| 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(); |