|
import { ScramjetClient } from "../client";
|
|
import { SCRAMJETCLIENT } from "../../symbols";
|
|
import { rewriteUrl } from "../../shared/rewriters/url";
|
|
|
|
export default function (client: ScramjetClient) {
|
|
client.Proxy("window.open", {
|
|
apply(ctx) {
|
|
if (ctx.args[0]) ctx.args[0] = rewriteUrl(ctx.args[0], client.meta);
|
|
|
|
if (ctx.args[1] === "_top" || ctx.args[1] === "_unfencedTop")
|
|
ctx.args[1] = client.meta.topFrameName;
|
|
if (ctx.args[1] === "_parent") ctx.args[1] = client.meta.parentFrameName;
|
|
|
|
const realwin = ctx.call();
|
|
|
|
if (!realwin) return ctx.return(realwin);
|
|
|
|
if (SCRAMJETCLIENT in realwin) {
|
|
return ctx.return(realwin[SCRAMJETCLIENT].globalProxy);
|
|
} else {
|
|
const newclient = new ScramjetClient(realwin);
|
|
|
|
newclient.hook();
|
|
|
|
return ctx.return(newclient.globalProxy);
|
|
}
|
|
},
|
|
});
|
|
|
|
|
|
client.Trap("opener", {
|
|
get(ctx) {
|
|
const realwin = ctx.get() as Window;
|
|
|
|
if (realwin && SCRAMJETCLIENT in realwin) {
|
|
return realwin[SCRAMJETCLIENT].globalProxy;
|
|
} else {
|
|
|
|
return undefined;
|
|
}
|
|
},
|
|
});
|
|
|
|
client.Trap("window.frameElement", {
|
|
get(ctx) {
|
|
const f = ctx.get() as HTMLIFrameElement | null;
|
|
if (!f) return f;
|
|
|
|
const win = f.ownerDocument.defaultView;
|
|
if (win[SCRAMJETCLIENT]) {
|
|
|
|
return f;
|
|
} else {
|
|
|
|
return null;
|
|
}
|
|
},
|
|
});
|
|
}
|
|
|