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.
*/
import { EventEmitter } from 'events';
import { EventEmitter } from './eventEmitter';
import { BrowserContext, prepareBrowserContextParams } from './browserContext';
import { ChannelOwner } from './channelOwner';
import { TargetClosedError, isTargetClosedError } from './errors';

View File

@ -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<channels.BrowserTypeChannel> 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);

View File

@ -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';

View File

@ -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<EventType, Listener | Listener[]>;
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 {

View File

@ -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';

View File

@ -14,8 +14,6 @@
* limitations under the License.
*/
import { URLSearchParams } from 'url';
import { ChannelOwner } from './channelOwner';
import { isTargetClosedError } from './errors';
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 }) {
if (require('inspector').url())
if (this._platform.isDebuggerAttached())
return;
const defaultNavigationTimeout = this._browserContext._timeoutSettings.defaultNavigationTimeout();
const defaultTimeout = this._browserContext._timeoutSettings.defaultTimeout();

View File

@ -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;
},

View File

@ -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, '..'));

View File

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