| Index: include.preload.js |
| diff --git a/include.preload.js b/include.preload.js |
| index 9b7e4104fc8606812aeaad46668a76e62db5c4d0..6017d7ec7b47e3f91e1852c17ec4e01eea6cb3ab 100644 |
| --- a/include.preload.js |
| +++ b/include.preload.js |
| @@ -15,19 +15,24 @@ |
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| +/* globals ElemHideEmulation, splitSelector */ |
| + |
| "use strict"; |
| -const typeMap = { |
| - "img": "IMAGE", |
| - "input": "IMAGE", |
| - "picture": "IMAGE", |
| - "audio": "MEDIA", |
| - "video": "MEDIA", |
| - "frame": "SUBDOCUMENT", |
| - "iframe": "SUBDOCUMENT", |
| - "object": "OBJECT", |
| - "embed": "OBJECT" |
| -}; |
| +// This variable is also used by our other content scripts. |
| +let elemhide; |
| + |
| +const typeMap = new Map([ |
| + ["img", "IMAGE"], |
| + ["input", "IMAGE"], |
| + ["picture", "IMAGE"], |
| + ["audio", "MEDIA"], |
| + ["video", "MEDIA"], |
| + ["frame", "SUBDOCUMENT"], |
| + ["iframe", "SUBDOCUMENT"], |
| + ["object", "OBJECT"], |
| + ["embed", "OBJECT"] |
| +]); |
| function getURLsFromObjectElement(element) |
| { |
| @@ -41,9 +46,9 @@ function getURLsFromObjectElement(element) |
| continue; |
| let name = child.getAttribute("name"); |
| - if (name != "movie" && // Adobe Flash |
| + if (name != "movie" && // Adobe Flash |
| name != "source" && // Silverlight |
| - name != "src" && // Real Media + Quicktime |
| + name != "src" && // Real Media + Quicktime |
| name != "FileName") // Windows Media |
| continue; |
| @@ -84,7 +89,7 @@ function getURLsFromMediaElement(element) |
| for (let child of element.children) |
| { |
| if (child.localName == "source" || child.localName == "track") |
| - urls.push.apply(urls, getURLsFromAttributes(child)); |
| + urls.push(...getURLsFromAttributes(child)); |
| } |
| if (element.poster) |
| @@ -124,7 +129,7 @@ function getURLsFromElement(element) |
| function checkCollapse(element) |
| { |
| - let mediatype = typeMap[element.localName]; |
| + let mediatype = typeMap.get(element.localName); |
| if (!mediatype) |
| return; |
| @@ -135,8 +140,8 @@ function checkCollapse(element) |
| ext.backgroundPage.sendMessage( |
| { |
| type: "filters.collapse", |
| - urls: urls, |
| - mediatype: mediatype, |
| + urls, |
| + mediatype, |
| baseURL: document.location.href |
| }, |
| @@ -179,18 +184,6 @@ function checkSitekey() |
| ext.backgroundPage.sendMessage({type: "filters.addKey", token: attr}); |
| } |
| -function getContentDocument(element) |
| -{ |
| - try |
| - { |
| - return element.contentDocument; |
| - } |
| - catch (e) |
| - { |
| - return null; |
| - } |
| -} |
| - |
| function ElementHidingTracer() |
| { |
| this.selectors = []; |
| @@ -242,10 +235,12 @@ ElementHidingTracer.prototype = { |
| } |
| if (matchedSelectors.length > 0) |
| + { |
| ext.backgroundPage.sendMessage({ |
| type: "devtools.traceElemHide", |
| selectors: matchedSelectors |
| }); |
| + } |
| }, |
| onTimeout() |
| @@ -349,18 +344,18 @@ function runInPageContext(fn, arg) |
| // [1] - https://bugs.chromium.org/p/chromium/issues/detail?id=129353 |
| function wrapWebSocket() |
| { |
| - let eventName = "abpws-" + Math.random().toString(36).substr(2); |
| + let randomEventName = "abpws-" + Math.random().toString(36).substr(2); |
| - document.addEventListener(eventName, event => |
| + document.addEventListener(randomEventName, event => |
| { |
| ext.backgroundPage.sendMessage({ |
| type: "request.websocket", |
| url: event.detail.url |
| }, block => |
| { |
| - document.dispatchEvent( |
| - new CustomEvent(eventName + "-" + event.detail.url, {detail: block}) |
| - ); |
| + document.dispatchEvent(new CustomEvent( |
| + randomEventName + "-" + event.detail.url, {detail: block} |
| + )); |
| }); |
| }); |
| @@ -369,11 +364,13 @@ function wrapWebSocket() |
| // As far as possible we must track everything we use that could be |
| // sabotaged by the website later in order to circumvent us. |
| let RealWebSocket = WebSocket; |
| - let closeWebSocket = Function.prototype.call.bind(RealWebSocket.prototype.close); |
| + let RealCustomEvent = window.CustomEvent; |
| + let closeWebSocket = Function.prototype.call.bind( |
| + RealWebSocket.prototype.close |
| + ); |
| let addEventListener = document.addEventListener.bind(document); |
| let removeEventListener = document.removeEventListener.bind(document); |
| let dispatchEvent = document.dispatchEvent.bind(document); |
| - let CustomEvent = window.CustomEvent; |
| function checkRequest(url, callback) |
| { |
| @@ -385,12 +382,10 @@ function wrapWebSocket() |
| } |
| addEventListener(incomingEventName, listener); |
| - dispatchEvent(new CustomEvent(eventName, { |
| - detail: {url: url} |
| - })); |
| + dispatchEvent(new RealCustomEvent(eventName, {detail: {url}})); |
| } |
| - function WrappedWebSocket(url) |
| + function WrappedWebSocket(url, ...args) |
| { |
| // Throw correct exceptions if the constructor is used improperly. |
| if (!(this instanceof WrappedWebSocket)) return RealWebSocket(); |
| @@ -400,7 +395,7 @@ function wrapWebSocket() |
| if (arguments.length == 1) |
| websocket = new RealWebSocket(url); |
| else |
| - websocket = new RealWebSocket(url, arguments[1]); |
| + websocket = new RealWebSocket(url, args[0]); |
| checkRequest(websocket.url, blocked => |
| { |
| @@ -411,7 +406,7 @@ function wrapWebSocket() |
| return websocket; |
| } |
| WrappedWebSocket.prototype = RealWebSocket.prototype; |
| - WebSocket = WrappedWebSocket.bind(); |
| + window.WebSocket = WrappedWebSocket.bind(); |
| Object.defineProperties(WebSocket, { |
| CONNECTING: {value: RealWebSocket.CONNECTING, enumerable: true}, |
| OPEN: {value: RealWebSocket.OPEN, enumerable: true}, |
| @@ -421,7 +416,7 @@ function wrapWebSocket() |
| }); |
| RealWebSocket.prototype.constructor = WebSocket; |
| - }, eventName); |
| + }, randomEventName); |
| } |
| function ElemHide() |
| @@ -474,14 +469,15 @@ ElemHide.prototype = { |
| let ourShadowRoot = document.documentElement.shadowRoot; |
| if (!ourShadowRoot) |
| return; |
| - let desc = Object.getOwnPropertyDescriptor(Element.prototype, "shadowRoot"); |
| + let desc = Object.getOwnPropertyDescriptor(Element.prototype, |
| + "shadowRoot"); |
| let shadowRoot = Function.prototype.call.bind(desc.get); |
| Object.defineProperty(Element.prototype, "shadowRoot", { |
| configurable: true, enumerable: true, get() |
| { |
| - let shadow = shadowRoot(this); |
| - return shadow == ourShadowRoot ? null : shadow; |
| + let thisShadow = shadowRoot(this); |
| + return thisShadow == ourShadowRoot ? null : shadow; |
| } |
| }); |
| }, null); |
| @@ -502,8 +498,8 @@ ElemHide.prototype = { |
| // <html> element. If we have injected a style element before that |
| // has been removed (the sheet property is null), create a new one. |
| this.style = document.createElement("style"); |
| - (this.shadow || document.head |
| - || document.documentElement).appendChild(this.style); |
| + (this.shadow || document.head || |
| + document.documentElement).appendChild(this.style); |
| // It can happen that the frame already navigated to a different |
| // document while we were waiting for the background page to respond. |
| @@ -527,9 +523,7 @@ ElemHide.prototype = { |
| } |
| } |
| else |
| - { |
| preparedSelectors = selectors; |
| - } |
| // Safari only allows 8192 primitive selectors to be injected at once[1], we |
| // therefore chunk the inserted selectors into groups of 200 to be safe. |
| @@ -538,7 +532,9 @@ ElemHide.prototype = { |
| // [1] - https://github.com/WebKit/webkit/blob/1cb2227f6b2a1035f7bdc46e5ab69debb75fc1de/Source/WebCore/css/RuleSet.h#L68 |
| for (let i = 0; i < preparedSelectors.length; i += this.selectorGroupSize) |
| { |
| - let selector = preparedSelectors.slice(i, i + this.selectorGroupSize).join(", "); |
| + let selector = preparedSelectors.slice( |
| + i, i + this.selectorGroupSize |
| + ).join(", "); |
| this.style.sheet.insertRule(selector + "{display: none !important;}", |
| this.style.sheet.cssRules.length); |
| } |
| @@ -573,9 +569,7 @@ if (document instanceof HTMLDocument) |
| checkSitekey(); |
| wrapWebSocket(); |
| - // This variable is also used by our other content scripts, outside of the |
| - // current scope. |
| - var elemhide = new ElemHide(); |
| + elemhide = new ElemHide(); |
| elemhide.apply(); |
| document.addEventListener("error", event => |