Changeset 424

Show
Ignore:
Timestamp:
06/28/08 14:56:23 (2 months ago)
Author:
t-bone
Message:

Enhanced element collapsing.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • extension/kabl/components/nsIKablPolicy.idl

    • Property svn:executable deleted
    r352 r424  
    1111    void openMonitorWindow(in nsIDOMWindow parentWin); 
    1212    void closeMonitorWindow(); 
     13     
     14    void collapse(in nsIDOMEvent event); 
    1315}; 
  • extension/kabl/components/nsIKablPolicy.xpt

    • Property svn:executable deleted
  • extension/kabl/content/kabl-overlay.js

    r354 r424  
    5757        window.removeEventListener('DOMContentLoaded', gKabl.onLoad, false); 
    5858        gKabl.setImage(); 
     59 
     60        var kablService=Components.classes['@arantius.com/kabl-policy;1'] 
     61            .createInstance(Components.interfaces.nsIKablPolicy); 
     62 
     63        document.getElementById('appcontent') 
     64            .addEventListener('DOMContentLoaded', kablService.collapse, false); 
    5965    } 
    6066}; 
  • extension/kabl/content/kabl-policy.js

    r354 r424  
    4040    } 
    4141}; 
     42 
     43function strippedTextContent(el) { 
     44    var text=el.innerHTML || el.textContent; 
     45    if (!text) return ''; 
     46 
     47    text=text.replace(/[\s]+/g, ' '); //collapse whitespace 
     48    text=text.replace(/^\s+|\s+$/g, ''); //strip leading/trailing whitespace 
     49    text=text.replace(/<script.*?\/script>/gi, ''); //strip js 
     50    text=text.replace(/<noscript.*?\/noscript>/gi, ''); //strip no-js 
     51    text=text.replace(/<iframe.*?\/iframe>/gi, ''); // iframe, alternate content 
     52    text=text.replace(/<!--.*?-->/gi, ''); //strip comments 
     53    text=text.replace(/<\/?[^>]+>/gi, ''); //strip tags 
     54 
     55    return text; 
     56} 
     57 
     58const gKablCollapseMarker=String(Math.floor(Math.random()*100000)); 
     59const UNORDERED_NODE_SNAPSHOT_TYPE=6; 
     60const COLLAPSE_TEXT_LENGTH=25; 
    4261 
    4362var gKablPolicy={ 
     
    121140            break; 
    122141        default: 
    123             if (gKablDebug ) { 
     142            if (gKablDebug) { 
    124143                dump( 
    125144                    'kabl error condition, unknown origin scheme for\n    '+ 
     
    192211                fields.node=fields.node 
    193212                    .QueryInterface(Components.interfaces.nsIDOMNode); 
    194                 fields.node.style.display='none !important'; 
     213                fields.node.setAttribute('style', 'display: none !important'); 
     214            } catch (e) { 
     215                if (gKablDebug) dump('Error in evalScore: '+e+'\n'); 
     216            } 
     217 
     218            // mark a node for extended hiding 
     219            try { 
     220                fields.node=fields.node 
     221                    .QueryInterface(Components.interfaces.nsIDOMNode); 
     222                fields.node.setAttribute('kabl', gKablCollapseMarker); 
    195223            } catch (e) { 
    196224                if (gKablDebug) dump('Error in evalScore: '+e+'\n'); 
     
    219247    }, 
    220248 
    221     // nsIKablPolicy 
    222249    closeMonitorWindow:function() { 
    223250        this.monitorWin.close(); 
     
    232259    }, 
    233260 
    234     // nsIContentPolicy interface implementation 
     261    collapse:function(event) { 
     262        // called when a content page loads, this looks for elements that were 
     263        // marked as blocked, and looks for a parent node that should be 
     264        // collapsed down (because it's probably just a wrapper around the ad) 
     265         
     266        var doc=event.target; 
     267        var xpr=doc.evaluate( 
     268            '//*[@kabl="'+gKablCollapseMarker+'"]', 
     269            doc, null, UNORDERED_NODE_SNAPSHOT_TYPE, null 
     270        ); 
     271        for (var i=0, item=null; item=xpr.snapshotItem(i); i++) { 
     272            // Climb the DOM, from this item, to find a container to collapse. 
     273            var el=null; 
     274            while (item=item.parentNode) { 
     275                if (strippedTextContent(item).length>COLLAPSE_TEXT_LENGTH) break; 
     276 
     277                el=item; 
     278            } 
     279 
     280            // If we selected an item, collapse it. 
     281            // try block just in case, attempt to hide the node, i.e. 
     282            // if a non-loaded image will result in an alt tag showing 
     283            try { 
     284                if (el) { 
     285                    el=el.QueryInterface(Components.interfaces.nsIDOMNode); 
     286                    //el.style.display='none !important'; 
     287                    el.setAttribute('style', 'display: none !important'); 
     288                    el.setAttribute('kablcollapse', '1'); 
     289                } 
     290            } catch (e) { 
     291                if (gKablDebug) dump('Error in collapse: '+e+'\n'); 
     292            } 
     293        } 
     294    }, 
     295 
     296    // nsIContentPolicy 
    235297    shouldLoad:function( 
    236298        contentType, contentLocation, requestOrigin, requestingNode, mimeTypeGuess, extra 
     
    254316        // if it is chrome, and so is the origin, let it through 
    255317        if (contentLocation.schemeIs('chrome') && 
    256             requestOrigin.schemeIs('chrome') 
     318            requestOrigin && requestOrigin.schemeIs('chrome') 
    257319        ) { 
    258320            return this.ACCEPT; 
  • extension/kabl/install.rdf

    r358 r424  
    44        <em:id>kabl@trac.arantius.com</em:id> 
    55        <em:name>Karma Blocker</em:name> 
    6         <em:version>0.3</em:version> 
     6        <em:version>0.4</em:version> 
    77        <em:description>Block resources based on their karma.</em:description> 
    88