diff --git a/experimental/puppeteer-firefox/lib/FrameManager.js b/experimental/puppeteer-firefox/lib/FrameManager.js index f9d872ca998..7201613253b 100644 --- a/experimental/puppeteer-firefox/lib/FrameManager.js +++ b/experimental/puppeteer-firefox/lib/FrameManager.js @@ -13,10 +13,11 @@ class FrameManager extends EventEmitter { * @param {PageSession} session * @param {Page} page */ - constructor(session, page) { + constructor(session, page, timeoutSettings) { super(); this._session = session; this._page = page; + this._timeoutSettings = timeoutSettings; this._mainFrame = null; this._frames = new Map(); this._eventListeners = [ @@ -48,7 +49,7 @@ class FrameManager extends EventEmitter { } _onFrameAttached(params) { - const frame = new Frame(this._session, this, this._page, params.frameId); + const frame = new Frame(this._session, this, this._page, params.frameId, this._timeoutSettings); const parentFrame = this._frames.get(params.parentFrameId) || null; if (parentFrame) { frame._parentFrame = parentFrame; @@ -90,9 +91,10 @@ class Frame { * @param {!Page} page * @param {string} frameId */ - constructor(session, frameManager, page, frameId) { + constructor(session, frameManager, page, frameId, timeoutSettings) { this._session = session; this._frameManager = frameManager; + this._timeoutSettings = timeoutSettings; this._page = page; this._frameId = frameId; /** @type {?Frame} */ @@ -230,7 +232,7 @@ class Frame { waitForFunction(pageFunction, options = {}, ...args) { const { polling = 'raf', - timeout = 30000 + timeout = this._timeoutSettings.timeout(), } = options; return new WaitTask(this, pageFunction, 'function', polling, timeout, ...args).promise; } @@ -263,7 +265,7 @@ class Frame { const { visible: waitForVisible = false, hidden: waitForHidden = false, - timeout = 30000 + timeout = this._timeoutSettings.timeout(), } = options; const polling = waitForVisible || waitForHidden ? 'raf' : 'mutation'; const title = `${isXPath ? 'XPath' : 'selector'} "${selectorOrXPath}"${waitForHidden ? ' to be hidden' : ''}`; diff --git a/experimental/puppeteer-firefox/lib/Page.js b/experimental/puppeteer-firefox/lib/Page.js index 0ff246828f5..8d195ac9e6b 100644 --- a/experimental/puppeteer-firefox/lib/Page.js +++ b/experimental/puppeteer-firefox/lib/Page.js @@ -1,6 +1,5 @@ const {helper} = require('./helper'); const {Keyboard, Mouse} = require('./Input'); -const {constants} = require('./common'); const {Dialog} = require('./Dialog'); const {TimeoutError} = require('./Errors'); const fs = require('fs'); @@ -10,6 +9,7 @@ const EventEmitter = require('events'); const {createHandle} = require('./JSHandle'); const {Events} = require('./Events'); const {FrameManager} = require('./FrameManager'); +const {TimeoutSettings} = require('./TimeoutSettings'); const writeFileAsync = util.promisify(fs.writeFile); @@ -67,12 +67,13 @@ class Page extends EventEmitter { */ constructor(session, target) { super(); + this._timeoutSettings = new TimeoutSettings(); this._session = session; this._target = target; this._keyboard = new Keyboard(session); this._mouse = new Mouse(session, this._keyboard); this._isClosed = false; - this._frameManager = new FrameManager(session, this); + this._frameManager = new FrameManager(session, this, this._timeoutSettings); this._eventListeners = [ helper.addEventListener(this._session, 'Page.uncaughtError', this._onUncaughtError.bind(this)), helper.addEventListener(this._session, 'Page.consoleAPICalled', this._onConsole.bind(this)), @@ -88,6 +89,20 @@ class Page extends EventEmitter { this._viewport = null; } + /** + * @param {number} timeout + */ + setDefaultNavigationTimeout(timeout) { + this._timeoutSettings.setDefaultNavigationTimeout(timeout); + } + + /** + * @param {number} timeout + */ + setDefaultTimeout(timeout) { + this._timeoutSettings.setDefaultTimeout(timeout); + } + /** * @param {string} userAgent */ @@ -214,7 +229,7 @@ class Page extends EventEmitter { */ async waitForNavigation(options = {}) { const { - timeout = constants.DEFAULT_NAVIGATION_TIMEOUT, + timeout = this._timeoutSettings.navigationTimeout(), waitUntil = ['load'], } = options; const frame = this._frameManager.mainFrame(); @@ -263,7 +278,7 @@ class Page extends EventEmitter { */ async goto(url, options = {}) { const { - timeout = constants.DEFAULT_NAVIGATION_TIMEOUT, + timeout = this._timeoutSettings.navigationTimeout(), waitUntil = ['load'], } = options; const frame = this._frameManager.mainFrame(); @@ -296,7 +311,7 @@ class Page extends EventEmitter { */ async goBack(options = {}) { const { - timeout = constants.DEFAULT_NAVIGATION_TIMEOUT, + timeout = this._timeoutSettings.navigationTimeout(), waitUntil = ['load'], } = options; const frame = this._frameManager.mainFrame(); @@ -328,7 +343,7 @@ class Page extends EventEmitter { */ async goForward(options = {}) { const { - timeout = constants.DEFAULT_NAVIGATION_TIMEOUT, + timeout = this._timeoutSettings.navigationTimeout(), waitUntil = ['load'], } = options; const frame = this._frameManager.mainFrame(); @@ -360,7 +375,7 @@ class Page extends EventEmitter { */ async reload(options = {}) { const { - timeout = constants.DEFAULT_NAVIGATION_TIMEOUT, + timeout = this._timeoutSettings.navigationTimeout(), waitUntil = ['load'], } = options; const frame = this._frameManager.mainFrame(); diff --git a/experimental/puppeteer-firefox/lib/TimeoutSettings.js b/experimental/puppeteer-firefox/lib/TimeoutSettings.js new file mode 100644 index 00000000000..c6b08d39671 --- /dev/null +++ b/experimental/puppeteer-firefox/lib/TimeoutSettings.js @@ -0,0 +1,57 @@ +/** + * 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 DEFAULT_TIMEOUT = 30000; + +class TimeoutSettings { + constructor() { + this._defaultTimeout = null; + this._defaultNavigationTimeout = null; + } + + /** + * @param {number} timeout + */ + setDefaultTimeout(timeout) { + this._defaultTimeout = timeout; + } + + /** + * @param {number} timeout + */ + setDefaultNavigationTimeout(timeout) { + this._defaultNavigationTimeout = timeout; + } + + /** + * @return {number} + */ + navigationTimeout() { + if (this._defaultNavigationTimeout !== null) + return this._defaultNavigationTimeout; + if (this._defaultTimeout !== null) + return this._defaultTimeout; + return DEFAULT_TIMEOUT; + } + + timeout() { + if (this._defaultTimeout !== null) + return this._defaultTimeout; + return DEFAULT_TIMEOUT; + } +} + +module.exports = {TimeoutSettings}; diff --git a/experimental/puppeteer-firefox/lib/common.js b/experimental/puppeteer-firefox/lib/common.js deleted file mode 100644 index 0614aa61397..00000000000 --- a/experimental/puppeteer-firefox/lib/common.js +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright 2018 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 constants = { - DEFAULT_NAVIGATION_TIMEOUT: 30000, -}; - -module.exports = {constants}; diff --git a/test/navigation.spec.js b/test/navigation.spec.js index bf004702597..e75d2eca345 100644 --- a/test/navigation.spec.js +++ b/test/navigation.spec.js @@ -131,7 +131,7 @@ module.exports.addTests = function({testRunner, expect, Errors, CHROME}) { expect(error.message).toContain('Navigation Timeout Exceeded: 1ms'); expect(error).toBeInstanceOf(TimeoutError); }); - it_fails_ffox('should fail when exceeding default maximum navigation timeout', async({page, server}) => { + it('should fail when exceeding default maximum navigation timeout', async({page, server}) => { // Hang for request to the empty.html server.setRoute('/empty.html', (req, res) => { }); let error = null; @@ -140,7 +140,7 @@ module.exports.addTests = function({testRunner, expect, Errors, CHROME}) { expect(error.message).toContain('Navigation Timeout Exceeded: 1ms'); expect(error).toBeInstanceOf(TimeoutError); }); - it_fails_ffox('should fail when exceeding default maximum timeout', async({page, server}) => { + it('should fail when exceeding default maximum timeout', async({page, server}) => { // Hang for request to the empty.html server.setRoute('/empty.html', (req, res) => { }); let error = null; @@ -149,7 +149,7 @@ module.exports.addTests = function({testRunner, expect, Errors, CHROME}) { expect(error.message).toContain('Navigation Timeout Exceeded: 1ms'); expect(error).toBeInstanceOf(TimeoutError); }); - it_fails_ffox('should prioritize default navigation timeout over default timeout', async({page, server}) => { + it('should prioritize default navigation timeout over default timeout', async({page, server}) => { // Hang for request to the empty.html server.setRoute('/empty.html', (req, res) => { }); let error = null; diff --git a/test/waittask.spec.js b/test/waittask.spec.js index 426e93e0ea9..bb2b036db88 100644 --- a/test/waittask.spec.js +++ b/test/waittask.spec.js @@ -173,13 +173,12 @@ module.exports.addTests = function({testRunner, expect, product, Errors}) { expect(error.message).toContain('waiting for function failed: timeout'); expect(error).toBeInstanceOf(TimeoutError); }); - it_fails_ffox('should respect default timeout', async({page}) => { + it('should respect default timeout', async({page}) => { page.setDefaultTimeout(1); let error = null; await page.waitForFunction('false').catch(e => error = e); - expect(error).toBeTruthy(); - expect(error.message).toContain('waiting for function failed: timeout'); expect(error).toBeInstanceOf(TimeoutError); + expect(error.message).toContain('waiting for function failed: timeout'); }); it('should disable timeout when its set to 0', async({page}) => { const watchdog = page.waitForFunction(() => {