mirror of
https://github.com/kkapsner/CanvasBlocker
synced 2025-05-25 09:13:27 +02:00
parent
e2efb727b9
commit
f3f6df229f
@ -90,5 +90,46 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const changedPropertiesByWindow = new WeakMap();
|
||||||
|
scope.changeProperty = function(window, group, {object, name, type, changed}){
|
||||||
|
let changedProperties = changedPropertiesByWindow.get(scope.getWrapped(window));
|
||||||
|
if (!changedProperties){
|
||||||
|
changedProperties = [];
|
||||||
|
changedPropertiesByWindow.set(scope.getWrapped(window), changedProperties);
|
||||||
|
}
|
||||||
|
const descriptor = Object.getOwnPropertyDescriptor(object, name);
|
||||||
|
const original = descriptor[type];
|
||||||
|
descriptor[type] = changed;
|
||||||
|
Object.defineProperty(object, name, descriptor);
|
||||||
|
changedProperties.push({group, object, name, type, original});
|
||||||
|
};
|
||||||
|
scope.revertProperties = function(window, group){
|
||||||
|
window = scope.getWrapped(window);
|
||||||
|
let changedProperties = changedPropertiesByWindow.get(window);
|
||||||
|
if (!changedProperties){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (group){
|
||||||
|
const remainingProperties = changedProperties.filter(function({group}){
|
||||||
|
return group !== group;
|
||||||
|
});
|
||||||
|
changedPropertiesByWindow.set(window, remainingProperties);
|
||||||
|
changedProperties = changedProperties.filter(function({group}){
|
||||||
|
return group === group;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
changedPropertiesByWindow.delete(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let i = changedProperties.length - 1; i >= 0; i -= 1){
|
||||||
|
const {object, name, type, original} = changedProperties[i];
|
||||||
|
logging.verbose("reverting", name, "on", object);
|
||||||
|
const descriptor = Object.getOwnPropertyDescriptor(object, name);
|
||||||
|
descriptor[type] = original;
|
||||||
|
Object.defineProperty(object, name, descriptor);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Object.seal(scope);
|
Object.seal(scope);
|
||||||
}());
|
}());
|
28
lib/frame.js
28
lib/frame.js
@ -125,7 +125,6 @@
|
|||||||
return settings.get(...args);
|
return settings.get(...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const interceptedWindows = new WeakMap();
|
const interceptedWindows = new WeakMap();
|
||||||
function interceptWindow(window){
|
function interceptWindow(window){
|
||||||
let wrappedTry;
|
let wrappedTry;
|
||||||
@ -144,10 +143,16 @@
|
|||||||
if (!enabled || interceptedWindows.get(wrappedWindow)){
|
if (!enabled || interceptedWindows.get(wrappedWindow)){
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (wrappedWindow.matchMedia(extensionSecret[0]) === extensionSecret[1]){
|
const canvasBlockerData = wrappedWindow.matchMedia(extensionSecret[0]);
|
||||||
|
if (canvasBlockerData.secret === extensionSecret[1]){
|
||||||
|
if (wrappedWindow.top === wrappedWindow){
|
||||||
|
canvasBlockerData.undoIntercept(extension.extensionID);
|
||||||
|
}
|
||||||
|
else {
|
||||||
interceptedWindows.set(wrappedWindow, true);
|
interceptedWindows.set(wrappedWindow, true);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
logging.message("intercepting window", window);
|
logging.message("intercepting window", window);
|
||||||
intercept(
|
intercept(
|
||||||
@ -168,17 +173,28 @@
|
|||||||
|
|
||||||
const matchMediaDescriptor = Object.getOwnPropertyDescriptor(wrappedWindow, "matchMedia");
|
const matchMediaDescriptor = Object.getOwnPropertyDescriptor(wrappedWindow, "matchMedia");
|
||||||
const originalMatchMedia = matchMediaDescriptor.value;
|
const originalMatchMedia = matchMediaDescriptor.value;
|
||||||
matchMediaDescriptor.value = extension.exportFunctionWithName(function matchMedia(query){
|
extension.changeProperty(window, "matchMedia", {
|
||||||
|
object: wrappedWindow,
|
||||||
|
name: "matchMedia",
|
||||||
|
type: "value",
|
||||||
|
changed: extension.exportFunctionWithName(function matchMedia(query){
|
||||||
if (query === extensionSecret[0]){
|
if (query === extensionSecret[0]){
|
||||||
return extensionSecret[1];
|
return {
|
||||||
|
secret: extensionSecret[1],
|
||||||
|
undoIntercept: function(token){
|
||||||
|
if (token === extension.extensionID){
|
||||||
|
extension.revertProperties(window);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return arguments.length > 1?
|
return arguments.length > 1?
|
||||||
originalMatchMedia.call(this, ...arguments):
|
originalMatchMedia.call(this, ...arguments):
|
||||||
originalMatchMedia.call(this, query);
|
originalMatchMedia.call(this, query);
|
||||||
}
|
}
|
||||||
}, window, originalMatchMedia.name);
|
}, window, originalMatchMedia.name)
|
||||||
Object.defineProperty(wrappedWindow, "matchMedia", matchMediaDescriptor);
|
});
|
||||||
|
|
||||||
interceptedWindows.set(wrappedWindow, true);
|
interceptedWindows.set(wrappedWindow, true);
|
||||||
return true;
|
return true;
|
||||||
|
@ -27,23 +27,12 @@
|
|||||||
if ((typeof changed) === "function"){
|
if ((typeof changed) === "function"){
|
||||||
changed = extension.exportFunctionWithName(changed, window, original.name);
|
changed = extension.exportFunctionWithName(changed, window, original.name);
|
||||||
}
|
}
|
||||||
descriptor[type] = changed;
|
extension.changeProperty(window, "iframeProtection", {object, name, type, changed});
|
||||||
Object.defineProperty(object, name, descriptor);
|
|
||||||
registerChangedProperty(object, name, descriptor, type, original);
|
|
||||||
}
|
|
||||||
const changedProperties = [];
|
|
||||||
// eslint-disable-next-line max-params
|
|
||||||
function registerChangedProperty(object, name, descriptor, type, original){
|
|
||||||
changedProperties.push({object, name, descriptor, type, original});
|
|
||||||
}
|
}
|
||||||
if (settings.isStillDefault){
|
if (settings.isStillDefault){
|
||||||
settings.onloaded(function(){
|
settings.onloaded(function(){
|
||||||
if (isWhitelisted(window.location)){
|
if (isWhitelisted(window.location)){
|
||||||
changedProperties.forEach(function({object, name, descriptor, type, original}){
|
extension.revertProperties(window, "iframeProtection");
|
||||||
descriptor[type] = original;
|
|
||||||
Object.defineProperty(object, name, descriptor);
|
|
||||||
});
|
|
||||||
changedProperties.length = 0;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -331,21 +331,22 @@
|
|||||||
});
|
});
|
||||||
const descriptor = Object.getOwnPropertyDescriptor(object, name);
|
const descriptor = Object.getOwnPropertyDescriptor(object, name);
|
||||||
if (!descriptor) return;
|
if (!descriptor) return;
|
||||||
|
const type = descriptor.hasOwnProperty("value")? "value": "get";
|
||||||
if (descriptor.hasOwnProperty("value")){
|
let changed;
|
||||||
|
if (type ==="value"){
|
||||||
if (changedFunction.fakeGenerator){
|
if (changedFunction.fakeGenerator){
|
||||||
descriptor.value = extension.exportFunctionWithName(
|
changed = extension.exportFunctionWithName(
|
||||||
changedFunction.fakeGenerator(checker, original, windowToProcess),
|
changedFunction.fakeGenerator(checker, original, windowToProcess),
|
||||||
windowToProcess,
|
windowToProcess,
|
||||||
original.name
|
original.name
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
descriptor.value = null;
|
changed = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
descriptor.get = extension.exportFunctionWithName(function(){
|
changed = extension.exportFunctionWithName(function(){
|
||||||
return extension.exportFunctionWithName(
|
return extension.exportFunctionWithName(
|
||||||
changedFunction.fakeGenerator(checker),
|
changedFunction.fakeGenerator(checker),
|
||||||
windowToProcess,
|
windowToProcess,
|
||||||
@ -353,7 +354,9 @@
|
|||||||
);
|
);
|
||||||
}, windowToProcess, descriptor.get.name);
|
}, windowToProcess, descriptor.get.name);
|
||||||
}
|
}
|
||||||
Object.defineProperty(object, name, descriptor);
|
extension.changeProperty(windowToProcess, changedFunction.api, {
|
||||||
|
object, name, type, changed
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -378,7 +381,12 @@
|
|||||||
window: windowToProcess, prefs, checkStack, ask, notify
|
window: windowToProcess, prefs, checkStack, ask, notify
|
||||||
});
|
});
|
||||||
const getter = changedGetter.getterGenerator(checker, original, windowToProcess);
|
const getter = changedGetter.getterGenerator(checker, original, windowToProcess);
|
||||||
descriptor.get = extension.exportFunctionWithName(getter, windowToProcess, original.name);
|
extension.changeProperty(windowToProcess, changedGetter.api,
|
||||||
|
{
|
||||||
|
object, name, type: "get",
|
||||||
|
changed: extension.exportFunctionWithName(getter, windowToProcess, original.name)
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
if (descriptor.hasOwnProperty("set") && descriptor.set && changedGetter.setterGenerator){
|
if (descriptor.hasOwnProperty("set") && descriptor.set && changedGetter.setterGenerator){
|
||||||
const original = descriptor.set;
|
const original = descriptor.set;
|
||||||
@ -387,10 +395,14 @@
|
|||||||
original,
|
original,
|
||||||
prefs
|
prefs
|
||||||
);
|
);
|
||||||
descriptor.set = extension.exportFunctionWithName(setter, windowToProcess, original.name);
|
extension.changeProperty(windowToProcess, changedGetter.api,
|
||||||
|
{
|
||||||
|
object, name, type: "set",
|
||||||
|
changed: extension.exportFunctionWithName(setter, windowToProcess, original.name)
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object.defineProperty(object, name, descriptor);
|
|
||||||
}
|
}
|
||||||
else if (
|
else if (
|
||||||
changedGetter.valueGenerator &&
|
changedGetter.valueGenerator &&
|
||||||
@ -405,7 +417,9 @@
|
|||||||
}
|
}
|
||||||
switch (functionStatus.mode){
|
switch (functionStatus.mode){
|
||||||
case "ask": case "block": case "fake":
|
case "ask": case "block": case "fake":
|
||||||
descriptor.value = changedGetter.valueGenerator({
|
extension.changeProperty(windowToProcess, changedGetter.api, {
|
||||||
|
object, name, type: "value",
|
||||||
|
changed: changedGetter.valueGenerator({
|
||||||
mode: functionStatus.mode,
|
mode: functionStatus.mode,
|
||||||
original: descriptor.value,
|
original: descriptor.value,
|
||||||
notify: function notifyCallback(messageId){
|
notify: function notifyCallback(messageId){
|
||||||
@ -418,8 +432,8 @@
|
|||||||
api: changedGetter.api
|
api: changedGetter.api
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
})
|
||||||
});
|
});
|
||||||
Object.defineProperty(object, name, descriptor);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,6 +109,10 @@
|
|||||||
{
|
{
|
||||||
"version": "1.1Alpha20192001",
|
"version": "1.1Alpha20192001",
|
||||||
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.1Alpha20192001-an+fx.xpi"
|
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.1Alpha20192001-an+fx.xpi"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"version": "1.1Alpha20192301",
|
||||||
|
"update_link": "https://canvasblocker.kkapsner.de/versions/canvasblocker_beta-1.1Alpha20192301-an+fx.xpi"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user