| Index: third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/fetch-rewrite-worker.js
 | 
| diff --git a/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/fetch-rewrite-worker.js b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/fetch-rewrite-worker.js
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..4a7646e1506b0aaef91bd67123e9e426b98c98f0
 | 
| --- /dev/null
 | 
| +++ b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/resources/fetch-rewrite-worker.js
 | 
| @@ -0,0 +1,148 @@
 | 
| +function get_query_params(url) {
 | 
| +  var search = (new URL(url)).search;
 | 
| +  if (!search) {
 | 
| +    return {};
 | 
| +  }
 | 
| +  var ret = {};
 | 
| +  var params = search.substring(1).split('&');
 | 
| +  params.forEach(function(param) {
 | 
| +      var element = param.split('=');
 | 
| +      ret[decodeURIComponent(element[0])] = decodeURIComponent(element[1]);
 | 
| +    });
 | 
| +  return ret;
 | 
| +}
 | 
| +
 | 
| +function get_request_init(base, params) {
 | 
| +  var init = {};
 | 
| +  init['method'] = params['method'] || base['method'];
 | 
| +  init['mode'] = params['mode'] || base['mode'];
 | 
| +  if (init['mode'] == 'navigate') {
 | 
| +    init['mode'] = 'same-origin';
 | 
| +  }
 | 
| +  init['credentials'] = params['credentials'] || base['credentials'];
 | 
| +  init['redirect'] = params['redirect-mode'] || base['redirect'];
 | 
| +  return init;
 | 
| +}
 | 
| +
 | 
| +self.addEventListener('fetch', function(event) {
 | 
| +    var params = get_query_params(event.request.url);
 | 
| +    var init = get_request_init(event.request, params);
 | 
| +    var url = params['url'];
 | 
| +    if (params['ignore']) {
 | 
| +      return;
 | 
| +    }
 | 
| +    if (params['throw']) {
 | 
| +      throw new Error('boom');
 | 
| +    }
 | 
| +    if (params['reject']) {
 | 
| +      event.respondWith(new Promise(function(resolve, reject) {
 | 
| +          reject();
 | 
| +        }));
 | 
| +      return;
 | 
| +    }
 | 
| +    if (params['resolve-null']) {
 | 
| +      event.respondWith(new Promise(function(resolve) {
 | 
| +          resolve(null);
 | 
| +        }));
 | 
| +      return;
 | 
| +    }
 | 
| +    if (params['generate-png']) {
 | 
| +      var binary = atob(
 | 
| +          'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAA' +
 | 
| +          'RnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAAhSURBVDhPY3wro/Kf' +
 | 
| +          'gQLABKXJBqMGjBoAAqMGDLwBDAwAEsoCTFWunmQAAAAASUVORK5CYII=');
 | 
| +      var array = new Uint8Array(binary.length);
 | 
| +      for(var i = 0; i < binary.length; i++) {
 | 
| +        array[i] = binary.charCodeAt(i);
 | 
| +      };
 | 
| +      event.respondWith(new Response(new Blob([array], {type: 'image/png'})));
 | 
| +      return;
 | 
| +    }
 | 
| +    if (params['check-ua-header']) {
 | 
| +      var ua = event.request.headers.get('User-Agent');
 | 
| +      if (ua) {
 | 
| +        // We have a user agent!
 | 
| +        event.respondWith(new Response(new Blob([ua])));
 | 
| +      } else {
 | 
| +        // We don't have a user-agent!
 | 
| +        event.respondWith(new Response(new Blob(["NO_UA"])));
 | 
| +      }
 | 
| +      return;
 | 
| +    }
 | 
| +    if (params['check-accept-header']) {
 | 
| +      var accept = event.request.headers.get('Accept');
 | 
| +      if (accept) {
 | 
| +        event.respondWith(new Response(accept));
 | 
| +      } else {
 | 
| +        event.respondWith(new Response('NO_ACCEPT'));
 | 
| +      }
 | 
| +    }
 | 
| +    event.respondWith(new Promise(function(resolve, reject) {
 | 
| +        var request = event.request;
 | 
| +        if (url) {
 | 
| +          request = new Request(url, init);
 | 
| +        }
 | 
| +        fetch(request).then(function(response) {
 | 
| +          var expectedType = params['expected_type'];
 | 
| +          if (expectedType && response.type !== expectedType) {
 | 
| +            // Resolve a JSON object with a failure instead of rejecting
 | 
| +            // in order to distinguish this from a NetworkError, which
 | 
| +            // may be expected even if the type is correct.
 | 
| +            resolve(new Response(JSON.stringify({
 | 
| +              result: 'failure',
 | 
| +              detail: 'got ' + response.type + ' Response.type instead of ' +
 | 
| +                      expectedType
 | 
| +            })));
 | 
| +          }
 | 
| +
 | 
| +          var expectedRedirected = params['expected_redirected'];
 | 
| +          if (typeof expectedRedirected !== 'undefined') {
 | 
| +            var expected_redirected = (expectedRedirected === 'true');
 | 
| +            if(response.redirected !== expected_redirected) {
 | 
| +              // This is simply determining how to pass an error to the outer
 | 
| +              // test case(fetch-request-redirect.https.html).
 | 
| +              var execptedResolves = params['expected_resolves'];
 | 
| +              if (execptedResolves === 'true') {
 | 
| +                // Reject a JSON object with a failure since promise is expected
 | 
| +                // to be resolved.
 | 
| +                reject(new Response(JSON.stringify({
 | 
| +                  result: 'failure',
 | 
| +                  detail: 'got '+ response.redirected +
 | 
| +                          ' Response.redirected instead of ' +
 | 
| +                          expectedRedirected
 | 
| +                })));
 | 
| +              } else {
 | 
| +                // Resolve a JSON object with a failure since promise is
 | 
| +                // expected to be rejected.
 | 
| +                resolve(new Response(JSON.stringify({
 | 
| +                  result: 'failure',
 | 
| +                  detail: 'got '+ response.redirected +
 | 
| +                          ' Response.redirected instead of ' +
 | 
| +                          expectedRedirected
 | 
| +                })));
 | 
| +              }
 | 
| +            }
 | 
| +          }
 | 
| +
 | 
| +          if (params['cache']) {
 | 
| +            var cacheName = "cached-fetches-" + performance.now() + "-" +
 | 
| +                            event.request.url;
 | 
| +            var cache;
 | 
| +            var cachedResponse;
 | 
| +            return self.caches.open(cacheName).then(function(opened) {
 | 
| +              cache = opened;
 | 
| +              return cache.put(request, response);
 | 
| +            }).then(function() {
 | 
| +              return cache.match(request);
 | 
| +            }).then(function(cached) {
 | 
| +              cachedResponse = cached;
 | 
| +              return self.caches.delete(cacheName);
 | 
| +            }).then(function() {
 | 
| +               resolve(cachedResponse);
 | 
| +            });
 | 
| +          } else {
 | 
| +            resolve(response);
 | 
| +          }
 | 
| +        }, reject)
 | 
| +      }));
 | 
| +  });
 | 
| 
 |