mirror of
https://github.com/puppeteer/puppeteer
synced 2024-06-14 14:02:48 +00:00
chore: refactor Browser.js into seperate files (#2097)
This patch splits Browser.js into multiple separate files.
This commit is contained in:
parent
8578283e11
commit
ffe5b63dba
119
lib/Browser.js
119
lib/Browser.js
@ -14,9 +14,10 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const {helper} = require('./helper');
|
const { helper } = require('./helper');
|
||||||
const Page = require('./Page');
|
const Target = require('./Target');
|
||||||
const EventEmitter = require('events');
|
const EventEmitter = require('events');
|
||||||
|
const TaskQueue = require('./TaskQueue');
|
||||||
|
|
||||||
class Browser extends EventEmitter {
|
class Browser extends EventEmitter {
|
||||||
/**
|
/**
|
||||||
@ -63,10 +64,11 @@ class Browser extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {{targetInfo: !Target.TargetInfo}} event
|
* @param {{targetInfo: !Puppeteer.TargetInfo}} event
|
||||||
*/
|
*/
|
||||||
async _targetCreated(event) {
|
async _targetCreated(event) {
|
||||||
const target = new Target(this, event.targetInfo);
|
const targetInfo = event.targetInfo;
|
||||||
|
const target = new Target(targetInfo, () => this._connection.createSession(targetInfo.targetId), this._ignoreHTTPSErrors, this._appMode, this._screenshotTaskQueue);
|
||||||
console.assert(!this._targets.has(event.targetInfo.targetId), 'Target should not exist before targetCreated');
|
console.assert(!this._targets.has(event.targetInfo.targetId), 'Target should not exist before targetCreated');
|
||||||
this._targets.set(event.targetInfo.targetId, target);
|
this._targets.set(event.targetInfo.targetId, target);
|
||||||
|
|
||||||
@ -87,12 +89,16 @@ class Browser extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {{targetInfo: !Target.TargetInfo}} event
|
* @param {{targetInfo: !Puppeteer.TargetInfo}} event
|
||||||
*/
|
*/
|
||||||
_targetInfoChanged(event) {
|
_targetInfoChanged(event) {
|
||||||
const target = this._targets.get(event.targetInfo.targetId);
|
const target = this._targets.get(event.targetInfo.targetId);
|
||||||
console.assert(target, 'target should exist before targetInfoChanged');
|
console.assert(target, 'target should exist before targetInfoChanged');
|
||||||
|
const previousURL = target.url();
|
||||||
|
const wasInitialized = target._isInitialized;
|
||||||
target._targetInfoChanged(event.targetInfo);
|
target._targetInfoChanged(event.targetInfo);
|
||||||
|
if (wasInitialized && previousURL !== target.url())
|
||||||
|
this.emit(Browser.Events.TargetChanged, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -103,7 +109,7 @@ class Browser extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {!Promise<!Page>}
|
* @return {!Promise<!Puppeteer.Page>}
|
||||||
*/
|
*/
|
||||||
async newPage() {
|
async newPage() {
|
||||||
const {targetId} = await this._connection.send('Target.createTarget', {url: 'about:blank'});
|
const {targetId} = await this._connection.send('Target.createTarget', {url: 'about:blank'});
|
||||||
@ -121,7 +127,7 @@ class Browser extends EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return {!Promise<!Array<!Page>>}
|
* @return {!Promise<!Array<!Puppeteer.Page>>}
|
||||||
*/
|
*/
|
||||||
async pages() {
|
async pages() {
|
||||||
const pages = await Promise.all(this.targets().map(target => target.page()));
|
const pages = await Promise.all(this.targets().map(target => target.page()));
|
||||||
@ -171,101 +177,4 @@ Browser.Events = {
|
|||||||
|
|
||||||
helper.tracePublicAPI(Browser);
|
helper.tracePublicAPI(Browser);
|
||||||
|
|
||||||
class TaskQueue {
|
module.exports = Browser;
|
||||||
constructor() {
|
|
||||||
this._chain = Promise.resolve();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {function()} task
|
|
||||||
* @return {!Promise}
|
|
||||||
*/
|
|
||||||
postTask(task) {
|
|
||||||
const result = this._chain.then(task);
|
|
||||||
this._chain = result.catch(() => {});
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Target {
|
|
||||||
/**
|
|
||||||
* @param {!Browser} browser
|
|
||||||
* @param {!Target.TargetInfo} targetInfo
|
|
||||||
*/
|
|
||||||
constructor(browser, targetInfo) {
|
|
||||||
this._browser = browser;
|
|
||||||
this._targetId = targetInfo.targetId;
|
|
||||||
this._targetInfo = targetInfo;
|
|
||||||
/** @type {?Promise<!Page>} */
|
|
||||||
this._pagePromise = null;
|
|
||||||
this._initializedPromise = new Promise(fulfill => this._initializedCallback = fulfill);
|
|
||||||
this._isClosedPromise = new Promise(fulfill => this._closedCallback = fulfill);
|
|
||||||
this._isInitialized = this._targetInfo.type !== 'page' || this._targetInfo.url !== '';
|
|
||||||
if (this._isInitialized)
|
|
||||||
this._initializedCallback(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return {!Promise<!Puppeteer.CDPSession>}
|
|
||||||
*/
|
|
||||||
createCDPSession() {
|
|
||||||
return this._browser._connection.createSession(this._targetId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return {!Promise<?Page>}
|
|
||||||
*/
|
|
||||||
async page() {
|
|
||||||
if (this._targetInfo.type === 'page' && !this._pagePromise) {
|
|
||||||
this._pagePromise = this._browser._connection.createSession(this._targetId)
|
|
||||||
.then(client => Page.create(client, this, this._browser._ignoreHTTPSErrors, this._browser._appMode, this._browser._screenshotTaskQueue));
|
|
||||||
}
|
|
||||||
return this._pagePromise;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return {string}
|
|
||||||
*/
|
|
||||||
url() {
|
|
||||||
return this._targetInfo.url;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return {"page"|"service_worker"|"other"|"browser"}
|
|
||||||
*/
|
|
||||||
type() {
|
|
||||||
const type = this._targetInfo.type;
|
|
||||||
if (type === 'page' || type === 'service_worker' || type === 'browser')
|
|
||||||
return type;
|
|
||||||
return 'other';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {!Target.TargetInfo} targetInfo
|
|
||||||
*/
|
|
||||||
_targetInfoChanged(targetInfo) {
|
|
||||||
const previousURL = this._targetInfo.url;
|
|
||||||
this._targetInfo = targetInfo;
|
|
||||||
|
|
||||||
if (!this._isInitialized && (this._targetInfo.type !== 'page' || this._targetInfo.url !== '')) {
|
|
||||||
this._isInitialized = true;
|
|
||||||
this._initializedCallback(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (previousURL !== targetInfo.url)
|
|
||||||
this._browser.emit(Browser.Events.TargetChanged, this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
helper.tracePublicAPI(Target);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef {Object} Target.TargetInfo
|
|
||||||
* @property {string} type
|
|
||||||
* @property {string} targetId
|
|
||||||
* @property {string} title
|
|
||||||
* @property {string} url
|
|
||||||
* @property {boolean} attached
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = { Browser, TaskQueue, Target };
|
|
||||||
|
@ -19,7 +19,7 @@ const removeFolder = require('rimraf');
|
|||||||
const childProcess = require('child_process');
|
const childProcess = require('child_process');
|
||||||
const BrowserFetcher = require('./BrowserFetcher');
|
const BrowserFetcher = require('./BrowserFetcher');
|
||||||
const {Connection} = require('./Connection');
|
const {Connection} = require('./Connection');
|
||||||
const {Browser} = require('./Browser');
|
const Browser = require('./Browser');
|
||||||
const readline = require('readline');
|
const readline = require('readline');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const {helper} = require('./helper');
|
const {helper} = require('./helper');
|
||||||
|
79
lib/Target.js
Normal file
79
lib/Target.js
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
const Page = require('./Page');
|
||||||
|
const {helper} = require('./helper');
|
||||||
|
|
||||||
|
class Target {
|
||||||
|
/**
|
||||||
|
* @param {!Puppeteer.TargetInfo} targetInfo
|
||||||
|
* @param {!function():!Promise<!Puppeteer.CDPSession>} sessionFactory
|
||||||
|
* @param {boolean} ignoreHTTPSErrors
|
||||||
|
* @param {boolean} appMode
|
||||||
|
* @param {!Puppeteer.TaskQueue} screenshotTaskQueue
|
||||||
|
*/
|
||||||
|
constructor(targetInfo, sessionFactory, ignoreHTTPSErrors, appMode, screenshotTaskQueue) {
|
||||||
|
this._targetInfo = targetInfo;
|
||||||
|
this._targetId = targetInfo.targetId;
|
||||||
|
this._sessionFactory = sessionFactory;
|
||||||
|
this._ignoreHTTPSErrors = ignoreHTTPSErrors;
|
||||||
|
this._appMode = appMode;
|
||||||
|
this._screenshotTaskQueue = screenshotTaskQueue;
|
||||||
|
/** @type {?Promise<!Puppeteer.Page>} */
|
||||||
|
this._pagePromise = null;
|
||||||
|
this._initializedPromise = new Promise(fulfill => this._initializedCallback = fulfill);
|
||||||
|
this._isClosedPromise = new Promise(fulfill => this._closedCallback = fulfill);
|
||||||
|
this._isInitialized = this._targetInfo.type !== 'page' || this._targetInfo.url !== '';
|
||||||
|
if (this._isInitialized)
|
||||||
|
this._initializedCallback(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {!Promise<!Puppeteer.CDPSession>}
|
||||||
|
*/
|
||||||
|
createCDPSession() {
|
||||||
|
return this._sessionFactory();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {!Promise<?Page>}
|
||||||
|
*/
|
||||||
|
async page() {
|
||||||
|
if (this._targetInfo.type === 'page' && !this._pagePromise) {
|
||||||
|
this._pagePromise = this._sessionFactory()
|
||||||
|
.then(client => Page.create(client, this, this._ignoreHTTPSErrors, this._appMode, this._screenshotTaskQueue));
|
||||||
|
}
|
||||||
|
return this._pagePromise;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
url() {
|
||||||
|
return this._targetInfo.url;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return {"page"|"service_worker"|"other"|"browser"}
|
||||||
|
*/
|
||||||
|
type() {
|
||||||
|
const type = this._targetInfo.type;
|
||||||
|
if (type === 'page' || type === 'service_worker' || type === 'browser')
|
||||||
|
return type;
|
||||||
|
return 'other';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {!Puppeteer.TargetInfo} targetInfo
|
||||||
|
*/
|
||||||
|
_targetInfoChanged(targetInfo) {
|
||||||
|
this._targetInfo = targetInfo;
|
||||||
|
|
||||||
|
if (!this._isInitialized && (this._targetInfo.type !== 'page' || this._targetInfo.url !== '')) {
|
||||||
|
this._isInitialized = true;
|
||||||
|
this._initializedCallback(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
helper.tracePublicAPI(Target);
|
||||||
|
|
||||||
|
module.exports = Target;
|
17
lib/TaskQueue.js
Normal file
17
lib/TaskQueue.js
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
class TaskQueue {
|
||||||
|
constructor() {
|
||||||
|
this._chain = Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {function()} task
|
||||||
|
* @return {!Promise}
|
||||||
|
*/
|
||||||
|
postTask(task) {
|
||||||
|
const result = this._chain.then(task);
|
||||||
|
this._chain = result.catch(() => {});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = TaskQueue;
|
12
lib/externs.d.ts
vendored
12
lib/externs.d.ts
vendored
@ -1,6 +1,8 @@
|
|||||||
import { Connection as RealConnection, CDPSession as RealCDPSession } from './Connection.js';
|
import { Connection as RealConnection, CDPSession as RealCDPSession } from './Connection.js';
|
||||||
import {Browser as RealBrowser, TaskQueue as RealTaskQueue, Target as RealTarget} from './Browser.js';
|
import * as RealBrowser from './Browser.js';
|
||||||
|
import * as RealTarget from './Target.js';
|
||||||
import * as RealPage from './Page.js';
|
import * as RealPage from './Page.js';
|
||||||
|
import * as RealTaskQueue from './TaskQueue.js';
|
||||||
import {Mouse as RealMouse, Keyboard as RealKeyboard, Touchscreen as RealTouchscreen} from './Input.js';
|
import {Mouse as RealMouse, Keyboard as RealKeyboard, Touchscreen as RealTouchscreen} from './Input.js';
|
||||||
import {Frame as RealFrame, FrameManager as RealFrameManager} from './FrameManager.js';
|
import {Frame as RealFrame, FrameManager as RealFrameManager} from './FrameManager.js';
|
||||||
import {JSHandle as RealJSHandle, ExecutionContext as RealExecutionContext} from './ExecutionContext.js';
|
import {JSHandle as RealJSHandle, ExecutionContext as RealExecutionContext} from './ExecutionContext.js';
|
||||||
@ -30,4 +32,12 @@ export interface ConnectionTransport extends NodeJS.EventEmitter {
|
|||||||
close();
|
close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface TargetInfo {
|
||||||
|
type: string;
|
||||||
|
targetId: string;
|
||||||
|
title: string;
|
||||||
|
url: string;
|
||||||
|
attached: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
export interface ChildProcess extends child_process.ChildProcess {}
|
export interface ChildProcess extends child_process.ChildProcess {}
|
||||||
|
Loading…
Reference in New Issue
Block a user