| Index: include.preload.js | 
| diff --git a/include.preload.js b/include.preload.js | 
| index 9d66b658918af782cd1050aeeb738bc432b23477..2c3e215eca62575de7aec71e54dd4126c59100d7 100644 | 
| --- a/include.preload.js | 
| +++ b/include.preload.js | 
| @@ -333,272 +333,6 @@ ElementHidingTracer.prototype = { | 
| } | 
| }; | 
| -function runInPageContext(fn, arg) | 
| -{ | 
| - let script = document.createElement("script"); | 
| - script.type = "application/javascript"; | 
| - script.async = false; | 
| - script.textContent = "(" + fn + ")(" + JSON.stringify(arg) + ");"; | 
| - document.documentElement.appendChild(script); | 
| - document.documentElement.removeChild(script); | 
| -} | 
| - | 
| -function wrapRequestAPIs() | 
| -{ | 
| - let randomEventName = "abp-request-" + Math.random().toString(36).substr(2); | 
| - | 
| - // Proxy "should we block?" messages from checkRequest inside the injected | 
| - // code to the background page and back again. | 
| - document.addEventListener(randomEventName, event => | 
| - { | 
| - let {url, requestType} = event.detail; | 
| - | 
| - ext.backgroundPage.sendMessage({ | 
| - type: "request.blockedByWrapper", | 
| - requestType, | 
| - url | 
| - }, block => | 
| - { | 
| - document.dispatchEvent(new CustomEvent( | 
| - randomEventName + "-" + requestType + "-" + url, {detail: block} | 
| - )); | 
| - }); | 
| - }); | 
| - | 
| - runInPageContext(eventName => | 
| - { | 
| - let RealCustomEvent = window.CustomEvent; | 
| - let addEventListener = document.addEventListener.bind(document); | 
| - let removeEventListener = document.removeEventListener.bind(document); | 
| - let dispatchEvent = document.dispatchEvent.bind(document); | 
| - | 
| - function checkRequest(requestType, url, callback) | 
| - { | 
| - let incomingEventName = eventName + "-" + requestType + "-" + url; | 
| - | 
| - function listener(event) | 
| - { | 
| - callback(event.detail); | 
| - removeEventListener(incomingEventName, listener); | 
| - } | 
| - addEventListener(incomingEventName, listener); | 
| - | 
| - dispatchEvent(new RealCustomEvent(eventName, | 
| - {detail: {url, requestType}})); | 
| - } | 
| - | 
| - // Only to be called before the page's code, not hardened. | 
| - function copyProperties(src, dest, properties) | 
| - { | 
| - for (let name of properties) | 
| - { | 
| - Object.defineProperty(dest, name, | 
| - Object.getOwnPropertyDescriptor(src, name)); | 
| - } | 
| - } | 
| - | 
| - /* | 
| - * WebSocket wrapper | 
| - * | 
| - * Required before Chrome 58, since the webRequest API didn't allow us to | 
| - * intercept WebSockets. | 
| - * See https://bugs.chromium.org/p/chromium/issues/detail?id=129353 | 
| - */ | 
| - let RealWebSocket = WebSocket; | 
| - let closeWebSocket = Function.prototype.call.bind( | 
| - RealWebSocket.prototype.close | 
| - ); | 
| - | 
| - function WrappedWebSocket(url, ...args) | 
| - { | 
| - // Throw correct exceptions if the constructor is used improperly. | 
| - if (!(this instanceof WrappedWebSocket)) return RealWebSocket(); | 
| - if (arguments.length < 1) return new RealWebSocket(); | 
| - | 
| - let websocket = new RealWebSocket(url, ...args); | 
| - | 
| - checkRequest("WEBSOCKET", websocket.url, blocked => | 
| - { | 
| - if (blocked) | 
| - closeWebSocket(websocket); | 
| - }); | 
| - | 
| - return websocket; | 
| - } | 
| - WrappedWebSocket.prototype = RealWebSocket.prototype; | 
| - window.WebSocket = WrappedWebSocket.bind(); | 
| - copyProperties(RealWebSocket, WebSocket, | 
| - ["CONNECTING", "OPEN", "CLOSING", "CLOSED", "prototype"]); | 
| - RealWebSocket.prototype.constructor = WebSocket; | 
| - | 
| - /* | 
| - * RTCPeerConnection wrapper | 
| - * | 
| - * The webRequest API in Chrome does not yet allow the blocking of | 
| - * WebRTC connections. | 
| - * See https://bugs.chromium.org/p/chromium/issues/detail?id=707683 | 
| - */ | 
| - let RealRTCPeerConnection = window.RTCPeerConnection || | 
| - window.webkitRTCPeerConnection; | 
| - let closeRTCPeerConnection = Function.prototype.call.bind( | 
| - RealRTCPeerConnection.prototype.close | 
| - ); | 
| - let RealArray = Array; | 
| - let RealString = String; | 
| - let {create: createObject, defineProperty} = Object; | 
| - | 
| - function normalizeUrl(url) | 
| - { | 
| - if (typeof url != "undefined") | 
| - return RealString(url); | 
| - } | 
| - | 
| - function safeCopyArray(originalArray, transform) | 
| - { | 
| - if (originalArray == null || typeof originalArray != "object") | 
| - return originalArray; | 
| - | 
| - let safeArray = RealArray(originalArray.length); | 
| - for (let i = 0; i < safeArray.length; i++) | 
| - { | 
| - defineProperty(safeArray, i, { | 
| - configurable: false, enumerable: false, writable: false, | 
| - value: transform(originalArray[i]) | 
| - }); | 
| - } | 
| - defineProperty(safeArray, "length", { | 
| - configurable: false, enumerable: false, writable: false, | 
| - value: safeArray.length | 
| - }); | 
| - return safeArray; | 
| - } | 
| - | 
| - // It would be much easier to use the .getConfiguration method to obtain | 
| - // the normalized and safe configuration from the RTCPeerConnection | 
| - // instance. Unfortunately its not implemented as of Chrome unstable 59. | 
| - // See https://www.chromestatus.com/feature/5271355306016768 | 
| - function protectConfiguration(configuration) | 
| - { | 
| - if (configuration == null || typeof configuration != "object") | 
| - return configuration; | 
| - | 
| - let iceServers = safeCopyArray( | 
| - configuration.iceServers, | 
| - iceServer => | 
| - { | 
| - let {url, urls} = iceServer; | 
| - | 
| - // RTCPeerConnection doesn't iterate through pseudo Arrays of urls. | 
| - if (typeof urls != "undefined" && !(urls instanceof RealArray)) | 
| - urls = [urls]; | 
| - | 
| - return createObject(iceServer, { | 
| - url: { | 
| - configurable: false, enumerable: false, writable: false, | 
| - value: normalizeUrl(url) | 
| - }, | 
| - urls: { | 
| - configurable: false, enumerable: false, writable: false, | 
| - value: safeCopyArray(urls, normalizeUrl) | 
| - } | 
| - }); | 
| - } | 
| - ); | 
| - | 
| - return createObject(configuration, { | 
| - iceServers: { | 
| - configurable: false, enumerable: false, writable: false, | 
| - value: iceServers | 
| - } | 
| - }); | 
| - } | 
| - | 
| - function checkUrl(peerconnection, url) | 
| - { | 
| - checkRequest("WEBRTC", url, blocked => | 
| - { | 
| - if (blocked) | 
| - { | 
| - // Calling .close() throws if already closed. | 
| - try | 
| - { | 
| - closeRTCPeerConnection(peerconnection); | 
| - } | 
| - catch (e) {} | 
| - } | 
| - }); | 
| - } | 
| - | 
| - function checkConfiguration(peerconnection, configuration) | 
| - { | 
| - if (configuration && configuration.iceServers) | 
| - { | 
| - for (let i = 0; i < configuration.iceServers.length; i++) | 
| - { | 
| - let iceServer = configuration.iceServers[i]; | 
| - if (iceServer) | 
| - { | 
| - if (iceServer.url) | 
| - checkUrl(peerconnection, iceServer.url); | 
| - | 
| - if (iceServer.urls) | 
| - { | 
| - for (let j = 0; j < iceServer.urls.length; j++) | 
| - checkUrl(peerconnection, iceServer.urls[j]); | 
| - } | 
| - } | 
| - } | 
| - } | 
| - } | 
| - | 
| - // Chrome unstable (tested with 59) has already implemented | 
| - // setConfiguration, so we need to wrap that if it exists too. | 
| - // https://www.chromestatus.com/feature/5596193748942848 | 
| - if (RealRTCPeerConnection.prototype.setConfiguration) | 
| - { | 
| - let realSetConfiguration = Function.prototype.call.bind( | 
| - RealRTCPeerConnection.prototype.setConfiguration | 
| - ); | 
| - | 
| - RealRTCPeerConnection.prototype.setConfiguration = function(configuration) | 
| - { | 
| - configuration = protectConfiguration(configuration); | 
| - | 
| - // Call the real method first, so that validates the configuration for | 
| - // us. Also we might as well since checkRequest is asynchronous anyway. | 
| - realSetConfiguration(this, configuration); | 
| - checkConfiguration(this, configuration); | 
| - }; | 
| - } | 
| - | 
| - function WrappedRTCPeerConnection(...args) | 
| - { | 
| - if (!(this instanceof WrappedRTCPeerConnection)) | 
| - return WrappedRTCPeerConnection(); | 
| - | 
| - let configuration = protectConfiguration(args[0]); | 
| - // Since the old webkitRTCPeerConnection constructor takes an optional | 
| - // second argument we need to take care to pass that through. Necessary | 
| - // for older versions of Chrome such as 49. | 
| - let peerconnection = new RealRTCPeerConnection(configuration, args[1]); | 
| - checkConfiguration(peerconnection, configuration); | 
| - return peerconnection; | 
| - } | 
| - | 
| - WrappedRTCPeerConnection.prototype = RealRTCPeerConnection.prototype; | 
| - | 
| - let boundWrappedRTCPeerConnection = WrappedRTCPeerConnection.bind(); | 
| - copyProperties(RealRTCPeerConnection, boundWrappedRTCPeerConnection, | 
| - ["caller", "generateCertificate", "name", "prototype"]); | 
| - RealRTCPeerConnection.prototype.constructor = boundWrappedRTCPeerConnection; | 
| - | 
| - if ("RTCPeerConnection" in window) | 
| - window.RTCPeerConnection = boundWrappedRTCPeerConnection; | 
| - if ("webkitRTCPeerConnection" in window) | 
| - window.webkitRTCPeerConnection = boundWrappedRTCPeerConnection; | 
| - }, randomEventName); | 
| -} | 
| - | 
| function ElemHide() | 
| { | 
| this.shadow = this.createShadowTree(); | 
| @@ -641,28 +375,6 @@ ElemHide.prototype = { | 
| document.documentElement.createShadowRoot(); | 
| shadow.appendChild(document.createElement("shadow")); | 
| - // Stop the website from messing with our shadow root (#4191, #4298). | 
| - if ("shadowRoot" in Element.prototype) | 
| - { | 
| - runInPageContext(() => | 
| - { | 
| - let ourShadowRoot = document.documentElement.shadowRoot; | 
| - if (!ourShadowRoot) | 
| - return; | 
| - 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 thisShadow = shadowRoot(this); | 
| - return thisShadow == ourShadowRoot ? null : thisShadow; | 
| - } | 
| - }); | 
| - }, null); | 
| - } | 
| - | 
| return shadow; | 
| }, | 
| @@ -749,7 +461,6 @@ ElemHide.prototype = { | 
| if (document instanceof HTMLDocument) | 
| { | 
| checkSitekey(); | 
| - wrapRequestAPIs(); | 
| elemhide = new ElemHide(); | 
| elemhide.apply(); |