| Index: LayoutTests/http/tests/serviceworker/chromium/resources/service-worker-mixed-response-worker.js | 
| diff --git a/LayoutTests/http/tests/serviceworker/chromium/resources/service-worker-mixed-response-worker.js b/LayoutTests/http/tests/serviceworker/chromium/resources/service-worker-mixed-response-worker.js | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..39c81da2092e0e119f7ebba486956d7e3c1a0140 | 
| --- /dev/null | 
| +++ b/LayoutTests/http/tests/serviceworker/chromium/resources/service-worker-mixed-response-worker.js | 
| @@ -0,0 +1,67 @@ | 
| +importScripts('../../../resources/get-host-info.js'); | 
| + | 
| +var HOST_INFO = get_host_info(); | 
| +var PARTIAL_RESOURCE_PATH = | 
| +    '/serviceworker/chromium/resources/service-worker-mixed-response.php'; | 
| + | 
| +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 generate_partial_byte_response(position) { | 
| +  return new Response( | 
| +      'Ogg'.substr(position, 1), | 
| +      { | 
| +        status: 206, | 
| +        headers: { | 
| +          'content-type': 'audio/ogg', | 
| +          // 12983 is the file size of media/content/silence.oga. | 
| +          'content-range': 'bytes ' + position + '-' + position + '/12983' | 
| +        } | 
| +      }); | 
| +} | 
| + | 
| +function fetch_same_origin_partial_resource(position) { | 
| +  return fetch(HOST_INFO['HTTP_ORIGIN'] + PARTIAL_RESOURCE_PATH + | 
| +               '?position=' + position) | 
| +} | 
| + | 
| +function fetch_cross_origin_partial_resource(position) { | 
| +  return fetch(HOST_INFO['HTTP_REMOTE_ORIGIN'] + PARTIAL_RESOURCE_PATH + | 
| +               '?position=' + position) | 
| +} | 
| + | 
| +self.addEventListener('fetch', function(event) { | 
| +    if (event.request.url.indexOf('blank.html') != -1) { | 
| +      // The request is for the page load. | 
| +      return; | 
| +    } | 
| +    var params = get_query_params(event.request.url); | 
| +    if (event.request.headers.get('range') == 'bytes=0-') { | 
| +      if (params['SW_FIRST'] == 'gen') { | 
| +        event.respondWith(generate_partial_byte_response(0)); | 
| +      } else if (params['SW_FIRST'] == 'same') { | 
| +        event.respondWith(fetch_same_origin_partial_resource(0)); | 
| +      } else if (params['SW_FIRST'] == 'cross') { | 
| +        event.respondWith(fetch_cross_origin_partial_resource(0)); | 
| +      } | 
| +    } else if (event.request.headers.get('range') == 'bytes=1-') { | 
| +      if (params['SW_SECOND'] == 'gen') { | 
| +        event.respondWith(generate_partial_byte_response(1)); | 
| +      } else if (params['SW_SECOND'] == 'same') { | 
| +        event.respondWith(fetch_same_origin_partial_resource(1)); | 
| +      } else if (params['SW_SECOND'] == 'cross') { | 
| +        event.respondWith(fetch_cross_origin_partial_resource(1)); | 
| +      } | 
| +    } | 
| +  }); | 
|  |