2cbfdeb0ca
* feat: use CDP's auto-attach mechanism In this PR, we refactor Puppeteer to make use of the CDP's auto-attach mechanism. This allows the backend to pause new targets and give Puppeteer a chance to configure them properly. This fixes the flakiness related to dealing with OOPIFs and should fix some other issues related to the network interception and navigations. If those are not fixed completely by this PR, the PR serves a solid base for fixing them. Closes https://github.com/puppeteer/puppeteer/issues/8507, https://github.com/puppeteer/puppeteer/issues/7990 Unlocks https://github.com/puppeteer/puppeteer/issues/3667 BREAKING CHANGE: With Chromium, Puppeteer will now attach to page/iframe targets immediately to allow reliable configuration of targets.
72 lines
2.0 KiB
TypeScript
72 lines
2.0 KiB
TypeScript
/**
|
|
* Copyright 2022 Google Inc. All rights reserved.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import Protocol from 'devtools-protocol';
|
|
import {CDPSession} from './Connection.js';
|
|
import {EventEmitter} from './EventEmitter.js';
|
|
import {Target} from './Target.js';
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
export type TargetFactory = (
|
|
targetInfo: Protocol.Target.TargetInfo,
|
|
session?: CDPSession
|
|
) => Target;
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
export type TargetInterceptor = (
|
|
createdTarget: Target,
|
|
parentTarget: Target | null
|
|
) => Promise<void>;
|
|
|
|
/**
|
|
* TargetManager encapsulates all interactions with CDP targets and is
|
|
* responsible for coordinating the configuration of targets with the rest of
|
|
* Puppeteer. Code outside of this class should not subscribe `Target.*` events
|
|
* and only use the TargetManager events.
|
|
*
|
|
* There are two implementations: one for Chrome that uses CDP's auto-attach
|
|
* mechanism and one for Firefox because Firefox does not support auto-attach.
|
|
*
|
|
* @internal
|
|
*/
|
|
export interface TargetManager extends EventEmitter {
|
|
getAvailableTargets(): Map<string, Target>;
|
|
initialize(): Promise<void>;
|
|
dispose(): void;
|
|
addTargetInterceptor(
|
|
session: CDPSession,
|
|
interceptor: TargetInterceptor
|
|
): void;
|
|
removeTargetInterceptor(
|
|
session: CDPSession,
|
|
interceptor: TargetInterceptor
|
|
): void;
|
|
}
|
|
|
|
/**
|
|
* @internal
|
|
*/
|
|
export const enum TargetManagerEmittedEvents {
|
|
TargetDiscovered = 'targetDiscovered',
|
|
TargetAvailable = 'targetAvailable',
|
|
TargetGone = 'targetGone',
|
|
TargetChanged = 'targetChanged',
|
|
}
|