Skip to content

Commit 5256144

Browse files
adamraineDevtools-frontend LUCI CQ
authored andcommitted
[Lighthouse] Dismiss dialogs during navigation mode
Required for bfcache testing in Lighthouse to work: GoogleChrome/lighthouse#14465 Bug: None Change-Id: I4faf54e5dee9acdf8ffde4ee8762c21ed7fb50b5 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/4117673 Commit-Queue: Adam Raine <[email protected]> Reviewed-by: Benedikt Meurer <[email protected]> Reviewed-by: Paul Irish <[email protected]>
1 parent b6b4321 commit 5256144

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

front_end/core/sdk/ResourceTreeModel.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,7 @@ export enum Events {
655655
BackForwardCacheDetailsUpdated = 'BackForwardCacheDetailsUpdated',
656656
PrerenderingStatusUpdated = 'PrerenderingStatusUpdated',
657657
PrerenderAttemptCompleted = 'PrerenderAttemptCompleted',
658+
JavaScriptDialogOpening = 'JavaScriptDialogOpening',
658659
}
659660

660661
export type EventTypes = {
@@ -677,6 +678,7 @@ export type EventTypes = {
677678
[Events.BackForwardCacheDetailsUpdated]: ResourceTreeFrame,
678679
[Events.PrerenderingStatusUpdated]: ResourceTreeFrame,
679680
[Events.PrerenderAttemptCompleted]: Protocol.Page.PrerenderAttemptCompletedEvent,
681+
[Events.JavaScriptDialogOpening]: Protocol.Page.JavascriptDialogOpeningEvent,
680682
};
681683

682684
export class ResourceTreeFrame {
@@ -1154,8 +1156,9 @@ export class PageDispatcher implements ProtocolProxyApi.PageDispatcher {
11541156
this.#resourceTreeModel.dispatchEventToListeners(Events.FrameResized);
11551157
}
11561158

1157-
javascriptDialogOpening({hasBrowserHandler}: Protocol.Page.JavascriptDialogOpeningEvent): void {
1158-
if (!hasBrowserHandler) {
1159+
javascriptDialogOpening(event: Protocol.Page.JavascriptDialogOpeningEvent): void {
1160+
this.#resourceTreeModel.dispatchEventToListeners(Events.JavaScriptDialogOpening, event);
1161+
if (!event.hasBrowserHandler) {
11591162
void this.#resourceTreeModel.agent.invoke_handleJavaScriptDialog({accept: false});
11601163
}
11611164
}

front_end/panels/lighthouse/LighthouseProtocolService.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export class ProtocolService {
6464
private parallelConnection?: ProtocolClient.InspectorBackend.Connection;
6565
private lighthouseWorkerPromise?: Promise<Worker>;
6666
private lighthouseMessageUpdateCallback?: ((arg0: string) => void);
67+
private removeDialogHandler?: () => void;
6768
private configForTesting?: Object;
6869

6970
async attach(): Promise<void> {
@@ -92,6 +93,23 @@ export class ProtocolService {
9293
this.dispatchProtocolMessage(message);
9394
});
9495

96+
// Lighthouse implements its own dialog handler like this, however its lifecycle ends when
97+
// the internal Lighthouse session is disposed.
98+
//
99+
// If the page is reloaded near the end of the run (e.g. bfcache testing), the Lighthouse
100+
// internal session can be disposed before a dialog message appears. This allows the dialog
101+
// to block important Lighthouse teardown operations in LighthouseProtocolService.
102+
//
103+
// To ensure the teardown operations can proceed, we need a dialog handler which lasts until
104+
// the LighthouseProtocolService detaches.
105+
const dialogHandler = (): void => {
106+
void mainTarget.pageAgent().invoke_handleJavaScriptDialog({accept: true});
107+
};
108+
109+
resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.JavaScriptDialogOpening, dialogHandler);
110+
this.removeDialogHandler = (): void =>
111+
resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.JavaScriptDialogOpening, dialogHandler);
112+
95113
this.parallelConnection = connection;
96114
this.targetInfos = childTargetManager.targetInfos();
97115
this.mainFrameId = mainFrame.id;
@@ -163,6 +181,7 @@ export class ProtocolService {
163181
await oldParallelConnection.disconnect();
164182
}
165183
await SDK.TargetManager.TargetManager.instance().resumeAllTargets();
184+
this.removeDialogHandler?.();
166185
}
167186

168187
registerStatusCallback(callback: (arg0: string) => void): void {

0 commit comments

Comments
 (0)