diff --git a/docs/api/puppeteer.frame.goto.md b/docs/api/puppeteer.frame.goto.md index b1265055..ff377102 100644 --- a/docs/api/puppeteer.frame.goto.md +++ b/docs/api/puppeteer.frame.goto.md @@ -14,6 +14,7 @@ class Frame { url: string, options?: { referer?: string; + referrerPolicy?: string; timeout?: number; waitUntil?: PuppeteerLifeCycleEvent | PuppeteerLifeCycleEvent[]; } @@ -23,10 +24,10 @@ class Frame { ## Parameters -| Parameter | Type | Description | -| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| url | string | the URL to navigate the frame to. This should include the scheme, e.g. https://. | -| options | { referer?: string; timeout?: number; waitUntil?: [PuppeteerLifeCycleEvent](./puppeteer.puppeteerlifecycleevent.md) \| [PuppeteerLifeCycleEvent](./puppeteer.puppeteerlifecycleevent.md)\[\]; } | (Optional) navigation options. waitUntil is useful to define when the navigation should be considered successful - see the docs for [PuppeteerLifeCycleEvent](./puppeteer.puppeteerlifecycleevent.md) for more details. | +| Parameter | Type | Description | +| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| url | string | the URL to navigate the frame to. This should include the scheme, e.g. https://. | +| options | { referer?: string; referrerPolicy?: string; timeout?: number; waitUntil?: [PuppeteerLifeCycleEvent](./puppeteer.puppeteerlifecycleevent.md) \| [PuppeteerLifeCycleEvent](./puppeteer.puppeteerlifecycleevent.md)\[\]; } | (Optional) navigation options. waitUntil is useful to define when the navigation should be considered successful - see the docs for [PuppeteerLifeCycleEvent](./puppeteer.puppeteerlifecycleevent.md) for more details. | **Returns:** diff --git a/docs/api/puppeteer.page.goto.md b/docs/api/puppeteer.page.goto.md index 91860ea1..4b4ec1ce 100644 --- a/docs/api/puppeteer.page.goto.md +++ b/docs/api/puppeteer.page.goto.md @@ -12,6 +12,7 @@ class Page { url: string, options?: WaitForOptions & { referer?: string; + referrerPolicy?: string; } ): Promise; } @@ -19,10 +20,10 @@ class Page { ## Parameters -| Parameter | Type | Description | -| --------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | -| url | string | URL to navigate page to. The URL should include scheme, e.g. https:// | -| options | [WaitForOptions](./puppeteer.waitforoptions.md) & { referer?: string; } | (Optional) Navigation Parameter | +| Parameter | Type | Description | +| --------- | ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | +| url | string | URL to navigate page to. The URL should include scheme, e.g. https:// | +| options | [WaitForOptions](./puppeteer.waitforoptions.md) & { referer?: string; referrerPolicy?: string; } | (Optional) Navigation Parameter | **Returns:** @@ -38,7 +39,7 @@ The argument `options` might have the following properties: - `waitUntil`:When to consider navigation succeeded, defaults to `load`. Given an array of event strings, navigation is considered to be successful after all events have been fired. Events can be either:
- `load` : consider navigation to be finished when the load event is fired.
- `domcontentloaded` : consider navigation to be finished when the DOMContentLoaded event is fired.
- `networkidle0` : consider navigation to be finished when there are no more than 0 network connections for at least `500` ms.
- `networkidle2` : consider navigation to be finished when there are no more than 2 network connections for at least `500` ms. -- `referer` : Referer header value. If provided it will take preference over the referer header value set by [page.setExtraHTTPHeaders()](./puppeteer.page.setextrahttpheaders.md). +- `referer` : Referer header value. If provided it will take preference over the referer header value set by [page.setExtraHTTPHeaders()](./puppeteer.page.setextrahttpheaders.md).
- `referrerPolicy` : ReferrerPolicy. If provided it will take preference over the referer-policy header value set by [page.setExtraHTTPHeaders()](./puppeteer.page.setextrahttpheaders.md). `page.goto` will throw an error if: diff --git a/packages/puppeteer-core/src/api/Page.ts b/packages/puppeteer-core/src/api/Page.ts index 85aa3d88..31f6e9f4 100644 --- a/packages/puppeteer-core/src/api/Page.ts +++ b/packages/puppeteer-core/src/api/Page.ts @@ -1381,6 +1381,9 @@ export class Page extends EventEmitter { * * - `referer` : Referer header value. If provided it will take preference * over the referer header value set by + * {@link Page.setExtraHTTPHeaders |page.setExtraHTTPHeaders()}.
+ * - `referrerPolicy` : ReferrerPolicy. If provided it will take preference + * over the referer-policy header value set by * {@link Page.setExtraHTTPHeaders |page.setExtraHTTPHeaders()}. * * `page.goto` will throw an error if: @@ -1408,7 +1411,7 @@ export class Page extends EventEmitter { */ async goto( url: string, - options?: WaitForOptions & {referer?: string} + options?: WaitForOptions & {referer?: string; referrerPolicy?: string} ): Promise; async goto(): Promise { throw new Error('Not implemented'); diff --git a/packages/puppeteer-core/src/common/Frame.ts b/packages/puppeteer-core/src/common/Frame.ts index 63a28075..cbd1097a 100644 --- a/packages/puppeteer-core/src/common/Frame.ts +++ b/packages/puppeteer-core/src/common/Frame.ts @@ -289,12 +289,16 @@ export class Frame { url: string, options: { referer?: string; + referrerPolicy?: string; timeout?: number; waitUntil?: PuppeteerLifeCycleEvent | PuppeteerLifeCycleEvent[]; } = {} ): Promise { const { referer = this._frameManager.networkManager.extraHTTPHeaders()['referer'], + referrerPolicy = this._frameManager.networkManager.extraHTTPHeaders()[ + 'referer-policy' + ], waitUntil = ['load'], timeout = this._frameManager.timeoutSettings.navigationTimeout(), } = options; @@ -307,7 +311,13 @@ export class Frame { timeout ); let error = await Promise.race([ - navigate(this.#client, url, referer, this._id), + navigate( + this.#client, + url, + referer, + referrerPolicy as Protocol.Page.ReferrerPolicy, + this._id + ), watcher.timeoutOrTerminationPromise(), ]); if (!error) { @@ -332,6 +342,7 @@ export class Frame { client: CDPSession, url: string, referrer: string | undefined, + referrerPolicy: Protocol.Page.ReferrerPolicy | undefined, frameId: string ): Promise { try { @@ -339,6 +350,7 @@ export class Frame { url, referrer, frameId, + referrerPolicy, }); ensureNewDocumentNavigation = !!response.loaderId; return response.errorText diff --git a/packages/puppeteer-core/src/common/Page.ts b/packages/puppeteer-core/src/common/Page.ts index 388fc7f0..f86abf6f 100644 --- a/packages/puppeteer-core/src/common/Page.ts +++ b/packages/puppeteer-core/src/common/Page.ts @@ -893,7 +893,7 @@ export class CDPPage extends Page { override async goto( url: string, - options: WaitForOptions & {referer?: string} = {} + options: WaitForOptions & {referer?: string; referrerPolicy?: string} = {} ): Promise { return await this.#frameManager.mainFrame().goto(url, options); } diff --git a/test/src/navigation.spec.ts b/test/src/navigation.spec.ts index 73013c68..fea8015c 100644 --- a/test/src/navigation.spec.ts +++ b/test/src/navigation.spec.ts @@ -494,6 +494,20 @@ describe('navigation', function () { // Make sure subresources do not inherit referer. expect(request2.headers['referer']).toBe(server.PREFIX + '/grid.html'); }); + + it('should send referer policy', async () => { + const {page, server} = getTestState(); + + const [request1, request2] = await Promise.all([ + server.waitForRequest('/grid.html'), + server.waitForRequest('/digits/1.png'), + page.goto(server.PREFIX + '/grid.html', { + referrerPolicy: 'no-referer', + }), + ]); + expect(request1.headers['referer']).toBeUndefined(); + expect(request2.headers['referer']).toBe(server.PREFIX + '/grid.html'); + }); }); describe('Page.waitForNavigation', function () {