diff --git a/src/webkit/wkInterceptableRequest.ts b/src/webkit/wkInterceptableRequest.ts index e7d6728628..f12a0c8bd5 100644 --- a/src/webkit/wkInterceptableRequest.ts +++ b/src/webkit/wkInterceptableRequest.ts @@ -77,8 +77,15 @@ export class WKInterceptableRequest implements network.RouteDelegate { for (const header of Object.keys(response.headers)) responseHeaders[header.toLowerCase()] = String(response.headers[header]); } - if (response.contentType) + let mimeType = base64Encoded ? 'application/octet-stream' : 'text/plain'; + if (response.contentType) { responseHeaders['content-type'] = response.contentType; + const index = response.contentType.indexOf(';'); + if (index !== -1) + mimeType = response.contentType.substring(0, index).trimEnd(); + else + mimeType = response.contentType.trim(); + } if (responseBody && !('content-length' in responseHeaders)) responseHeaders['content-length'] = String(Buffer.byteLength(responseBody)); @@ -86,7 +93,7 @@ export class WKInterceptableRequest implements network.RouteDelegate { requestId: this._requestId, status: response.status || 200, statusText: network.STATUS_TEXTS[String(response.status || 200)], - mimeType: response.contentType || (base64Encoded ? 'application/octet-stream' : 'text/plain'), + mimeType, headers: responseHeaders, base64Encoded, content: responseBody diff --git a/test/golden-chromium/mock-svg.png b/test/golden-chromium/mock-svg.png new file mode 100644 index 0000000000..6b382a810d Binary files /dev/null and b/test/golden-chromium/mock-svg.png differ diff --git a/test/golden-firefox/mock-svg.png b/test/golden-firefox/mock-svg.png new file mode 100644 index 0000000000..a9ee147949 Binary files /dev/null and b/test/golden-firefox/mock-svg.png differ diff --git a/test/golden-webkit/mock-svg.png b/test/golden-webkit/mock-svg.png new file mode 100644 index 0000000000..668e8292fa Binary files /dev/null and b/test/golden-webkit/mock-svg.png differ diff --git a/test/interception.spec.js b/test/interception.spec.js index fc6173ea49..5626547673 100644 --- a/test/interception.spec.js +++ b/test/interception.spec.js @@ -484,6 +484,23 @@ describe('Request.fulfill', function() { const img = await page.$('img'); expect(await img.screenshot()).toBeGolden(golden('mock-binary-response.png')); }); + it.skip(FFOX && !HEADLESS)('should allow mocking svg with charset', async({page, server, golden}) => { + // Firefox headful produces a different image. + await page.route('**/*', route => { + route.fulfill({ + contentType: 'image/svg+xml ; charset=utf-8', + body: '' + }); + }); + await page.evaluate(PREFIX => { + const img = document.createElement('img'); + img.src = PREFIX + '/does-not-exist.svg'; + document.body.appendChild(img); + return new Promise((f, r) => { img.onload = f; img.onerror = r; }); + }, server.PREFIX); + const img = await page.$('img'); + expect(await img.screenshot()).toBeGolden(golden('mock-svg.png')); + }); it('should work with file path', async({page, server, golden}) => { await page.route('**/*', route => route.fulfill({ contentType: 'shouldBeIgnored', path: path.join(__dirname, 'assets', 'pptr.png') })); await page.evaluate(PREFIX => {