chore: for not use Node's events in client (#34791)

This commit is contained in:
Pavel Feldman 2025-02-13 16:46:24 -08:00 committed by GitHub
parent 6833b664e3
commit 4a9b336168
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 22 additions and 15 deletions

View file

@ -14,8 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { EventEmitter } from 'events'; import { EventEmitter } from './eventEmitter';
import { BrowserContext, prepareBrowserContextParams } from './browserContext'; import { BrowserContext, prepareBrowserContextParams } from './browserContext';
import { ChannelOwner } from './channelOwner'; import { ChannelOwner } from './channelOwner';
import { TargetClosedError, isTargetClosedError } from './errors'; import { TargetClosedError, isTargetClosedError } from './errors';

View file

@ -14,8 +14,6 @@
* limitations under the License. * limitations under the License.
*/ */
import path from 'path';
import { Browser } from './browser'; import { Browser } from './browser';
import { BrowserContext, prepareBrowserContextParams } from './browserContext'; import { BrowserContext, prepareBrowserContextParams } from './browserContext';
import { ChannelOwner } from './channelOwner'; import { ChannelOwner } from './channelOwner';
@ -101,7 +99,7 @@ export class BrowserType extends ChannelOwner<channels.BrowserTypeChannel> imple
ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs), ignoreAllDefaultArgs: !!options.ignoreDefaultArgs && !Array.isArray(options.ignoreDefaultArgs),
env: options.env ? envObjectToArray(options.env) : undefined, env: options.env ? envObjectToArray(options.env) : undefined,
channel: options.channel, 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 () => { return await this._wrapApiCall(async () => {
const result = await this._channel.launchPersistentContext(persistentParams); const result = await this._channel.launchPersistentContext(persistentParams);

View file

@ -14,8 +14,8 @@
* limitations under the License. * limitations under the License.
*/ */
import { EventEmitter } from 'events';
import { EventEmitter } from './eventEmitter';
import { Android, AndroidDevice, AndroidSocket } from './android'; import { Android, AndroidDevice, AndroidSocket } from './android';
import { Artifact } from './artifact'; import { Artifact } from './artifact';
import { Browser } from './browser'; import { Browser } from './browser';

View file

@ -22,8 +22,6 @@
* USE OR OTHER DEALINGS IN THE SOFTWARE. * USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
import { EventEmitter as OriginalEventEmitter } from 'events';
import { isUnderTest } from '../utils/isomorphic/debug'; import { isUnderTest } from '../utils/isomorphic/debug';
import type { EventEmitter as EventEmitterType } from 'events'; import type { EventEmitter as EventEmitterType } from 'events';
@ -32,6 +30,12 @@ type EventType = string | symbol;
type Listener = (...args: any[]) => any; type Listener = (...args: any[]) => any;
type EventMap = Record<EventType, Listener | Listener[]>; type EventMap = Record<EventType, Listener | Listener[]>;
let defaultMaxListenersProvider = () => 10;
export function setDefaultMaxListenersProvider(provider: () => number) {
defaultMaxListenersProvider = provider;
}
export class EventEmitter implements EventEmitterType { export class EventEmitter implements EventEmitterType {
private _events: EventMap | undefined = undefined; private _events: EventMap | undefined = undefined;
@ -58,7 +62,7 @@ export class EventEmitter implements EventEmitterType {
} }
getMaxListeners(): number { getMaxListeners(): number {
return this._maxListeners === undefined ? OriginalEventEmitter.defaultMaxListeners : this._maxListeners; return this._maxListeners === undefined ? defaultMaxListenersProvider() : this._maxListeners;
} }
emit(type: EventType, ...args: any[]): boolean { emit(type: EventType, ...args: any[]): boolean {

View file

@ -15,8 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
import { EventEmitter } from 'events'; import { EventEmitter } from './eventEmitter';
import { ChannelOwner } from './channelOwner'; import { ChannelOwner } from './channelOwner';
import { addSourceUrlToScript } from './clientHelper'; import { addSourceUrlToScript } from './clientHelper';
import { ElementHandle, convertInputFiles, convertSelectOptionValues } from './elementHandle'; import { ElementHandle, convertInputFiles, convertSelectOptionValues } from './elementHandle';

View file

@ -14,8 +14,6 @@
* limitations under the License. * limitations under the License.
*/ */
import { URLSearchParams } from 'url';
import { ChannelOwner } from './channelOwner'; import { ChannelOwner } from './channelOwner';
import { isTargetClosedError } from './errors'; import { isTargetClosedError } from './errors';
import { Events } from './events'; import { Events } from './events';

View file

@ -799,7 +799,7 @@ export class Page extends ChannelOwner<channels.PageChannel> implements api.Page
} }
async pause(_options?: { __testHookKeepTestTimeout: boolean }) { async pause(_options?: { __testHookKeepTestTimeout: boolean }) {
if (require('inspector').url()) if (this._platform.isDebuggerAttached())
return; return;
const defaultNavigationTimeout = this._browserContext._timeoutSettings.defaultNavigationTimeout(); const defaultNavigationTimeout = this._browserContext._timeoutSettings.defaultNavigationTimeout();
const defaultTimeout = this._browserContext._timeoutSettings.defaultTimeout(); const defaultTimeout = this._browserContext._timeoutSettings.defaultTimeout();

View file

@ -42,6 +42,7 @@ export type Platform = {
createGuid: () => string; createGuid: () => string;
fs: () => typeof fs; fs: () => typeof fs;
inspectCustom: symbol | undefined; inspectCustom: symbol | undefined;
isDebuggerAttached(): boolean;
isLogEnabled(name: 'api' | 'channel'): boolean; isLogEnabled(name: 'api' | 'channel'): boolean;
log(name: 'api' | 'channel', message: string | Error | object): void; log(name: 'api' | 'channel', message: string | Error | object): void;
path: () => typeof path; path: () => typeof path;
@ -70,6 +71,7 @@ export const webPlatform: Platform = {
inspectCustom: undefined, inspectCustom: undefined,
isDebuggerAttached: () => false,
isLogEnabled(name: 'api' | 'channel') { isLogEnabled(name: 'api' | 'channel') {
return false; return false;
@ -105,6 +107,8 @@ export const emptyPlatform: Platform = {
inspectCustom: undefined, inspectCustom: undefined,
isDebuggerAttached: () => false,
isLogEnabled(name: 'api' | 'channel') { isLogEnabled(name: 'api' | 'channel') {
return false; return false;
}, },

View file

@ -14,7 +14,8 @@
* limitations under the License. * limitations under the License.
*/ */
import path from 'path'; import * as path from 'path';
import { EventEmitter } from 'events';
import { AndroidServerLauncherImpl } from './androidServerImpl'; import { AndroidServerLauncherImpl } from './androidServerImpl';
import { BrowserServerLauncherImpl } from './browserServerImpl'; import { BrowserServerLauncherImpl } from './browserServerImpl';
@ -25,6 +26,7 @@ import { setDebugMode } from './utils/isomorphic/debug';
import { getFromENV } from './server/utils/env'; import { getFromENV } from './server/utils/env';
import { nodePlatform } from './server/utils/nodePlatform'; import { nodePlatform } from './server/utils/nodePlatform';
import { setPlatformForSelectors } from './client/selectors'; import { setPlatformForSelectors } from './client/selectors';
import { setDefaultMaxListenersProvider } from './client/eventEmitter';
import type { Playwright as PlaywrightAPI } from './client/playwright'; import type { Playwright as PlaywrightAPI } from './client/playwright';
import type { Language } from './utils'; 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' }); const playwright = createPlaywright({ sdkLanguage: (process.env.PW_LANG_NAME as Language | undefined) || 'javascript' });
setDebugMode(getFromENV('PWDEBUG') || ''); setDebugMode(getFromENV('PWDEBUG') || '');
setPlatformForSelectors(nodePlatform); setPlatformForSelectors(nodePlatform);
setDefaultMaxListenersProvider(() => EventEmitter.defaultMaxListeners);
setLibraryStackPrefix(path.join(__dirname, '..')); setLibraryStackPrefix(path.join(__dirname, '..'));

View file

@ -67,6 +67,8 @@ export const nodePlatform: Platform = {
inspectCustom: util.inspect.custom, inspectCustom: util.inspect.custom,
isDebuggerAttached: () => !!require('inspector').url(),
isLogEnabled(name: 'api' | 'channel') { isLogEnabled(name: 'api' | 'channel') {
return debugLogger.isEnabled(name); return debugLogger.isEnabled(name);
}, },