mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 17:34:47 -05:00
fix(runtime/js): add navigator interface objects (#9685)
This commit is contained in:
parent
ceeebe46ee
commit
0bc488c85c
6 changed files with 84 additions and 17 deletions
9
cli/dts/lib.deno.window.d.ts
vendored
9
cli/dts/lib.deno.window.d.ts
vendored
|
@ -18,19 +18,24 @@ declare class Window extends EventTarget {
|
|||
confirm: (message?: string) => boolean;
|
||||
prompt: (message?: string, defaultValue?: string) => string | null;
|
||||
Deno: typeof Deno;
|
||||
Navigator: typeof Navigator;
|
||||
navigator: Navigator;
|
||||
Location: typeof Location;
|
||||
location: Location;
|
||||
}
|
||||
|
||||
declare var window: Window & typeof globalThis;
|
||||
declare var self: Window & typeof globalThis;
|
||||
declare var onload: ((this: Window, ev: Event) => any) | null;
|
||||
declare var onunload: ((this: Window, ev: Event) => any) | null;
|
||||
declare var navigator: Navigator;
|
||||
|
||||
declare interface Navigator {
|
||||
declare class Navigator {
|
||||
constructor();
|
||||
readonly gpu: GPU;
|
||||
}
|
||||
|
||||
declare var navigator: Navigator;
|
||||
|
||||
/**
|
||||
* Shows the given message and waits for the enter key pressed.
|
||||
* If the stdin is not interactive, it does nothing.
|
||||
|
|
12
cli/dts/lib.deno.worker.d.ts
vendored
12
cli/dts/lib.deno.worker.d.ts
vendored
|
@ -30,15 +30,19 @@ declare class WorkerGlobalScope {
|
|||
close: () => void;
|
||||
postMessage: (message: any) => void;
|
||||
Deno: typeof Deno;
|
||||
WorkerNavigator: typeof WorkerNavigator;
|
||||
navigator: WorkerNavigator;
|
||||
WorkerLocation: typeof WorkerLocation;
|
||||
location: WorkerLocation;
|
||||
}
|
||||
|
||||
declare class WorkerNavigator {
|
||||
constructor();
|
||||
readonly gpu: GPU;
|
||||
}
|
||||
|
||||
declare var navigator: WorkerNavigator;
|
||||
|
||||
declare interface WorkerNavigator {
|
||||
readonly gpu: GPU;
|
||||
}
|
||||
|
||||
declare class DedicatedWorkerGlobalScope extends WorkerGlobalScope {
|
||||
new(): DedicatedWorkerGlobalScope;
|
||||
name: string;
|
||||
|
|
|
@ -48,6 +48,12 @@ unitTest(function globalThisInstanceofEventTarget(): void {
|
|||
assert(globalThis instanceof EventTarget);
|
||||
});
|
||||
|
||||
unitTest(function navigatorInstanceofNavigator(): void {
|
||||
// TODO(nayeemrmn): Add `Navigator` to deno_lint globals.
|
||||
// deno-lint-ignore no-undef
|
||||
assert(navigator instanceof Navigator);
|
||||
});
|
||||
|
||||
unitTest(function DenoNamespaceExists(): void {
|
||||
assert(Deno != null);
|
||||
});
|
||||
|
|
|
@ -118,7 +118,7 @@ Deno.test({
|
|||
workerOptions,
|
||||
);
|
||||
w.onmessage = (e): void => {
|
||||
assertEquals(e.data, "true, true, true");
|
||||
assertEquals(e.data, "true, true, true, true");
|
||||
promise.resolve();
|
||||
};
|
||||
w.postMessage("Hello, world!");
|
||||
|
|
|
@ -4,6 +4,9 @@ onmessage = function (): void {
|
|||
self instanceof DedicatedWorkerGlobalScope,
|
||||
self instanceof WorkerGlobalScope,
|
||||
self instanceof EventTarget,
|
||||
// TODO(nayeemrmn): Add `WorkerNavigator` to deno_lint globals.
|
||||
// deno-lint-ignore no-undef
|
||||
navigator instanceof WorkerNavigator,
|
||||
].join(", "),
|
||||
);
|
||||
close();
|
||||
|
|
|
@ -35,6 +35,7 @@ delete Object.prototype.__proto__;
|
|||
const denoNs = window.__bootstrap.denoNs;
|
||||
const denoNsUnstable = window.__bootstrap.denoNsUnstable;
|
||||
const errors = window.__bootstrap.errors.errors;
|
||||
const webidl = window.__bootstrap.webidl;
|
||||
const { defineEventHandler } = window.__bootstrap.webUtil;
|
||||
|
||||
let windowIsClosing = false;
|
||||
|
@ -203,6 +204,52 @@ delete Object.prototype.__proto__;
|
|||
);
|
||||
}
|
||||
|
||||
class Navigator {
|
||||
constructor() {
|
||||
webidl.illegalConstructor();
|
||||
}
|
||||
|
||||
[Symbol.for("Deno.customInspect")](inspect) {
|
||||
return `${this.constructor.name} ${inspect({})}`;
|
||||
}
|
||||
}
|
||||
|
||||
const navigator = webidl.createBranded(Navigator);
|
||||
|
||||
Object.defineProperties(Navigator.prototype, {
|
||||
gpu: {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get() {
|
||||
webidl.assertBranded(this, Navigator);
|
||||
return webgpu.gpu;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
class WorkerNavigator {
|
||||
constructor() {
|
||||
webidl.illegalConstructor();
|
||||
}
|
||||
|
||||
[Symbol.for("Deno.customInspect")](inspect) {
|
||||
return `${this.constructor.name} ${inspect({})}`;
|
||||
}
|
||||
}
|
||||
|
||||
const workerNavigator = webidl.createBranded(WorkerNavigator);
|
||||
|
||||
Object.defineProperties(WorkerNavigator.prototype, {
|
||||
gpu: {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get() {
|
||||
webidl.assertBranded(this, WorkerNavigator);
|
||||
return webgpu.gpu;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope
|
||||
const windowOrWorkerGlobalScope = {
|
||||
Blob: util.nonEnumerable(file.Blob),
|
||||
|
@ -293,17 +340,18 @@ delete Object.prototype.__proto__;
|
|||
// structure, it might be worth it to define a helper in `util`
|
||||
windowOrWorkerGlobalScope.console.enumerable = false;
|
||||
|
||||
const windowNavigatorProperties = {
|
||||
gpu: webgpu.gpu,
|
||||
};
|
||||
|
||||
const mainRuntimeGlobalProperties = {
|
||||
Location: location.locationConstructorDescriptor,
|
||||
location: location.locationDescriptor,
|
||||
Window: globalInterfaces.windowConstructorDescriptor,
|
||||
window: util.readOnly(globalThis),
|
||||
self: util.readOnly(globalThis),
|
||||
navigator: util.readOnly(windowNavigatorProperties),
|
||||
Navigator: util.nonEnumerable(Navigator),
|
||||
navigator: {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get: () => navigator,
|
||||
},
|
||||
// TODO(bartlomieju): from MDN docs (https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope)
|
||||
// it seems those two properties should be available to workers as well
|
||||
onload: util.writable(null),
|
||||
|
@ -315,17 +363,18 @@ delete Object.prototype.__proto__;
|
|||
prompt: util.writable(prompt.prompt),
|
||||
};
|
||||
|
||||
const workerNavigatorProperties = {
|
||||
gpu: webgpu.gpu,
|
||||
};
|
||||
|
||||
const workerRuntimeGlobalProperties = {
|
||||
WorkerLocation: location.workerLocationConstructorDescriptor,
|
||||
location: location.workerLocationDescriptor,
|
||||
WorkerGlobalScope: globalInterfaces.workerGlobalScopeConstructorDescriptor,
|
||||
DedicatedWorkerGlobalScope:
|
||||
globalInterfaces.dedicatedWorkerGlobalScopeConstructorDescriptor,
|
||||
navigator: util.readOnly(workerNavigatorProperties),
|
||||
WorkerNavigator: util.nonEnumerable(WorkerNavigator),
|
||||
navigator: {
|
||||
configurable: true,
|
||||
enumerable: true,
|
||||
get: () => workerNavigator,
|
||||
},
|
||||
self: util.readOnly(globalThis),
|
||||
onmessage: util.writable(onmessage),
|
||||
onerror: util.writable(onerror),
|
||||
|
|
Loading…
Add table
Reference in a new issue