diff --git a/docs/api.md b/docs/api.md index 5e84034786..c9b4735cf5 100644 --- a/docs/api.md +++ b/docs/api.md @@ -88,7 +88,6 @@ * [page.accessibility](#pageaccessibility) * [page.addScriptTag(options)](#pageaddscripttagoptions) * [page.addStyleTag(options)](#pageaddstyletagoptions) - * [page.authenticate(credentials)](#pageauthenticatecredentials) * [page.browser()](#pagebrowser) * [page.browserContext()](#pagebrowsercontext) * [page.click(selector[, options])](#pageclickselector-options) @@ -127,7 +126,6 @@ * [page.setDefaultTimeout(timeout)](#pagesetdefaulttimeouttimeout) * [page.setExtraHTTPHeaders(headers)](#pagesetextrahttpheadersheaders) * [page.setJavaScriptEnabled(enabled)](#pagesetjavascriptenabledenabled) - * [page.setOfflineMode(enabled)](#pagesetofflinemodeenabled) * [page.setUserAgent(userAgent)](#pagesetuseragentuseragent) * [page.setViewport(viewport)](#pagesetviewportviewport) * [page.target()](#pagetarget) @@ -232,10 +230,12 @@ * [executionContext.frame()](#executioncontextframe) - [class: Interception](#class-interception) * [interception.abort(request, [errorCode])](#interceptionabortrequest-errorcode) + * [interception.authenticate(credentials)](#interceptionauthenticatecredentials) * [interception.continue(request, [overrides])](#interceptioncontinuerequest-overrides) * [interception.disable()](#interceptiondisable) * [interception.enable()](#interceptionenable) * [interception.fulfill(request, response)](#interceptionfulfillrequest-response) + * [interception.setOfflineMode(enabled)](#interceptionsetofflinemodeenabled) - [class: JSHandle](#class-jshandle) * [jsHandle.asElement()](#jshandleaselement) * [jsHandle.dispose()](#jshandledispose) @@ -1119,16 +1119,6 @@ Adds a `` tag into the page with the desired url or a ` - - `username` <[string]> - - `password` <[string]> -- returns: <[Promise]> - -Provide credentials for [HTTP authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication). - -To disable authentication, pass `null`. - #### page.browser() - returns: <[Browser]> @@ -1676,10 +1666,6 @@ The extra HTTP headers will be sent with every request the page initiates. > **NOTE** changing this value won't affect scripts that have already been run. It will take full effect on the next [navigation](#pagegotourl-options). -#### page.setOfflineMode(enabled) -- `enabled` <[boolean]> When `true`, enables offline mode for the page. -- returns: <[Promise]> - #### page.setUserAgent(userAgent) - `userAgent` <[string]> Specific user agent to use in this page - returns: <[Promise]> Promise which resolves when the user agent is set. @@ -3111,6 +3097,16 @@ await resultHandle.dispose(); Aborts request. To use this, request interception should be enabled with `page.interception.enable()`. Exception is immediately thrown if the request interception is not enabled. +#### interception.authenticate(credentials) +- `credentials` + - `username` <[string]> + - `password` <[string]> +- returns: <[Promise]> + +Provide credentials for [HTTP authentication](https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication). + +To disable authentication, pass `null`. + #### interception.continue(request, [overrides]) - `request` <[Request]> - `overrides` <[Object]> Optional request overwrites, which can be one of the following: @@ -3195,6 +3191,9 @@ page.on('request', request => { > **NOTE** Mocking responses for dataURL requests is not supported. > Calling `request.respond` for a dataURL request is a noop. +#### interception.setOfflineMode(enabled) +- `enabled` <[boolean]> When `true`, enables offline mode for the page. +- returns: <[Promise]> ### class: JSHandle diff --git a/src/chromium/Page.ts b/src/chromium/Page.ts index 2e7b76c180..de469d8c45 100644 --- a/src/chromium/Page.ts +++ b/src/chromium/Page.ts @@ -217,10 +217,6 @@ export class Page extends EventEmitter { return this._frameManager.frames(); } - setOfflineMode(enabled: boolean) { - return this._frameManager.networkManager().setOfflineMode(enabled); - } - setDefaultNavigationTimeout(timeout: number) { this._timeoutSettings.setDefaultNavigationTimeout(timeout); } @@ -290,10 +286,6 @@ export class Page extends EventEmitter { } } - async authenticate(credentials: { username: string; password: string; } | null) { - return this._frameManager.networkManager().authenticate(credentials); - } - async setExtraHTTPHeaders(headers: { [s: string]: string; }) { return this._frameManager.networkManager().setExtraHTTPHeaders(headers); } diff --git a/src/chromium/features/coverage.spec.js b/src/chromium/features/coverage.spec.js index aee11c12a7..97fd005de3 100644 --- a/src/chromium/features/coverage.spec.js +++ b/src/chromium/features/coverage.spec.js @@ -109,8 +109,7 @@ module.exports.addTests = function({testRunner, expect, FFOX, CHROME, WEBKIT}) { expect(coverage.length).toBe(0); }); }); - // @see https://crbug.com/990945 - xit('should not hang when there is a debugger statement', async function({page, server}) { + it('should not hang when there is a debugger statement', async function({page, server}) { await page.coverage.startJSCoverage(); await page.goto(server.EMPTY_PAGE); await page.evaluate(() => { diff --git a/src/chromium/features/coverage.ts b/src/chromium/features/coverage.ts index 93616d2cf5..b089e21e76 100644 --- a/src/chromium/features/coverage.ts +++ b/src/chromium/features/coverage.ts @@ -92,6 +92,7 @@ class JSCoverage { helper.addEventListener(this._client, 'Debugger.scriptParsed', this._onScriptParsed.bind(this)), helper.addEventListener(this._client, 'Runtime.executionContextsCleared', this._onExecutionContextsCleared.bind(this)), ]; + this._client.on('Debugger.paused', () => this._client.send('Debugger.resume')); await Promise.all([ this._client.send('Profiler.enable'), this._client.send('Profiler.startPreciseCoverage', {callCount: false, detailed: true}), diff --git a/src/chromium/features/interception.ts b/src/chromium/features/interception.ts index 23998ea346..c71279cbe7 100644 --- a/src/chromium/features/interception.ts +++ b/src/chromium/features/interception.ts @@ -29,4 +29,12 @@ export class Interception { async abort(request: Request, errorCode: string = 'failed') { return request._abort(errorCode); } + + setOfflineMode(enabled: boolean) { + return this._networkManager.setOfflineMode(enabled); + } + + async authenticate(credentials: { username: string; password: string; } | null) { + return this._networkManager.authenticate(credentials); + } } diff --git a/test/headful.spec.js b/test/headful.spec.js index ef658f02fe..d606fc8319 100644 --- a/test/headful.spec.js +++ b/test/headful.spec.js @@ -94,7 +94,7 @@ module.exports.addTests = function({testRunner, expect, playwright, defaultBrows const page = await browser.newPage(); await page.goto(server.EMPTY_PAGE); await page.interception.enable(); - page.on('request', r => r.respond({body: 'YO, GOOGLE.COM'})); + page.on('request', r => page.interception.fulfill(r, {body: 'YO, GOOGLE.COM'})); await page.evaluate(() => { const frame = document.createElement('iframe'); frame.setAttribute('src', 'https://google.com/'); diff --git a/test/network.spec.js b/test/network.spec.js index 6de0a9c90f..ae1cad06d3 100644 --- a/test/network.spec.js +++ b/test/network.spec.js @@ -358,12 +358,12 @@ module.exports.addTests = function({testRunner, expect, FFOX, CHROME, WEBKIT}) { }); // FIXME: WebKit doesn't support network interception. - describe.skip(FFOX || WEBKIT)('Page.authenticate', function() { + describe.skip(FFOX || WEBKIT)('Interception.authenticate', function() { it('should work', async({page, server}) => { server.setAuth('/empty.html', 'user', 'pass'); let response = await page.goto(server.EMPTY_PAGE); expect(response.status()).toBe(401); - await page.authenticate({ + await page.interception.authenticate({ username: 'user', password: 'pass' }); @@ -373,7 +373,7 @@ module.exports.addTests = function({testRunner, expect, FFOX, CHROME, WEBKIT}) { it('should fail if wrong credentials', async({page, server}) => { // Use unique user/password since Chrome caches credentials per origin. server.setAuth('/empty.html', 'user2', 'pass2'); - await page.authenticate({ + await page.interception.authenticate({ username: 'foo', password: 'bar' }); @@ -383,13 +383,13 @@ module.exports.addTests = function({testRunner, expect, FFOX, CHROME, WEBKIT}) { it('should allow disable authentication', async({page, server}) => { // Use unique user/password since Chrome caches credentials per origin. server.setAuth('/empty.html', 'user3', 'pass3'); - await page.authenticate({ + await page.interception.authenticate({ username: 'user3', password: 'pass3' }); let response = await page.goto(server.EMPTY_PAGE); expect(response.status()).toBe(200); - await page.authenticate(null); + await page.interception.authenticate(null); // Navigate to a different origin to bust Chrome's credential caching. response = await page.goto(server.CROSS_PROCESS_PREFIX + '/empty.html'); expect(response.status()).toBe(401); diff --git a/test/page.spec.js b/test/page.spec.js index 9ef89c0fde..ca678a37c7 100644 --- a/test/page.spec.js +++ b/test/page.spec.js @@ -166,21 +166,21 @@ module.exports.addTests = function({testRunner, expect, headless, playwright, FF }); }); - describe.skip(FFOX || WEBKIT)('Page.setOfflineMode', function() { + describe.skip(FFOX || WEBKIT)('Interception.setOfflineMode', function() { it('should work', async({page, server}) => { - await page.setOfflineMode(true); + await page.interception.setOfflineMode(true); let error = null; await page.goto(server.EMPTY_PAGE).catch(e => error = e); expect(error).toBeTruthy(); - await page.setOfflineMode(false); + await page.interception.setOfflineMode(false); const response = await page.reload(); expect(response.status()).toBe(200); }); it('should emulate navigator.onLine', async({page, server}) => { expect(await page.evaluate(() => window.navigator.onLine)).toBe(true); - await page.setOfflineMode(true); + await page.interception.setOfflineMode(true); expect(await page.evaluate(() => window.navigator.onLine)).toBe(false); - await page.setOfflineMode(false); + await page.interception.setOfflineMode(false); expect(await page.evaluate(() => window.navigator.onLine)).toBe(true); }); });