use unproxy instead of replacing this on the windowprxy

This commit is contained in:
velzie 2024-07-30 13:04:55 -04:00
parent 12b17bc3b4
commit 7289a329c4
No known key found for this signature in database
GPG key ID: 048413F95F0DDE1F
4 changed files with 50 additions and 41 deletions

View file

@ -174,27 +174,4 @@ export default function (client: ScramjetClient, self: typeof window) {
return ctx.set(value); return ctx.set(value);
}, },
}); });
// an automated approach to cleaning the documentProxy from dom functions
// it will trigger an illegal invocation if you pass the proxy to c++ code, we gotta hotswap it out with the real one
for (const target of [
self.Node.prototype,
self.MutationObserver.prototype,
self.document,
]) {
for (const prop in target) {
try {
if (typeof target[prop] === "function") {
client.RawProxy(target, prop, {
apply(ctx) {
for (const i in ctx.args) {
if (ctx.args[i] === client.documentProxy)
ctx.args[i] = self.document;
}
},
});
}
} catch (e) {}
}
}
} }

View file

@ -0,0 +1,49 @@
import { iswindow } from "..";
import { ScramjetClient } from "../client";
export default function (client: ScramjetClient, self: typeof window) {
// an automated approach to cleaning the documentProxy from dom functions
// it will trigger an illegal invocation if you pass the proxy to c++ code, we gotta hotswap it out with the real one
for (const target of [self]) {
for (const prop in target) {
try {
if (typeof target[prop] === "function") {
client.RawProxy(target, prop, {
apply(ctx) {
if (ctx.this == client.windowProxy) ctx.this = self;
for (const i in ctx.args) {
if (ctx.args[i] === client.windowProxy)
ctx.args[i] = self.global;
}
},
});
}
} catch (e) {}
}
}
if (!iswindow) return;
for (const target of [
self.Node.prototype,
self.MutationObserver.prototype,
self.document,
]) {
for (const prop in target) {
try {
if (typeof target[prop] === "function") {
client.RawProxy(target, prop, {
apply(ctx) {
for (const i in ctx.args) {
if (ctx.args[i] === client.documentProxy)
ctx.args[i] = self.document;
if (ctx.this === client.documentProxy) ctx.this = self.document;
}
},
});
}
} catch (e) {}
}
}
}

View file

@ -89,7 +89,7 @@ export default function (client: ScramjetClient, self: typeof globalThis) {
} }
} }
self.$scramerr = function scramerr(e) { self.$scramerr = function scramerr(e) {
// console.error("CAUGHT ERROR", e); // console.warn("CAUGHT ERROR", e);
}; };
self.$scramdbg = function scramdbg(args, t) { self.$scramdbg = function scramdbg(args, t) {

View file

@ -24,15 +24,6 @@ export function createWindowProxy(
const value = Reflect.get(target, prop); const value = Reflect.get(target, prop);
// this is bad! i don't know what the right thing to do is
if (typeof value === "function") {
return new Proxy(value, {
apply(_target, thisArg, argArray) {
return value.apply(self, argArray);
},
});
}
return value; return value;
}, },
@ -74,14 +65,6 @@ export function createDocumentProxy(
const value = Reflect.get(target, prop); const value = Reflect.get(target, prop);
if (typeof value === "function") {
return new Proxy(value, {
apply(_target, thisArg, argArray) {
return value.apply(self.document, argArray);
},
});
}
return value; return value;
}, },
set(target, prop, newValue) { set(target, prop, newValue) {