diff --git a/src/client/dom/open.ts b/src/client/dom/open.ts index 294adfa..62c6fa9 100644 --- a/src/client/dom/open.ts +++ b/src/client/dom/open.ts @@ -6,7 +6,10 @@ export default function (client: ScramjetClient) { apply(ctx) { if (ctx.args[0]) ctx.args[0] = encodeUrl(ctx.args[0]); - const realwin = ctx.fn.apply(this, ctx.args); + if (["_parent", "_top", "_unfencedTop"].includes(ctx.args[1])) + ctx.args[1] = "_self"; + + const realwin = ctx.fn.apply(ctx.this, ctx.args); if (ScramjetClient.SCRAMJET in realwin.self) { return ctx.return(realwin.self[ScramjetClient.SCRAMJET].windowProxy); diff --git a/src/shared/rewriters/html.ts b/src/shared/rewriters/html.ts index ce82ef5..fad29d9 100644 --- a/src/shared/rewriters/html.ts +++ b/src/shared/rewriters/html.ts @@ -55,6 +55,8 @@ function traverseParsedHtml(node, origin?: URL) { "video", ].includes(node.name) ) { + if (["_parent", "_top", "_unfencedTop"].includes(node.attribs["target"])) + node.attribs["target"] = "_self"; const value = node.attribs[urlAttr]; node.attribs[`data-${urlAttr}`] = value; node.attribs[urlAttr] = encodeUrl(value, origin);