diff options
| author | Leo K <crowlkats@toaxl.com> | 2021-06-05 22:56:59 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-06-05 22:56:59 +0200 |
| commit | bb0c90cadbb99784681a2acac1fd65ac7f802297 (patch) | |
| tree | 6d5e1f668ee54c3ae6ed5ff63f987499f882a6cf | |
| parent | 368c784d7f6feff6bb483ca2b02cf2c44ea29c26 (diff) | |
fix(crypto): change Crypto to interface (#10853)
Co-authored-by: Luca Casonato <hello@lcas.dev>
| -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", |
