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

content / test / data / service_worker / maybe_offline_support.js [blame]

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

function sleep(delay) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve();
    }, delay);
  });
}

const scriptUrlParams = new URL(self.serviceWorker.scriptURL).searchParams;
if (scriptUrlParams.has('pendingInstallEvent')) {
  // Prevents this SW from being activated.
  self.addEventListener('install', e => {
    e.waitUntil(new Promise(resolve => {}));
  });
}

self.addEventListener("fetch", event => {
  const param = new URL(event.request.url).searchParams;

  if (param.has("fetch")) {
    event.respondWith(fetch(event.request.url));
  } else if (param.has("offline")) {
    event.respondWith(new Response("Hello Offline page"));
  } else if (param.has("fetch_or_offline")) {
    event.respondWith(
      fetch(event.request).catch(error => {
        return new Response("Hello Offline page");
      })
    );
  } else if (param.has("sleep_then_fetch")) {
    event.respondWith(
      sleep(param.get("sleep") || 0).then(() => {
        return fetch(event.request.url);
      })
    );
  } else if (param.has("sleep_then_offline")) {
    event.respondWith(
      sleep(param.get("sleep") || 0).then(() => {
        return new Response("Hello Offline page");
      })
    );
  } else if (param.has("cache_add")) {
    event.respondWith((async () => {
      const cache = await caches.open('maybe_offline_support_cache_add');
      await cache.add(event.request);
      return cache.match(event.request);
    })());
  } else if (param.has("redirect")) {
    const headers = new Headers();
    headers.append("Location", "https://a.com");
    event.respondWith(
      new Response("Redirect", {"status": 301, "headers": headers})
    );
  } else {
    // fallback case: do nothing.
  }
});