@@ -24,8 +24,6 @@ import { unsafeLocatorOrSelectorAsSelector } from '../utils/isomorphic/locatorPa
2424import { generateCode } from './codegen/language';
2525import { collapseActions } from './recorder/recorderUtils';
2626import { JavaScriptLanguageGenerator } from './codegen/javascript';
27- import { Frame } from './frames';
28- import { Page } from './page';
2927
3028import type { Language } from '../utils';
3129import type { BrowserContext } from './browserContext';
@@ -44,8 +42,7 @@ export class DebugController extends SdkObject {
4442 SetModeRequested: 'setModeRequested',
4543 };
4644
47- private _reportState = false;
48- private _disposeListeners = new Set<() => void>();
45+ private _trackHierarchyListener: InstrumentationListener | undefined;
4946 private _playwright: Playwright;
5047 _sdkLanguage: Language = 'javascript';
5148 _generateAutoExpect = false;
@@ -64,40 +61,25 @@ export class DebugController extends SdkObject {
6461 }
6562
6663 setReportStateChanged(enabled: boolean) {
67- if (this._reportState === enabled)
68- return;
69- this._reportState = enabled;
70- if (enabled) {
71- const listener: InstrumentationListener = {
72- onPageOpen: page => {
73- this._emitSnapshot(false);
74- const handleNavigation = () => this._emitSnapshot(false);
75- page.mainFrame().on(Frame.Events.InternalNavigation, handleNavigation);
76- const dispose = () => page.mainFrame().off(Frame.Events.InternalNavigation, handleNavigation);
77- this._disposeListeners.add(dispose);
78- page.on(Page.Events.Close, () => this._disposeListeners.delete(dispose));
79- },
64+ if (enabled && !this._trackHierarchyListener) {
65+ this._trackHierarchyListener = {
66+ onPageOpen: () => this._emitSnapshot(false),
8067 onPageClose: () => this._emitSnapshot(false),
81- onBrowserClose: () => {
82- this._emitSnapshot(false);
83- },
8468 };
85- this._playwright.instrumentation.addListener(listener, null);
86- this._disposeListeners.add(() => this._playwright.instrumentation.removeListener(listener));
69+ this._playwright.instrumentation.addListener(this._trackHierarchyListener, null);
8770 this._emitSnapshot(true);
88- } else {
89- for (const dispose of this._disposeListeners)
90- dispose();
91- this._disposeListeners.clear();
71+ } else if (!enabled && this._trackHierarchyListener) {
72+ this._playwright.instrumentation.removeListener(this._trackHierarchyListener);
73+ this._trackHierarchyListener = undefined;
9274 }
9375 }
9476
95- async setRecorderMode(progress: Progress, params: { mode: Mode, testIdAttributeName?: string, generateAutoExpect?: boolean, browserId?: string }) {
77+ async setRecorderMode(progress: Progress, params: { mode: Mode, testIdAttributeName?: string, generateAutoExpect?: boolean }) {
9678 await progress.race(this._closeBrowsersWithoutPages());
9779 this._generateAutoExpect = !!params.generateAutoExpect;
9880
9981 if (params.mode === 'none') {
100- for (const recorder of await progress.race(this._allRecorders(params.browserId ))) {
82+ for (const recorder of await progress.race(this._allRecorders())) {
10183 recorder.hideHighlightedSelector();
10284 recorder.setMode('none');
10385 }
@@ -115,14 +97,11 @@ export class DebugController extends SdkObject {
11597 }
11698 // Update test id attribute.
11799 if (params.testIdAttributeName) {
118- for (const page of this._playwright.allPages()) {
119- if (params.browserId && page.browserContext._browser.guid !== params.browserId)
120- continue;
100+ for (const page of this._playwright.allPages())
121101 page.browserContext.selectors().setTestIdAttributeName(params.testIdAttributeName);
122- }
123102 }
124103 // Toggle the mode.
125- for (const recorder of await progress.race(this._allRecorders(params.browserId ))) {
104+ for (const recorder of await progress.race(this._allRecorders())) {
126105 recorder.hideHighlightedSelector();
127106 recorder.setMode(params.mode);
128107 }
@@ -154,13 +133,6 @@ export class DebugController extends SdkObject {
154133 recorder.resume();
155134 }
156135
157- async closeBrowser(progress: Progress, id: string, reason?: string) {
158- const browser = this._playwright.allBrowsers().find(b => b.guid === id);
159- if (!browser)
160- return;
161- await progress.race(browser.close({ reason }));
162- }
163-
164136 kill() {
165137 gracefullyProcessExitDoNotHang(0);
166138 }
@@ -169,28 +141,13 @@ export class DebugController extends SdkObject {
169141 const pageCount = this._playwright.allPages().length;
170142 if (initial && !pageCount)
171143 return;
172- this.emit(DebugController.Events.StateChanged, {
173- pageCount,
174- browsers: this._playwright.allBrowsers().map(browser => ({
175- id: browser.guid,
176- name: browser.options.name,
177- channel: browser.options.channel,
178- contexts: browser.contexts().map(context => ({
179- pages: context.pages().map(page => ({
180- url: page.mainFrame().url(),
181- }))
182- }))
183- }))
184- });
144+ this.emit(DebugController.Events.StateChanged, { pageCount });
185145 }
186146
187- private async _allRecorders(browserId?: string ): Promise<Recorder[]> {
147+ private async _allRecorders(): Promise<Recorder[]> {
188148 const contexts = new Set<BrowserContext>();
189- for (const page of this._playwright.allPages()) {
190- if (browserId && page.browserContext._browser.guid !== browserId)
191- continue;
149+ for (const page of this._playwright.allPages())
192150 contexts.add(page.browserContext);
193- }
194151 const recorders = await Promise.all([...contexts].map(c => Recorder.forContext(c, { omitCallTracking: true })));
195152 const nonNullRecorders = recorders.filter(Boolean) as Recorder[];
196153 for (const recorder of recorders)
0 commit comments