| Index: LayoutTests/http/tests/serviceworker/resources/request-worker.js
|
| diff --git a/LayoutTests/http/tests/serviceworker/resources/request-worker.js b/LayoutTests/http/tests/serviceworker/resources/request-worker.js
|
| index 34629f9ecfebf2d884901bc20cad299bf7dfdc1b..8a5c582bd5bb0447dcab6cd700d8305cb60663a9 100644
|
| --- a/LayoutTests/http/tests/serviceworker/resources/request-worker.js
|
| +++ b/LayoutTests/http/tests/serviceworker/resources/request-worker.js
|
| @@ -1,34 +1,189 @@
|
| importScripts('worker-test-helpers.js');
|
|
|
| test(function() {
|
| - var headers = new HeaderMap;
|
| - headers.set('User-Agent', 'Mozilla/5.0');
|
| - headers.set('Accept', 'text/html');
|
| - headers.set('X-ServiceWorker-Test', 'request test field');
|
| -
|
| - var request = new Request({
|
| - url: 'https://www.example.com/test.html',
|
| - method: 'GET',
|
| - headers: headers
|
| + var url = 'https://www.example.com/test.html';
|
| + var headers = new Headers;
|
| + headers.set('User-Agent', 'Mozilla/5.0');
|
| + headers.set('Accept', 'text/html');
|
| + headers.set('X-ServiceWorker-Test', 'request test field');
|
| +
|
| + var request = new Request(
|
| + url,
|
| + {
|
| + method: 'GET',
|
| + headers: headers
|
| + });
|
| +
|
| + assert_equals(request.url, url, 'Request.url should match');
|
| + assert_equals(request.method, 'GET', 'Request.method should match');
|
| + assert_true(request.headers instanceof Headers, 'Request.headers should be Headers');
|
| +
|
| + // 'User-Agent' is a forbidden header.
|
| + assert_equals(request.headers.size, 2, 'Request.headers.size should match');
|
| + // Note: detailed behavioral tests for Headers are in another test,
|
| + // http/tests/serviceworker/headers.html.
|
| +
|
| + request.url = 'http://localhost/';
|
| + assert_equals(request.url, 'https://www.example.com/test.html', 'Request.url should be readonly');
|
| + request = new Request('http://localhost/\uD800'); // Unmatched lead surrogate.
|
| + assert_equals(request.url,
|
| + 'http://localhost/' + encodeURIComponent('\uFFFD'),
|
| + 'Request.url should have unmatched surrogates replaced.');
|
| + request.method = 'POST';
|
| + assert_equals(request.method, 'GET', 'Request.method should be readonly');
|
| +
|
| + request = new Request(url);
|
| + assert_equals(request.url, url, 'Request.url should match');
|
| + assert_equals(request.method, 'GET', 'Default Request.method should be GET');
|
| + assert_equals(request.mode, 'cors', 'Default Request.mode should be cors');
|
| + assert_equals(request.credentials, 'omit', 'Default Request.credentials should be omit');
|
| + var request2 = new Request(request);
|
| + assert_equals(request2.url, url, 'Request.url should match');
|
| + assert_equals(request2.method, 'GET', 'Request.method should match');
|
| + assert_equals(request2.mode, 'cors', 'Request.mode should match');
|
| + assert_equals(request2.credentials, 'omit', 'Request.credentials should match');
|
| +
|
| + var kMethods = ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'OPTIONS'];
|
| + var kModes = ['same-origin', 'no-cors', 'cors'];
|
| + var kCredentials = ['omit', 'same-origin', 'include'];
|
| +
|
| + kMethods.forEach(function(method) {
|
| + request = new Request(url, {method: method});
|
| + assert_equals(request.method, method, 'Request.method should match');
|
| + request2 = new Request(request);
|
| + assert_equals(request2.method, method, 'Request.method should match');
|
| + kMethods.forEach(function(method2) {
|
| + var request2 = new Request(request, {method: method2});
|
| + assert_equals(request2.method, method2, 'Request.method should be overridden');
|
| + });
|
| + });
|
| + kModes.forEach(function(mode) {
|
| + request = new Request(url, {mode: mode});
|
| + assert_equals(request.mode, mode, 'Request.mode should match');
|
| + var request2 = new Request(request);
|
| + assert_equals(request2.mode, mode, 'Request.mode should match');
|
| + kModes.forEach(function(mode2) {
|
| + var request2 = new Request(request, {mode: mode2});
|
| + assert_equals(request2.mode, mode2, 'Request.mode should be overridden');
|
| + });
|
| + });
|
| + kCredentials.forEach(function(credentials) {
|
| + request = new Request(url, {credentials: credentials});
|
| + assert_equals(request.credentials, credentials, 'Request.credentials should match');
|
| + var request2 = new Request(request);
|
| + assert_equals(request2.credentials, credentials, 'Request.credentials should match');
|
| + kCredentials.forEach(function(credentials2) {
|
| + var request2 = new Request(request, {credentials: credentials2});
|
| + assert_equals(request2.credentials, credentials2, 'Request.credentials should be overridden');
|
| });
|
| + });
|
| +
|
| +
|
| + var forbiddenMethods = ['TRACE', 'TRACK', 'CONNECT'];
|
| + var invalidNames = ['(', ')', '<', '>', '@', ',', ';', ':', '\\', '"',
|
| + '/', '[', ']', '?', '=', '{', '}', '\u3042', 'a(b'];
|
| + forbiddenMethods.forEach(function(method) {
|
| + assert_throws({name:'TypeError'},
|
| + function() { var request = new Request(url, {method: method}); },
|
| + 'new Request with a forbidden method (' + method +') should throw');
|
| + });
|
| + invalidNames.forEach(function(name) {
|
| + assert_throws({name:'TypeError'},
|
| + function() { var request = new Request(url, {method: name}); },
|
| + 'new Request with an invalid method (' + name +') should throw');
|
| + });
|
| +
|
| + kMethods.forEach(function(method) {
|
| + request = new Request(url, {method: method.toLowerCase()});
|
| + assert_equals(request.method, method, 'Request.method should be case corrected');
|
| + });
|
| +
|
| + ['PUT', 'DELETE', 'OPTIONS'].forEach(function(method) {
|
| + assert_throws({name:'TypeError'},
|
| + function() { var request = new Request(url, {method: method, mode: 'no-cors'}); },
|
| + 'new no-cors Request with non simple method (' + method +') should throw');
|
| + assert_throws({name:'TypeError'},
|
| + function() {
|
| + var request = new Request(url, {method: method});
|
| + var request2 = new Request(request, {mode: 'no-cors'});
|
| + },
|
| + 'new no-cors Request with non simple method (' + method +') should throw');
|
| + assert_throws({name:'TypeError'},
|
| + function() {
|
| + var request = new Request(url, {mode: 'no-cors'});
|
| + var request2 = new Request(request, {method: method});
|
| + },
|
| + 'new no-cors Request with non simple method (' + method +') should throw');
|
| + });
|
| +
|
| + kForbiddenHeaders =
|
| + ['Accept-Charset', 'Accept-Encoding', 'Access-Control-Request-Headers',
|
| + 'Access-Control-Request-Method', 'Connection', 'Content-Length', 'Cookie',
|
| + 'Cookie2', 'Date', 'DNT', 'Expect', 'Host', 'Keep-Alive', 'Origin',
|
| + 'Referer', 'TE', 'Trailer', 'Transfer-Encoding', 'Upgrade', 'User-Agent',
|
| + 'Via', 'Proxy-', 'Sec-', 'Proxy-FooBar', 'Sec-FooBar'];
|
| + kSimpleHeaders =
|
| + [['Accept', '*'], ['Accept-Language', 'ru'], ['Content-Language', 'ru'],
|
| + ['Content-Type', 'application/x-www-form-urlencoded'],
|
| + ['Content-Type', 'multipart/form-data'],
|
| + ['Content-Type', 'text/plain']]
|
| +
|
| + request = new Request(url);
|
| + assert_equals(request.headers.size, 0);
|
| + request.headers.append('X-ServiceWorker-Test', 'test');
|
| + request.headers.append('X-ServiceWorker-Test2', 'test2');
|
| + assert_equals(request.headers.size, 2);
|
| + assert_equals(request.headers.get('X-ServiceWorker-Test'), 'test');
|
| + assert_equals(request.headers.get('X-ServiceWorker-Test2'), 'test2');
|
| + kForbiddenHeaders.forEach(function(header) {
|
| + request.headers.append(header, 'test');
|
| + assert_equals(request.headers.size, 2,
|
| + 'Request.headers.append should ignore the forbidden headers');
|
| + request.headers.set(header, 'test');
|
| + assert_equals(request.headers.size, 2,
|
| + 'Request.headers.append should ignore the forbidden headers');
|
| + });
|
| +
|
| + request = new Request(url, {mode: 'no-cors'});
|
| + request.headers.append('X-ServiceWorker-Test', 'test');
|
| + request.headers.append('X-ServiceWorker-Test2', 'test2');
|
| + assert_equals(request.headers.size, 0);
|
| +
|
| + kSimpleHeaders.forEach(function(header) {
|
| + request = new Request(url, {mode: 'no-cors'});
|
| + request.headers.append(header[0], header[1]);
|
| + assert_equals(request.headers.size, 1);
|
| + request = new Request(url, {mode: 'no-cors'});
|
| + request.headers.set(header[0], header[1]);
|
| + assert_equals(request.headers.size, 1);
|
| + request.headers.delete(header[0]);
|
| + if (header[0] == 'Content-Type') {
|
| + assert_equals(
|
| + request.headers.size, 1,
|
| + 'Content-Type header of no-cors request shouldn\'t be deleted');
|
| + } else {
|
| + assert_equals(request.headers.size, 0);
|
| + }
|
| + });
|
|
|
| - assert_equals(request.url, 'https://www.example.com/test.html', 'Request.url should match');
|
| - assert_equals(request.method, 'GET', 'Request.method should match');
|
| - assert_equals(request.origin, 'https://www.example.com', 'Request.origin should match');
|
| - assert_true(request.headers instanceof HeaderMap, 'Request.headers should be HeaderMap');
|
| - assert_equals(request.headers.size, 3, 'Request.headers.size should match');
|
| - // Note: detailed behavioral tests for HeaderMap are in another test,
|
| - // http/tests/serviceworker/headermap.html.
|
| -
|
| - request.url = 'http://localhost/';
|
| - assert_equals(request.url, 'http://localhost/', 'Request.url should be writable');
|
| - request.url = 'http://localhost/\uD800'; // Unmatched lead surrogate.
|
| - assert_equals(request.url,
|
| - 'http://localhost/' + encodeURIComponent('\uFFFD'),
|
| - 'Request.url should have unmatched surrogates replaced.');
|
| - request.method = 'POST';
|
| - assert_equals(request.method, 'POST', 'Request.method should be writable');
|
| - assert_throws({name: 'TypeError'}, function() { request.method = 'invalid \u0100'; },
|
| - 'Request.method should throw on invalid ByteString');
|
| + kSimpleHeaders.forEach(function(header) {
|
| + var headers = {};
|
| + headers['X-ServiceWorker-Test'] = 'test';
|
| + headers['X-ServiceWorker-Test2'] = 'test2';
|
| + kForbiddenHeaders.forEach(function(header) { headers[header] = 'foo';});
|
| + headers[header[0]] = header[1];
|
| + request = new Request(url, {headers: headers});
|
| + assert_equals(request.headers.size, 3,
|
| + 'Request.headers should not support the forbidden headers');
|
| + request = new Request(url, {mode: 'same-origin', headers: headers});
|
| + assert_equals(request.headers.size, 3,
|
| + 'Request.headers should not support the forbidden headers');
|
| + request = new Request(url, {mode: 'no-cors', headers: headers});
|
| + assert_equals(request.headers.size, 1,
|
| + 'No-CORS Request.headers should only support simple headers');
|
| + request = new Request(url, {mode: 'cors', headers: headers});
|
| + assert_equals(request.headers.size, 3,
|
| + 'Request.headers should not support the forbidden headers');
|
| + });
|
|
|
| }, 'Request in ServiceWorkerGlobalScope');
|
|
|