@@ -182,25 +182,125 @@ it('should set CloseEvent.wasClean to false when the server terminates a WebSock
182
182
expect ( wasClean ) . toBe ( false ) ;
183
183
} ) ;
184
184
185
- it ( 'serviceWorker should intercept document request' , async ( { page, server } ) => {
186
- server . setRoute ( '/sw.js' , ( req , res ) => {
187
- res . setHeader ( 'Content-Type' , 'application/javascript' ) ;
188
- res . end ( `
189
- self.addEventListener('fetch', event => {
190
- event.respondWith(new Response('intercepted'));
191
- });
192
- self.addEventListener('activate', event => {
193
- event.waitUntil(clients.claim());
194
- });
195
- ` ) ;
185
+ it . describe ( ( ) => {
186
+ it . use ( { ignoreHTTPSErrors : true } ) ;
187
+ it ( 'serviceWorker should intercept document request' , async ( { page, httpsServer } ) => {
188
+ httpsServer . setRoute ( '/sw.js' , ( req , res ) => {
189
+ res . setHeader ( 'Content-Type' , 'application/javascript' ) ;
190
+ res . end ( `
191
+ self.addEventListener('fetch', event => {
192
+ event.respondWith(new Response('intercepted'));
193
+ });
194
+ self.addEventListener('activate', event => {
195
+ event.waitUntil(clients.claim());
196
+ });
197
+ ` ) ;
198
+ } ) ;
199
+ await page . goto ( httpsServer . EMPTY_PAGE ) ;
200
+ await page . evaluate ( async ( ) => {
201
+ await navigator . serviceWorker . register ( '/sw.js' ) ;
202
+ await new Promise ( resolve => navigator . serviceWorker . oncontrollerchange = resolve ) ;
203
+ } ) ;
204
+ await page . reload ( ) ;
205
+ expect ( await page . textContent ( 'body' ) ) . toBe ( 'intercepted' ) ;
196
206
} ) ;
197
- await page . goto ( server . EMPTY_PAGE ) ;
198
- await page . evaluate ( async ( ) => {
199
- await navigator . serviceWorker . register ( '/sw.js' ) ;
200
- await new Promise ( resolve => navigator . serviceWorker . oncontrollerchange = resolve ) ;
207
+
208
+ it ( 'service worker should register in an iframe' , async ( { page, httpsServer } ) => {
209
+ it . info ( ) . annotations . push ( { type : 'issue' , description : 'https://github.com/microsoft/playwright/issues/29267' } ) ;
210
+
211
+ httpsServer . setRoute ( '/main.html' , ( req , res ) => {
212
+ res . writeHead ( 200 , { 'content-type' : 'text/html' } ) . end ( `
213
+ <iframe src='/dir/iframe.html'></iframe>
214
+ ` ) ;
215
+ } ) ;
216
+
217
+ httpsServer . setRoute ( '/dir/iframe.html' , ( req , res ) => {
218
+ res . writeHead ( 200 , { 'content-type' : 'text/html' } ) . end ( `
219
+ <script>
220
+ window.registrationPromise = navigator.serviceWorker.register('sw.js');
221
+ window.activationPromise = new Promise(resolve => navigator.serviceWorker.oncontrollerchange = resolve);
222
+ </script>
223
+ ` ) ;
224
+ } ) ;
225
+
226
+ httpsServer . setRoute ( '/dir/sw.js' , ( req , res ) => {
227
+ res . writeHead ( 200 , { 'content-type' : 'application/javascript' } ) . end ( `
228
+ const kIframeHtml = "<div>from the service worker</div>";
229
+
230
+ self.addEventListener('fetch', event => {
231
+ if (event.request.url.endsWith('html')) {
232
+ event.respondWith(fetch(event.request));
233
+ return;
234
+ }
235
+ const blob = new Blob(['responseFromServiceWorker'], { type: 'text/plain' });
236
+ const response = new Response(blob, { status: 200 , statusText: 'OK' });
237
+ event.respondWith(response);
238
+ });
239
+
240
+ self.addEventListener('activate', event => {
241
+ event.waitUntil(clients.claim());
242
+ });
243
+ ` ) ;
244
+ } ) ;
245
+
246
+ await page . goto ( httpsServer . PREFIX + '/main.html' ) ;
247
+ const iframe = page . frames ( ) [ 1 ] ;
248
+ await iframe . evaluate ( ( ) => window [ 'activationPromise' ] ) ;
249
+
250
+ const response = await iframe . evaluate ( async ( ) => {
251
+ const response = await fetch ( 'foo.txt' ) ;
252
+ return response . text ( ) ;
253
+ } ) ;
254
+ expect ( response ) . toBe ( 'responseFromServiceWorker' ) ;
255
+ } ) ;
256
+
257
+ it ( 'service worker should cover the iframe' , async ( { page, httpsServer } ) => {
258
+ it . info ( ) . annotations . push ( { type : 'issue' , description : 'https://github.com/microsoft/playwright/issues/29267' } ) ;
259
+
260
+ httpsServer . setRoute ( '/sw.html' , ( req , res ) => {
261
+ res . writeHead ( 200 , { 'content-type' : 'text/html' } ) . end ( `
262
+ <script>
263
+ window.registrationPromise = navigator.serviceWorker.register('sw.js');
264
+ window.activationPromise = new Promise(resolve => navigator.serviceWorker.oncontrollerchange = resolve);
265
+ </script>
266
+ ` ) ;
267
+ } ) ;
268
+
269
+ httpsServer . setRoute ( '/iframe.html' , ( req , res ) => {
270
+ res . writeHead ( 200 , { 'content-type' : 'text/html' } ) . end ( `<div>from the server</div>` ) ;
271
+ } ) ;
272
+
273
+ httpsServer . setRoute ( '/sw.js' , ( req , res ) => {
274
+ res . writeHead ( 200 , { 'content-type' : 'application/javascript' } ) . end ( `
275
+ const kIframeHtml = "<div>from the service worker</div>";
276
+
277
+ self.addEventListener('fetch', event => {
278
+ if (event.request.url.endsWith('iframe.html')) {
279
+ const blob = new Blob([kIframeHtml], { type: 'text/html' });
280
+ const response = new Response(blob, { status: 200 , statusText: 'OK' });
281
+ event.respondWith(response);
282
+ return;
283
+ }
284
+ event.respondWith(fetch(event.request));
285
+ });
286
+
287
+ self.addEventListener('activate', event => {
288
+ event.waitUntil(clients.claim());
289
+ });
290
+ ` ) ;
291
+ } ) ;
292
+
293
+ await page . goto ( httpsServer . PREFIX + '/sw.html' ) ;
294
+ await page . evaluate ( ( ) => window [ 'activationPromise' ] ) ;
295
+
296
+ await page . evaluate ( ( ) => {
297
+ const iframe = document . createElement ( 'iframe' ) ;
298
+ iframe . src = '/iframe.html' ;
299
+ document . body . appendChild ( iframe ) ;
300
+ } ) ;
301
+
302
+ await expect ( page . frameLocator ( 'iframe' ) . locator ( 'div' ) ) . toHaveText ( 'from the service worker' ) ;
201
303
} ) ;
202
- await page . reload ( ) ;
203
- expect ( await page . textContent ( 'body' ) ) . toBe ( 'intercepted' ) ;
204
304
} ) ;
205
305
206
306
it ( 'webkit should define window.safari' , async ( { page, server, browserName } ) => {
@@ -294,103 +394,6 @@ it('Intl.ListFormat should work', async ({ page, server, browserName }) => {
294
394
expect ( formatted ) . toBe ( 'first, second, or third' ) ;
295
395
} ) ;
296
396
297
- it ( 'service worker should cover the iframe' , async ( { page, server } ) => {
298
- it . info ( ) . annotations . push ( { type : 'issue' , description : 'https://github.com/microsoft/playwright/issues/29267' } ) ;
299
-
300
- server . setRoute ( '/sw.html' , ( req , res ) => {
301
- res . writeHead ( 200 , { 'content-type' : 'text/html' } ) . end ( `
302
- <script>
303
- window.registrationPromise = navigator.serviceWorker.register('sw.js');
304
- window.activationPromise = new Promise(resolve => navigator.serviceWorker.oncontrollerchange = resolve);
305
- </script>
306
- ` ) ;
307
- } ) ;
308
-
309
- server . setRoute ( '/iframe.html' , ( req , res ) => {
310
- res . writeHead ( 200 , { 'content-type' : 'text/html' } ) . end ( `<div>from the server</div>` ) ;
311
- } ) ;
312
-
313
- server . setRoute ( '/sw.js' , ( req , res ) => {
314
- res . writeHead ( 200 , { 'content-type' : 'application/javascript' } ) . end ( `
315
- const kIframeHtml = "<div>from the service worker</div>";
316
-
317
- self.addEventListener('fetch', event => {
318
- if (event.request.url.endsWith('iframe.html')) {
319
- const blob = new Blob([kIframeHtml], { type: 'text/html' });
320
- const response = new Response(blob, { status: 200 , statusText: 'OK' });
321
- event.respondWith(response);
322
- return;
323
- }
324
- event.respondWith(fetch(event.request));
325
- });
326
-
327
- self.addEventListener('activate', event => {
328
- event.waitUntil(clients.claim());
329
- });
330
- ` ) ;
331
- } ) ;
332
-
333
- await page . goto ( server . PREFIX + '/sw.html' ) ;
334
- await page . evaluate ( ( ) => window [ 'activationPromise' ] ) ;
335
-
336
- await page . evaluate ( ( ) => {
337
- const iframe = document . createElement ( 'iframe' ) ;
338
- iframe . src = '/iframe.html' ;
339
- document . body . appendChild ( iframe ) ;
340
- } ) ;
341
-
342
- await expect ( page . frameLocator ( 'iframe' ) . locator ( 'div' ) ) . toHaveText ( 'from the service worker' ) ;
343
- } ) ;
344
-
345
- it ( 'service worker should register in an iframe' , async ( { page, server } ) => {
346
- it . info ( ) . annotations . push ( { type : 'issue' , description : 'https://github.com/microsoft/playwright/issues/29267' } ) ;
347
-
348
- server . setRoute ( '/main.html' , ( req , res ) => {
349
- res . writeHead ( 200 , { 'content-type' : 'text/html' } ) . end ( `
350
- <iframe src='/dir/iframe.html'></iframe>
351
- ` ) ;
352
- } ) ;
353
-
354
- server . setRoute ( '/dir/iframe.html' , ( req , res ) => {
355
- res . writeHead ( 200 , { 'content-type' : 'text/html' } ) . end ( `
356
- <script>
357
- window.registrationPromise = navigator.serviceWorker.register('sw.js');
358
- window.activationPromise = new Promise(resolve => navigator.serviceWorker.oncontrollerchange = resolve);
359
- </script>
360
- ` ) ;
361
- } ) ;
362
-
363
- server . setRoute ( '/dir/sw.js' , ( req , res ) => {
364
- res . writeHead ( 200 , { 'content-type' : 'application/javascript' } ) . end ( `
365
- const kIframeHtml = "<div>from the service worker</div>";
366
-
367
- self.addEventListener('fetch', event => {
368
- if (event.request.url.endsWith('html')) {
369
- event.respondWith(fetch(event.request));
370
- return;
371
- }
372
- const blob = new Blob(['responseFromServiceWorker'], { type: 'text/plain' });
373
- const response = new Response(blob, { status: 200 , statusText: 'OK' });
374
- event.respondWith(response);
375
- });
376
-
377
- self.addEventListener('activate', event => {
378
- event.waitUntil(clients.claim());
379
- });
380
- ` ) ;
381
- } ) ;
382
-
383
- await page . goto ( server . PREFIX + '/main.html' ) ;
384
- const iframe = page . frames ( ) [ 1 ] ;
385
- await iframe . evaluate ( ( ) => window [ 'activationPromise' ] ) ;
386
-
387
- const response = await iframe . evaluate ( async ( ) => {
388
- const response = await fetch ( 'foo.txt' ) ;
389
- return response . text ( ) ;
390
- } ) ;
391
- expect ( response ) . toBe ( 'responseFromServiceWorker' ) ;
392
- } ) ;
393
-
394
397
it ( 'should be able to render avif images' , {
395
398
annotation : {
396
399
type : 'issue' ,
0 commit comments