OLD | NEW |
(Empty) | |
| 1 <!DOCTYPE html> |
| 2 <title>Service Worker: fetch()</title> |
| 3 <script src="../resources/testharness.js"></script> |
| 4 <script src="../resources/testharnessreport.js"></script> |
| 5 <script src="resources/test-helpers.js"></script> |
| 6 <script> |
| 7 var test = async_test('Verify access control of fetch() in a Service Worker'); |
| 8 test.step(function() { |
| 9 window.addEventListener('message', onMessage, false); |
| 10 var scope = 'resources/fetch-access-control-iframe.html'; |
| 11 service_worker_unregister_and_register( |
| 12 test, 'resources/fetch-access-control-worker.js', scope).then(test.step_fu
nc(onRegister)); |
| 13 |
| 14 |
| 15 var kBaseUrl = 'http://127.0.0.1:8000/serviceworker/resources/fetch-access-con
trol.php?'; |
| 16 var kCorsBaseUrl = 'http://localhost:8000/serviceworker/resources/fetch-access
-control.php?'; |
| 17 var kIframeUrl = 'http://127.0.0.1:8000/serviceworker/resources/fetch-access-c
ontrol-iframe.html'; |
| 18 |
| 19 var shouldBeResolved = function (url, data) { |
| 20 assert_true(data.event != 'rejected' && data.event != 'error', url + ' shoul
d be resolved'); |
| 21 }; |
| 22 var shouldBeRejected = function (url, data) { |
| 23 assert_true(data.event != 'resolved' && data.event != 'error', url + ' shoul
d be rejected'); |
| 24 }; |
| 25 var shouldThrowError = function (url, data) { |
| 26 assert_true(data.event != 'rejected' && data.event != 'resolved', url + ' sh
ould throw error'); |
| 27 }; |
| 28 var shouldHaveHeader = function (url, name, value, data) { |
| 29 if (data.event != 'report') { |
| 30 return; |
| 31 } |
| 32 assert_equals(data.headers[name], value, |
| 33 'the request header to ' + url + ' should have ' + name + '/'
+ value); |
| 34 }; |
| 35 var shouldNotHaveHeader = function (url, name, data) { |
| 36 if (data.event != 'report') { |
| 37 return; |
| 38 } |
| 39 assert_equals(data.headers[name], undefined, |
| 40 'the request header to ' + url + ' should not have ' + name); |
| 41 }; |
| 42 var methodCheck = function (url, method, data) { |
| 43 if (data.event != 'report') { |
| 44 return; |
| 45 } |
| 46 assert_equals(data.method, method, 'Method must match'); |
| 47 }; |
| 48 var headerCheck = function (url, hasContentLength, hasXServiceWorkerServerHead
er, data) { |
| 49 if (data.event != 'resolved') { |
| 50 return; |
| 51 } |
| 52 var hasCL = false; |
| 53 var hasXSWSH = false; |
| 54 for (var i = 0; i < data.headers.length; ++i) { |
| 55 if (data.headers[i][0] == 'content-length') { |
| 56 hasCL = true; |
| 57 } else if (data.headers[i][0] == 'x-serviceworker-serverheader') { |
| 58 hasXSWSH = true; |
| 59 } |
| 60 } |
| 61 assert_equals(hasCL, hasContentLength, 'hasContentLength must match'); |
| 62 assert_equals(hasXSWSH, hasXServiceWorkerServerHeader, 'hasContentLength mus
t match'); |
| 63 }; |
| 64 var testTargets = []; |
| 65 [kBaseUrl, kCorsBaseUrl].forEach(function(baseUrl) { |
| 66 ['same-origin', 'no-cors', 'cors'].forEach(function(mode) { |
| 67 var headersTestList = ['', '{}', 'HEADER_WITHOUT_ACA']; |
| 68 var ACAOriginTestList = ['']; |
| 69 if (mode == 'cors') { |
| 70 headersTestList.push('HEADER_WITH_ACA'); |
| 71 ACAOriginTestList.push('*'); |
| 72 ACAOriginTestList.push('http://127.0.0.1:8000'); |
| 73 ACAOriginTestList.push('http://127.0.0.1:8000,http://www.example.com'); |
| 74 ACAOriginTestList.push('http://localhost:8000'); |
| 75 } |
| 76 ['GET', 'POST', 'PUT', 'XXX'].forEach(function(method) { |
| 77 headersTestList.forEach(function(headers) { |
| 78 ACAOriginTestList.forEach(function(ACAOrigin) { |
| 79 var ACAMethodsTestList = ['']; |
| 80 if (mode == 'cors' && headers == '{}' && ACAOrigin == '*') { |
| 81 ACAMethodsTestList.push('*'); |
| 82 ACAMethodsTestList.push('XXX'); |
| 83 ACAMethodsTestList.push('PUT'); |
| 84 ACAMethodsTestList.push('PUT, XXX'); |
| 85 } |
| 86 ACAMethodsTestList.forEach(function(ACAMethods) { |
| 87 var ACEHeadersList = ['']; |
| 88 if (mode == 'cors' && headers == '{}' && ACAOrigin == '*') { |
| 89 ACEHeadersList.push('X-ServiceWorker-ServerHeader'); |
| 90 ACEHeadersList.push('Content-Length, X-ServiceWorker-ServerHeade
r'); |
| 91 } |
| 92 ACEHeadersList.forEach(function(ACEHeaders){ |
| 93 var url = baseUrl + |
| 94 'mode=' + mode + |
| 95 '&method=' + method; |
| 96 if (headers == '{}') { |
| 97 url += '&headers=' + headers; |
| 98 } else if (headers == 'HEADER_WITHOUT_ACA') { |
| 99 url += '&headers={\"X-ServiceWorker-Test\":\ \"test\"}'; |
| 100 } else if (headers == 'HEADER_WITH_ACA') { |
| 101 url += '&headers={\"X-ServiceWorker-Test\":\ \"test\"}'; |
| 102 url += '&ACAHeaders=x-serviceworker-test'; |
| 103 } |
| 104 if (ACAOrigin) { |
| 105 url += '&ACAOrigin=' + ACAOrigin; |
| 106 } |
| 107 if (ACAMethods) { |
| 108 url += '&ACAMethods=' + ACAMethods; |
| 109 } |
| 110 if (ACEHeaders) { |
| 111 url += '&ACEHeaders=' + ACEHeaders; |
| 112 } |
| 113 var checkFunctions = []; |
| 114 var error = false; |
| 115 if (method != 'GET' && method != 'POST') { |
| 116 if (mode == 'no-cors') { |
| 117 error = true; |
| 118 } |
| 119 } |
| 120 var resolve = true; |
| 121 if (!error) { |
| 122 if (baseUrl == kCorsBaseUrl) { |
| 123 if (mode == 'same-origin') { |
| 124 resolve = false; |
| 125 } else if (mode == 'cors') { |
| 126 if (headers == '{}' || headers == 'HEADER_WITH_ACA') { |
| 127 if (ACAOrigin == '' || |
| 128 ACAOrigin == 'http://localhost:8000' || |
| 129 ACAOrigin == 'http://127.0.0.1:8000,http://www.examp
le.com') { |
| 130 resolve = false; |
| 131 } |
| 132 } else { |
| 133 resolve = false; |
| 134 } |
| 135 if (method != 'GET' && method != 'POST') { |
| 136 if (ACAMethods.indexOf(method) == -1) { |
| 137 resolve = false; |
| 138 } |
| 139 } |
| 140 } |
| 141 } |
| 142 } |
| 143 if (error) { |
| 144 checkFunctions.push(shouldThrowError.bind(this, url)); |
| 145 } else if (resolve) { |
| 146 checkFunctions.push(shouldBeResolved.bind(this, url)); |
| 147 } else { |
| 148 checkFunctions.push(shouldBeRejected.bind(this, url)); |
| 149 } |
| 150 var haveHeader = false; |
| 151 if (resolve) { |
| 152 if (headers == 'HEADER_WITHOUT_ACA' || headers == 'HEADER_WITH
_ACA') { |
| 153 if (mode == 'same-origin' || mode == 'cors') { |
| 154 haveHeader = true; |
| 155 } |
| 156 } |
| 157 } |
| 158 if (haveHeader) { |
| 159 checkFunctions.push(shouldHaveHeader.bind( |
| 160 this, url, 'x-serviceworker-test', 'test')); |
| 161 } else { |
| 162 checkFunctions.push(shouldNotHaveHeader.bind( |
| 163 this, url, 'x-serviceworker-test')); |
| 164 } |
| 165 if (resolve) { |
| 166 var expectedMethod = method; |
| 167 if (baseUrl == kBaseUrl) { |
| 168 if (mode == 'no-cors' && method != 'POST') { |
| 169 expectedMethod = 'GET'; |
| 170 } |
| 171 } else { |
| 172 if (mode == 'no-cors' && method != 'POST') { |
| 173 expectedMethod = 'GET'; |
| 174 } |
| 175 } |
| 176 checkFunctions.push(methodCheck.bind(this, url, expectedMethod
)); |
| 177 var hasContentLength = false; |
| 178 var hasXServiceWorkerServerHeader = false; |
| 179 if (baseUrl == kBaseUrl) { |
| 180 if (mode == 'cors') { |
| 181 if (ACEHeaders.indexOf('Content-Length') != -1) { |
| 182 hasContentLength = true; |
| 183 } |
| 184 if (ACEHeaders.indexOf('X-ServiceWorker-ServerHeader') !=
-1) { |
| 185 hasXServiceWorkerServerHeader = true; |
| 186 } |
| 187 } else { |
| 188 hasContentLength = true; |
| 189 hasXServiceWorkerServerHeader = true; |
| 190 } |
| 191 } else { |
| 192 if (mode == 'cors') { |
| 193 if (ACEHeaders.indexOf('Content-Length') != -1) { |
| 194 hasContentLength = true; |
| 195 } |
| 196 if (ACEHeaders.indexOf('X-ServiceWorker-ServerHeader') !=
-1) { |
| 197 hasXServiceWorkerServerHeader = true; |
| 198 } |
| 199 } |
| 200 } |
| 201 checkFunctions.push(headerCheck.bind(this, url, hasContentLeng
th, hasXServiceWorkerServerHeader)); |
| 202 } |
| 203 testTargets.push([url, checkFunctions]); |
| 204 }); |
| 205 }); |
| 206 }); |
| 207 }); |
| 208 }); |
| 209 }); |
| 210 }); |
| 211 |
| 212 function onRegister(worker) { |
| 213 worker.addEventListener('statechange', test.step_func(onStateChange)); |
| 214 var messageChannel = new MessageChannel(); |
| 215 messageChannel.port1.onmessage = onWorkerMessage; |
| 216 worker.postMessage({port: messageChannel.port2}, [messageChannel.port2]); |
| 217 } |
| 218 |
| 219 function onWorkerMessage(e) { |
| 220 var message = e.data; |
| 221 testTargets[message.id][1].forEach(function(checkFunc){ |
| 222 checkFunc.call(this, message); |
| 223 }); |
| 224 if (message.event == 'resolved') { |
| 225 var hasContentLength = false; |
| 226 var hasXServiceWorkerServerHeader = false; |
| 227 for (var i = 0; i < message.headers.length; ++i) { |
| 228 if (message.headers[i][0] == 'content-length') { |
| 229 hasContentLength = true; |
| 230 } else if (message.headers[i][0] == 'x-serviceworker-serverheader') { |
| 231 hasXServiceWorkerServerHeader = true; |
| 232 } |
| 233 } |
| 234 // console.log('resolved type:' + message.data.type + |
| 235 // ' hasContentLength:' + hasContentLength + |
| 236 // ' hasXServiceWorkerServerHeader:' + hasXServiceWorkerServerH
eader); |
| 237 } else if (message.event == 'rejected') { |
| 238 // console.log('rejected'); |
| 239 } else if (message.event == 'error') { |
| 240 // console.log('error'); |
| 241 } |
| 242 } |
| 243 |
| 244 var jsonpResultCount = 0; |
| 245 function onMessage(e) { |
| 246 var message = e.data; |
| 247 testTargets[message.id][1].forEach(function(checkFunc){ |
| 248 checkFunc.call(this, message); |
| 249 }); |
| 250 ++jsonpResultCount; |
| 251 // console.log(message.event + ' ' + message.method + ' ' + message.headers[
'x-serviceworker-test']); |
| 252 if (jsonpResultCount == testTargets.length) { |
| 253 service_worker_unregister_and_done(test, scope); |
| 254 } else { |
| 255 loadNext(); |
| 256 } |
| 257 } |
| 258 var frameWindow = {}; |
| 259 function loadNext() { |
| 260 // console.log(testTargets[jsonpResultCount][0]); |
| 261 frameWindow.postMessage( |
| 262 {url: testTargets[jsonpResultCount][0] + '&id=' + jsonpResultCount}, |
| 263 kIframeUrl); |
| 264 } |
| 265 function onStateChange(event) { |
| 266 if (event.target.state != 'active') |
| 267 return; |
| 268 with_iframe('resources/fetch-access-control-iframe.html') |
| 269 .then(function(frame) { |
| 270 frameWindow = frame.contentWindow; |
| 271 loadNext(); |
| 272 }); |
| 273 } |
| 274 }); |
| 275 </script> |
OLD | NEW |