Commit ca86b8af authored by horo's avatar horo Committed by Commit bot

Introduce Response.redirected attribute and add LayoutTest.

https://codereview.chromium.org/2516353002/ introduces URL list of Response.
Response.redirected returns true when the size of the list is larger than 1.

BUG=658249

Review-Url: https://codereview.chromium.org/2524703002
Cr-Commit-Position: refs/heads/master@{#437555}
parent 3387c177
......@@ -65,6 +65,14 @@ var checkFetchResponseType = function(type, url, data) {
type,
'type must match. url: ' + url);
};
var checkFetchResponseRedirected = function(expected, url, data) {
assert_equals(data.fetchResult,
'resolved',
'fetchResult must be resolved. url = ' + url);
assert_equals(data.redirected,
expected,
url + ' redirected flag should match');
};
var checkURLList = function(redirectedURLList, url, data) {
if (!self.internals)
return;
......@@ -102,6 +110,8 @@ var noServerHeader =
var typeBasic = checkFetchResponseType.bind(this, 'basic');
var typeCors = checkFetchResponseType.bind(this, 'cors');
var typeOpaque = checkFetchResponseType.bind(this, 'opaque');
var responseRedirected = checkFetchResponseRedirected.bind(this, true);
var responseNotRedirected = checkFetchResponseRedirected.bind(this, false);
// Functions to check the result of JSONP which is evaluated in
// thorough-iframe.html by appending <script> element.
......@@ -365,6 +375,7 @@ function doFetch(request) {
status: response.status,
headers: headersToArray(response.headers),
type: response.type,
redirected: response.redirected,
urlList: self.internals ?
self.internals.getInternalResponseURLList(response) :
[],
......
......@@ -29,6 +29,7 @@ promise_test(function(t) {
assert_equals(response.headers.get('Content-Type'),
'text/plain;charset=US-ASCII');
assert_equals(size(response.headers), 1);
assert_false(response.redirected);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response),
......@@ -68,6 +69,7 @@ promise_test(function(t) {
assert_equals(response.headers.get('Content-Type'),
'text/html;charset=utf-8');
assert_equals(size(response.headers), 1);
assert_false(response.redirected);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response),
......@@ -99,6 +101,7 @@ if ('createObjectURL' in URL) {
assert_equals(response.headers.get('Content-Type'), 'text/fox');
assert_equals(response.headers.get('Content-Length'), '3');
assert_equals(size(response.headers), 2);
assert_false(response.redirected);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response), [url]);
......@@ -136,6 +139,7 @@ promise_test(function(t) {
.then(function(response) {
assert_equals(response.status, 200);
assert_equals(response.statusText, 'OK');
assert_false(response.redirected);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response),
......@@ -150,6 +154,7 @@ promise_test(function(t) {
.then(function(response) {
assert_equals(response.status, 404);
assert_equals(response.statusText, 'Not Found');
assert_false(response.redirected);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response),
......@@ -176,6 +181,7 @@ promise_test(function(t) {
// serialized with the exclude fragment flag set, otherwise.
assert_equals(response.url,
BASE_ORIGIN + '/fetch/resources/fetch-status.php?status=200');
assert_false(response.redirected);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response),
......@@ -205,6 +211,7 @@ promise_test(function(t) {
'Response\'s url is locationURL');
assert_equals(request.url, redirect_original_url,
'Request\'s url remains the original URL');
assert_true(response.redirected);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response),
......@@ -230,6 +237,7 @@ promise_test(function(t) {
assert_equals(response.status, 0);
assert_equals(response.type, 'opaqueredirect');
assert_equals(response.url, request.url);
assert_false(response.redirected);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response),
......@@ -285,6 +293,7 @@ promise_test(function(test) {
assert_equals(response.status, 200);
assert_equals(response.statusText, 'OK');
assert_equals(response.url, url);
assert_false(response.redirected);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response), [url]);
......@@ -301,6 +310,7 @@ promise_test(function(test) {
assert_equals(response.status, 200);
assert_equals(response.statusText, 'OK');
assert_equals(response.url, url);
assert_false(response.redirected);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response), [url]);
......
......@@ -18,6 +18,7 @@ test(function() {
assert_equals(response.type, 'default',
'Default Response.type should be \'default\'');
assert_equals(response.url, '', 'Response.url should be the empty string');
assert_false(response.redirected, 'Response.redirected should be false.');
assert_equals(response.status, 200,
'Default Response.status should be 200');
assert_true(response.ok, 'Default Response.ok must be true');
......
......@@ -16,6 +16,7 @@ var TEST_TARGETS = [
[REDIRECT_LOOP_URL + encodeURIComponent(BASE_URL) + '&Count=20&mode=cors' +
'&credentials=same-origin',
[fetchResolved, hasContentLength, hasBody, typeBasic,
responseRedirected,
checkURLList.bind(
self,
createExpectedURLList(
......@@ -30,6 +31,7 @@ var TEST_TARGETS = [
[REDIRECT_LOOP_URL + encodeURIComponent(OTHER_BASE_URL + '&ACAOrigin=*') +
'&Count=20&mode=cors&credentials=same-origin&method=GET',
[fetchResolved, noContentLength, noServerHeader, hasBody, typeCors,
responseRedirected,
checkURLList.bind(
self,
createExpectedURLList(
......@@ -49,6 +51,7 @@ var TEST_TARGETS = [
[OTHER_REDIRECT_LOOP_URL + encodeURIComponent(BASE_URL + 'ACAOrigin=*') +
'&Count=20&mode=cors&credentials=same-origin&method=GET&ACAOrigin=*',
[fetchResolved, noContentLength, noServerHeader, hasBody, typeCors,
responseRedirected,
checkURLList.bind(
self,
createExpectedURLList(
......@@ -67,6 +70,7 @@ var TEST_TARGETS = [
encodeURIComponent(OTHER_BASE_URL + 'ACAOrigin=*') +
'&Count=20&mode=cors&credentials=same-origin&method=GET&ACAOrigin=*',
[fetchResolved, noContentLength, noServerHeader, hasBody, typeCors,
responseRedirected,
checkURLList.bind(
self,
createExpectedURLList(
......
......@@ -8,14 +8,14 @@ var TEST_TARGETS = [
[REDIRECT_URL + encodeURIComponent(BASE_URL) +
'&mode=no-cors&method=GET&headers=CUSTOM',
[fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic,
checkURLList.bind(self, [BASE_URL])],
responseRedirected, checkURLList.bind(self, [BASE_URL])],
[methodIsGET, noCustomHeader, authCheck1]],
// Redirect: same origin -> other origin
[REDIRECT_URL + encodeURIComponent(OTHER_BASE_URL) +
'&mode=no-cors&method=GET&headers=CUSTOM',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [OTHER_BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [OTHER_BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsGET, noCustomHeader, authCheck2])],
// Status code tests for mode="no-cors"
......@@ -23,25 +23,25 @@ var TEST_TARGETS = [
[REDIRECT_URL + encodeURIComponent(OTHER_BASE_URL) +
'&mode=no-cors&method=POST&Status=301',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [OTHER_BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [OTHER_BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsGET, authCheck2])],
// The 302 redirect response changes POST method to GET method.
[REDIRECT_URL + encodeURIComponent(OTHER_BASE_URL) +
'&mode=no-cors&method=POST',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [OTHER_BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [OTHER_BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsGET, authCheck2])],
// GET method must be used for 303 redirect.
[REDIRECT_URL + encodeURIComponent(OTHER_BASE_URL) +
'&mode=no-cors&method=POST&Status=303',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [OTHER_BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [OTHER_BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsGET, authCheck2])],
// The 307 redirect response doesn't change the method.
[REDIRECT_URL + encodeURIComponent(OTHER_BASE_URL) +
'&mode=no-cors&method=POST&Status=307',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [OTHER_BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [OTHER_BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsPOST, authCheck2])],
// The 308 redirect response doesn't change the method.
// FIXME: disabled due to https://crbug.com/451938
......@@ -54,12 +54,12 @@ var TEST_TARGETS = [
[OTHER_REDIRECT_URL + encodeURIComponent(BASE_URL) +
'&mode=no-cors&method=GET',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsGET, authCheck1])],
[OTHER_REDIRECT_URL + encodeURIComponent(BASE_URL) +
'&mode=no-cors&method=GET&headers=CUSTOM',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsGET, noCustomHeader, authCheck1])],
// Status code tests for mode="no-cors"
......@@ -67,25 +67,25 @@ var TEST_TARGETS = [
[OTHER_REDIRECT_URL + encodeURIComponent(BASE_URL) +
'&mode=no-cors&method=POST&Status=301',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsGET, authCheck1])],
// The 302 redirect response MAY change the request method from POST to GET.
[OTHER_REDIRECT_URL + encodeURIComponent(BASE_URL) +
'&mode=no-cors&method=POST',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsGET, authCheck1])],
// GET method must be used for 303 redirect.
[OTHER_REDIRECT_URL + encodeURIComponent(BASE_URL) +
'&mode=no-cors&method=POST&Status=303',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsGET, authCheck1])],
// The 307 redirect response MUST NOT change the method.
[OTHER_REDIRECT_URL + encodeURIComponent(BASE_URL) +
'&mode=no-cors&method=POST&Status=307',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsPOST, authCheck1])],
// The 308 redirect response MUST NOT change the method.
// FIXME: disabled due to https://crbug.com/451938
......@@ -98,7 +98,7 @@ var TEST_TARGETS = [
[OTHER_REDIRECT_URL + encodeURIComponent(OTHER_BASE_URL) +
'&mode=no-cors&method=GET',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
checkURLList.bind(self, [OTHER_BASE_URL])],
responseNotRedirected, checkURLList.bind(self, [OTHER_BASE_URL])],
onlyOnServiceWorkerProxiedTest([methodIsGET, authCheck2])],
];
......
......@@ -17,32 +17,32 @@ var TEST_TARGETS = [
[REDIRECT_URL + encodeURIComponent(BASE_URL_WITH_USERNAME) +
'&mode=same-origin&method=GET',
[fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic,
checkURLList.bind(self, [BASE_URL_WITH_USERNAME])],
responseRedirected, checkURLList.bind(self, [BASE_URL_WITH_USERNAME])],
[methodIsGET]],
[REDIRECT_URL + encodeURIComponent(BASE_URL_WITH_PASSWORD) +
'&mode=same-origin&method=GET',
[fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic,
checkURLList.bind(self, [BASE_URL_WITH_PASSWORD])],
responseRedirected, checkURLList.bind(self, [BASE_URL_WITH_PASSWORD])],
[methodIsGET]],
[REDIRECT_URL + encodeURIComponent(BASE_URL_WITH_USERNAME) +
'&mode=cors&method=GET',
[fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic,
checkURLList.bind(self, [BASE_URL_WITH_USERNAME])],
responseRedirected, checkURLList.bind(self, [BASE_URL_WITH_USERNAME])],
[methodIsGET]],
[REDIRECT_URL + encodeURIComponent(BASE_URL_WITH_PASSWORD) +
'&mode=cors&method=GET',
[fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic,
checkURLList.bind(self, [BASE_URL_WITH_PASSWORD])],
responseRedirected, checkURLList.bind(self, [BASE_URL_WITH_PASSWORD])],
[methodIsGET]],
[REDIRECT_URL + encodeURIComponent(BASE_URL_WITH_USERNAME) +
'&mode=no-cors&method=GET',
[fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic,
checkURLList.bind(self, [BASE_URL_WITH_USERNAME])],
responseRedirected, checkURLList.bind(self, [BASE_URL_WITH_USERNAME])],
[methodIsGET]],
[REDIRECT_URL + encodeURIComponent(BASE_URL_WITH_PASSWORD) +
'&mode=no-cors&method=GET',
[fetchResolved, hasContentLength, hasServerHeader, hasBody, typeBasic,
checkURLList.bind(self, [BASE_URL_WITH_PASSWORD])],
responseRedirected, checkURLList.bind(self, [BASE_URL_WITH_PASSWORD])],
[methodIsGET]],
// Origin A -[fetch]-> Origin A -[redirect]-> Origin B
......@@ -58,12 +58,14 @@ var TEST_TARGETS = [
encodeURIComponent(OTHER_BASE_URL_WITH_USERNAME + '&ACAOrigin=*') +
'&mode=no-cors&method=GET',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
responseNotRedirected,
checkURLList.bind(self, [OTHER_BASE_URL_WITH_USERNAME + '&ACAOrigin=*'])],
onlyOnServiceWorkerProxiedTest([methodIsGET])],
[REDIRECT_URL +
encodeURIComponent(OTHER_BASE_URL_WITH_PASSWORD + '&ACAOrigin=*') +
'&mode=no-cors&method=GET',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
responseNotRedirected,
checkURLList.bind(self, [OTHER_BASE_URL_WITH_PASSWORD + '&ACAOrigin=*'])],
onlyOnServiceWorkerProxiedTest([methodIsGET])],
......@@ -80,12 +82,14 @@ var TEST_TARGETS = [
encodeURIComponent(BASE_URL_WITH_USERNAME + 'ACAOrigin=*') +
'&mode=no-cors&method=GET&ACAOrigin=*',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
responseNotRedirected,
checkURLList.bind(self, [BASE_URL_WITH_USERNAME + 'ACAOrigin=*'])],
onlyOnServiceWorkerProxiedTest([methodIsGET])],
[OTHER_REDIRECT_URL +
encodeURIComponent(BASE_URL_WITH_PASSWORD + 'ACAOrigin=*') +
'&mode=no-cors&method=GET&ACAOrigin=*',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
responseNotRedirected,
checkURLList.bind(self, [BASE_URL_WITH_PASSWORD + 'ACAOrigin=*'])],
onlyOnServiceWorkerProxiedTest([methodIsGET])],
......@@ -102,12 +106,14 @@ var TEST_TARGETS = [
encodeURIComponent(OTHER_BASE_URL_WITH_USERNAME + 'ACAOrigin=*') +
'&mode=no-cors&method=GET&ACAOrigin=*',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
responseNotRedirected,
checkURLList.bind(self, [OTHER_BASE_URL_WITH_USERNAME + 'ACAOrigin=*'])],
onlyOnServiceWorkerProxiedTest([methodIsGET])],
[OTHER_REDIRECT_URL +
encodeURIComponent(OTHER_BASE_URL_WITH_PASSWORD + 'ACAOrigin=*') +
'&mode=no-cors&method=GET&ACAOrigin=*',
[fetchResolved, noContentLength, noServerHeader, noBody, typeOpaque,
responseNotRedirected,
checkURLList.bind(self, [OTHER_BASE_URL_WITH_PASSWORD + 'ACAOrigin=*'])],
onlyOnServiceWorkerProxiedTest([methodIsGET])],
];
......
......@@ -9,9 +9,16 @@
function redirected_test(url,
fetch_method,
cache,
expected_redirected,
expected_url_list) {
return fetch_method(url).then(response => {
var cloned_response = response.clone();
assert_equals(
response.redirected, expected_redirected,
'The redirected flag of response must match. URL: ' + url);
assert_equals(
cloned_response.redirected, expected_redirected,
'The redirected flag of cloned response must match. URL: ' + url);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response),
......@@ -26,6 +33,9 @@ function redirected_test(url,
})
.then(_ => cache.match(url))
.then(response => {
assert_equals(response.redirected, expected_redirected,
'The redirected flag of response in CacheStorage must match. URL: ' +
url);
if (self.internals) {
assert_array_equals(
self.internals.getInternalResponseURLList(response),
......@@ -62,17 +72,21 @@ promise_test(t => {
frame = f;
return Promise.all([
redirected_test(TARGET_URL, self.fetch, cache,
false /* expected_redirected */,
[TARGET_URL]),
redirected_test(REDIRECT_TO_TARGET_URL, self.fetch, cache,
true /* expected_redirected */,
[REDIRECT_TO_TARGET_URL, TARGET_URL]),
redirected_test('./?url=' + encodeURIComponent(TARGET_URL),
frame.contentWindow.fetch,
cache,
false /* expected_redirected */,
[TARGET_URL]),
redirected_test(
'./?url=' + encodeURIComponent(REDIRECT_TO_TARGET_URL),
frame.contentWindow.fetch,
cache,
true /* expected_redirected */,
[REDIRECT_TO_TARGET_URL, TARGET_URL]),
]);
})
......@@ -81,5 +95,5 @@ promise_test(t => {
frame.remove();
return service_worker_unregister(t, SCOPE);
});
}, 'Verify URL list of responses.');
}, 'Verify redirected flag of responses.');
</script>
......@@ -649,6 +649,7 @@ interface Response
getter bodyUsed
getter headers
getter ok
getter redirected
getter status
getter statusText
getter type
......
......@@ -4126,6 +4126,7 @@ interface Response
getter bodyUsed
getter headers
getter ok
getter redirected
getter status
getter statusText
getter type
......
......@@ -656,6 +656,7 @@ interface Response
getter bodyUsed
getter headers
getter ok
getter redirected
getter status
getter statusText
getter type
......
......@@ -512,6 +512,7 @@ interface Response
getter bodyUsed
getter headers
getter ok
getter redirected
getter status
getter statusText
getter type
......
......@@ -516,6 +516,7 @@ Starting worker: resources/global-interface-listing.js
[Worker] getter bodyUsed
[Worker] getter headers
[Worker] getter ok
[Worker] getter redirected
[Worker] getter status
[Worker] getter statusText
[Worker] getter type
......
......@@ -4184,6 +4184,7 @@ interface Response
getter bodyUsed
getter headers
getter ok
getter redirected
getter status
getter statusText
getter type
......
......@@ -511,6 +511,7 @@ Starting worker: resources/global-interface-listing.js
[Worker] getter bodyUsed
[Worker] getter headers
[Worker] getter ok
[Worker] getter redirected
[Worker] getter status
[Worker] getter statusText
[Worker] getter type
......
......@@ -652,6 +652,7 @@ Starting worker: resources/global-interface-listing.js
[Worker] getter bodyUsed
[Worker] getter headers
[Worker] getter ok
[Worker] getter redirected
[Worker] getter status
[Worker] getter statusText
[Worker] getter type
......
......@@ -5052,6 +5052,7 @@ interface Response
getter bodyUsed
getter headers
getter ok
getter redirected
getter status
getter statusText
getter type
......
......@@ -647,6 +647,7 @@ Starting worker: resources/global-interface-listing.js
[Worker] getter bodyUsed
[Worker] getter headers
[Worker] getter ok
[Worker] getter redirected
[Worker] getter status
[Worker] getter statusText
[Worker] getter type
......
......@@ -87,6 +87,7 @@ class MODULES_EXPORT FetchResponseData final
}
void setURLList(const Vector<KURL>&);
const Vector<KURL>& urlList() const { return m_urlList; }
const Vector<KURL>& internalURLList() const;
void setStatus(unsigned short status) { m_status = status; }
......
......@@ -364,6 +364,10 @@ String Response::url() const {
return url;
}
bool Response::redirected() const {
return m_response->urlList().size() > 1;
}
unsigned short Response::status() const {
// "The status attribute's getter must return response's status."
return m_response->status();
......
......@@ -60,6 +60,7 @@ class MODULES_EXPORT Response final : public Body {
// From Response.idl:
String type() const;
String url() const;
bool redirected() const;
unsigned short status() const;
bool ok() const;
String statusText() const;
......
......@@ -20,6 +20,7 @@ enum ResponseType { "basic", "cors", "default", "error", "opaque", "opaqueredire
[CallWith=ExecutionContext, RaisesException] static Response redirect(USVString url, optional unsigned short status = 302);
readonly attribute ResponseType type;
readonly attribute USVString url;
readonly attribute boolean redirected;
readonly attribute unsigned short status;
readonly attribute boolean ok;
readonly attribute ByteString statusText;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment