Skip to content

Commit

Permalink
PlzDedicatedWorker: support DevTools for browser-initiated dedicated …
Browse files Browse the repository at this point in the history
…workers

PlzDedicatedWorker makes the worker script fetch a browser-initiated and
dedicated workers will be real service worker clients. Before the
feature, the worker script fetch was a renderer-initiated and dedicated
workers are treated as a subresource in the parent frame.
I2S: https://groups.google.com/a/chromium.org/g/blink-dev/c/FhGd1AqB3ng/

This CL
1) Removes http/tests/inspector-protocol/fetch/dedicated-worker-main-script.js
because `dp.Fetch.onRequestPaused` intercepts a renderer-initiated
request in the frame, but after PlzDedicatedWorker, the worker script
fetch runs on the browser process.
2) Instead, adds http/tests/inspector-protocol/fetch/worker-interception.js
that observes browser-initiated requests via `globalFetcher`.
3) Implements the DevTools integration for PlzDedicatedWorker.
  3-1) Creates WorkerDevToolsAgentHost in DedicatedWorkerHostFactoryImpl.
  3-2) Sets a callback to TargetHandler as `worker_throttle_`.
  3-3) Resumes the script fetch in DedicatedWorkerHost::StartScriptLoad().

The worker script fetch of `worker.js` is not observed without the
implementation (3) and the worker-interception.js test fails:
> Tests that dedicated worker requests are intercepted.
> [browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/empty.html, type: Document
> -[browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/worker.js, type: Other
> [browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/fetch-data.txt, type: XHR
> -Response after Fetch.fulfillRequest: Fetched for real!
> +Response after Fetch.fulfillRequest: overridden response body
See the test result of http/tests/inspector-protocol/fetch/worker-interception.js
in https://ci.chromium.org/ui/p/chromium/builders/try/linux_layout_tests_composite_after_paint/55826/test-results

Bug: 1143102
Change-Id: I9d2f23ed4076f9fa36805da599daac06bc2b163d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3068908
Reviewed-by: Koji Ishii <[email protected]>
Reviewed-by: Andrey Kosyakov <[email protected]>
Reviewed-by: Hiroki Nakagawa <[email protected]>
Commit-Queue: Asami Doi <[email protected]>
Cr-Commit-Position: refs/heads/main@{#933339}
NOKEYCHECK=True
GitOrigin-RevId: 1ee5fb813d06cfb948ba4d71929b954db1971754
  • Loading branch information
d0iasm authored and copybara-github committed Oct 20, 2021
1 parent 089bc7f commit 3548686
Show file tree
Hide file tree
Showing 11 changed files with 54 additions and 43 deletions.
1 change: 1 addition & 0 deletions blink/web_tests/VirtualTestSuites
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,7 @@
"external/wpt/workers",
"external/wpt/xhr",
"fast/workers",
"http/tests/inspector-protocol/fetch",
"http/tests/origin_trials",
"http/tests/workers"],
"args": ["--enable-features=PlzDedicatedWorker,SharedArrayBuffer"]
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
self.testToken = 'FAIL: original value';

self.addEventListener('connect', e => {
e.ports[0].postMessage('ready');
});

Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
self.testToken = 'FAIL: original value';
console.log("Worker");

self.addEventListener('connect', e => {
e.ports[0].postMessage('ready');
self.addEventListener('message', e => {
self.postMessage('ready');
});

Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
Tests that service worker requests are intercepted.
[browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/service-worker.html, type: Document
[browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/empty.html, type: Document
[renderer] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/service-worker.js, type: Other
[browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/service-worker.js, type: Other
[renderer] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/service-worker.html, type: XHR
[browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/service-worker.html, type: XHR
[renderer] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/empty.html, type: XHR
[browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/empty.html, type: XHR
Response fulfilled by service worker: response from service worker
[renderer] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/fetch-data.txt, type: XHR
[browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/fetch-data.txt, type: XHR
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ Tests that service worker requests are intercepted when DevTools attached after
Response before interception enabled: Fetched for real!
[renderer] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/service-worker-import.js, type: Script
Imported script after interception enabled: overriden imported script!
[renderer] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/service-worker.html, type: XHR
[renderer] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/empty.html, type: XHR
[renderer] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/fetch-data.txt, type: XHR
Response after interception enabled: overriden response body

Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
});

await dp.ServiceWorker.enable();
await session.navigate("resources/service-worker.html");
await session.navigate("resources/empty.html");
session.evaluateAsync(`
navigator.serviceWorker.register('service-worker.js?defer-install')`);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
});

await dp.ServiceWorker.enable();
await session.navigate("resources/service-worker.html");
await session.navigate("resources/empty.html");
session.evaluateAsync(`navigator.serviceWorker.register('service-worker.js')`);

async function waitForServiceWorkerActivation() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Tests that dedicated worker requests are intercepted.
[browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/empty.html, type: Document
[browser] Request to http://127.0.0.1:8000/inspector-protocol/fetch/resources/worker.js, type: Other
worker is ready

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
(async function(testRunner) {
const {page, session, dp} = await testRunner.startBlank(
`Tests that dedicated worker requests are intercepted.`);

const FetchHelper = await testRunner.loadScript("resources/fetch-test.js");
const globalFetcher = new FetchHelper(testRunner, testRunner.browserP());
globalFetcher.setLogPrefix("[browser] ");
await globalFetcher.enable();

globalFetcher.onRequest().continueRequest({});

await dp.Target.setAutoAttach({
autoAttach: true, waitForDebuggerOnStart: true, flatten: true});
dp.Target.onAttachedToTarget(async event => {
const wdp = session.createChild(event.params.sessionId).protocol;
await wdp.Runtime.runIfWaitingForDebugger();
});

await dp.Page.enable();
await session.navigate("resources/empty.html");

const result = await session.evaluateAsync(`
const w = new Worker('/inspector-protocol/fetch/resources/worker.js');
new Promise((resolve, reject) => {
w.onmessage = e => resolve('worker is ready');
w.onerror = e => reject(e.message);
w.postMessage('start a worker');
})
`);

testRunner.log(result);
testRunner.completeTest();
});

0 comments on commit 3548686

Please sign in to comment.