@@ -11,6 +11,34 @@ const urlsToCache = [
11
11
'< %= doc_index_urls . join "', \n '" % > ',
12
12
];
13
13
14
+ < % # Clone a request with the mode set to 'cors ' % >
15
+ function corsify(request) {
16
+ const options = {
17
+ mode : 'cors' ,
18
+ } ;
19
+
20
+ const keys = [
21
+ 'body' ,
22
+ 'cache' ,
23
+ 'credentials' ,
24
+ 'headers' ,
25
+ 'integrity' ,
26
+ 'keepalive' ,
27
+ 'method' ,
28
+ 'redirect' ,
29
+ 'referrer' ,
30
+ 'referrerPolicy' ,
31
+ 'signal' ,
32
+ 'window' ,
33
+ ] ;
34
+
35
+ for ( const key of keys ) {
36
+ options [ key ] = request [ key ] ;
37
+ }
38
+
39
+ return new Request(request.url, options);
40
+ }
41
+
14
42
< % # Set-up the cache % >
15
43
self.addEventListener('install', event => {
16
44
self . skipWaiting ( ) ;
@@ -36,21 +64,25 @@ self.addEventListener('fetch', event => {
36
64
if ( cachedResponse ) return cachedResponse ;
37
65
38
66
try {
39
- const response = await fetch ( event . request ) ;
67
+ const response = await fetch ( corsify ( event . request ) ) ;
40
68
41
- if ( ! response . ok ) {
69
+ < % # If the status code is 0 it means the response is opaque % >
70
+ < % # If the response is opaque it 's not possible to read whether it is successful or not , so we assume it is % >
71
+ if ( ! response . ok && response . status !== 0 ) {
42
72
throw new Error ( `The HTTP request failed with status code ${ response . status } ` ) ;
43
73
}
44
74
45
75
return response ;
46
76
} catch ( err ) {
47
77
const url = new URL ( event . request . url ) ;
48
78
49
- < % # Attempt to return the index page from the cache if the user is visiting a url like devdocs . io / offline or devdocs . io / javascript / global_objects / array / find % >
50
- < % # The index page will make sure the correct documentation or a proper offline page is shown % >
51
79
const pathname = url . pathname ;
52
80
const filename = pathname . substr ( 1 + pathname . lastIndexOf ( '/' ) ) . split ( / \# | \? / g) [ 0 ] ;
53
- if (url.origin === location.origin && ! [ '.css' , '.js' , '.json' , '.png' , '.ico' , '.svg' , '.xml' ] . some ( ext => filename . endsWith ( ext ) ) ) {
81
+ const extensions = [ '.html' , '.css' , '.js' , '.json' , '.png' , '.ico' , '.svg' , '.xml' ] ;
82
+
83
+ < % # Attempt to return the index page from the cache if the user is visiting a url like devdocs . io / offline or devdocs . io / javascript / global_objects / array / find % >
84
+ < % # The index page will make sure the correct documentation or a proper offline page is shown % >
85
+ if (url.origin === location.origin && ! extensions . some ( ext => filename . endsWith ( ext ) ) ) {
54
86
const cachedIndex = await caches . match ( '/' ) ;
55
87
if ( cachedIndex ) return cachedIndex ;
56
88
}
0 commit comments