summaryrefslogtreecommitdiff
path: root/runtime/js/98_global_scope_window.js
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/js/98_global_scope_window.js')
-rw-r--r--runtime/js/98_global_scope_window.js119
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 };