feat: add option to specify the default viewport (#3005)

Fixes #1183.
This commit is contained in:
Joel Einbinder
2018-08-01 16:23:03 -07:00
committed by Andrey Lushnikov
parent 0c49bf5245
commit 25632133e2
8 changed files with 94 additions and 72 deletions

View File

@@ -58,22 +58,17 @@ const AUTOMATION_ARGS = [
class Launcher {
/**
* @param {!LaunchOptions=} options
* @param {!(LaunchOptions & BrowserOptions)=} options
* @return {!Promise<!Browser>}
*/
static async launch(options) {
options = Object.assign({}, options || {});
assert(!options.ignoreDefaultArgs || !options.appMode, '`appMode` flag cannot be used together with `ignoreDefaultArgs`');
let temporaryUserDataDir = null;
const chromeArguments = [];
if (!options.ignoreDefaultArgs)
chromeArguments.push(...DEFAULT_ARGS);
if (options.appMode) {
options.headless = false;
options.pipe = true;
} else if (!options.ignoreDefaultArgs) {
if (!options.ignoreDefaultArgs)
chromeArguments.push(...AUTOMATION_ARGS);
}
if (!options.ignoreDefaultArgs || !chromeArguments.some(argument => argument.startsWith('--remote-debugging-')))
chromeArguments.push(options.pipe ? '--remote-debugging-pipe' : '--remote-debugging-port=0');
@@ -155,17 +150,19 @@ class Launcher {
/** @type {?Connection} */
let connection = null;
try {
const connectionDelay = options.slowMo || 0;
const {
ignoreHTTPSErrors = false,
defaultViewport = {width: 800, height: 600},
slowMo = 0
} = options;
if (!usePipe) {
const timeout = helper.isNumber(options.timeout) ? options.timeout : 30000;
const browserWSEndpoint = await waitForWSEndpoint(chromeProcess, timeout);
connection = await Connection.createForWebSocket(browserWSEndpoint, connectionDelay);
connection = await Connection.createForWebSocket(browserWSEndpoint, slowMo);
} else {
connection = Connection.createForPipe(/** @type {!NodeJS.WritableStream} */(chromeProcess.stdio[3]), /** @type {!NodeJS.ReadableStream} */ (chromeProcess.stdio[4]), connectionDelay);
connection = Connection.createForPipe(/** @type {!NodeJS.WritableStream} */(chromeProcess.stdio[3]), /** @type {!NodeJS.ReadableStream} */ (chromeProcess.stdio[4]), slowMo);
}
const ignoreHTTPSErrors = !!options.ignoreHTTPSErrors;
const setDefaultViewport = !options.appMode;
const browser = await Browser.create(connection, [], ignoreHTTPSErrors, setDefaultViewport, chromeProcess, gracefullyCloseChrome);
const browser = await Browser.create(connection, [], ignoreHTTPSErrors, defaultViewport, chromeProcess, gracefullyCloseChrome);
await ensureInitialPage(browser);
return browser;
} catch (e) {
@@ -247,15 +244,19 @@ class Launcher {
}
/**
* @param {!Object=} options
* @param {!(BrowserOptions & {browserWSEndpoint: string})=} options
* @return {!Promise<!Browser>}
*/
static async connect(options = {}) {
const connectionDelay = options.slowMo || 0;
const connection = await Connection.createForWebSocket(options.browserWSEndpoint, connectionDelay);
static async connect(options) {
const {
browserWSEndpoint,
ignoreHTTPSErrors = false,
defaultViewport = {width: 800, height: 600},
slowMo = 0,
} = options;
const connection = await Connection.createForWebSocket(browserWSEndpoint, slowMo);
const {browserContextIds} = await connection.send('Target.getBrowserContexts');
const ignoreHTTPSErrors = !!options.ignoreHTTPSErrors;
return Browser.create(connection, browserContextIds, ignoreHTTPSErrors, true /* setDefaultViewport */, null, () => connection.send('Browser.close').catch(debugError));
return Browser.create(connection, browserContextIds, ignoreHTTPSErrors, defaultViewport, null, () => connection.send('Browser.close').catch(debugError));
}
}
@@ -317,10 +318,8 @@ function waitForWSEndpoint(chromeProcess, timeout) {
/**
* @typedef {Object} LaunchOptions
* @property {boolean=} ignoreHTTPSErrors
* @property {boolean=} headless
* @property {string=} executablePath
* @property {number=} slowMo
* @property {!Array<string>=} args
* @property {boolean=} ignoreDefaultArgs
* @property {boolean=} handleSIGINT
@@ -332,7 +331,13 @@ function waitForWSEndpoint(chromeProcess, timeout) {
* @property {!Object<string, string | undefined>=} env
* @property {boolean=} devtools
* @property {boolean=} pipe
* @property {boolean=} appMode
*/
/**
* @typedef {Object} BrowserOptions
* @property {boolean=} ignoreHTTPSErrors
* @property {(?Puppeteer.Viewport)=} defaultViewport
* @property {number=} slowMo
*/