diff --git a/assets/checksums.txt b/assets/checksums.txt index c7271755c..164042097 100644 --- a/assets/checksums.txt +++ b/assets/checksums.txt @@ -5,7 +5,7 @@ a1bbb634b15518cb2916bfdc78fd4344 assets/ublock/unbreak.txt 146704ad1c0393e342afdb416762c183 assets/ublock/badware.txt 5baa90e2da7cd6a73edff2010557ee57 assets/ublock/redirect.txt a2c0edc2da6a2ba591d83f9a105a8401 assets/ublock/experimental.txt -4d7a4dae5294ea40b0af1bd184806308 assets/ublock/resources.txt +0a8d548c42652b0303ab35d4e4fe0852 assets/ublock/resources.txt fd3bf1065012191e032f81468de43e09 assets/ublock/filter-lists.json 3605c73f21abca428c7eb69a8bc32dfe assets/thirdparties/easylist-downloads.adblockplus.org/easyprivacy.txt a91af77c47c302c0741c7445b0fada1a assets/thirdparties/easylist-downloads.adblockplus.org/easylist.txt diff --git a/assets/ublock/resources.txt b/assets/ublock/resources.txt index 851bfd91c..751546633 100644 --- a/assets/ublock/resources.txt +++ b/assets/ublock/resources.txt @@ -527,7 +527,6 @@ openload-defuser.js application/javascript var noopfn = function() { ; }; - var excludes = ['177']; var wjdmpGet = function() { return wjdmp; }; @@ -536,12 +535,8 @@ openload-defuser.js application/javascript if ( r.length === 1 && r[0] === 4 ) { for ( var k in o ) { if ( o.hasOwnProperty(k) && typeof o[k] === 'function' ) { - continue; + o[k] = noopfn; } - if ( excludes.indexOf(k) !== -1 ) { - continue; - } - o[k] = noopfn; } } a(r, o); @@ -598,25 +593,44 @@ widgets.outbrain.com/outbrain.js application/javascript ; }; var obr = {}; - var methods = [ - 'callClick', 'callLoadMore', 'callRecs', 'callUserZapping', - 'callWhatIs', 'cancelRecommendation', 'cancelRecs', 'closeCard', - 'closeModal', 'closeTbx', 'errorInjectionHandler', 'getCountOfRecs', - 'getStat', 'imageError', 'manualVideoClicked', 'onOdbReturn', - 'onVideoClick', 'pagerLoad', 'recClicked', 'refreshSpecificWidget', - 'refreshWidget', 'reloadWidget', 'researchWidget', 'returnedError', - 'returnedHtmlData', 'returnedIrdData', 'returnedJsonData', 'scrollLoad', - 'showDescription', 'showRecInIframe', 'userZappingMessage', 'zappingFormAction' - ]; obr.extern = { + callClick: noopfn, + callLoadMore: noopfn, + callRecs: noopfn, + callUserZapping: noopfn, + callWhatIs: noopfn, + cancelRecommendation: noopfn, + cancelRecs: noopfn, + closeCard: noopfn, + closeModal: noopfn, + closeTbx: noopfn, + errorInjectionHandler: noopfn, + getCountOfRecs: noopfn, + getStat: noopfn, + imageError: noopfn, + manualVideoClicked: noopfn, + onOdbReturn: noopfn, + onVideoClick: noopfn, + pagerLoad: noopfn, + recClicked: noopfn, + refreshSpecificWidget: noopfn, + refreshWidget: noopfn, + reloadWidget: noopfn, + researchWidget: noopfn, + returnedError: noopfn, + returnedHtmlData: noopfn, + returnedIrdData: noopfn, + returnedJsonData: noopfn, + scrollLoad: noopfn, + showDescription: noopfn, + showRecInIframe: noopfn, + userZappingMessage: noopfn, video: { getVideoRecs: noopfn, videoClicked: noopfn - } + }, + zappingFormAction: noopfn }; - methods.forEach(function(a) { - obr.extern[a] = noopfn; - }); window.OBR = window.OBR || obr; })(); diff --git a/platform/chromium/vapi-client.js b/platform/chromium/vapi-client.js index f7ff589e1..6fdc851fc 100644 --- a/platform/chromium/vapi-client.js +++ b/platform/chromium/vapi-client.js @@ -317,6 +317,17 @@ MessagingChannel.prototype.sendToListeners = function(msg) { /******************************************************************************/ +// No need to have vAPI client linger around after shutdown if +// we are not a top window (because element picker can still +// be injected in top window). +if ( window !== window.top ) { + vAPI.shutdown.add(function() { + vAPI = null; + }); +} + +/******************************************************************************/ + })(this); /******************************************************************************/ diff --git a/src/js/contentscript-end.js b/src/js/contentscript-end.js index fe0b5073f..857c97696 100644 --- a/src/js/contentscript-end.js +++ b/src/js/contentscript-end.js @@ -73,10 +73,11 @@ var uBlockCollapser = (function() { var timer = null; var requestId = 1; var newRequests = []; - var pendingRequests = Object.create(null); + var pendingRequests = {}; var pendingRequestCount = 0; var src1stProps = { 'embed': 'src', + 'iframe': 'src', 'img': 'src', 'object': 'data' }; @@ -118,10 +119,10 @@ var uBlockCollapser = (function() { var request, entry, target, value; while ( i-- ) { request = requests[i]; - entry = pendingRequests[request.id]; - if ( entry === undefined ) { + if ( pendingRequests.hasOwnProperty(request.id) === false ) { continue; } + entry = pendingRequests[request.id]; delete pendingRequests[request.id]; pendingRequestCount -= 1; @@ -153,7 +154,7 @@ var uBlockCollapser = (function() { // Renew map: I believe that even if all properties are deleted, an // object will still use more memory than a brand new one. if ( pendingRequestCount === 0 ) { - pendingRequests = Object.create(null); + pendingRequests = {}; } }; @@ -209,13 +210,6 @@ var uBlockCollapser = (function() { newRequests.push(new BouncingRequest(req.id, tagName, src)); }; - var addMany = function(targets) { - var i = targets.length; - while ( i-- ) { - add(targets[i]); - } - }; - var iframeSourceModified = function(mutations) { var i = mutations.length; while ( i-- ) { @@ -260,26 +254,21 @@ var uBlockCollapser = (function() { newRequests.push(new BouncingRequest(req.id, 'iframe', src)); }; - var addIFrames = function(iframes) { - var i = iframes.length; - while ( i-- ) { - addIFrame(iframes[i]); - } - }; - var iframesFromNode = function(node) { if ( node.localName === 'iframe' ) { addIFrame(node); } - addIFrames(node.getElementsByTagName('iframe')); + var iframes = node.getElementsByTagName('iframe'); + var i = iframes.length; + while ( i-- ) { + addIFrame(iframes[i]); + } process(); }; return { add: add, - addMany: addMany, addIFrame: addIFrame, - addIFrames: addIFrames, iframesFromNode: iframesFromNode, process: process }; @@ -936,17 +925,35 @@ var uBlockCollapser = (function() { (function() { var collapser = uBlockCollapser; - var elems = document.getElementsByTagName('img'), - i = elems.length, elem; + var elems, i, elem; + + elems = document.getElementsByTagName('embed'); + i = elems.length; + while ( i-- ) { + collapser.add(elems[i]); + } + + elems = document.getElementsByTagName('object'); + i = elems.length; + while ( i-- ) { + collapser.add(elems[i]); + } + + elems = document.getElementsByTagName('img'); + i = elems.length; while ( i-- ) { elem = elems[i]; if ( elem.complete ) { collapser.add(elem); } } - collapser.addMany(document.getElementsByTagName('embed')); - collapser.addMany(document.getElementsByTagName('object')); - collapser.addIFrames(document.getElementsByTagName('iframe')); + + elems = document.getElementsByTagName('iframe'); + i = elems.length; + while ( i-- ) { + collapser.addIFrame(elems[i]); + } + collapser.process(0); })();