[go: nahoru, domu]

PreloadingDevTools: Prevent PreloadingModel gone due to iframes

Before this CL, Preloading panel didn't work for pages with iframes
because PreloadingModelProxy.modelAdded replaced the top-frame's model
by the iframe's model. This CL prevents the behavior.

Bug: 1432880
Change-Id: Iab3dc3b3ad167e051f77b081fcd4dccecafd1194
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/4421749
Reviewed-by: Danil Somsikov <dsv@chromium.org>
Commit-Queue: Ken Okada <kenoss@chromium.org>
diff --git a/front_end/panels/application/preloading/PreloadingView.ts b/front_end/panels/application/preloading/PreloadingView.ts
index 4be8015..fdba72a 100644
--- a/front_end/panels/application/preloading/PreloadingView.ts
+++ b/front_end/panels/application/preloading/PreloadingView.ts
@@ -153,6 +153,11 @@
   }
 
   modelAdded(model: SDK.PreloadingModel.PreloadingModel): void {
+    // Ignore models/targets of non-outermost frames like iframe/FencedFrames.
+    if (model.target().outermostTarget() !== model.target()) {
+      return;
+    }
+
     this.model.removeEventListener(SDK.PreloadingModel.Events.ModelUpdated, this.view.render, this.view);
     this.model = model;
     this.model.addEventListener(SDK.PreloadingModel.Events.ModelUpdated, this.view.render, this.view);
diff --git a/test/unittests/front_end/panels/application/preloading/PreloadingView_test.ts b/test/unittests/front_end/panels/application/preloading/PreloadingView_test.ts
index 2886a5d..d50277b 100644
--- a/test/unittests/front_end/panels/application/preloading/PreloadingView_test.ts
+++ b/test/unittests/front_end/panels/application/preloading/PreloadingView_test.ts
@@ -438,6 +438,77 @@
     assert.include(usedPreloadingComponent.shadowRoot.textContent, 'This page was prerendered');
   });
 
+  // See https://crbug.com/1432880
+  it('preserves information even if iframe loaded', async () => {
+    const emulator = new NavigationEmulator();
+    await emulator.openDevTools();
+    const view = createView(emulator.primaryTarget);
+
+    await emulator.navigateAndDispatchEvents('');
+    await emulator.addSpecRules(`
+{
+  "prerender":[
+    {
+      "source": "list",
+      "urls": ["/prerendered.html"]
+    }
+  ]
+}
+`);
+
+    const targetInfo = {
+      targetId: 'targetId' as Protocol.Target.TargetID,
+      type: 'iframe',
+      title: 'title',
+      url: 'https://example.com/iframe.html',
+      attached: true,
+      canAccessOpener: false,
+    };
+    const childTargetManager = emulator.primaryTarget.model(SDK.ChildTargetManager.ChildTargetManager);
+    assertNotNullOrUndefined(childTargetManager);
+
+    dispatchEvent(emulator.primaryTarget, 'Target.targetCreated', {targetInfo});
+
+    await childTargetManager.attachedToTarget({
+      sessionId: 'sessionId' as Protocol.Target.SessionID,
+      targetInfo,
+      waitingForDebugger: false,
+    });
+
+    await coordinator.done();
+
+    const ruleSetGridComponent = view.getRuleSetGridForTest();
+    assertShadowRoot(ruleSetGridComponent.shadowRoot);
+    const preloadingGridComponent = view.getPreloadingGridForTest();
+    assertShadowRoot(preloadingGridComponent.shadowRoot);
+    const preloadingDetailsComponent = view.getPreloadingDetailsForTest();
+    assertShadowRoot(preloadingDetailsComponent.shadowRoot);
+
+    assertGridContents(
+        ruleSetGridComponent,
+        ['Validity'],
+        [
+          ['Valid'],
+        ],
+    );
+
+    assertGridContents(
+        preloadingGridComponent,
+        ['URL', 'Action', 'Status'],
+        [
+          [
+            'https://example.com/prerendered.html',
+            'prerender',
+            'Running',
+          ],
+        ],
+    );
+
+    const placeholder = preloadingDetailsComponent.shadowRoot.querySelector('div.preloading-noselected div p');
+
+    assert.strictEqual(placeholder?.textContent, 'Select an element for more details');
+  });
+
   it('filters preloading attempts by selected rule set', async () => {
     const emulator = new NavigationEmulator();
     await emulator.openDevTools();