summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--extensions/broadcast_channel/01_broadcast_channel.js2
-rw-r--r--extensions/timers/02_performance.js (renamed from runtime/js/40_performance.js)12
-rw-r--r--extensions/timers/lib.rs1
-rw-r--r--extensions/web/02_structured_clone.js73
-rw-r--r--extensions/web/lib.rs1
-rw-r--r--runtime/js/01_web_util.js60
6 files changed, 82 insertions, 67 deletions
diff --git a/extensions/broadcast_channel/01_broadcast_channel.js b/extensions/broadcast_channel/01_broadcast_channel.js
index 7670b0cfd..c2937105e 100644
--- a/extensions/broadcast_channel/01_broadcast_channel.js
+++ b/extensions/broadcast_channel/01_broadcast_channel.js
@@ -105,7 +105,7 @@
constructor(name) {
super();
- const prefix = "Failed to construct 'broadcastChannel'";
+ const prefix = "Failed to construct 'BroadcastChannel'";
webidl.requiredArguments(arguments.length, 1, { prefix });
this[_name] = webidl.converters["DOMString"](name, {
diff --git a/runtime/js/40_performance.js b/extensions/timers/02_performance.js
index 24c35b5c0..bca98fdbd 100644
--- a/runtime/js/40_performance.js
+++ b/extensions/timers/02_performance.js
@@ -2,10 +2,9 @@
"use strict";
((window) => {
+ const { webidl, structuredClone } = window.__bootstrap;
const { opNow } = window.__bootstrap.timers;
- const { cloneValue, illegalConstructorKey } = window.__bootstrap.webUtil;
- const { requiredArguments } = window.__bootstrap.webUtil;
-
+ const illegalConstructorKey = Symbol("illegalConstructorKey");
const customInspect = Symbol.for("Deno.customInspect");
let performanceEntries = [];
@@ -118,7 +117,8 @@
name,
options = {},
) {
- requiredArguments("PerformanceMark", arguments.length, 1);
+ const prefix = "Failed to construct 'PerformanceMark'";
+ webidl.requiredArguments(arguments.length, 1, { prefix });
// ensure options is object-ish, or null-ish
switch (typeof options) {
@@ -138,7 +138,7 @@
if (startTime < 0) {
throw new TypeError("startTime cannot be negative");
}
- this.#detail = cloneValue(detail);
+ this.#detail = structuredClone(detail);
}
toJSON() {
@@ -184,7 +184,7 @@
throw new TypeError("Illegal constructor.");
}
super(name, "measure", startTime, duration, illegalConstructorKey);
- this.#detail = cloneValue(detail);
+ this.#detail = structuredClone(detail);
}
toJSON() {
diff --git a/extensions/timers/lib.rs b/extensions/timers/lib.rs
index e9580c4b5..66e7d05ed 100644
--- a/extensions/timers/lib.rs
+++ b/extensions/timers/lib.rs
@@ -45,6 +45,7 @@ pub fn init<P: TimersPermission + 'static>() -> Extension {
.js(include_js_files!(
prefix "deno:extensions/timers",
"01_timers.js",
+ "02_performance.js",
))
.ops(vec![
("op_global_timer_stop", op_sync(op_global_timer_stop)),
diff --git a/extensions/web/02_structured_clone.js b/extensions/web/02_structured_clone.js
new file mode 100644
index 000000000..2170095d9
--- /dev/null
+++ b/extensions/web/02_structured_clone.js
@@ -0,0 +1,73 @@
+// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license.
+
+// @ts-check
+/// <reference path="../../core/lib.deno_core.d.ts" />
+/// <reference path="../web/internal.d.ts" />
+/// <reference path="../web/lib.deno_web.d.ts" />
+
+"use strict";
+
+((window) => {
+ const core = window.Deno.core;
+
+ const objectCloneMemo = new WeakMap();
+
+ function cloneArrayBuffer(
+ srcBuffer,
+ srcByteOffset,
+ srcLength,
+ _cloneConstructor,
+ ) {
+ // this function fudges the return type but SharedArrayBuffer is disabled for a while anyway
+ return srcBuffer.slice(
+ srcByteOffset,
+ srcByteOffset + srcLength,
+ );
+ }
+
+ /** Clone a value in a similar way to structured cloning. It is similar to a
+* StructureDeserialize(StructuredSerialize(...)). */
+ function structuredClone(value) {
+ // Performance optimization for buffers, otherwise
+ // `serialize/deserialize` will allocate new buffer.
+ if (value instanceof ArrayBuffer) {
+ const cloned = cloneArrayBuffer(
+ value,
+ 0,
+ value.byteLength,
+ ArrayBuffer,
+ );
+ objectCloneMemo.set(value, cloned);
+ return cloned;
+ }
+ if (ArrayBuffer.isView(value)) {
+ const clonedBuffer = structuredClone(value.buffer);
+ // Use DataViewConstructor type purely for type-checking, can be a
+ // DataView or TypedArray. They use the same constructor signature,
+ // only DataView has a length in bytes and TypedArrays use a length in
+ // terms of elements, so we adjust for that.
+ let length;
+ if (value instanceof DataView) {
+ length = value.byteLength;
+ } else {
+ length = value.length;
+ }
+ return new (value.constructor)(
+ clonedBuffer,
+ value.byteOffset,
+ length,
+ );
+ }
+
+ try {
+ return core.deserialize(core.serialize(value));
+ } catch (e) {
+ if (e instanceof TypeError) {
+ throw new DOMException("Uncloneable value", "DataCloneError");
+ }
+ throw e;
+ }
+ }
+
+ window.__bootstrap.structuredClone = structuredClone;
+})(globalThis);
diff --git a/extensions/web/lib.rs b/extensions/web/lib.rs
index 2f2f15942..95adb822a 100644
--- a/extensions/web/lib.rs
+++ b/extensions/web/lib.rs
@@ -33,6 +33,7 @@ pub fn init() -> Extension {
"01_dom_exception.js",
"01_mimesniff.js",
"02_event.js",
+ "02_structured_clone.js",
"03_abort_signal.js",
"04_global_interfaces.js",
"05_base64.js",
diff --git a/runtime/js/01_web_util.js b/runtime/js/01_web_util.js
index 5960691eb..11294a9bb 100644
--- a/runtime/js/01_web_util.js
+++ b/runtime/js/01_web_util.js
@@ -17,65 +17,6 @@
}
}
- const objectCloneMemo = new WeakMap();
-
- function cloneArrayBuffer(
- srcBuffer,
- srcByteOffset,
- srcLength,
- _cloneConstructor,
- ) {
- // this function fudges the return type but SharedArrayBuffer is disabled for a while anyway
- return srcBuffer.slice(
- srcByteOffset,
- srcByteOffset + srcLength,
- );
- }
-
- /** Clone a value in a similar way to structured cloning. It is similar to a
- * StructureDeserialize(StructuredSerialize(...)). */
- function cloneValue(value) {
- // Performance optimization for buffers, otherwise
- // `serialize/deserialize` will allocate new buffer.
- if (value instanceof ArrayBuffer) {
- const cloned = cloneArrayBuffer(
- value,
- 0,
- value.byteLength,
- ArrayBuffer,
- );
- objectCloneMemo.set(value, cloned);
- return cloned;
- }
- if (ArrayBuffer.isView(value)) {
- const clonedBuffer = cloneValue(value.buffer);
- // Use DataViewConstructor type purely for type-checking, can be a
- // DataView or TypedArray. They use the same constructor signature,
- // only DataView has a length in bytes and TypedArrays use a length in
- // terms of elements, so we adjust for that.
- let length;
- if (value instanceof DataView) {
- length = value.byteLength;
- } else {
- length = value.length;
- }
- return new (value.constructor)(
- clonedBuffer,
- value.byteOffset,
- length,
- );
- }
-
- try {
- return Deno.core.deserialize(Deno.core.serialize(value));
- } catch (e) {
- if (e instanceof TypeError) {
- throw new DOMException("Uncloneable value", "DataCloneError");
- }
- throw e;
- }
- }
-
const handlerSymbol = Symbol("eventHandlers");
function makeWrappedHandler(handler) {
function wrappedHandler(...args) {
@@ -114,6 +55,5 @@
illegalConstructorKey,
requiredArguments,
defineEventHandler,
- cloneValue,
};
})(this);