block window.open

This commit is contained in:
Michael Zhang 2017-12-02 12:19:50 -06:00
parent cf6978693d
commit 90b2e60c71
No known key found for this signature in database
GPG key ID: A1B65B603268116B
2 changed files with 23 additions and 9 deletions

View file

@ -32,7 +32,7 @@
const removeChild = window.Element.prototype.removeChild; const removeChild = window.Element.prototype.removeChild;
const getElementsByTagName = window.document.getElementsByTagName; const getElementsByTagName = window.document.getElementsByTagName;
const defaultFunction = function () {}; const defaultFunction = function () { };
const funcPropNames = Object.getOwnPropertyNames(defaultFunction); const funcPropNames = Object.getOwnPropertyNames(defaultFunction);
const unconfigurablePropNames = funcPropNames.filter(function (propName) { const unconfigurablePropNames = funcPropNames.filter(function (propName) {
const possiblePropDesc = Object.getOwnPropertyDescriptor(defaultFunction, propName); const possiblePropDesc = Object.getOwnPropertyDescriptor(defaultFunction, propName);
@ -66,7 +66,7 @@
return undefined; return undefined;
}; };
const keyPathToRefPath = function (keyPath) { const keyPathToRefPath = function (keyPath, target) {
const keyParts = keyPath.split("."); const keyParts = keyPath.split(".");
return keyParts.reduce(function (prev, cur) { return keyParts.reduce(function (prev, cur) {
@ -76,7 +76,7 @@
const numNodes = prev.length; const numNodes = prev.length;
const currentLeaf = (numNodes === 0) const currentLeaf = (numNodes === 0)
? window ? target
: prev[numNodes - 1]; : prev[numNodes - 1];
const nextLeaf = currentLeaf[cur]; const nextLeaf = currentLeaf[cur];
@ -95,8 +95,8 @@
const logKeyPath = function () { const logKeyPath = function () {
if (keyPath !== undefined && if (keyPath !== undefined &&
hasBeenLogged === false && hasBeenLogged === false &&
shouldLog) { shouldLog) {
hasBeenLogged = true; hasBeenLogged = true;
const standard = featureToStandardMapping[keyPath]; const standard = featureToStandardMapping[keyPath];
const message = `Blocked '${keyPath}' from '${standard}' on '${hostName}'`; const message = `Blocked '${keyPath}' from '${standard}' on '${hostName}'`;
@ -157,8 +157,10 @@
const defaultBlockingProxy = createBlockingProxy(); const defaultBlockingProxy = createBlockingProxy();
const blockFeatureAtKeyPath = function (keyPath) { const blockFeatureAtKeyPath = function (keyPath, target) {
const propertyRefs = keyPathToRefPath(keyPath); target = target || window;
const propertyRefs = keyPathToRefPath(keyPath, target);
// If we weren't able to turn the key path into an array of references, // If we weren't able to turn the key path into an array of references,
// then it means that the property doesn't exist in this DOM / // then it means that the property doesn't exist in this DOM /
@ -197,7 +199,20 @@
} }
}; };
featuresToBlock.forEach(blockFeatureAtKeyPath); const oldWindowOpen = window.open;
const windowOpenProxy = new Proxy(window.open, {
apply: function (target, thisArg, argumentsList) {
console.log("window.open =", oldWindowOpen);
const wnd = oldWindowOpen.apply(thisArg, argumentsList);
featuresToBlock.forEach((v) => blockFeatureAtKeyPath(v, wnd));
return wnd;
}
});
Object.defineProperty(window, "open", {
get: () => windowOpenProxy
});
featuresToBlock.forEach((v) => blockFeatureAtKeyPath(v));
// Next, delete the WEB_API_MANAGER_PAGE global property. Technically // Next, delete the WEB_API_MANAGER_PAGE global property. Technically
// this never needed to be global, but doing so allows for easier // this never needed to be global, but doing so allows for easier

View file

@ -189,7 +189,6 @@
"window.onvolumechange", "window.onvolumechange",
"window.onwaiting", "window.onwaiting",
"window.onwheel", "window.onwheel",
"window.open",
"window.opener", "window.opener",
"window.parent", "window.parent",
"window.self", "window.self",