Handle worker main script requests
Bug: 383343309
Change-Id: Ie2da91c7a68e0b4e975c48a9a5e15b9da95e0769
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6281387
Auto-Submit: Alex Rudenko <alexrudenko@chromium.org>
Reviewed-by: Danil Somsikov <dsv@chromium.org>
Commit-Queue: Danil Somsikov <dsv@chromium.org>
diff --git a/front_end/core/sdk/NetworkManager.test.ts b/front_end/core/sdk/NetworkManager.test.ts
index 357cfe8..1c8f6b4 100644
--- a/front_end/core/sdk/NetworkManager.test.ts
+++ b/front_end/core/sdk/NetworkManager.test.ts
@@ -96,6 +96,31 @@
});
});
+ it('handles worker requests originating from the frame target', async () => {
+ const target = createTarget();
+ const workerTarget = createTarget({type: SDK.Target.Type.Worker});
+
+ const multiTargetNetworkManager = SDK.NetworkManager.MultitargetNetworkManager.instance();
+ const initialNetworkManager = target.model(SDK.NetworkManager.NetworkManager)!;
+
+ assert.strictEqual(multiTargetNetworkManager.inflightMainResourceRequests.size, 0);
+
+ const requestId = 'mockId';
+ const requestPromise = initialNetworkManager.once(SDK.NetworkManager.Events.RequestStarted);
+ initialNetworkManager.dispatcher.requestWillBeSent(
+ {requestId, loaderId: '', request: {url: 'example.com'}} as Protocol.Network.RequestWillBeSentEvent);
+
+ const {request} = await requestPromise;
+ assert.isOk(SDK.NetworkManager.NetworkManager.forRequest(request) === initialNetworkManager);
+ assert.isOk(multiTargetNetworkManager.inflightMainResourceRequests.has(requestId));
+
+ const workerNetworkManager = workerTarget.model(SDK.NetworkManager.NetworkManager)!;
+ workerNetworkManager.dispatcher.loadingFinished({requestId} as Protocol.Network.LoadingFinishedEvent);
+
+ assert.isOk(SDK.NetworkManager.NetworkManager.forRequest(request) === workerNetworkManager);
+ assert.isOk(!multiTargetNetworkManager.inflightMainResourceRequests.has(requestId));
+ });
+
it('uses main frame to get certificate', () => {
SDK.ChildTargetManager.ChildTargetManager.install();
const tabTarget = createTarget({type: SDK.Target.Type.TAB});
diff --git a/front_end/core/sdk/NetworkManager.ts b/front_end/core/sdk/NetworkManager.ts
index 72f7068..e48c114 100644
--- a/front_end/core/sdk/NetworkManager.ts
+++ b/front_end/core/sdk/NetworkManager.ts
@@ -1107,9 +1107,12 @@
if (loaderId) {
this.#requestsByLoaderId.set(loaderId, networkRequest);
}
- // The following relies on the fact that loaderIds and requestIds are
- // globally unique and that the main request has them equal.
- if (networkRequest.loaderId === networkRequest.requestId()) {
+ // The following relies on the fact that loaderIds and requestIds
+ // are globally unique and that the main request has them equal. If
+ // loaderId is an empty string, it indicates a worker request. For the
+ // request to fetch the main worker script, the request ID is the future
+ // worker target ID and, therefore, it is unique.
+ if (networkRequest.loaderId === networkRequest.requestId() || networkRequest.loaderId === '') {
MultitargetNetworkManager.instance().inflightMainResourceRequests.set(networkRequest.requestId(), networkRequest);
}