From 3f76b2c2e44edc608d5da96db6c7b105176837eb Mon Sep 17 00:00:00 2001 From: Andreu Botella Date: Sun, 9 Oct 2022 06:41:04 +0200 Subject: [PATCH 1/6] experiment(ext/web): Don't expose event classes during the bootstrap phase --- ext/broadcast_channel/01_broadcast_channel.js | 4 ++- ext/flash/01_http.js | 1 + ext/http/01_http.js | 1 + ext/web/02_event.js | 21 ++++++--------- ext/web/03_abort_signal.js | 4 +-- ext/web/04_global_interfaces.js | 2 +- ext/web/10_filereader.js | 2 ++ ext/web/13_message_port.js | 4 +-- ext/web/15_performance.js | 1 + ext/web/internal.d.ts | 11 ++++++++ ext/websocket/01_websocket.js | 4 ++- runtime/js/10_permissions.js | 10 +++---- runtime/js/11_workers.js | 4 ++- runtime/js/30_os.js | 4 ++- runtime/js/99_main.js | 26 +++++++++++-------- 15 files changed, 60 insertions(+), 39 deletions(-) diff --git a/ext/broadcast_channel/01_broadcast_channel.js b/ext/broadcast_channel/01_broadcast_channel.js index e14b597790a6bb..0682a2d5abd42d 100644 --- a/ext/broadcast_channel/01_broadcast_channel.js +++ b/ext/broadcast_channel/01_broadcast_channel.js @@ -8,7 +8,9 @@ const core = window.Deno.core; const ops = core.ops; const webidl = window.__bootstrap.webidl; - const { defineEventHandler, setTarget } = window.__bootstrap.event; + const { MessageEvent, defineEventHandler, setTarget } = + window.__bootstrap.event; + const { EventTarget } = window.__bootstrap.eventTarget; const { DOMException } = window.__bootstrap.domException; const { ArrayPrototypeIndexOf, diff --git a/ext/flash/01_http.js b/ext/flash/01_http.js index 17f99ca98e7810..441d5f5d9f0054 100644 --- a/ext/flash/01_http.js +++ b/ext/flash/01_http.js @@ -7,6 +7,7 @@ const { fromFlashRequest, toInnerResponse, _flash } = window.__bootstrap.fetch; const core = window.Deno.core; + const { Event } = window.__bootstrap.event; const { ReadableStream, ReadableStreamPrototype, diff --git a/ext/http/01_http.js b/ext/http/01_http.js index 588a7da5746a46..ab23cbec052751 100644 --- a/ext/http/01_http.js +++ b/ext/http/01_http.js @@ -4,6 +4,7 @@ ((window) => { const webidl = window.__bootstrap.webidl; const { InnerBody } = window.__bootstrap.fetchBody; + const { Event } = window.__bootstrap.event; const { setEventTargetData } = window.__bootstrap.eventTarget; const { BlobPrototype } = window.__bootstrap.file; const { diff --git a/ext/web/02_event.js b/ext/web/02_event.js index ee64b37197583f..d915b5f2074c73 100644 --- a/ext/web/02_event.js +++ b/ext/web/02_event.js @@ -1471,19 +1471,6 @@ reportException(error); } - window[webidl.brand] = webidl.brand; - window.Event = Event; - window.EventTarget = EventTarget; - window.ErrorEvent = ErrorEvent; - window.CloseEvent = CloseEvent; - window.MessageEvent = MessageEvent; - window.CustomEvent = CustomEvent; - window.ProgressEvent = ProgressEvent; - window.PromiseRejectionEvent = PromiseRejectionEvent; - window.dispatchEvent = EventTarget.prototype.dispatchEvent; - window.addEventListener = EventTarget.prototype.addEventListener; - window.removeEventListener = EventTarget.prototype.removeEventListener; - window.reportError = reportError; window.__bootstrap.eventTarget = { EventTarget, setEventTargetData, @@ -1494,5 +1481,13 @@ setIsTrusted, setTarget, defineEventHandler, + Event, + ErrorEvent, + CloseEvent, + MessageEvent, + CustomEvent, + ProgressEvent, + PromiseRejectionEvent, + reportError, }; })(this); diff --git a/ext/web/03_abort_signal.js b/ext/web/03_abort_signal.js index 39de8d0fc58b84..91046f8717357f 100644 --- a/ext/web/03_abort_signal.js +++ b/ext/web/03_abort_signal.js @@ -6,8 +6,8 @@ ((window) => { const webidl = window.__bootstrap.webidl; - const { setIsTrusted, defineEventHandler } = window.__bootstrap.event; - const { listenerCount } = window.__bootstrap.eventTarget; + const { Event, setIsTrusted, defineEventHandler } = window.__bootstrap.event; + const { EventTarget, listenerCount } = window.__bootstrap.eventTarget; const { Set, SetPrototypeAdd, diff --git a/ext/web/04_global_interfaces.js b/ext/web/04_global_interfaces.js index fcf8caea5d3983..503b8fd086bfe5 100644 --- a/ext/web/04_global_interfaces.js +++ b/ext/web/04_global_interfaces.js @@ -5,7 +5,7 @@ /// ((window) => { - const { EventTarget } = window; + const { EventTarget } = window.__bootstrap.eventTarget; const { Symbol, SymbolToStringTag, diff --git a/ext/web/10_filereader.js b/ext/web/10_filereader.js index c50635ea8cda08..8a76b2e0f1a39e 100644 --- a/ext/web/10_filereader.js +++ b/ext/web/10_filereader.js @@ -15,6 +15,8 @@ ((window) => { const webidl = window.__bootstrap.webidl; const { forgivingBase64Encode } = window.__bootstrap.infra; + const { ProgressEvent } = window.__bootstrap.event; + const { EventTarget } = window.__bootstrap.eventTarget; const { decode, TextDecoder } = window.__bootstrap.encoding; const { parseMimeType } = window.__bootstrap.mimesniff; const { DOMException } = window.__bootstrap.domException; diff --git a/ext/web/13_message_port.js b/ext/web/13_message_port.js index 1fbeeaff7b6a4e..253ed7ecd586e2 100644 --- a/ext/web/13_message_port.js +++ b/ext/web/13_message_port.js @@ -12,8 +12,8 @@ const core = window.Deno.core; const { InterruptedPrototype, ops } = core; const webidl = window.__bootstrap.webidl; - const { setEventTargetData } = window.__bootstrap.eventTarget; - const { defineEventHandler } = window.__bootstrap.event; + const { EventTarget, setEventTargetData } = window.__bootstrap.eventTarget; + const { MessageEvent, defineEventHandler } = window.__bootstrap.event; const { DOMException } = window.__bootstrap.domException; const { ArrayBufferPrototype, diff --git a/ext/web/15_performance.js b/ext/web/15_performance.js index e7eafd53377d04..556cfa774cd503 100644 --- a/ext/web/15_performance.js +++ b/ext/web/15_performance.js @@ -18,6 +18,7 @@ const { webidl, structuredClone } = window.__bootstrap; const consoleInternal = window.__bootstrap.console; + const { EventTarget } = window.__bootstrap.eventTarget; const { opNow } = window.__bootstrap.timers; const { DOMException } = window.__bootstrap.domException; diff --git a/ext/web/internal.d.ts b/ext/web/internal.d.ts index 04309a77ee63bd..a02f45a75c62ec 100644 --- a/ext/web/internal.d.ts +++ b/ext/web/internal.d.ts @@ -70,6 +70,17 @@ declare namespace globalThis { EventTarget: typeof EventTarget; }; + declare var event: { + Event: typeof event, + ErrorEvent: typeof ErrorEvent, + CloseEvent: typeof CloseEvent, + MessageEvent: typeof MessageEvent, + CustomEvent: typeof CustomEvent, + ProgressEvent: typeof ProgressEvent, + PromiseRejectionEvent: typeof PromiseRejectionEvent, + reportError: typeof reportError, + } + declare var location: { getLocationHref(): string | undefined; }; diff --git a/ext/websocket/01_websocket.js b/ext/websocket/01_websocket.js index f7bd820c0cb3b3..bf781b2f09abcc 100644 --- a/ext/websocket/01_websocket.js +++ b/ext/websocket/01_websocket.js @@ -10,7 +10,9 @@ const webidl = window.__bootstrap.webidl; const { HTTP_TOKEN_CODE_POINT_RE } = window.__bootstrap.infra; const { DOMException } = window.__bootstrap.domException; - const { defineEventHandler } = window.__bootstrap.event; + const { Event, ErrorEvent, CloseEvent, MessageEvent, defineEventHandler } = + window.__bootstrap.event; + const { EventTarget } = window.__bootstrap.eventTarget; const { Blob, BlobPrototype } = globalThis.__bootstrap.file; const { ArrayBufferPrototype, diff --git a/runtime/js/10_permissions.js b/runtime/js/10_permissions.js index 6aad0677d4278d..f048a5d62880c6 100644 --- a/runtime/js/10_permissions.js +++ b/runtime/js/10_permissions.js @@ -2,13 +2,11 @@ "use strict"; ((window) => { - const { - Event, - EventTarget, - Deno: { core: { ops } }, - __bootstrap: { webUtil: { illegalConstructorKey } }, - } = window; + const { ops } = Deno.core; + const { Event } = window.__bootstrap.event; + const { EventTarget } = window.__bootstrap.eventTarget; const { pathFromURL } = window.__bootstrap.util; + const { illegalConstructorKey } = window.__bootstrap.webUtil; const { ArrayIsArray, ArrayPrototypeIncludes, diff --git a/runtime/js/11_workers.js b/runtime/js/11_workers.js index 5e3253dff3ffc9..0d05ac671c69db 100644 --- a/runtime/js/11_workers.js +++ b/runtime/js/11_workers.js @@ -17,7 +17,9 @@ const { getLocationHref } = window.__bootstrap.location; const { serializePermissions } = window.__bootstrap.permissions; const { log } = window.__bootstrap.util; - const { defineEventHandler } = window.__bootstrap.event; + const { ErrorEvent, MessageEvent, defineEventHandler } = + window.__bootstrap.event; + const { EventTarget } = window.__bootstrap.eventTarget; const { deserializeJsMessageData, serializeJsMessageData, diff --git a/runtime/js/30_os.js b/runtime/js/30_os.js index c3addd0439beff..4fa71fa83252aa 100644 --- a/runtime/js/30_os.js +++ b/runtime/js/30_os.js @@ -4,12 +4,14 @@ ((window) => { const core = window.Deno.core; const ops = core.ops; + const { Event } = window.__bootstrap.event; + const { EventTarget } = window.__bootstrap.eventTarget; const { Error, SymbolFor, } = window.__bootstrap.primordials; - const windowDispatchEvent = window.dispatchEvent.bind(window); + const windowDispatchEvent = EventTarget.prototype.dispatchEvent.bind(window); function loadavg() { return ops.op_loadavg(); diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 0a65cadee27971..409ffac103c443 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -39,6 +39,7 @@ delete Intl.v8BreakIterator; WeakMapPrototypeSet, } = window.__bootstrap.primordials; const util = window.__bootstrap.util; + const event = window.__bootstrap.event; const eventTarget = window.__bootstrap.eventTarget; const globalInterfaces = window.__bootstrap.globalInterfaces; const location = window.__bootstrap.location; @@ -155,7 +156,7 @@ delete Intl.v8BreakIterator; const message = v[0]; const transferables = v[1]; - const msgEvent = new MessageEvent("message", { + const msgEvent = new event.MessageEvent("message", { cancelable: false, data: message, ports: transferables.filter((t) => @@ -166,7 +167,7 @@ delete Intl.v8BreakIterator; try { globalDispatchEvent(msgEvent); } catch (e) { - const errorEvent = new ErrorEvent("error", { + const errorEvent = new event.ErrorEvent("error", { cancelable: true, message: e.message, lineno: e.lineNumber ? e.lineNumber + 1 : undefined, @@ -403,29 +404,29 @@ delete Intl.v8BreakIterator; ByteLengthQueuingStrategy: util.nonEnumerable( streams.ByteLengthQueuingStrategy, ), - CloseEvent: util.nonEnumerable(CloseEvent), + CloseEvent: util.nonEnumerable(event.CloseEvent), CompressionStream: util.nonEnumerable(compression.CompressionStream), CountQueuingStrategy: util.nonEnumerable( streams.CountQueuingStrategy, ), CryptoKey: util.nonEnumerable(crypto.CryptoKey), - CustomEvent: util.nonEnumerable(CustomEvent), + CustomEvent: util.nonEnumerable(event.CustomEvent), DecompressionStream: util.nonEnumerable(compression.DecompressionStream), DOMException: util.nonEnumerable(domException.DOMException), - ErrorEvent: util.nonEnumerable(ErrorEvent), - Event: util.nonEnumerable(Event), - EventTarget: util.nonEnumerable(EventTarget), + ErrorEvent: util.nonEnumerable(event.ErrorEvent), + Event: util.nonEnumerable(event.Event), + EventTarget: util.nonEnumerable(eventTarget.EventTarget), File: util.nonEnumerable(file.File), FileReader: util.nonEnumerable(fileReader.FileReader), FormData: util.nonEnumerable(formData.FormData), Headers: util.nonEnumerable(headers.Headers), - MessageEvent: util.nonEnumerable(MessageEvent), + MessageEvent: util.nonEnumerable(event.MessageEvent), Performance: util.nonEnumerable(performance.Performance), PerformanceEntry: util.nonEnumerable(performance.PerformanceEntry), PerformanceMark: util.nonEnumerable(performance.PerformanceMark), PerformanceMeasure: util.nonEnumerable(performance.PerformanceMeasure), - PromiseRejectionEvent: util.nonEnumerable(PromiseRejectionEvent), - ProgressEvent: util.nonEnumerable(ProgressEvent), + PromiseRejectionEvent: util.nonEnumerable(event.PromiseRejectionEvent), + ProgressEvent: util.nonEnumerable(event.ProgressEvent), ReadableStream: util.nonEnumerable(streams.ReadableStream), ReadableStreamDefaultReader: util.nonEnumerable( streams.ReadableStreamDefaultReader, @@ -485,9 +486,12 @@ delete Intl.v8BreakIterator; SubtleCrypto: util.nonEnumerable(crypto.SubtleCrypto), fetch: util.writable(fetch.fetch), performance: util.writable(performance.performance), + reportError: util.writable(event.reportError), setInterval: util.writable(timers.setInterval), setTimeout: util.writable(timers.setTimeout), structuredClone: util.writable(messagePort.structuredClone), + // Branding as a WebIDL object + [webidl.brand]: util.nonEnumerable(webidl.brand), }; const unstableWindowOrWorkerGlobalScope = { @@ -615,7 +619,7 @@ delete Intl.v8BreakIterator; continue; } - const event = new PromiseRejectionEvent("unhandledrejection", { + const event = new event.PromiseRejectionEvent("unhandledrejection", { cancelable: true, promise, reason, From 3ec1dc88694663980f06c056d7510fa12ba2b790 Mon Sep 17 00:00:00 2001 From: Andreu Botella Date: Sun, 9 Oct 2022 07:00:02 +0200 Subject: [PATCH 2/6] Fix formatting --- ext/web/internal.d.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/web/internal.d.ts b/ext/web/internal.d.ts index a02f45a75c62ec..9e836aac036e5c 100644 --- a/ext/web/internal.d.ts +++ b/ext/web/internal.d.ts @@ -71,15 +71,15 @@ declare namespace globalThis { }; declare var event: { - Event: typeof event, - ErrorEvent: typeof ErrorEvent, - CloseEvent: typeof CloseEvent, - MessageEvent: typeof MessageEvent, - CustomEvent: typeof CustomEvent, - ProgressEvent: typeof ProgressEvent, - PromiseRejectionEvent: typeof PromiseRejectionEvent, - reportError: typeof reportError, - } + Event: typeof event; + ErrorEvent: typeof ErrorEvent; + CloseEvent: typeof CloseEvent; + MessageEvent: typeof MessageEvent; + CustomEvent: typeof CustomEvent; + ProgressEvent: typeof ProgressEvent; + PromiseRejectionEvent: typeof PromiseRejectionEvent; + reportError: typeof reportError; + }; declare var location: { getLocationHref(): string | undefined; From 4615a86195005628db858ed22bae42384c32c1a7 Mon Sep 17 00:00:00 2001 From: Andreu Botella Date: Sun, 9 Oct 2022 07:31:46 +0200 Subject: [PATCH 3/6] Fix name clash --- runtime/js/99_main.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 409ffac103c443..88da319d1835bb 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -619,11 +619,14 @@ delete Intl.v8BreakIterator; continue; } - const event = new event.PromiseRejectionEvent("unhandledrejection", { - cancelable: true, - promise, - reason, - }); + const rejectionEvent = new event.PromiseRejectionEvent( + "unhandledrejection", + { + cancelable: true, + promise, + reason, + }, + ); const errorEventCb = (event) => { if (event.error === reason) { @@ -634,12 +637,12 @@ delete Intl.v8BreakIterator; // if error is thrown during dispatch of "unhandledrejection" // event. globalThis.addEventListener("error", errorEventCb); - globalThis.dispatchEvent(event); + globalThis.dispatchEvent(rejectionEvent); globalThis.removeEventListener("error", errorEventCb); // If event was not prevented (or "unhandledrejection" listeners didn't // throw) we will let Rust side handle it. - if (event.defaultPrevented) { + if (rejectionEvent.defaultPrevented) { ops.op_remove_pending_promise_exception(promise); } } From c6508ecc917f6f220a1948bf7b82b323585ac340 Mon Sep 17 00:00:00 2001 From: Andreu Botella Date: Sun, 9 Oct 2022 19:50:02 +0200 Subject: [PATCH 4/6] . --- ext/web/03_abort_signal.js | 4 ++-- runtime/js/99_main.js | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ext/web/03_abort_signal.js b/ext/web/03_abort_signal.js index 91046f8717357f..2fa3c4bcf46192 100644 --- a/ext/web/03_abort_signal.js +++ b/ext/web/03_abort_signal.js @@ -185,9 +185,9 @@ } } - window.AbortSignal = AbortSignal; - window.AbortController = AbortController; window.__bootstrap.abortSignal = { + AbortSignal, + AbortController, AbortSignalPrototype, add, signalAbort, diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 88da319d1835bb..5269d9feb6ca0f 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -78,6 +78,7 @@ delete Intl.v8BreakIterator; const errors = window.__bootstrap.errors.errors; const webidl = window.__bootstrap.webidl; const domException = window.__bootstrap.domException; + const abortSignal = window.__bootstrap.abortSignal; const { defineEventHandler, reportException } = window.__bootstrap.event; const { deserializeJsMessageData, serializeJsMessageData } = window.__bootstrap.messagePort; @@ -400,6 +401,8 @@ delete Intl.v8BreakIterator; // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope const windowOrWorkerGlobalScope = { + AbortController: util.nonEnumerable(abortSignal.AbortController), + AbortSignal: util.nonEnumerable(abortSignal.AbortSignal), Blob: util.nonEnumerable(file.Blob), ByteLengthQueuingStrategy: util.nonEnumerable( streams.ByteLengthQueuingStrategy, From e828f00b52db560613b072c384dc46b03973a559 Mon Sep 17 00:00:00 2001 From: Andreu Botella Date: Mon, 10 Oct 2022 03:53:40 +0200 Subject: [PATCH 5/6] Update WPT expectations --- tools/wpt/expectation.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/wpt/expectation.json b/tools/wpt/expectation.json index 828eb079d7829d..aea4f578d86aec 100644 --- a/tools/wpt/expectation.json +++ b/tools/wpt/expectation.json @@ -1132,9 +1132,7 @@ "Event interface: calling initEvent(DOMString, optional boolean, optional boolean) on new CustomEvent(\"foo\") with too few arguments must throw TypeError", "EventTarget interface: operation addEventListener(DOMString, EventListener?, optional (AddEventListenerOptions or boolean))", "EventTarget interface: operation removeEventListener(DOMString, EventListener?, optional (EventListenerOptions or boolean))", - "AbortController interface: existence and properties of interface object", "AbortController interface: operation abort(optional any)", - "AbortSignal interface: existence and properties of interface object", "AbortSignal interface: operation abort(optional any)", "AbortSignal interface: operation timeout(unsigned long long)", "AbortSignal interface: attribute onabort" From dea162bf29bd3932b4f4071c2a2ba66f0c4f0ce1 Mon Sep 17 00:00:00 2001 From: Andreu Botella Date: Mon, 10 Oct 2022 07:05:43 +0200 Subject: [PATCH 6/6] Bump CI