mirror of
https://github.com/MercuryWorkshop/scramjet.git
synced 2025-05-13 22:40:01 -04:00
properly rewrite postmessage
This commit is contained in:
parent
34c3cc5094
commit
c2d147442e
9 changed files with 134 additions and 17 deletions
81
src/client/shared/event.ts
Normal file
81
src/client/shared/event.ts
Normal file
|
@ -0,0 +1,81 @@
|
|||
import { iswindow } from "..";
|
||||
import { ScramjetClient } from "../client";
|
||||
|
||||
const realOnEvent = Symbol.for("scramjet original onevent function");
|
||||
|
||||
export default function (client: ScramjetClient, self: Self) {
|
||||
const handlers = {
|
||||
message: {
|
||||
origin() {
|
||||
return this.data.$scramjet$origin;
|
||||
},
|
||||
data() {
|
||||
return this.data.$scramjet$data;
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
function wraplistener(listener: (...args: any) => any) {
|
||||
return new Proxy(listener, {
|
||||
apply(target, thisArg, argArray) {
|
||||
const realEvent: Event = argArray[0];
|
||||
|
||||
// we only need to handle events dispatched from the browser
|
||||
if (realEvent.isTrusted) {
|
||||
const type = realEvent.type;
|
||||
|
||||
if (type in handlers) {
|
||||
let handler = handlers[type];
|
||||
argArray[0] = new Proxy(realEvent, {
|
||||
get(_target, prop, reciever) {
|
||||
if (prop in handler) {
|
||||
return handler[prop].call(_target);
|
||||
}
|
||||
|
||||
return Reflect.get(target, prop, reciever);
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return listener.apply(self, argArray);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
client.Proxy("EventTarget.prototype.addEventListener", {
|
||||
apply(ctx) {
|
||||
ctx.args[1] = wraplistener(ctx.args[1]);
|
||||
},
|
||||
});
|
||||
|
||||
if (!iswindow) return;
|
||||
|
||||
const targets = [self.window, self.HTMLElement.prototype];
|
||||
|
||||
for (const target of targets) {
|
||||
const keys = Reflect.ownKeys(target);
|
||||
|
||||
for (const key of keys) {
|
||||
if (typeof key === "string" && key.startsWith("on")) {
|
||||
const descriptor = Object.getOwnPropertyDescriptor(target, key);
|
||||
if (!descriptor.get || !descriptor.set || !descriptor.configurable)
|
||||
continue;
|
||||
|
||||
// these are the `onmessage`, `onclick`, etc. properties
|
||||
client.RawTrap(target, key, {
|
||||
get(ctx) {
|
||||
if (this[realOnEvent]) return this[realOnEvent];
|
||||
|
||||
return ctx.get();
|
||||
},
|
||||
set(ctx, value: any) {
|
||||
this[realOnEvent] = value;
|
||||
|
||||
ctx.set(wraplistener(value));
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue