From 391e9c4de09ca0e6d72a8330ccfe749a9ebe1e11 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 28 Jan 2025 16:00:28 -0800 Subject: [PATCH] fix(recorder): do not reset inspect highlight on inactivity (#34526) --- .../injected/recorder/pollingRecorder.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/playwright-core/src/server/injected/recorder/pollingRecorder.ts b/packages/playwright-core/src/server/injected/recorder/pollingRecorder.ts index bc96ff2185..86b2babdd9 100644 --- a/packages/playwright-core/src/server/injected/recorder/pollingRecorder.ts +++ b/packages/playwright-core/src/server/injected/recorder/pollingRecorder.ts @@ -34,6 +34,7 @@ export class PollingRecorder implements RecorderDelegate { private _recorder: Recorder; private _embedder: Embedder; private _pollRecorderModeTimer: number | undefined; + private _lastStateJSON: string | undefined; constructor(injectedScript: InjectedScript) { this._recorder = new Recorder(injectedScript); @@ -42,6 +43,7 @@ export class PollingRecorder implements RecorderDelegate { injectedScript.onGlobalListenersRemoved.add(() => this._recorder.installListeners()); const refreshOverlay = () => { + this._lastStateJSON = undefined; this._pollRecorderMode().catch(e => console.log(e)); // eslint-disable-line no-console }; this._embedder.__pw_refreshOverlay = refreshOverlay; @@ -57,13 +59,19 @@ export class PollingRecorder implements RecorderDelegate { this._pollRecorderModeTimer = this._recorder.injectedScript.builtinSetTimeout(() => this._pollRecorderMode(), pollPeriod); return; } - const win = this._recorder.document.defaultView!; - if (win.top !== win) { - // Only show action point in the main frame, since it is relative to the page's viewport. - // Otherwise we'll see multiple action points at different locations. - state.actionPoint = undefined; + + const stringifiedState = JSON.stringify(state); + if (this._lastStateJSON !== stringifiedState) { + this._lastStateJSON = stringifiedState; + const win = this._recorder.document.defaultView!; + if (win.top !== win) { + // Only show action point in the main frame, since it is relative to the page's viewport. + // Otherwise we'll see multiple action points at different locations. + state.actionPoint = undefined; + } + this._recorder.setUIState(state, this); } - this._recorder.setUIState(state, this); + this._pollRecorderModeTimer = this._recorder.injectedScript.builtinSetTimeout(() => this._pollRecorderMode(), pollPeriod); }