123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- "use strict";
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.DebugController = void 0;
- var _processLauncher = require("../utils/processLauncher");
- var _instrumentation = require("./instrumentation");
- var _recorder = require("./recorder");
- var _recorderApp = require("./recorder/recorderApp");
- var _locatorGenerators = require("../utils/isomorphic/locatorGenerators");
- const internalMetadata = (0, _instrumentation.serverSideCallMetadata)();
- class DebugController extends _instrumentation.SdkObject {
- constructor(playwright) {
- super({
- attribution: {
- isInternalPlaywright: true
- },
- instrumentation: (0, _instrumentation.createInstrumentation)()
- }, undefined, 'DebugController');
- this._autoCloseTimer = void 0;
-
- this._autoCloseAllowed = false;
- this._trackHierarchyListener = void 0;
- this._playwright = void 0;
- this._sdkLanguage = 'javascript';
- this._codegenId = 'playwright-test';
- this._playwright = playwright;
- }
- initialize(codegenId, sdkLanguage) {
- this._codegenId = codegenId;
- this._sdkLanguage = sdkLanguage;
- _recorder.Recorder.setAppFactory(async () => new InspectingRecorderApp(this));
- }
- setAutoCloseAllowed(allowed) {
- this._autoCloseAllowed = allowed;
- }
- dispose() {
- this.setReportStateChanged(false);
- this.setAutoCloseAllowed(false);
- _recorder.Recorder.setAppFactory(undefined);
- }
- setReportStateChanged(enabled) {
- if (enabled && !this._trackHierarchyListener) {
- this._trackHierarchyListener = {
- onPageOpen: () => this._emitSnapshot(),
- onPageClose: () => this._emitSnapshot()
- };
- this._playwright.instrumentation.addListener(this._trackHierarchyListener, null);
- } else if (!enabled && this._trackHierarchyListener) {
- this._playwright.instrumentation.removeListener(this._trackHierarchyListener);
- this._trackHierarchyListener = undefined;
- }
- }
- async resetForReuse() {
- const contexts = new Set();
- for (const page of this._playwright.allPages()) contexts.add(page.context());
- for (const context of contexts) await context.resetForReuse(internalMetadata, null);
- }
- async navigate(url) {
- for (const p of this._playwright.allPages()) await p.mainFrame().goto(internalMetadata, url);
- }
- async setRecorderMode(params) {
-
- await this._closeBrowsersWithoutPages();
- if (params.mode === 'none') {
- for (const recorder of await this._allRecorders()) {
- recorder.hideHighlightedSelector();
- recorder.setMode('none');
- }
- this.setAutoCloseEnabled(true);
- return;
- }
- if (!this._playwright.allBrowsers().length) await this._playwright.chromium.launch(internalMetadata, {
- headless: !!process.env.PW_DEBUG_CONTROLLER_HEADLESS
- });
-
- const pages = this._playwright.allPages();
- if (!pages.length) {
- const [browser] = this._playwright.allBrowsers();
- const {
- context
- } = await browser.newContextForReuse({}, internalMetadata);
- await context.newPage(internalMetadata);
- }
-
- if (params.testIdAttributeName) {
- for (const page of this._playwright.allPages()) page.context().selectors().setTestIdAttributeName(params.testIdAttributeName);
- }
-
- for (const recorder of await this._allRecorders()) {
- recorder.hideHighlightedSelector();
- if (params.mode !== 'inspecting') recorder.setOutput(this._codegenId, params.file);
- recorder.setMode(params.mode);
- }
- this.setAutoCloseEnabled(true);
- }
- async setAutoCloseEnabled(enabled) {
- if (!this._autoCloseAllowed) return;
- if (this._autoCloseTimer) clearTimeout(this._autoCloseTimer);
- if (!enabled) return;
- const heartBeat = () => {
- if (!this._playwright.allPages().length) (0, _processLauncher.gracefullyProcessExitDoNotHang)(0);else this._autoCloseTimer = setTimeout(heartBeat, 5000);
- };
- this._autoCloseTimer = setTimeout(heartBeat, 30000);
- }
- async highlight(selector) {
- for (const recorder of await this._allRecorders()) recorder.setHighlightedSelector(this._sdkLanguage, selector);
- }
- async hideHighlight() {
-
- for (const recorder of await this._allRecorders()) recorder.hideHighlightedSelector();
-
- await this._playwright.hideHighlight();
- }
- allBrowsers() {
- return [...this._playwright.allBrowsers()];
- }
- async resume() {
- for (const recorder of await this._allRecorders()) recorder.resume();
- }
- async kill() {
- (0, _processLauncher.gracefullyProcessExitDoNotHang)(0);
- }
- async closeAllBrowsers() {
- await Promise.all(this.allBrowsers().map(browser => browser.close({
- reason: 'Close all browsers requested'
- })));
- }
- _emitSnapshot() {
- const browsers = [];
- let pageCount = 0;
- for (const browser of this._playwright.allBrowsers()) {
- const b = {
- contexts: []
- };
- browsers.push(b);
- for (const context of browser.contexts()) {
- const c = {
- pages: []
- };
- b.contexts.push(c);
- for (const page of context.pages()) c.pages.push(page.mainFrame().url());
- pageCount += context.pages().length;
- }
- }
-
- this.emit(DebugController.Events.BrowsersChanged, browsers);
- this.emit(DebugController.Events.StateChanged, {
- pageCount
- });
- }
- async _allRecorders() {
- const contexts = new Set();
- for (const page of this._playwright.allPages()) contexts.add(page.context());
- const result = await Promise.all([...contexts].map(c => _recorder.Recorder.show(c, {
- omitCallTracking: true
- })));
- return result.filter(Boolean);
- }
- async _closeBrowsersWithoutPages() {
- for (const browser of this._playwright.allBrowsers()) {
- for (const context of browser.contexts()) {
- if (!context.pages().length) await context.close({
- reason: 'Browser collected'
- });
- }
- if (!browser.contexts()) await browser.close({
- reason: 'Browser collected'
- });
- }
- }
- }
- exports.DebugController = DebugController;
- DebugController.Events = {
- BrowsersChanged: 'browsersChanged',
- StateChanged: 'stateChanged',
- InspectRequested: 'inspectRequested',
- SourceChanged: 'sourceChanged',
- Paused: 'paused',
- SetModeRequested: 'setModeRequested'
- };
- class InspectingRecorderApp extends _recorderApp.EmptyRecorderApp {
- constructor(debugController) {
- super();
- this._debugController = void 0;
- this._debugController = debugController;
- }
- async setSelector(selector) {
- const locator = (0, _locatorGenerators.asLocator)(this._debugController._sdkLanguage, selector);
- this._debugController.emit(DebugController.Events.InspectRequested, {
- selector,
- locator
- });
- }
- async setSources(sources) {
- const source = sources.find(s => s.id === this._debugController._codegenId);
- const {
- text,
- header,
- footer,
- actions
- } = source || {
- text: ''
- };
- this._debugController.emit(DebugController.Events.SourceChanged, {
- text,
- header,
- footer,
- actions
- });
- }
- async setPaused(paused) {
- this._debugController.emit(DebugController.Events.Paused, {
- paused
- });
- }
- async setMode(mode) {
- this._debugController.emit(DebugController.Events.SetModeRequested, {
- mode
- });
- }
- }
|