diff --git a/src/utils/multimap.ts b/src/utils/multimap.ts index e32e1efbf2114..5c671fcc48c98 100644 --- a/src/utils/multimap.ts +++ b/src/utils/multimap.ts @@ -15,23 +15,23 @@ */ export class MultiMap { - private _map: Map>; + private _map: Map; constructor() { - this._map = new Map>(); + this._map = new Map(); } set(key: K, value: V) { - let set = this._map.get(key); - if (!set) { - set = new Set(); - this._map.set(key, set); + let values = this._map.get(key); + if (!values) { + values = []; + this._map.set(key, values); } - set.add(value); + values.push(value); } - get(key: K): Set { - return this._map.get(key) || new Set(); + get(key: K): V[] { + return this._map.get(key) || []; } has(key: K): boolean { @@ -39,28 +39,16 @@ export class MultiMap { } hasValue(key: K, value: V): boolean { - const set = this._map.get(key); - if (!set) + const values = this._map.get(key); + if (!values) return false; - return set.has(value); + return values.includes(value); } get size(): number { return this._map.size; } - delete(key: K, value: V): boolean { - const values = this.get(key); - const result = values.delete(value); - if (!values.size) - this._map.delete(key); - return result; - } - - deleteAll(key: K) { - this._map.delete(key); - } - keys(): IterableIterator { return this._map.keys(); } @@ -68,7 +56,7 @@ export class MultiMap { values(): Iterable { const result: V[] = []; for (const key of this.keys()) - result.push(...Array.from(this.get(key)!)); + result.push(...this.get(key)); return result; } diff --git a/tests/page/page-route.spec.ts b/tests/page/page-route.spec.ts index 9aeaa0b716920..6b1e304902c1a 100644 --- a/tests/page/page-route.spec.ts +++ b/tests/page/page-route.spec.ts @@ -213,10 +213,14 @@ it('should pause intercepted fetch request until continue', async ({page, server expect(status).toBe(200); }); -it('should work with custom referer headers', async ({page, server}) => { +it('should work with custom referer headers', async ({page, server, browserName}) => { await page.setExtraHTTPHeaders({ 'referer': server.EMPTY_PAGE }); await page.route('**/*', route => { - expect(route.request().headers()['referer']).toBe(server.EMPTY_PAGE); + // See https://github.com/microsoft/playwright/issues/8999 + if (browserName === 'chromium') + expect(route.request().headers()['referer']).toBe(server.EMPTY_PAGE + ', ' + server.EMPTY_PAGE); + else + expect(route.request().headers()['referer']).toBe(server.EMPTY_PAGE); route.continue(); }); const response = await page.goto(server.EMPTY_PAGE); diff --git a/tests/page/page-set-extra-http-headers.spec.ts b/tests/page/page-set-extra-http-headers.spec.ts index d03d6f16725b3..31702badc8f0c 100644 --- a/tests/page/page-set-extra-http-headers.spec.ts +++ b/tests/page/page-set-extra-http-headers.spec.ts @@ -60,3 +60,11 @@ it('should throw for non-string header values', async ({page}) => { const error2 = await page.context().setExtraHTTPHeaders({ 'foo': true }).catch(e => e); expect(error2.message).toContain('Expected value of header "foo" to be String, but "boolean" is found.'); }); + +it('should not duplicate referer header', async ({page, server, browserName}) => { + it.fail(browserName === 'chromium', 'Request has referer and Referer'); + await page.setExtraHTTPHeaders({ 'referer': server.EMPTY_PAGE }); + const response = await page.goto(server.EMPTY_PAGE); + expect(response.ok()).toBe(true); + expect(response.request().headers()['referer']).toBe(server.EMPTY_PAGE); +});