mirror of
https://github.com/MercuryWorkshop/scramjet.git
synced 2025-05-13 06:20:02 -04:00
event target
This commit is contained in:
parent
5f7a9d4bd4
commit
08ccb4f56e
6 changed files with 48 additions and 5 deletions
|
@ -8,6 +8,7 @@ import { createLocationProxy } from "./location";
|
||||||
import { nativeGetOwnPropertyDescriptor } from "./natives";
|
import { nativeGetOwnPropertyDescriptor } from "./natives";
|
||||||
import { CookieStore, config, decodeUrl, encodeUrl } from "../shared";
|
import { CookieStore, config, decodeUrl, encodeUrl } from "../shared";
|
||||||
import { createWrapFn } from "./shared/wrap";
|
import { createWrapFn } from "./shared/wrap";
|
||||||
|
import { NavigateEvent } from "./events";
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface Window {
|
interface Window {
|
||||||
|
@ -26,6 +27,7 @@ export type ProxyCtx = {
|
||||||
args: any[];
|
args: any[];
|
||||||
newTarget: AnyFunction;
|
newTarget: AnyFunction;
|
||||||
return: (r: any) => void;
|
return: (r: any) => void;
|
||||||
|
call: () => any;
|
||||||
};
|
};
|
||||||
export type Proxy = {
|
export type Proxy = {
|
||||||
construct?(ctx: ProxyCtx): any;
|
construct?(ctx: ProxyCtx): any;
|
||||||
|
@ -140,9 +142,15 @@ export class ScramjetClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
set url(url: URL | string) {
|
set url(url: URL | string) {
|
||||||
if (typeof url === "string") url = new URL(url);
|
if (url instanceof URL) url = url.toString();
|
||||||
|
|
||||||
self.location.href = encodeUrl(url.href);
|
const ev = new NavigateEvent(url);
|
||||||
|
if (this.frame) {
|
||||||
|
this.frame.dispatchEvent(ev);
|
||||||
|
}
|
||||||
|
if (ev.defaultPrevented) return;
|
||||||
|
|
||||||
|
self.location.href = encodeUrl(ev.url);
|
||||||
}
|
}
|
||||||
|
|
||||||
// below are the utilities for proxying and trapping dom APIs
|
// below are the utilities for proxying and trapping dom APIs
|
||||||
|
@ -192,6 +200,7 @@ export class ScramjetClient {
|
||||||
return: (r: any) => {
|
return: (r: any) => {
|
||||||
returnValue = r;
|
returnValue = r;
|
||||||
},
|
},
|
||||||
|
call: () => alert("todo"),
|
||||||
};
|
};
|
||||||
|
|
||||||
handler.construct(ctx);
|
handler.construct(ctx);
|
||||||
|
@ -218,6 +227,10 @@ export class ScramjetClient {
|
||||||
earlyreturn = true;
|
earlyreturn = true;
|
||||||
returnValue = r;
|
returnValue = r;
|
||||||
},
|
},
|
||||||
|
call: () => {
|
||||||
|
earlyreturn = true;
|
||||||
|
returnValue = Reflect.apply(ctx.fn, ctx.this, ctx.args);
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const pst = Error.prepareStackTrace;
|
const pst = Error.prepareStackTrace;
|
||||||
|
|
|
@ -1,16 +1,25 @@
|
||||||
import { ScramjetClient } from "../client";
|
import { ScramjetClient } from "../client";
|
||||||
import { encodeUrl } from "../../shared";
|
import { encodeUrl } from "../../shared";
|
||||||
|
import { UrlChangeEvent } from "../events";
|
||||||
|
|
||||||
export default function (client: ScramjetClient, self: typeof globalThis) {
|
export default function (client: ScramjetClient, self: typeof globalThis) {
|
||||||
client.Proxy("history.pushState", {
|
client.Proxy("history.pushState", {
|
||||||
apply(ctx) {
|
apply(ctx) {
|
||||||
ctx.args[2] = encodeUrl(ctx.args[2]);
|
ctx.args[2] = encodeUrl(ctx.args[2]);
|
||||||
|
ctx.call();
|
||||||
|
|
||||||
|
const ev = new UrlChangeEvent(client.url.href);
|
||||||
|
if (client.frame) client.frame.dispatchEvent(ev);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
client.Proxy("history.replaceState", {
|
client.Proxy("history.replaceState", {
|
||||||
apply(ctx) {
|
apply(ctx) {
|
||||||
ctx.args[2] = encodeUrl(ctx.args[2]);
|
ctx.args[2] = encodeUrl(ctx.args[2]);
|
||||||
|
ctx.call();
|
||||||
|
|
||||||
|
const ev = new UrlChangeEvent(client.url.href);
|
||||||
|
if (client.frame) client.frame.dispatchEvent(ev);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
11
src/client/events.ts
Normal file
11
src/client/events.ts
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
export class NavigateEvent extends Event {
|
||||||
|
constructor(public url: string) {
|
||||||
|
super("navigate");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class UrlChangeEvent extends Event {
|
||||||
|
constructor(public url: string) {
|
||||||
|
super("urlchange");
|
||||||
|
}
|
||||||
|
}
|
|
@ -26,7 +26,7 @@ export class ScramjetController {
|
||||||
client: "/scramjet.client.js",
|
client: "/scramjet.client.js",
|
||||||
codecs: "/scramjet.codecs.js",
|
codecs: "/scramjet.codecs.js",
|
||||||
flags: {
|
flags: {
|
||||||
serviceworkers: false,
|
serviceworkers: true,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
4
src/types.d.ts
vendored
4
src/types.d.ts
vendored
|
@ -1,4 +1,4 @@
|
||||||
import { ScramjetController } from "./bootsrapper/index";
|
import { ScramjetController } from "./controller/index";
|
||||||
import { encodeUrl, decodeUrl } from "./shared/rewriters/url";
|
import { encodeUrl, decodeUrl } from "./shared/rewriters/url";
|
||||||
import { rewriteCss } from "./shared/rewriters/css";
|
import { rewriteCss } from "./shared/rewriters/css";
|
||||||
import {
|
import {
|
||||||
|
@ -21,6 +21,7 @@ import { ScramjetFrame } from "./controller/frame";
|
||||||
|
|
||||||
type ScramjetFlags = {
|
type ScramjetFlags = {
|
||||||
serviceworkers: boolean;
|
serviceworkers: boolean;
|
||||||
|
naiiverewriter: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
interface ScramjetConfig {
|
interface ScramjetConfig {
|
||||||
|
@ -39,6 +40,7 @@ interface ScramjetConfig {
|
||||||
client: string;
|
client: string;
|
||||||
codecs: string;
|
codecs: string;
|
||||||
flags: ScramjetFlags;
|
flags: ScramjetFlags;
|
||||||
|
siteflags?: Record<string, ScramjetFlags>;
|
||||||
}
|
}
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
|
|
10
static/ui.js
10
static/ui.js
|
@ -153,6 +153,10 @@ function App() {
|
||||||
|
|
||||||
const frame = scramjet.createFrame();
|
const frame = scramjet.createFrame();
|
||||||
|
|
||||||
|
frame.addEventListener("urlchange", (e) => {
|
||||||
|
this.url = e.url;
|
||||||
|
});
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<div>
|
<div>
|
||||||
<h1>Percury Unblocker</h1>
|
<h1>Percury Unblocker</h1>
|
||||||
|
@ -185,7 +189,11 @@ function App() {
|
||||||
</div>
|
</div>
|
||||||
<div class=${[flex, "nav"]} style="width: 60%">
|
<div class=${[flex, "nav"]} style="width: 60%">
|
||||||
<button on:click=${() => frame.back()}><-</button>
|
<button on:click=${() => frame.back()}><-</button>
|
||||||
<input class="bar" style="flex: 1" bind:value=${use(store.url)} on:input=${(e) => (store.url = e.target.value)} on:keyup=${(e) => e.keyCode == 13 && frame.go(e.target.value)}></input>
|
<input class="bar" style="flex: 1" bind:value=${use(this.url)} on:input=${(
|
||||||
|
e
|
||||||
|
) => {
|
||||||
|
this.url = e.target.value;
|
||||||
|
}} on:keyup=${(e) => e.keyCode == 13 && frame.go(e.target.value) && (store.url = this.url)}></input>
|
||||||
<button on:click=${() => frame.forward()}>-></button>
|
<button on:click=${() => frame.forward()}>-></button>
|
||||||
</div>
|
</div>
|
||||||
${frame.frame}
|
${frame.frame}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue