From 8d2ab5ac8bcc5751613579d8e98d5f01c7cdd60c Mon Sep 17 00:00:00 2001 From: velzie Date: Sun, 25 Aug 2024 20:17:45 -0400 Subject: [PATCH] properly? handle getOwnPropertyDescriptor --- src/client/client.ts | 2 ++ src/client/document.ts | 2 ++ src/client/global.ts | 2 ++ src/client/helpers.ts | 26 ++++++++++++++++++++++++++ src/client/shared/event.ts | 3 +++ src/shared/rewriters/html.ts | 1 - 6 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 src/client/helpers.ts diff --git a/src/client/client.ts b/src/client/client.ts index 0f4df70..3d4f96a 100644 --- a/src/client/client.ts +++ b/src/client/client.ts @@ -1,5 +1,6 @@ import { createDocumentProxy } from "./document"; import { createGlobalProxy } from "./global"; +import { getOwnPropertyDescriptorHandler } from "./helpers"; import { createLocationProxy } from "./location"; import { CookieStore, decodeUrl } from "./shared"; @@ -191,6 +192,7 @@ export class ScramjetClient { }; } + h.getOwnPropertyDescriptor = getOwnPropertyDescriptorHandler; target[prop] = new Proxy(value, h); } Trap(name: string | string[], descriptor: Trap): PropertyDescriptor { diff --git a/src/client/document.ts b/src/client/document.ts index 4ac928e..b7ffd58 100644 --- a/src/client/document.ts +++ b/src/client/document.ts @@ -1,5 +1,6 @@ import { encodeUrl } from "../shared/rewriters/url"; import { ScramjetClient } from "./client"; +import { getOwnPropertyDescriptorHandler } from "./helpers"; export function createDocumentProxy( client: ScramjetClient, @@ -26,5 +27,6 @@ export function createDocumentProxy( return Reflect.set(target, prop, newValue); }, + getOwnPropertyDescriptor: getOwnPropertyDescriptorHandler, }); } diff --git a/src/client/global.ts b/src/client/global.ts index 5b3b6a1..d0b528f 100644 --- a/src/client/global.ts +++ b/src/client/global.ts @@ -2,6 +2,7 @@ import { encodeUrl } from "./shared"; import { ScramjetClient } from "./client"; import { indirectEval } from "./shared/eval"; import { config } from "./shared"; +import { getOwnPropertyDescriptorHandler } from "./helpers"; export function createGlobalProxy( client: ScramjetClient, @@ -51,5 +52,6 @@ export function createGlobalProxy( return Reflect.defineProperty(target, property, attributes); }, + getOwnPropertyDescriptor: getOwnPropertyDescriptorHandler, }); } diff --git a/src/client/helpers.ts b/src/client/helpers.ts new file mode 100644 index 0000000..b235775 --- /dev/null +++ b/src/client/helpers.ts @@ -0,0 +1,26 @@ +export function getOwnPropertyDescriptorHandler(target, prop) { + let realDescriptor = Reflect.getOwnPropertyDescriptor(target, prop); + if (!realDescriptor) return realDescriptor; + + let d: PropertyDescriptor = {}; + + if (realDescriptor.enumerable !== undefined) + d.enumerable = realDescriptor.enumerable; + if (realDescriptor.configurable !== undefined) + d.configurable = realDescriptor.configurable; + if (realDescriptor.writable !== undefined) + d.writable = realDescriptor.writable; + + if (realDescriptor.get) { + d.get = () => this.get(target, prop); + } + + if (realDescriptor.set) { + d.set = (value) => this.set(target, prop, value); + } + + if (realDescriptor.value) { + d.value = this.get(target, prop); + } + return d; +} diff --git a/src/client/shared/event.ts b/src/client/shared/event.ts index 1e3046b..fa12395 100644 --- a/src/client/shared/event.ts +++ b/src/client/shared/event.ts @@ -1,5 +1,6 @@ import { iswindow } from ".."; import { ScramjetClient } from "../client"; +import { getOwnPropertyDescriptorHandler } from "../helpers"; import { unproxy } from "./unproxy"; const realOnEvent = Symbol.for("scramjet original onevent function"); @@ -66,12 +67,14 @@ export default function (client: ScramjetClient, self: Self) { return Reflect.get(target, prop, reciever); }, + getOwnPropertyDescriptor: getOwnPropertyDescriptorHandler, }); } } return Reflect.apply(target, thisArg, argArray); }, + getOwnPropertyDescriptor: getOwnPropertyDescriptorHandler, }); } diff --git a/src/shared/rewriters/html.ts b/src/shared/rewriters/html.ts index 55eb032..f05db2c 100644 --- a/src/shared/rewriters/html.ts +++ b/src/shared/rewriters/html.ts @@ -103,7 +103,6 @@ export const htmlRules: { fn: (value: string, origin: URL) => { if (["_parent", "_top", "_unfencedTop"].includes(value)) return "_self"; - console.log(value, origin); return encodeUrl(value, origin); },