/**
 * Copyright 2020 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 { Puppeteer , CommonPuppeteerSettings , ConnectOptions , } from '../common/Puppeteer.js' ; import { BrowserFetcher , BrowserFetcherOptions } from './BrowserFetcher.js' ; import { LaunchOptions , BrowserLaunchArgumentOptions , } from './LaunchOptions.js' ; import { BrowserConnectOptions } from '../common/BrowserConnector.js' ; import { Browser } from '../common/Browser.js' ; import Launcher , { ProductLauncher } from './Launcher.js' ; import { PUPPETEER_REVISIONS } from '../revisions.js' ; import { Product } from '../common/Product.js' ; /**
 * Extends the main  Puppeteer class with Node specific behaviour for fetching and
 * downloading browsers.
 *
 * If you're using Puppeteer in a Node environment, this is the class you'll get
 * when you run `require('puppeteer')` (or the equivalent ES `import`).
 *
 *  remarks The most common method to use is  PuppeteerNode . launch , which
 * is used to launch and connect to a new browser instance.
 *
 * See  Puppeteer for methods common to all
 * environments, such as  Puppeteer . connect .
 *
 *  example The following is a typical example of using Puppeteer to drive automation:
 * ```js
 * const puppeteer = require('puppeteer');
 *
 * (async () => {
 *   const browser = await puppeteer.launch();
 *   const page = await browser.newPage();
 *   await page.goto('https://www.google.com');
 *   // other actions...
 *   await browser.close();
 * })();
 * ```
 *
 * Once you have created a `page` you have access to a large API to interact
 * with the page, navigate, or find certain elements in that page.
 * The  Page lists all the available methods.
 *
 *  public export class PuppeteerNode extends Puppeteer { private _lazyLauncher : ProductLauncher ; private _projectRoot : string ; private __productName ? : Product ; internal _preferredRevision : string ; internal constructor ( settings ) { const { projectRoot , preferredRevision , productName , ... commonSettings } = settings ; super ( commonSettings ) ; this . _projectRoot = projectRoot ; this . __productName = productName ; this . _preferredRevision = preferredRevision ; } remarks param options returns connect ( options ) { if ( options . product ) this . _productName = options . product ; return super . connect ( options ) ; } internal get _productName ( ) : Product { return this . __productName ; } set _productName ( name ) { if ( this . __productName !== name ) this . _changedProduct = true ; this . __productName = name ; } remarks example You can use `ignoreDefaultArgs` to filter out `--mute-audio` from default arguments:
     * ```js
     * const browser = await puppeteer.launch({
     *   ignoreDefaultArgs: ['--mute-audio']
     * });
     * ```
     *
     * **NOTE** Puppeteer can also be used to control the Chrome browser,
     * but it works best with the version of Chromium it is bundled with.
     * There is no guarantee it will work with any other version.
     * Use `executablePath` option with extreme caution.
     * If Google Chrome (rather than Chromium) is preferred, a  https or  https build is suggested.
     * In `puppeteer.launch([options])`, any mention of Chromium also applies to Chrome.
     * See  https for a description of the differences between Chromium and Chrome.  https describes some differences for Linux users.
     *
     *  param options returns launch ( options = { } ) { if ( options . product ) this . _productName = options . product ; return this . _launcher . launch ( options ) ; } remarks returns executablePath ( channel ? ) { return this . _launcher . executablePath ( channel ) ; } internal get _launcher ( ) : ProductLauncher { if ( ! this . _lazyLauncher || this . _lazyLauncher . product !== this . _productName || this . _changedProduct ) { switch ( this . _productName ) { case 'firefox' : this . _preferredRevision = PUPPETEER_REVISIONS . firefox ; break ; case 'chrome' : default : this . _preferredRevision = PUPPETEER_REVISIONS . chromium ; } this . _changedProduct = false ; this . _lazyLauncher = Launcher ( this . _projectRoot , this . _preferredRevision , this . _isPuppeteerCore , this . _productName ) ; } return this . _lazyLauncher ; } remarks get product ( ) : string { return this . _launcher . product ; } param options returns defaultArgs ( options = { } ) { return this . _launcher . defaultArgs ( options ) ; } param options returns createBrowserFetcher ( options ) { return new BrowserFetcher ( this . _projectRoot , options ) ; } }