123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /**
- * Copyright 2019 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.
- */
- const {Events} = require('./Events');
- const {Page} = require('./Page');
- const {Worker} = require('./Worker');
- class Target {
- /**
- * @param {!Protocol.Target.TargetInfo} targetInfo
- * @param {!Puppeteer.BrowserContext} browserContext
- * @param {!function():!Promise<!Puppeteer.CDPSession>} sessionFactory
- * @param {boolean} ignoreHTTPSErrors
- * @param {?Puppeteer.Viewport} defaultViewport
- * @param {!Puppeteer.TaskQueue} screenshotTaskQueue
- */
- constructor(targetInfo, browserContext, sessionFactory, ignoreHTTPSErrors, defaultViewport, screenshotTaskQueue) {
- this._targetInfo = targetInfo;
- this._browserContext = browserContext;
- this._targetId = targetInfo.targetId;
- this._sessionFactory = sessionFactory;
- this._ignoreHTTPSErrors = ignoreHTTPSErrors;
- this._defaultViewport = defaultViewport;
- this._screenshotTaskQueue = screenshotTaskQueue;
- /** @type {?Promise<!Puppeteer.Page>} */
- this._pagePromise = null;
- /** @type {?Promise<!Worker>} */
- this._workerPromise = null;
- this._initializedPromise = new Promise(fulfill => this._initializedCallback = fulfill).then(async success => {
- if (!success)
- return false;
- const opener = this.opener();
- if (!opener || !opener._pagePromise || this.type() !== 'page')
- return true;
- const openerPage = await opener._pagePromise;
- if (!openerPage.listenerCount(Events.Page.Popup))
- return true;
- const popupPage = await this.page();
- openerPage.emit(Events.Page.Popup, popupPage);
- return true;
- });
- 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._targetInfo.type === 'background_page') && !this._pagePromise) {
- this._pagePromise = this._sessionFactory()
- .then(client => Page.create(client, this, this._ignoreHTTPSErrors, this._defaultViewport, this._screenshotTaskQueue));
- }
- return this._pagePromise;
- }
- /**
- * @return {!Promise<?Worker>}
- */
- async worker() {
- if (this._targetInfo.type !== 'service_worker' && this._targetInfo.type !== 'shared_worker')
- return null;
- if (!this._workerPromise) {
- // TODO(einbinder): Make workers send their console logs.
- this._workerPromise = this._sessionFactory()
- .then(client => new Worker(client, this._targetInfo.url, () => {} /* consoleAPICalled */, () => {} /* exceptionThrown */));
- }
- return this._workerPromise;
- }
- /**
- * @return {string}
- */
- url() {
- return this._targetInfo.url;
- }
- /**
- * @return {"page"|"background_page"|"service_worker"|"shared_worker"|"other"|"browser"}
- */
- type() {
- const type = this._targetInfo.type;
- if (type === 'page' || type === 'background_page' || type === 'service_worker' || type === 'shared_worker' || type === 'browser')
- return type;
- return 'other';
- }
- /**
- * @return {!Puppeteer.Browser}
- */
- browser() {
- return this._browserContext.browser();
- }
- /**
- * @return {!Puppeteer.BrowserContext}
- */
- browserContext() {
- return this._browserContext;
- }
- /**
- * @return {?Puppeteer.Target}
- */
- opener() {
- const { openerId } = this._targetInfo;
- if (!openerId)
- return null;
- return this.browser()._targets.get(openerId);
- }
- /**
- * @param {!Protocol.Target.TargetInfo} targetInfo
- */
- _targetInfoChanged(targetInfo) {
- this._targetInfo = targetInfo;
- if (!this._isInitialized && (this._targetInfo.type !== 'page' || this._targetInfo.url !== '')) {
- this._isInitialized = true;
- this._initializedCallback(true);
- return;
- }
- }
- }
- module.exports = {Target};
|