Skip to content

Commit

Permalink
fix(runtime/js): add navigator interface objects (denoland#9685)
Browse files Browse the repository at this point in the history
  • Loading branch information
nayeemrmn committed Mar 8, 2021
1 parent ceeebe4 commit 0bc488c
Show file tree
Hide file tree
Showing 6 changed files with 83 additions and 16 deletions.
9 changes: 7 additions & 2 deletions cli/dts/lib.deno.window.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
10 changes: 7 additions & 3 deletions cli/dts/lib.deno.worker.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 var navigator: WorkerNavigator;

declare interface WorkerNavigator {
declare class WorkerNavigator {
constructor();
readonly gpu: GPU;
}

declare var navigator: WorkerNavigator;

declare class DedicatedWorkerGlobalScope extends WorkerGlobalScope {
new(): DedicatedWorkerGlobalScope;
name: string;
Expand Down
6 changes: 6 additions & 0 deletions cli/tests/unit/globals_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
Expand Down
2 changes: 1 addition & 1 deletion cli/tests/workers/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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!");
Expand Down
3 changes: 3 additions & 0 deletions cli/tests/workers/worker_globals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
69 changes: 59 additions & 10 deletions runtime/js/99_main.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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),
Expand Down Expand Up @@ -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),
Expand All @@ -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),
Expand Down

0 comments on commit 0bc488c

Please sign in to comment.