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