1 importScripts('worker-test-harness.js');
3 var URL = 'https://www.example.com/test.html';
6 var headers = new Headers;
7 headers.set('User-Agent', 'Mozilla/5.0');
8 headers.set('Accept', 'text/html');
9 headers.set('X-ServiceWorker-Test', 'request test field');
11 var request = new Request(URL, {method: 'GET', headers: headers});
13 assert_equals(request.url, URL, 'Request.url should match');
14 assert_equals(request.method, 'GET', 'Request.method should match');
15 assert_equals(request.referrer, location.href, 'Request.referrer should match');
16 assert_true(request.headers instanceof Headers, 'Request.headers should be Headers');
18 // 'User-Agent' is a forbidden header.
19 assert_equals(request.headers.size, 2, 'Request.headers.size should match');
20 // Note: detailed behavioral tests for Headers are in another test,
21 // http/tests/serviceworker/headers.html.
23 request.url = 'http://localhost/';
24 assert_equals(request.url, 'https://www.example.com/test.html', 'Request.url should be readonly');
25 request = new Request('http://localhost/\uD800'); // Unmatched lead surrogate.
26 assert_equals(request.url,
27 'http://localhost/' + encodeURIComponent('\uFFFD'),
28 'Request.url should have unmatched surrogates replaced.');
29 request.method = 'POST';
30 assert_equals(request.method, 'GET', 'Request.method should be readonly');
31 }, 'Request basic test in ServiceWorkerGlobalScope');
35 new Request(URL, {method: ''}),
36 new Request(URL, {mode: ''}),
37 new Request(URL, {mode: 'invalid mode'}),
38 new Request(URL, {credentials: ''}),
39 new Request(URL, {credentials: 'invalid credentials'})].forEach(function(request) {
40 assert_equals(request.url, URL, 'Request.url should match');
41 assert_equals(request.method, 'GET', 'Default Request.method should be GET');
42 assert_equals(request.mode, 'cors', 'Default Request.mode should be cors');
43 assert_equals(request.credentials, 'omit', 'Default Request.credentials should be omit');
45 }, 'Request default value test in ServiceWorkerGlobalScope');
48 var request = new Request(URL);
49 request.headers.append('X-ServiceWorker-Foo', 'foo1');
50 request.headers.append('X-ServiceWorker-Foo', 'foo2');
51 request.headers.append('X-ServiceWorker-Bar', 'bar');
52 var request2 = new Request(request);
53 assert_equals(request2.url, URL, 'Request.url should match');
54 assert_equals(request2.method, 'GET', 'Request.method should match');
55 assert_equals(request2.mode, 'cors', 'Request.mode should match');
56 assert_equals(request2.credentials, 'omit', 'Request.credentials should match');
57 assert_equals(request2.headers.getAll('X-ServiceWorker-Foo')[0], 'foo1',
58 'Request.headers should match');
59 assert_equals(request2.headers.getAll('X-ServiceWorker-Foo')[1], 'foo2',
60 'Request.headers should match');
61 assert_equals(request2.headers.getAll('X-ServiceWorker-Bar')[0], 'bar',
62 'Request.headers should match');
63 }, 'Request header test in ServiceWorkerGlobalScope');
68 var METHODS = ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'OPTIONS', '', undefined];
69 var MODES = ['same-origin', 'no-cors', 'cors', '', undefined];
70 function isSimpleMethod(method) {
71 return ['GET', 'HEAD', 'POST', '', undefined].indexOf(method) != -1;
73 function effectiveMethod(method1, method2) {
74 return method2 ? method2 : (method1 ? method1 : 'GET');
76 function effectiveMode(mode1, mode2) {
77 return mode2 ? mode2 : (mode1 ? mode1 : 'cors');
79 METHODS.forEach(function(method1) {
80 MODES.forEach(function(mode1) {
82 if (method1 != undefined) { init1['method'] = method1; }
83 if (mode1 != undefined) { init1['mode'] = mode1; }
84 if (!isSimpleMethod(method1) && mode1 == 'no-cors') {
87 function() { request1 = new Request(URL, init1); },
88 'new no-cors Request with non simple method (' + method1 +') should throw');
91 request1 = new Request(URL, init1);
92 assert_equals(request1.method, method1 ? method1 : 'GET', 'Request.method should match');
93 assert_equals(request1.mode, mode1 ? mode1 : 'cors', 'Request.mode should match');
94 request1 = new Request(request1);
95 assert_equals(request1.method, method1 ? method1 : 'GET', 'Request.method should match');
96 assert_equals(request1.mode, mode1 ? mode1 : 'cors', 'Request.mode should match');
97 METHODS.forEach(function(method2) {
98 MODES.forEach(function(mode2) {
100 if (method2 != undefined) { init2['method'] = method2; }
101 if (mode2 != undefined) { init2['mode'] = mode2; }
102 if (!isSimpleMethod(effectiveMethod(method1, method2)) && effectiveMode(mode1, mode2) == 'no-cors') {
105 function() { request2 = new Request(request1, init2); },
106 'new no-cors Request with non simple method should throw');
109 request2 = new Request(request1, init2);
110 assert_equals(request2.method,
111 method2 ? method2 : request1.method,
112 'Request.method should be overridden');
113 assert_equals(request2.mode,
114 mode2 ? mode2 : request1.mode,
115 'Request.mode should be overridden');
120 }, 'Request header test in ServiceWorkerGlobalScope');
125 var CREDENTIALS = ['omit', 'same-origin', 'include', '', undefined];
126 CREDENTIALS.forEach(function(credentials1) {
128 if (credentials1 != undefined) { init1['credentials'] = credentials1; }
129 request1 = new Request(URL, init1);
130 assert_equals(request1.credentials, credentials1 ? credentials1 : 'omit', 'Request.credentials should match');
131 request1 = new Request(request1);
132 assert_equals(request1.credentials, credentials1 ? credentials1 : 'omit', 'Request.credentials should match');
133 CREDENTIALS.forEach(function(credentials2) {
135 if (credentials2 != undefined) { init2['credentials'] = credentials2; }
136 request2 = new Request(request1, init2);
137 assert_equals(request2.credentials,
138 credentials2 ? credentials2 : request1.credentials,
139 'Request.credentials should be overridden');
142 }, 'Request credentials test in ServiceWorkerGlobalScope');
145 ['same-origin', 'cors', 'no-cors'].forEach(function(mode) {
146 var forbiddenMethods = ['TRACE', 'TRACK', 'CONNECT'];
147 forbiddenMethods.forEach(function(method) {
150 function() { var request = new Request(URL, {mode: mode, method: method}); },
151 'new Request with a forbidden method (' + method +') should throw');
153 var invalidNames = ['(', ')', '<', '>', '@', ',', ';', ':', '\\', '"',
154 '/', '[', ']', '?', '=', '{', '}', '\u3042', 'a(b',
156 invalidNames.forEach(function(name) {
159 function() { var request = new Request(URL, {mode: mode, method: name}); },
160 'new Request with an invalid method (' + name +') should throw');
163 }, 'Request method name test in ServiceWorkerGlobalScope');
166 var FORBIDDEN_HEADERS =
167 ['Accept-Charset', 'Accept-Encoding', 'Access-Control-Request-Headers',
168 'Access-Control-Request-Method', 'Connection', 'Content-Length', 'Cookie',
169 'Cookie2', 'Date', 'DNT', 'Expect', 'Host', 'Keep-Alive', 'Origin',
170 'Referer', 'TE', 'Trailer', 'Transfer-Encoding', 'Upgrade', 'User-Agent',
171 'Via', 'Proxy-', 'Sec-', 'Proxy-FooBar', 'Sec-FooBar'];
173 [['Accept', '*'], ['Accept-Language', 'ru'], ['Content-Language', 'ru'],
174 ['Content-Type', 'application/x-www-form-urlencoded'],
175 ['Content-Type', 'multipart/form-data'],
176 ['Content-Type', 'text/plain']];
177 var NON_SIMPLE_HEADERS =
178 [['X-ServiceWorker-Test', 'test'],
179 ['X-ServiceWorker-Test2', 'test2'],
180 ['Content-Type', 'foo/bar']];
182 ['same-origin', 'cors'].forEach(function(mode) {
183 var request = new Request(URL, {mode: mode});
184 FORBIDDEN_HEADERS.forEach(function(header) {
185 request.headers.append(header, 'test');
186 assert_equals(request.headers.size, 0,
187 'Request.headers.append should ignore the forbidden headers');
188 request.headers.set(header, 'test');
189 assert_equals(request.headers.size, 0,
190 'Request.headers.set should ignore the forbidden headers');
192 var request = new Request(URL, {mode: mode});
193 assert_equals(request.headers.size, 0);
194 NON_SIMPLE_HEADERS.forEach(function(header) {
195 request.headers.append(header[0], header[1]);
197 assert_equals(request.headers.size, NON_SIMPLE_HEADERS.length);
198 NON_SIMPLE_HEADERS.forEach(function(header) {
199 assert_equals(request.headers.get(header[0]), header[1]);
201 request = new Request(URL, {mode: mode});
202 assert_equals(request.headers.size, 0);
203 NON_SIMPLE_HEADERS.forEach(function(header) {
204 request.headers.set(header[0], header[1]);
206 assert_equals(request.headers.size, NON_SIMPLE_HEADERS.length);
207 NON_SIMPLE_HEADERS.forEach(function(header) {
208 assert_equals(request.headers.get(header[0]), header[1]);
211 request = new Request(URL, {mode: 'no-cors'});
212 FORBIDDEN_HEADERS.forEach(function(header) {
213 request.headers.set(header, 'test');
214 request.headers.append(header, 'test');
216 NON_SIMPLE_HEADERS.forEach(function(header) {
217 request.headers.set(header[0], header[1]);
218 request.headers.append(header[0], header[1]);
220 assert_equals(request.headers.size, 0,
221 'no-cors request should only accept simple headers');
223 SIMPLE_HEADERS.forEach(function(header) {
224 request = new Request(URL, {mode: 'no-cors'});
225 request.headers.append(header[0], header[1]);
226 assert_equals(request.headers.size, 1,
227 'no-cors request should accept simple headers');
228 request = new Request(URL, {mode: 'no-cors'});
229 request.headers.set(header[0], header[1]);
230 assert_equals(request.headers.size, 1,
231 'no-cors request should accept simple headers');
232 request.headers.delete(header[0]);
233 if (header[0] == 'Content-Type') {
235 request.headers.size, 1,
236 'Content-Type header of no-cors request shouldn\'t be deleted');
238 assert_equals(request.headers.size, 0);
242 SIMPLE_HEADERS.forEach(function(header) {
244 NON_SIMPLE_HEADERS.forEach(function(header2) {
245 headers[header2[0]] = header2[1];
247 FORBIDDEN_HEADERS.forEach(function(header) { headers[header] = 'foo'; });
248 headers[header[0]] = header[1];
249 var expectedSize = NON_SIMPLE_HEADERS.length;
250 if (header[0] != 'Content-Type') {
253 ['same-origin', 'cors'].forEach(function(mode) {
254 request = new Request(URL, {mode: mode, headers: headers});
255 assert_equals(request.headers.size, expectedSize,
256 'Request should not support the forbidden headers');
258 request = new Request(URL, {mode: 'no-cors', headers: headers});
259 assert_equals(request.headers.size, 1,
260 'No-CORS Request.headers should only support simple headers');
261 ['same-origin', 'cors', 'no-cors'].forEach(function(mode) {
262 request = new Request(new Request(URL, {mode: mode, headers: headers}), {mode: 'no-cors'});
263 assert_equals(request.headers.size, 1,
264 'No-CORS Request.headers should only support simple headers');
267 }, 'Request headers test in ServiceWorkerGlobalScope');