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);
     }