File: basic-service-worker.js

package info (click to toggle)
firefox 143.0.3-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,617,328 kB
  • sloc: cpp: 7,478,492; javascript: 6,417,157; ansic: 3,720,058; python: 1,396,372; xml: 627,523; asm: 438,677; java: 186,156; sh: 63,477; makefile: 19,171; objc: 13,059; perl: 12,983; yacc: 4,583; cs: 3,846; pascal: 3,405; lex: 1,720; ruby: 1,003; exp: 762; php: 436; lisp: 258; awk: 247; sql: 66; sed: 53; csh: 10
file content (102 lines) | stat: -rw-r--r-- 3,610 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
const originalSwOption = new URL(location.href).searchParams.get('sw');
let swOption = originalSwOption;

if (swOption === 'fetch-handler-navigation-preload') {
  self.addEventListener('activate', event => {
    if (self.registration.navigationPreload) {
      event.waitUntil(self.registration.navigationPreload.enable());
    }
  });
}

if (swOption === 'race-fetch-handler' ||
  swOption === 'race-fetch-handler-to-fallback' ||
  swOption === 'race-fetch-handler-modify-url') {
  swOption = swOption.substring('race-'.length);
  self.addEventListener('install', event => {
    event.addRoutes([{
      condition: { urlPattern: { pathname: '/**/counting-executor.py' } },
      source: 'race-network-and-fetch-handler'
    }]);
  });
}

const interceptedRequests = [];

self.addEventListener('message', event => {
  if (event.data === 'getInterceptedRequests') {
    event.source.postMessage(interceptedRequests);
  }
});

if (swOption !== 'no-fetch-handler') {
  self.addEventListener('fetch', event => {

    // Intercept the prefetched and navigated URLs only (e.g. do not intercept
    // subresource requests related to `/common/dispatcher/dispatcher.js`).
    if (!event.request.url.includes('counting-executor.py')) {
      return;
    }

    const headers = {};
    event.request.headers.forEach((value, key) => {
      headers[key] = value;
    });
    const interceptedRequest = {
      request: {
        url: event.request.url,
        headers: headers,
      },
      clientId: event.clientId,
      resultingClientId: event.resultingClientId
    };
    interceptedRequests.push(interceptedRequest);

    if (swOption === 'fetch-handler') {
      event.respondWith(fetch(event.request));
    } else if (swOption === 'fetch-handler-synthetic') {
      const finalUrl = new URL(event.request.url).searchParams.get('location');
      if (finalUrl) {
        event.respondWith(Response.redirect(finalUrl));
      } else {
        // Fallback to the network.
      }
    } else if (swOption === 'fetch-handler-modify-url') {
      // The "Sec-Purpose: prefetch" header is dropped in fetch-handler-modify-*
      // cases in Step 33 of // https://fetch.spec.whatwg.org/#dom-request
      // because it's a https://fetch.spec.whatwg.org/#forbidden-request-header
      const url = new URL(event.request.url);
      url.searchParams.set('intercepted', 'true');
      if (originalSwOption === 'race-fetch-handler-modify-url') {
        // See the comment in `basic.sub.https.html` for delay value.
        url.searchParams.set('delay', '500');
      }
      event.respondWith(fetch(url, {headers: event.request.headers}));
    } else if (swOption === 'fetch-handler-modify-referrer') {
      event.respondWith(fetch(event.request,
          {referrer: new URL('/intercepted', location.href).href}));
    } else if (swOption === 'fetch-handler-navigation-preload') {
      event.respondWith((async () => {
        try {
          if (event.preloadResponse === 'undefined') {
            interceptedRequest.preloadResponse = 'undefined';
            return fetch(event.request);
          }
          const response = await event.preloadResponse;
          if (response) {
            interceptedRequest.preloadResponse = 'resolved';
            return response;
          } else {
            interceptedRequest.preloadResponse = 'resolved to undefined';
            return fetch(event.request);
          }
        } catch(e) {
          interceptedRequest.preloadResponse = 'rejected';
          throw e;
        }
      })());
    } else {
      // Do nothing to fallback to the network.
    }
  });
}