diff --git a/packages/playwright-core/src/client/android.ts b/packages/playwright-core/src/client/android.ts index 3aedc5c4ac..134be7c7bb 100644 --- a/packages/playwright-core/src/client/android.ts +++ b/packages/playwright-core/src/client/android.ts @@ -14,8 +14,7 @@ * limitations under the License. */ -import { EventEmitter } from 'events'; - +import { EventEmitter } from './eventEmitter'; import { BrowserContext, prepareBrowserContextParams } from './browserContext'; import { ChannelOwner } from './channelOwner'; import { TargetClosedError, isTargetClosedError } from './errors'; diff --git a/packages/playwright-core/src/client/browserType.ts b/packages/playwright-core/src/client/browserType.ts index 39a9a3f1cc..e4942bd7f0 100644 --- a/packages/playwright-core/src/client/browserType.ts +++ b/packages/playwright-core/src/client/browserType.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import path from 'path'; - import { Browser } from './browser'; import { BrowserContext, prepareBrowserContextParams } from './browserContext'; import { ChannelOwner } from './channelOwner'; @@ -101,7 +99,7 @@ export class BrowserType extends ChannelOwner imple ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs), env: options.env ? envObjectToArray(options.env) : undefined, channel: options.channel, - userDataDir: (path.isAbsolute(userDataDir) || !userDataDir) ? userDataDir : path.resolve(userDataDir), + userDataDir: (this._platform.path().isAbsolute(userDataDir) || !userDataDir) ? userDataDir : this._platform.path().resolve(userDataDir), }; return await this._wrapApiCall(async () => { const result = await this._channel.launchPersistentContext(persistentParams); diff --git a/packages/playwright-core/src/client/connection.ts b/packages/playwright-core/src/client/connection.ts index 929acff25f..9f2745a8ec 100644 --- a/packages/playwright-core/src/client/connection.ts +++ b/packages/playwright-core/src/client/connection.ts @@ -14,8 +14,8 @@ * limitations under the License. */ -import { EventEmitter } from 'events'; +import { EventEmitter } from './eventEmitter'; import { Android, AndroidDevice, AndroidSocket } from './android'; import { Artifact } from './artifact'; import { Browser } from './browser'; diff --git a/packages/playwright-core/src/client/eventEmitter.ts b/packages/playwright-core/src/client/eventEmitter.ts index ce695490c2..a0781534e3 100644 --- a/packages/playwright-core/src/client/eventEmitter.ts +++ b/packages/playwright-core/src/client/eventEmitter.ts @@ -22,8 +22,6 @@ * USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { EventEmitter as OriginalEventEmitter } from 'events'; - import { isUnderTest } from '../utils/isomorphic/debug'; import type { EventEmitter as EventEmitterType } from 'events'; @@ -32,6 +30,12 @@ type EventType = string | symbol; type Listener = (...args: any[]) => any; type EventMap = Record; +let defaultMaxListenersProvider = () => 10; + +export function setDefaultMaxListenersProvider(provider: () => number) { + defaultMaxListenersProvider = provider; +} + export class EventEmitter implements EventEmitterType { private _events: EventMap | undefined = undefined; @@ -58,7 +62,7 @@ export class EventEmitter implements EventEmitterType { } getMaxListeners(): number { - return this._maxListeners === undefined ? OriginalEventEmitter.defaultMaxListeners : this._maxListeners; + return this._maxListeners === undefined ? defaultMaxListenersProvider() : this._maxListeners; } emit(type: EventType, ...args: any[]): boolean { diff --git a/packages/playwright-core/src/client/frame.ts b/packages/playwright-core/src/client/frame.ts index c302da02e4..ecbfe3cb11 100644 --- a/packages/playwright-core/src/client/frame.ts +++ b/packages/playwright-core/src/client/frame.ts @@ -15,8 +15,7 @@ * limitations under the License. */ -import { EventEmitter } from 'events'; - +import { EventEmitter } from './eventEmitter'; import { ChannelOwner } from './channelOwner'; import { addSourceUrlToScript } from './clientHelper'; import { ElementHandle, convertInputFiles, convertSelectOptionValues } from './elementHandle'; diff --git a/packages/playwright-core/src/client/network.ts b/packages/playwright-core/src/client/network.ts index ff992e7ae7..a4f5ff68d0 100644 --- a/packages/playwright-core/src/client/network.ts +++ b/packages/playwright-core/src/client/network.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import { URLSearchParams } from 'url'; - import { ChannelOwner } from './channelOwner'; import { isTargetClosedError } from './errors'; import { Events } from './events'; diff --git a/packages/playwright-core/src/client/page.ts b/packages/playwright-core/src/client/page.ts index 43c43ee50c..cb6d0656b8 100644 --- a/packages/playwright-core/src/client/page.ts +++ b/packages/playwright-core/src/client/page.ts @@ -799,7 +799,7 @@ export class Page extends ChannelOwner implements api.Page } async pause(_options?: { __testHookKeepTestTimeout: boolean }) { - if (require('inspector').url()) + if (this._platform.isDebuggerAttached()) return; const defaultNavigationTimeout = this._browserContext._timeoutSettings.defaultNavigationTimeout(); const defaultTimeout = this._browserContext._timeoutSettings.defaultTimeout(); diff --git a/packages/playwright-core/src/common/platform.ts b/packages/playwright-core/src/common/platform.ts index 330b5d6323..10bdc35922 100644 --- a/packages/playwright-core/src/common/platform.ts +++ b/packages/playwright-core/src/common/platform.ts @@ -42,6 +42,7 @@ export type Platform = { createGuid: () => string; fs: () => typeof fs; inspectCustom: symbol | undefined; + isDebuggerAttached(): boolean; isLogEnabled(name: 'api' | 'channel'): boolean; log(name: 'api' | 'channel', message: string | Error | object): void; path: () => typeof path; @@ -70,6 +71,7 @@ export const webPlatform: Platform = { inspectCustom: undefined, + isDebuggerAttached: () => false, isLogEnabled(name: 'api' | 'channel') { return false; @@ -105,6 +107,8 @@ export const emptyPlatform: Platform = { inspectCustom: undefined, + isDebuggerAttached: () => false, + isLogEnabled(name: 'api' | 'channel') { return false; }, diff --git a/packages/playwright-core/src/inProcessFactory.ts b/packages/playwright-core/src/inProcessFactory.ts index 81b40afe19..a53aa8c2e3 100644 --- a/packages/playwright-core/src/inProcessFactory.ts +++ b/packages/playwright-core/src/inProcessFactory.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import path from 'path'; +import * as path from 'path'; +import { EventEmitter } from 'events'; import { AndroidServerLauncherImpl } from './androidServerImpl'; import { BrowserServerLauncherImpl } from './browserServerImpl'; @@ -25,6 +26,7 @@ import { setDebugMode } from './utils/isomorphic/debug'; import { getFromENV } from './server/utils/env'; import { nodePlatform } from './server/utils/nodePlatform'; import { setPlatformForSelectors } from './client/selectors'; +import { setDefaultMaxListenersProvider } from './client/eventEmitter'; import type { Playwright as PlaywrightAPI } from './client/playwright'; import type { Language } from './utils'; @@ -35,6 +37,7 @@ export function createInProcessPlaywright(platform: Platform): PlaywrightAPI { const playwright = createPlaywright({ sdkLanguage: (process.env.PW_LANG_NAME as Language | undefined) || 'javascript' }); setDebugMode(getFromENV('PWDEBUG') || ''); setPlatformForSelectors(nodePlatform); + setDefaultMaxListenersProvider(() => EventEmitter.defaultMaxListeners); setLibraryStackPrefix(path.join(__dirname, '..')); diff --git a/packages/playwright-core/src/server/utils/nodePlatform.ts b/packages/playwright-core/src/server/utils/nodePlatform.ts index 1c2a4dad0c..e9883da361 100644 --- a/packages/playwright-core/src/server/utils/nodePlatform.ts +++ b/packages/playwright-core/src/server/utils/nodePlatform.ts @@ -67,6 +67,8 @@ export const nodePlatform: Platform = { inspectCustom: util.inspect.custom, + isDebuggerAttached: () => !!require('inspector').url(), + isLogEnabled(name: 'api' | 'channel') { return debugLogger.isEnabled(name); },