chore: detect document open for inspector (#9901)

To be used later for other global event listeners.
This commit is contained in:
Dmitry Gozman 2021-10-30 16:06:52 -07:00 committed by GitHub
parent bd505ed07c
commit 4ff69529d4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 7 deletions

View file

@ -67,6 +67,7 @@ export class InjectedScript {
_evaluator: SelectorEvaluatorImpl;
private _stableRafCount: number;
private _browserName: string;
onGlobalListenersRemoved = new Set<() => void>();
constructor(stableRafCount: number, browserName: string, customEngines: { name: string, engine: SelectorEngine}[]) {
this._evaluator = new SelectorEvaluatorImpl(new Map());
@ -95,6 +96,8 @@ export class InjectedScript {
this._stableRafCount = stableRafCount;
this._browserName = browserName;
this._setupGlobalListenersRemovalDetection();
}
eval(expression: string): any {
@ -769,6 +772,31 @@ export class InjectedScript {
return error;
}
private _setupGlobalListenersRemovalDetection() {
const customEventName = '__playwright_global_listeners_check__';
let seenEvent = false;
const handleCustomEvent = () => seenEvent = true;
window.addEventListener(customEventName, handleCustomEvent);
new MutationObserver(entries => {
const newDocumentElement = entries.some(entry => Array.from(entry.addedNodes).includes(document.documentElement));
if (!newDocumentElement)
return;
// New documentElement - let's check whether listeners are still here.
seenEvent = false;
window.dispatchEvent(new CustomEvent(customEventName));
if (seenEvent)
return;
// Listener did not fire. Reattach the listener and notify.
window.addEventListener(customEventName, handleCustomEvent);
for (const callback of this.onGlobalListenersRemoved)
callback();
}).observe(document, { childList: true });
}
expect(progress: InjectedScriptProgress, element: Element, options: FrameExpectParams, elements: Element[]): { matches: boolean, received?: any } {
const injected = progress.injectedScript;
const expression = options.expression;

View file

@ -116,17 +116,14 @@ export class Recorder {
this._glassPaneShadow.appendChild(styleElement);
this._refreshListenersIfNeeded();
setInterval(() => {
this._refreshListenersIfNeeded();
if (params.isUnderTest && !(this as any)._reportedReadyForTest) {
(this as any)._reportedReadyForTest = true;
console.error('Recorder script ready for test');
}
}, 500);
injectedScript.onGlobalListenersRemoved.add(() => this._refreshListenersIfNeeded());
globalThis._playwrightRefreshOverlay = () => {
this._pollRecorderMode().catch(e => console.log(e)); // eslint-disable-line no-console
};
globalThis._playwrightRefreshOverlay();
if (params.isUnderTest)
console.error('Recorder script ready for test');
}
private _refreshListenersIfNeeded() {