OLD | NEW |
1 importScripts('worker-test-helpers.js'); | 1 importScripts('worker-test-helpers.js'); |
2 | 2 |
3 test(function() { | 3 test(function() { |
4 var headers = new HeaderMap; | 4 var url = 'https://www.example.com/test.html'; |
5 headers.set('User-Agent', 'Mozilla/5.0'); | 5 var headers = new Headers; |
6 headers.set('Accept', 'text/html'); | 6 headers.set('User-Agent', 'Mozilla/5.0'); |
7 headers.set('X-ServiceWorker-Test', 'request test field'); | 7 headers.set('Accept', 'text/html'); |
| 8 headers.set('X-ServiceWorker-Test', 'request test field'); |
8 | 9 |
9 var request = new Request({ | 10 var request = new Request( |
10 url: 'https://www.example.com/test.html', | 11 url, |
11 method: 'GET', | 12 { |
12 headers: headers | 13 method: 'GET', |
| 14 headers: headers |
| 15 }); |
| 16 |
| 17 assert_equals(request.url, url, 'Request.url should match'); |
| 18 assert_equals(request.method, 'GET', 'Request.method should match'); |
| 19 assert_true(request.headers instanceof Headers, 'Request.headers should be Hea
ders'); |
| 20 |
| 21 // 'User-Agent' is a forbidden header. |
| 22 assert_equals(request.headers.size, 2, 'Request.headers.size should match'); |
| 23 // Note: detailed behavioral tests for Headers are in another test, |
| 24 // http/tests/serviceworker/headers.html. |
| 25 |
| 26 request.url = 'http://localhost/'; |
| 27 assert_equals(request.url, 'https://www.example.com/test.html', 'Request.url s
hould be readonly'); |
| 28 request = new Request('http://localhost/\uD800'); // Unmatched lead surrogate. |
| 29 assert_equals(request.url, |
| 30 'http://localhost/' + encodeURIComponent('\uFFFD'), |
| 31 'Request.url should have unmatched surrogates replaced.'); |
| 32 request.method = 'POST'; |
| 33 assert_equals(request.method, 'GET', 'Request.method should be readonly'); |
| 34 |
| 35 request = new Request(url); |
| 36 assert_equals(request.url, url, 'Request.url should match'); |
| 37 assert_equals(request.method, 'GET', 'Default Request.method should be GET'); |
| 38 assert_equals(request.mode, 'cors', 'Default Request.mode should be cors'); |
| 39 assert_equals(request.credentials, 'omit', 'Default Request.credentials should
be omit'); |
| 40 var request2 = new Request(request); |
| 41 assert_equals(request2.url, url, 'Request.url should match'); |
| 42 assert_equals(request2.method, 'GET', 'Request.method should match'); |
| 43 assert_equals(request2.mode, 'cors', 'Request.mode should match'); |
| 44 assert_equals(request2.credentials, 'omit', 'Request.credentials should match'
); |
| 45 |
| 46 var kMethods = ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'OPTIONS']; |
| 47 var kModes = ['same-origin', 'no-cors', 'cors']; |
| 48 var kCredentials = ['omit', 'same-origin', 'include']; |
| 49 |
| 50 kMethods.forEach(function(method) { |
| 51 request = new Request(url, {method: method}); |
| 52 assert_equals(request.method, method, 'Request.method should match'); |
| 53 request2 = new Request(request); |
| 54 assert_equals(request2.method, method, 'Request.method should match'); |
| 55 kMethods.forEach(function(method2) { |
| 56 var request2 = new Request(request, {method: method2}); |
| 57 assert_equals(request2.method, method2, 'Request.method should be overri
dden'); |
13 }); | 58 }); |
| 59 }); |
| 60 kModes.forEach(function(mode) { |
| 61 request = new Request(url, {mode: mode}); |
| 62 assert_equals(request.mode, mode, 'Request.mode should match'); |
| 63 var request2 = new Request(request); |
| 64 assert_equals(request2.mode, mode, 'Request.mode should match'); |
| 65 kModes.forEach(function(mode2) { |
| 66 var request2 = new Request(request, {mode: mode2}); |
| 67 assert_equals(request2.mode, mode2, 'Request.mode should be overridden')
; |
| 68 }); |
| 69 }); |
| 70 kCredentials.forEach(function(credentials) { |
| 71 request = new Request(url, {credentials: credentials}); |
| 72 assert_equals(request.credentials, credentials, 'Request.credentials should
match'); |
| 73 var request2 = new Request(request); |
| 74 assert_equals(request2.credentials, credentials, 'Request.credentials should
match'); |
| 75 kCredentials.forEach(function(credentials2) { |
| 76 var request2 = new Request(request, {credentials: credentials2}); |
| 77 assert_equals(request2.credentials, credentials2, 'Request.credentials s
hould be overridden'); |
| 78 }); |
| 79 }); |
14 | 80 |
15 assert_equals(request.url, 'https://www.example.com/test.html', 'Request.url
should match'); | |
16 assert_equals(request.method, 'GET', 'Request.method should match'); | |
17 assert_equals(request.origin, 'https://www.example.com', 'Request.origin sho
uld match'); | |
18 assert_true(request.headers instanceof HeaderMap, 'Request.headers should be
HeaderMap'); | |
19 assert_equals(request.headers.size, 3, 'Request.headers.size should match'); | |
20 // Note: detailed behavioral tests for HeaderMap are in another test, | |
21 // http/tests/serviceworker/headermap.html. | |
22 | 81 |
23 request.url = 'http://localhost/'; | 82 var forbiddenMethods = ['TRACE', 'TRACK', 'CONNECT']; |
24 assert_equals(request.url, 'http://localhost/', 'Request.url should be writa
ble'); | 83 var invalidNames = ['(', ')', '<', '>', '@', ',', ';', ':', '\\', '"', |
25 request.url = 'http://localhost/\uD800'; // Unmatched lead surrogate. | 84 '/', '[', ']', '?', '=', '{', '}', '\u3042', 'a(b']; |
26 assert_equals(request.url, | 85 forbiddenMethods.forEach(function(method) { |
27 'http://localhost/' + encodeURIComponent('\uFFFD'), | 86 assert_throws({name:'TypeError'}, |
28 'Request.url should have unmatched surrogates replaced.'); | 87 function() { var request = new Request(url, {method: method});
}, |
29 request.method = 'POST'; | 88 'new Request with a forbidden method (' + method +') should th
row'); |
30 assert_equals(request.method, 'POST', 'Request.method should be writable'); | 89 }); |
31 assert_throws({name: 'TypeError'}, function() { request.method = 'invalid \u
0100'; }, | 90 invalidNames.forEach(function(name) { |
32 'Request.method should throw on invalid ByteString'); | 91 assert_throws({name:'TypeError'}, |
| 92 function() { var request = new Request(url, {method: name}); }
, |
| 93 'new Request with an invalid method (' + name +') should throw
'); |
| 94 }); |
| 95 |
| 96 kMethods.forEach(function(method) { |
| 97 request = new Request(url, {method: method.toLowerCase()}); |
| 98 assert_equals(request.method, method, 'Request.method should be case correct
ed'); |
| 99 }); |
| 100 |
| 101 ['PUT', 'DELETE', 'OPTIONS'].forEach(function(method) { |
| 102 assert_throws({name:'TypeError'}, |
| 103 function() { var request = new Request(url, {method: method, m
ode: 'no-cors'}); }, |
| 104 'new no-cors Request with non simple method (' + method +') sh
ould throw'); |
| 105 assert_throws({name:'TypeError'}, |
| 106 function() { |
| 107 var request = new Request(url, {method: method}); |
| 108 var request2 = new Request(request, {mode: 'no-cors'}); |
| 109 }, |
| 110 'new no-cors Request with non simple method (' + method +') sh
ould throw'); |
| 111 assert_throws({name:'TypeError'}, |
| 112 function() { |
| 113 var request = new Request(url, {mode: 'no-cors'}); |
| 114 var request2 = new Request(request, {method: method}); |
| 115 }, |
| 116 'new no-cors Request with non simple method (' + method +') sh
ould throw'); |
| 117 }); |
| 118 |
| 119 kForbiddenHeaders = |
| 120 ['Accept-Charset', 'Accept-Encoding', 'Access-Control-Request-Headers', |
| 121 'Access-Control-Request-Method', 'Connection', 'Content-Length', 'Cookie'
, |
| 122 'Cookie2', 'Date', 'DNT', 'Expect', 'Host', 'Keep-Alive', 'Origin', |
| 123 'Referer', 'TE', 'Trailer', 'Transfer-Encoding', 'Upgrade', 'User-Agent', |
| 124 'Via', 'Proxy-', 'Sec-', 'Proxy-FooBar', 'Sec-FooBar']; |
| 125 kSimpleHeaders = |
| 126 [['Accept', '*'], ['Accept-Language', 'ru'], ['Content-Language', 'ru'], |
| 127 ['Content-Type', 'application/x-www-form-urlencoded'], |
| 128 ['Content-Type', 'multipart/form-data'], |
| 129 ['Content-Type', 'text/plain']] |
| 130 |
| 131 request = new Request(url); |
| 132 assert_equals(request.headers.size, 0); |
| 133 request.headers.append('X-ServiceWorker-Test', 'test'); |
| 134 request.headers.append('X-ServiceWorker-Test2', 'test2'); |
| 135 assert_equals(request.headers.size, 2); |
| 136 assert_equals(request.headers.get('X-ServiceWorker-Test'), 'test'); |
| 137 assert_equals(request.headers.get('X-ServiceWorker-Test2'), 'test2'); |
| 138 kForbiddenHeaders.forEach(function(header) { |
| 139 request.headers.append(header, 'test'); |
| 140 assert_equals(request.headers.size, 2, |
| 141 'Request.headers.append should ignore the forbidden headers'); |
| 142 request.headers.set(header, 'test'); |
| 143 assert_equals(request.headers.size, 2, |
| 144 'Request.headers.append should ignore the forbidden headers'); |
| 145 }); |
| 146 |
| 147 request = new Request(url, {mode: 'no-cors'}); |
| 148 request.headers.append('X-ServiceWorker-Test', 'test'); |
| 149 request.headers.append('X-ServiceWorker-Test2', 'test2'); |
| 150 assert_equals(request.headers.size, 0); |
| 151 |
| 152 kSimpleHeaders.forEach(function(header) { |
| 153 request = new Request(url, {mode: 'no-cors'}); |
| 154 request.headers.append(header[0], header[1]); |
| 155 assert_equals(request.headers.size, 1); |
| 156 request = new Request(url, {mode: 'no-cors'}); |
| 157 request.headers.set(header[0], header[1]); |
| 158 assert_equals(request.headers.size, 1); |
| 159 request.headers.delete(header[0]); |
| 160 if (header[0] == 'Content-Type') { |
| 161 assert_equals( |
| 162 request.headers.size, 1, |
| 163 'Content-Type header of no-cors request shouldn\'t be deleted'); |
| 164 } else { |
| 165 assert_equals(request.headers.size, 0); |
| 166 } |
| 167 }); |
| 168 |
| 169 kSimpleHeaders.forEach(function(header) { |
| 170 var headers = {}; |
| 171 headers['X-ServiceWorker-Test'] = 'test'; |
| 172 headers['X-ServiceWorker-Test2'] = 'test2'; |
| 173 kForbiddenHeaders.forEach(function(header) { headers[header] = 'foo';}); |
| 174 headers[header[0]] = header[1]; |
| 175 request = new Request(url, {headers: headers}); |
| 176 assert_equals(request.headers.size, 3, |
| 177 'Request.headers should not support the forbidden headers'); |
| 178 request = new Request(url, {mode: 'same-origin', headers: headers}); |
| 179 assert_equals(request.headers.size, 3, |
| 180 'Request.headers should not support the forbidden headers'); |
| 181 request = new Request(url, {mode: 'no-cors', headers: headers}); |
| 182 assert_equals(request.headers.size, 1, |
| 183 'No-CORS Request.headers should only support simple headers'); |
| 184 request = new Request(url, {mode: 'cors', headers: headers}); |
| 185 assert_equals(request.headers.size, 3, |
| 186 'Request.headers should not support the forbidden headers'); |
| 187 }); |
33 | 188 |
34 }, 'Request in ServiceWorkerGlobalScope'); | 189 }, 'Request in ServiceWorkerGlobalScope'); |
OLD | NEW |