From 33ebe66ad4ac173d99080fb8c6e7975389212893 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Mon, 4 May 2020 21:49:54 -0700 Subject: [PATCH] fix(webkit): allow contenttype with charset in interception (#2108) --- src/webkit/wkInterceptableRequest.ts | 11 +++++++++-- test/golden-chromium/mock-svg.png | Bin 0 -> 257 bytes test/golden-firefox/mock-svg.png | Bin 0 -> 206 bytes test/golden-webkit/mock-svg.png | Bin 0 -> 323 bytes test/interception.spec.js | 17 +++++++++++++++++ 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 test/golden-chromium/mock-svg.png create mode 100644 test/golden-firefox/mock-svg.png create mode 100644 test/golden-webkit/mock-svg.png 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 0000000000000000000000000000000000000000..6b382a810d2cdd8de9903f4bfcd8016ca9810390 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^R}yFFbTLoyoQ z-g4w>G2m%^s8ziFS;pD3lO~sL(=!oTY25!|U#{RM=hBP2&RV8xC;b1;u-bry*ZIN} z&Yv#bY1huY3E$k}vZV9G(_gtAtMuewt<+d@=2{ZRtPir5m#g`|zv6l~@85|f&Mr%O z4L9{KU6Ex4mX>N;kjR0JnDu4nwB7sbHvE0UrXbr?aSW^pXtkft*^KL%u)b)gTd3)&t;ucLK6VmU~H5C literal 0 HcmV?d00001 diff --git a/test/golden-firefox/mock-svg.png b/test/golden-firefox/mock-svg.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ee14794972c0c985ea86d84f6573277ca0c788 GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nETsh%#5AsLNtZyw}5V!*)~Xk|Rt zF@4H2lMNY5Rr@;2-F{s^@&19g&gTg!-x=R=d2DYed2O#CXn1zbQKd)a9W#9eGYyTI znVyJFFg*6Dd+n;%iudg*+~4s%Np|RBJjoQq;~_R7$zfB22=gS?B@z>K6pl8eFlw@? zyw2!Y^@=Eo=ix1KYHs#(dmwuw@CTbK^zbYZi{u2MK$A4urn?K$Rc>5X{~YrM-nCD(BaViMiXR^(?sE8mq7LrX{de&`~(~dN+r4Vo1Epg(Ek< zDjo8ZxGFAaVpz7fV}r2US63F_9%QA5pGTEd9J9Or>p3?=&Jn(I7Y-Yn@m>z^U*jPe znJlf8*IyCeF=2~RR{Hs(7vg;#Gnh@cy%dz>yd$a@q$DJiyx;`;`;S^*Z>sie2L=R# Mr>mdKI;Vst0AYHFnE(I) literal 0 HcmV?d00001 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 => {