diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2024-01-06 14:40:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-06 14:40:26 +0100 |
commit | d1706c2ac99eb82a937dff1c6a4c861aa24b1210 (patch) | |
tree | bdb517ef7770af12de1cf9be081be560b4ec0870 /runtime/js/98_global_scope_window.js | |
parent | bfd5f1598cc462b460791fdfca9bb6c2c69fec9b (diff) |
refactor: split runtime/98_global_scope.js (#21785)
Diffstat (limited to 'runtime/js/98_global_scope_window.js')
-rw-r--r-- | runtime/js/98_global_scope_window.js | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/runtime/js/98_global_scope_window.js b/runtime/js/98_global_scope_window.js new file mode 100644 index 000000000..42cefdfb0 --- /dev/null +++ b/runtime/js/98_global_scope_window.js @@ -0,0 +1,119 @@ +// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. + +import { core, primordials } from "ext:core/mod.js"; +const ops = core.ops; +const { + ObjectDefineProperties, + ObjectPrototypeIsPrototypeOf, + SymbolFor, +} = primordials; + +import * as util from "ext:runtime/06_util.js"; +import * as location from "ext:deno_web/12_location.js"; +import * as console from "ext:deno_console/01_console.js"; +import * as webidl from "ext:deno_webidl/00_webidl.js"; +import * as globalInterfaces from "ext:deno_web/04_global_interfaces.js"; +import * as webStorage from "ext:deno_webstorage/01_webstorage.js"; +import * as prompt from "ext:runtime/41_prompt.js"; +import { loadWebGPU, webgpu } from "ext:deno_webgpu/00_init.js"; + +class Navigator { + constructor() { + webidl.illegalConstructor(); + } + + [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) { + return inspect( + console.createFilteredInspectProxy({ + object: this, + evaluate: ObjectPrototypeIsPrototypeOf(NavigatorPrototype, this), + keys: [ + "hardwareConcurrency", + "userAgent", + "language", + "languages", + ], + }), + inspectOptions, + ); + } +} + +const navigator = webidl.createBranded(Navigator); + +function memoizeLazy(f) { + let v_ = null; + return () => { + if (v_ === null) { + v_ = f(); + } + return v_; + }; +} + +const numCpus = memoizeLazy(() => ops.op_bootstrap_numcpus()); +const userAgent = memoizeLazy(() => ops.op_bootstrap_user_agent()); +const language = memoizeLazy(() => ops.op_bootstrap_language()); + +ObjectDefineProperties(Navigator.prototype, { + gpu: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, NavigatorPrototype); + loadWebGPU(); + return webgpu.gpu; + }, + }, + hardwareConcurrency: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, NavigatorPrototype); + return numCpus(); + }, + }, + userAgent: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, NavigatorPrototype); + return userAgent(); + }, + }, + language: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, NavigatorPrototype); + return language(); + }, + }, + languages: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, NavigatorPrototype); + return [language()]; + }, + }, +}); +const NavigatorPrototype = Navigator.prototype; + +const mainRuntimeGlobalProperties = { + Location: location.locationConstructorDescriptor, + location: location.locationDescriptor, + Window: globalInterfaces.windowConstructorDescriptor, + window: util.getterOnly(() => globalThis), + self: util.getterOnly(() => globalThis), + Navigator: util.nonEnumerable(Navigator), + navigator: util.getterOnly(() => navigator), + alert: util.writable(prompt.alert), + confirm: util.writable(prompt.confirm), + prompt: util.writable(prompt.prompt), + localStorage: util.getterOnly(webStorage.localStorage), + sessionStorage: util.getterOnly(webStorage.sessionStorage), + Storage: util.nonEnumerable(webStorage.Storage), +}; + +export { mainRuntimeGlobalProperties, memoizeLazy }; |