Version bump: 11.2rc1.
This commit is contained in:
parent
6157364aad
commit
4450f98f07
|
@ -8,7 +8,7 @@
|
||||||
"strict_min_version": "59.0"
|
"strict_min_version": "59.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": "11.1.9",
|
"version": "11.2rc1",
|
||||||
"description": "__MSG_Description__",
|
"description": "__MSG_Description__",
|
||||||
"incognito": "spanning",
|
"incognito": "spanning",
|
||||||
|
|
||||||
|
@ -96,6 +96,7 @@
|
||||||
"lib/sha256.js",
|
"lib/sha256.js",
|
||||||
"lib/Messages.js",
|
"lib/Messages.js",
|
||||||
"lib/CSP.js",
|
"lib/CSP.js",
|
||||||
|
"nscl/content/patchWindow.js",
|
||||||
"common/CapsCSP.js",
|
"common/CapsCSP.js",
|
||||||
"common/RequestKey.js",
|
"common/RequestKey.js",
|
||||||
"content/DocumentCSP.js",
|
"content/DocumentCSP.js",
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
function patchWindow(patchingCallback, targetWindow = window) {
|
||||||
|
let nativeExport = this && this.exportFunction || typeof exportFunction == "function";
|
||||||
|
if (!nativeExport) {
|
||||||
|
// Chromium
|
||||||
|
let exportFunction = (func, targetObject, {defineAs}) => {
|
||||||
|
let original = targetObject[defineAs];
|
||||||
|
if (original && original.toString) {
|
||||||
|
func.toString = original.toString.bind(original);
|
||||||
|
}
|
||||||
|
console.log(`Setting ${targetObject}.${defineAs}`, func);
|
||||||
|
targetObject[defineAs] = func;
|
||||||
|
};
|
||||||
|
let cloneInto = (obj, targetObject) => {
|
||||||
|
return obj; // dummy for assignment
|
||||||
|
};
|
||||||
|
let script = document.createElement("script");
|
||||||
|
script.text = `
|
||||||
|
(() => {
|
||||||
|
console.log("Chromium patchWindow");
|
||||||
|
let patchWindow = ${patchWindow};
|
||||||
|
let cloneInto = ${cloneInto};
|
||||||
|
let exportFunction = ${exportFunction};
|
||||||
|
({
|
||||||
|
patchWindow,
|
||||||
|
exportFunction,
|
||||||
|
cloneInto,
|
||||||
|
}).patchWindow(${patchingCallback});
|
||||||
|
})();
|
||||||
|
`;
|
||||||
|
document.documentElement.insertBefore(script, document.documentElement.firstChild);
|
||||||
|
script.remove();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// win: window object to modify.
|
||||||
|
// modifyTarget: callback to function that modifies the desired properties
|
||||||
|
// or methods. Callback must take target window as argument.
|
||||||
|
function modifyWindow(win, modifyTarget) {
|
||||||
|
try {
|
||||||
|
modifyTarget(win.wrappedJSObject || win);
|
||||||
|
modifyWindowOpenMethod(win, modifyTarget);
|
||||||
|
modifyFramingElements(win, modifyTarget);
|
||||||
|
} catch (e) {
|
||||||
|
if (e instanceof DOMException && e.name === "SecurityError") {
|
||||||
|
// In case someone tries to access SOP restricted window.
|
||||||
|
// We can just ignore this.
|
||||||
|
} else throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function modifyWindowOpenMethod(win, modifyTarget) {
|
||||||
|
let windowOpen = win.wrappedJSObject ? win.wrappedJSObject.open : win.open;
|
||||||
|
exportFunction(function(...args) {
|
||||||
|
let newWin = windowOpen.call(this, ...args);
|
||||||
|
if (newWin) modifyWindow(newWin, modifyTarget);
|
||||||
|
return newWin;
|
||||||
|
}, win, {defineAs: "open"});
|
||||||
|
}
|
||||||
|
|
||||||
|
function modifyFramingElements(win, modifyTarget) {
|
||||||
|
for (let property of ["contentWindow", "contentDocument"]) {
|
||||||
|
for (let iface of ["Frame", "IFrame", "Object"]) {
|
||||||
|
let proto = win[`HTML${iface}Element`].prototype;
|
||||||
|
modifyContentProperties(proto, property, modifyTarget)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function modifyContentProperties(proto, property, modifyTarget) {
|
||||||
|
let descriptor = Object.getOwnPropertyDescriptor(proto, property);
|
||||||
|
let origGetter = descriptor.get;
|
||||||
|
let replacementFn;
|
||||||
|
|
||||||
|
if (property === "contentWindow") { replacementFn = function() {
|
||||||
|
let win = origGetter.call(this);
|
||||||
|
if (win) modifyWindow(win, modifyTarget);
|
||||||
|
return win;
|
||||||
|
}}
|
||||||
|
if (property === "contentDocument") { replacementFn = function() {
|
||||||
|
let document = origGetter.call(this);
|
||||||
|
if (document && document.defaultView) modifyWindow(document.defaultView, modifyTarget);
|
||||||
|
return document;
|
||||||
|
}}
|
||||||
|
|
||||||
|
descriptor.get = exportFunction(replacementFn, proto, {defineAs: `get $property`});
|
||||||
|
let wrappedProto = proto.wrappedJSObject || proto;
|
||||||
|
Object.defineProperty(wrappedProto, property, descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
return modifyWindow(targetWindow, patchingCallback);
|
||||||
|
}
|
Loading…
Reference in New Issue