diff options
Diffstat (limited to 'ext/webstorage/01_webstorage.js')
-rw-r--r-- | ext/webstorage/01_webstorage.js | 348 |
1 files changed, 173 insertions, 175 deletions
diff --git a/ext/webstorage/01_webstorage.js b/ext/webstorage/01_webstorage.js index 27d7aac09..d7abdfbd8 100644 --- a/ext/webstorage/01_webstorage.js +++ b/ext/webstorage/01_webstorage.js @@ -2,191 +2,189 @@ /// <reference path="../../core/internal.d.ts" /> -((window) => { - const core = window.Deno.core; - const ops = core.ops; - const webidl = window.__bootstrap.webidl; - const { - SafeArrayIterator, - Symbol, - SymbolFor, - ObjectDefineProperty, - ObjectFromEntries, - ObjectEntries, - ReflectGet, - ReflectHas, - Proxy, - } = window.__bootstrap.primordials; - - const _persistent = Symbol("[[persistent]]"); - - class Storage { - [_persistent]; - - constructor() { - webidl.illegalConstructor(); - } - - get length() { - webidl.assertBranded(this, StoragePrototype); - return ops.op_webstorage_length(this[_persistent]); - } - - key(index) { - webidl.assertBranded(this, StoragePrototype); - const prefix = "Failed to execute 'key' on 'Storage'"; - webidl.requiredArguments(arguments.length, 1, { prefix }); - index = webidl.converters["unsigned long"](index, { - prefix, - context: "Argument 1", - }); - - return ops.op_webstorage_key(index, this[_persistent]); - } - - setItem(key, value) { - webidl.assertBranded(this, StoragePrototype); - const prefix = "Failed to execute 'setItem' on 'Storage'"; - webidl.requiredArguments(arguments.length, 2, { prefix }); - key = webidl.converters.DOMString(key, { - prefix, - context: "Argument 1", - }); - value = webidl.converters.DOMString(value, { - prefix, - context: "Argument 2", - }); - - ops.op_webstorage_set(key, value, this[_persistent]); - } - - getItem(key) { - webidl.assertBranded(this, StoragePrototype); - const prefix = "Failed to execute 'getItem' on 'Storage'"; - webidl.requiredArguments(arguments.length, 1, { prefix }); - key = webidl.converters.DOMString(key, { - prefix, - context: "Argument 1", - }); - - return ops.op_webstorage_get(key, this[_persistent]); - } - - removeItem(key) { - webidl.assertBranded(this, StoragePrototype); - const prefix = "Failed to execute 'removeItem' on 'Storage'"; - webidl.requiredArguments(arguments.length, 1, { prefix }); - key = webidl.converters.DOMString(key, { - prefix, - context: "Argument 1", - }); - - ops.op_webstorage_remove(key, this[_persistent]); - } - - clear() { - webidl.assertBranded(this, StoragePrototype); - ops.op_webstorage_clear(this[_persistent]); - } +const core = globalThis.Deno.core; +const ops = core.ops; +import * as webidl from "internal:ext/webidl/00_webidl.js"; +const primordials = globalThis.__bootstrap.primordials; +const { + SafeArrayIterator, + Symbol, + SymbolFor, + ObjectDefineProperty, + ObjectFromEntries, + ObjectEntries, + ReflectGet, + ReflectHas, + Proxy, +} = primordials; + +const _persistent = Symbol("[[persistent]]"); + +class Storage { + [_persistent]; + + constructor() { + webidl.illegalConstructor(); } - const StoragePrototype = Storage.prototype; - - function createStorage(persistent) { - const storage = webidl.createBranded(Storage); - storage[_persistent] = persistent; - - const proxy = new Proxy(storage, { - deleteProperty(target, key) { - if (typeof key == "symbol") { - delete target[key]; - } else { - target.removeItem(key); - } - return true; - }, - defineProperty(target, key, descriptor) { - if (typeof key == "symbol") { - ObjectDefineProperty(target, key, descriptor); - } else { - target.setItem(key, descriptor.value); - } - return true; - }, - get(target, key) { - if (typeof key == "symbol") return target[key]; - if (ReflectHas(target, key)) { - return ReflectGet(...new SafeArrayIterator(arguments)); - } else { - return target.getItem(key) ?? undefined; - } - }, - set(target, key, value) { - if (typeof key == "symbol") { - ObjectDefineProperty(target, key, { - value, - configurable: true, - }); - } else { - target.setItem(key, value); - } - return true; - }, - has(target, p) { - return p === SymbolFor("Deno.customInspect") || - (typeof target.getItem(p)) === "string"; - }, - ownKeys() { - return ops.op_webstorage_iterate_keys(persistent); - }, - getOwnPropertyDescriptor(target, key) { - if (arguments.length === 1) { - return undefined; - } - if (ReflectHas(target, key)) { - return undefined; - } - const value = target.getItem(key); - if (value === null) { - return undefined; - } - return { - value, - enumerable: true, - configurable: true, - writable: true, - }; - }, + get length() { + webidl.assertBranded(this, StoragePrototype); + return ops.op_webstorage_length(this[_persistent]); + } + + key(index) { + webidl.assertBranded(this, StoragePrototype); + const prefix = "Failed to execute 'key' on 'Storage'"; + webidl.requiredArguments(arguments.length, 1, { prefix }); + index = webidl.converters["unsigned long"](index, { + prefix, + context: "Argument 1", }); - proxy[SymbolFor("Deno.customInspect")] = function (inspect) { - return `${this.constructor.name} ${ - inspect({ - length: this.length, - ...ObjectFromEntries(ObjectEntries(proxy)), - }) - }`; - }; + return ops.op_webstorage_key(index, this[_persistent]); + } + + setItem(key, value) { + webidl.assertBranded(this, StoragePrototype); + const prefix = "Failed to execute 'setItem' on 'Storage'"; + webidl.requiredArguments(arguments.length, 2, { prefix }); + key = webidl.converters.DOMString(key, { + prefix, + context: "Argument 1", + }); + value = webidl.converters.DOMString(value, { + prefix, + context: "Argument 2", + }); - return proxy; + ops.op_webstorage_set(key, value, this[_persistent]); } - let localStorage; - let sessionStorage; + getItem(key) { + webidl.assertBranded(this, StoragePrototype); + const prefix = "Failed to execute 'getItem' on 'Storage'"; + webidl.requiredArguments(arguments.length, 1, { prefix }); + key = webidl.converters.DOMString(key, { + prefix, + context: "Argument 1", + }); + + return ops.op_webstorage_get(key, this[_persistent]); + } + + removeItem(key) { + webidl.assertBranded(this, StoragePrototype); + const prefix = "Failed to execute 'removeItem' on 'Storage'"; + webidl.requiredArguments(arguments.length, 1, { prefix }); + key = webidl.converters.DOMString(key, { + prefix, + context: "Argument 1", + }); + + ops.op_webstorage_remove(key, this[_persistent]); + } + + clear() { + webidl.assertBranded(this, StoragePrototype); + ops.op_webstorage_clear(this[_persistent]); + } +} + +const StoragePrototype = Storage.prototype; + +function createStorage(persistent) { + const storage = webidl.createBranded(Storage); + storage[_persistent] = persistent; - window.__bootstrap.webStorage = { - localStorage() { - if (!localStorage) { - localStorage = createStorage(true); + const proxy = new Proxy(storage, { + deleteProperty(target, key) { + if (typeof key == "symbol") { + delete target[key]; + } else { + target.removeItem(key); } - return localStorage; + return true; }, - sessionStorage() { - if (!sessionStorage) { - sessionStorage = createStorage(false); + defineProperty(target, key, descriptor) { + if (typeof key == "symbol") { + ObjectDefineProperty(target, key, descriptor); + } else { + target.setItem(key, descriptor.value); } - return sessionStorage; + return true; }, - Storage, + get(target, key) { + if (typeof key == "symbol") return target[key]; + if (ReflectHas(target, key)) { + return ReflectGet(...new SafeArrayIterator(arguments)); + } else { + return target.getItem(key) ?? undefined; + } + }, + set(target, key, value) { + if (typeof key == "symbol") { + ObjectDefineProperty(target, key, { + value, + configurable: true, + }); + } else { + target.setItem(key, value); + } + return true; + }, + has(target, p) { + return p === SymbolFor("Deno.customInspect") || + (typeof target.getItem(p)) === "string"; + }, + ownKeys() { + return ops.op_webstorage_iterate_keys(persistent); + }, + getOwnPropertyDescriptor(target, key) { + if (arguments.length === 1) { + return undefined; + } + if (ReflectHas(target, key)) { + return undefined; + } + const value = target.getItem(key); + if (value === null) { + return undefined; + } + return { + value, + enumerable: true, + configurable: true, + writable: true, + }; + }, + }); + + proxy[SymbolFor("Deno.customInspect")] = function (inspect) { + return `${this.constructor.name} ${ + inspect({ + length: this.length, + ...ObjectFromEntries(ObjectEntries(proxy)), + }) + }`; }; -})(this); + + return proxy; +} + +let localStorageStorage; +function localStorage() { + if (!localStorageStorage) { + localStorageStorage = createStorage(true); + } + return localStorageStorage; +} + +let sessionStorageStorage; +function sessionStorage() { + if (!sessionStorageStorage) { + sessionStorageStorage = createStorage(false); + } + return sessionStorageStorage; +} + +export { localStorage, sessionStorage, Storage }; |