From 41cad2179fb36c2371ab84ce587d3460af64b5fb Mon Sep 17 00:00:00 2001 From: await-ovo <13152410380@163.com> Date: Tue, 15 Aug 2023 23:04:36 +0800 Subject: [PATCH] fix(runtime): navigator.userAgent in web worker (#20129) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://github.com/denoland/deno/issues/20079 --------- Co-authored-by: Bartek IwaƄczuk --- cli/tests/testdata/workers/test.ts | 20 +++++++++++ .../testdata/workers/worker_navigator.ts | 11 ++++++ runtime/js/98_global_scope.js | 36 +++++++++++-------- runtime/js/99_main.js | 3 +- tools/wpt/expectation.json | 9 ++++- 5 files changed, 63 insertions(+), 16 deletions(-) create mode 100644 cli/tests/testdata/workers/worker_navigator.ts diff --git a/cli/tests/testdata/workers/test.ts b/cli/tests/testdata/workers/test.ts index 506bb4c312064e..90cc6a649a277e 100644 --- a/cli/tests/testdata/workers/test.ts +++ b/cli/tests/testdata/workers/test.ts @@ -119,6 +119,26 @@ Deno.test({ }, }); +Deno.test({ + name: "worker navigator", + fn: async function () { + const workerOptions: WorkerOptions = { type: "module" }; + const w = new Worker( + import.meta.resolve("./worker_navigator.ts"), + workerOptions, + ); + + const promise = deferred(); + w.onmessage = (e) => { + promise.resolve(e.data); + }; + + w.postMessage("Hello, world!"); + assertEquals(await promise, "string, object, string, number"); + w.terminate(); + }, +}); + Deno.test({ name: "worker fetch API", fn: async function () { diff --git a/cli/tests/testdata/workers/worker_navigator.ts b/cli/tests/testdata/workers/worker_navigator.ts new file mode 100644 index 00000000000000..bd364a8f947e27 --- /dev/null +++ b/cli/tests/testdata/workers/worker_navigator.ts @@ -0,0 +1,11 @@ +onmessage = function () { + postMessage( + [ + typeof navigator.language, + typeof navigator.languages, + typeof navigator.userAgent, + typeof navigator.hardwareConcurrency, + ].join(", "), + ); + close(); +}; diff --git a/runtime/js/98_global_scope.js b/runtime/js/98_global_scope.js index 1084f5c2482965..c916ef819f7944 100644 --- a/runtime/js/98_global_scope.js +++ b/runtime/js/98_global_scope.js @@ -225,21 +225,29 @@ ObjectDefineProperties(WorkerNavigator.prototype, { webidl.assertBranded(this, WorkerNavigatorPrototype); return numCpus; }, - language: { - configurable: true, - enumerable: true, - get() { - webidl.assertBranded(this, WorkerNavigatorPrototype); - return language; - }, + }, + userAgent: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, WorkerNavigatorPrototype); + return userAgent; + }, + }, + language: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, WorkerNavigatorPrototype); + return language; }, - languages: { - configurable: true, - enumerable: true, - get() { - webidl.assertBranded(this, WorkerNavigatorPrototype); - return [language]; - }, + }, + languages: { + configurable: true, + enumerable: true, + get() { + webidl.assertBranded(this, WorkerNavigatorPrototype); + return [language]; }, }, }); diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index dc68396469c1c7..c8fdabc258e1c1 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -567,7 +567,7 @@ function bootstrapWorkerRuntime( 10: pid, 11: target, 12: v8Version, - // 13: userAgent, + 13: userAgent, // 14: inspectFlag, 15: enableTestingFeaturesFlag, } = runtimeOptions; @@ -633,6 +633,7 @@ function bootstrapWorkerRuntime( location.setLocationHref(location_); setNumCpus(cpuCount); + setUserAgent(userAgent); setLanguage(locale); globalThis.pollForMessages = pollForMessages; diff --git a/tools/wpt/expectation.json b/tools/wpt/expectation.json index 86153084193107..326b7f55d3b9fe 100644 --- a/tools/wpt/expectation.json +++ b/tools/wpt/expectation.json @@ -6177,7 +6177,14 @@ "taintEnabled", "oscpu" ], - "navigator.any.worker.html": false, + "navigator.any.worker.html": [ + "appCodeName", + "appName", + "appVersion", + "platform", + "product", + "userAgent value" + ], "per-global.window.html": false } }