diff options
-rw-r--r-- | extensions/crypto/01_crypto.js | 84 | ||||
-rw-r--r-- | runtime/js/99_main.js | 3 | ||||
-rw-r--r-- | tools/wpt/expectation.json | 10 |
3 files changed, 51 insertions, 46 deletions
diff --git a/extensions/crypto/01_crypto.js b/extensions/crypto/01_crypto.js index f18b6d5aa..2b3982c32 100644 --- a/extensions/crypto/01_crypto.js +++ b/extensions/crypto/01_crypto.js @@ -3,48 +3,62 @@ ((window) => { const core = window.Deno.core; + const webidl = window.__bootstrap.webidl; - function getRandomValues(arrayBufferView) { - if (!ArrayBuffer.isView(arrayBufferView)) { - throw new TypeError( - "Argument 1 does not implement interface ArrayBufferView", - ); + class Crypto { + constructor() { + webidl.illegalConstructor(); } - if ( - !( - arrayBufferView instanceof Int8Array || - arrayBufferView instanceof Uint8Array || - arrayBufferView instanceof Int16Array || - arrayBufferView instanceof Uint16Array || - arrayBufferView instanceof Int32Array || - arrayBufferView instanceof Uint32Array || - arrayBufferView instanceof Uint8ClampedArray - ) - ) { - throw new DOMException( - "The provided ArrayBufferView is not an integer array type", - "TypeMismatchError", + + getRandomValues(arrayBufferView) { + webidl.assertBranded(this, Crypto); + const prefix = "Failed to execute 'getRandomValues' on 'Crypto'"; + webidl.requiredArguments(arguments.length, 1, { prefix }); + arrayBufferView = webidl.converters.ArrayBufferView(arrayBufferView, { + prefix, + context: "Argument 1", + }); + if ( + !( + arrayBufferView instanceof Int8Array || + arrayBufferView instanceof Uint8Array || + arrayBufferView instanceof Int16Array || + arrayBufferView instanceof Uint16Array || + arrayBufferView instanceof Int32Array || + arrayBufferView instanceof Uint32Array || + arrayBufferView instanceof Uint8ClampedArray + ) + ) { + throw new DOMException( + "The provided ArrayBufferView is not an integer array type", + "TypeMismatchError", + ); + } + const ui8 = new Uint8Array( + arrayBufferView.buffer, + arrayBufferView.byteOffset, + arrayBufferView.byteLength, ); + core.opSync("op_crypto_get_random_values", ui8); + return arrayBufferView; + } + + randomUUID() { + webidl.assertBranded(this, Crypto); + return core.opSync("op_crypto_random_uuid"); } - const ui8 = new Uint8Array( - arrayBufferView.buffer, - arrayBufferView.byteOffset, - arrayBufferView.byteLength, - ); - core.opSync("op_crypto_get_random_values", ui8); - return arrayBufferView; - } - function randomUUID() { - return core.opSync("op_crypto_random_uuid"); + get [Symbol.toStringTag]() { + return "Crypto"; + } + + [Symbol.for("Deno.customInspect")](inspect) { + return `${this.constructor.name} ${inspect({})}`; + } } - window.crypto = { - getRandomValues, - randomUUID, - }; window.__bootstrap.crypto = { - getRandomValues, - randomUUID, + crypto: webidl.createBranded(Crypto), + Crypto, }; })(this); diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index f98c4973e..d64625993 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -302,7 +302,8 @@ delete Object.prototype.__proto__; console: util.writable( new Console((msg, level) => core.print(msg, level > 1)), ), - crypto: util.readOnly(crypto), + crypto: util.readOnly(crypto.crypto), + Crypto: util.nonEnumerable(crypto.Crypto), fetch: util.writable(fetch.fetch), performance: util.writable(performance.performance), setInterval: util.writable(timers.setInterval), diff --git a/tools/wpt/expectation.json b/tools/wpt/expectation.json index 465c85a51..fe75af9d1 100644 --- a/tools/wpt/expectation.json +++ b/tools/wpt/expectation.json @@ -72,19 +72,9 @@ }, "historical.any.html": true, "idlharness.https.any.html": [ - "Crypto interface: existence and properties of interface object", - "Crypto interface object length", - "Crypto interface object name", - "Crypto interface: existence and properties of interface prototype object", - "Crypto interface: existence and properties of interface prototype object's \"constructor\" property", - "Crypto interface: existence and properties of interface prototype object's @@unscopables property", "Crypto interface: attribute subtle", "Crypto interface: operation getRandomValues(ArrayBufferView)", - "Crypto must be primary interface of crypto", - "Stringification of crypto", "Crypto interface: crypto must inherit property \"subtle\" with the proper type", - "Crypto interface: crypto must inherit property \"getRandomValues(ArrayBufferView)\" with the proper type", - "Crypto interface: calling getRandomValues(ArrayBufferView) on crypto with too few arguments must throw TypeError", "CryptoKey interface: existence and properties of interface object", "CryptoKey interface object length", "CryptoKey interface object name", |