diff --git a/assets/checksums.txt b/assets/checksums.txt index 164042097..c7271755c 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 -0a8d548c42652b0303ab35d4e4fe0852 assets/ublock/resources.txt +4d7a4dae5294ea40b0af1bd184806308 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 751546633..851bfd91c 100644 --- a/assets/ublock/resources.txt +++ b/assets/ublock/resources.txt @@ -527,6 +527,7 @@ openload-defuser.js application/javascript var noopfn = function() { ; }; + var excludes = ['177']; var wjdmpGet = function() { return wjdmp; }; @@ -535,8 +536,12 @@ 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' ) { - o[k] = noopfn; + continue; } + if ( excludes.indexOf(k) !== -1 ) { + continue; + } + o[k] = noopfn; } } a(r, o); @@ -593,44 +598,25 @@ 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 6fdc851fc..f7ff589e1 100644 --- a/platform/chromium/vapi-client.js +++ b/platform/chromium/vapi-client.js @@ -317,17 +317,6 @@ 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 857c97696..fe0b5073f 100644 --- a/src/js/contentscript-end.js +++ b/src/js/contentscript-end.js @@ -73,11 +73,10 @@ var uBlockCollapser = (function() { var timer = null; var requestId = 1; var newRequests = []; - var pendingRequests = {}; + var pendingRequests = Object.create(null); var pendingRequestCount = 0; var src1stProps = { 'embed': 'src', - 'iframe': 'src', 'img': 'src', 'object': 'data' }; @@ -119,10 +118,10 @@ var uBlockCollapser = (function() { var request, entry, target, value; while ( i-- ) { request = requests[i]; - if ( pendingRequests.hasOwnProperty(request.id) === false ) { + entry = pendingRequests[request.id]; + if ( entry === undefined ) { continue; } - entry = pendingRequests[request.id]; delete pendingRequests[request.id]; pendingRequestCount -= 1; @@ -154,7 +153,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 = {}; + pendingRequests = Object.create(null); } }; @@ -210,6 +209,13 @@ 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-- ) { @@ -254,21 +260,26 @@ var uBlockCollapser = (function() { newRequests.push(new BouncingRequest(req.id, 'iframe', src)); }; - var iframesFromNode = function(node) { - if ( node.localName === 'iframe' ) { - addIFrame(node); - } - var iframes = node.getElementsByTagName('iframe'); + 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')); process(); }; return { add: add, + addMany: addMany, addIFrame: addIFrame, + addIFrames: addIFrames, iframesFromNode: iframesFromNode, process: process }; @@ -925,35 +936,17 @@ var uBlockCollapser = (function() { (function() { var collapser = uBlockCollapser; - 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; + var elems = document.getElementsByTagName('img'), + i = elems.length, elem; while ( i-- ) { elem = elems[i]; if ( elem.complete ) { collapser.add(elem); } } - - elems = document.getElementsByTagName('iframe'); - i = elems.length; - while ( i-- ) { - collapser.addIFrame(elems[i]); - } - + collapser.addMany(document.getElementsByTagName('embed')); + collapser.addMany(document.getElementsByTagName('object')); + collapser.addIFrames(document.getElementsByTagName('iframe')); collapser.process(0); })();