Commit e4329694 authored by horo@chromium.org's avatar horo@chromium.org

Set the fetch API request flags correctly for navigation requests.

Current:
 mode: "no-cors"
 credentials: "same-origin"
 redirect: "follow"

With this patch:
 mode: "same-origin"
 credentials: "include"
 redirect: "manual"

Spec Issue: https://github.com/whatwg/fetch/issues/106
BUG=522873

Review URL: https://codereview.chromium.org/1320023005

git-svn-id: svn://svn.chromium.org/blink/trunk@202013 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent d2b8b043
......@@ -66,7 +66,7 @@ async_test(function(t) {
worker,
[{
url: host_info['HTTP_ORIGIN'] + '/serviceworker/' + SCOPE,
mode: 'no-cors'
mode: 'same-origin'
}],
'The SW must intercept the request for a main resourc.');
})
......
......@@ -260,14 +260,11 @@ promise_test(function(t) {
// SW fetched redirect.
// SW: event.respondWith(fetch(event.request));
// TODO(horo): When we change Request.redirect of navigation requests to
// 'manual', the expected last URL shuold be changed. (crbug.com/510650)
// Spec Issue: https://github.com/whatwg/fetch/issues/106
promise_test(function(t) {
return setup_environment(t).then(function() {
return test_redirect(
SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE),
SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE),
OUT_SCOPE,
[[SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE)],
[],
[]]);
......@@ -277,18 +274,45 @@ promise_test(function(t) {
return setup_environment(t).then(function() {
return test_redirect(
SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE1),
SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE1),
[[SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE1)], [], []]);
SCOPE1,
[[SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE1), SCOPE1],
[],
[]]);
});
}, 'SW-fetched redirect to same-origin same-scope.');
promise_test(function(t) {
return setup_environment(t).then(function() {
return test_redirect(
SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE2),
SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE2),
[[SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE2)], [], []]);
SCOPE2,
[[SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(SCOPE2)],
[SCOPE2],
[]]);
});
}, 'SW-fetched redirect to same-origin other-scope.');
promise_test(function(t) {
return setup_environment(t).then(function() {
return test_redirect(
SCOPE1 + 'sw=fetch&url=' +
encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE),
OTHER_ORIGIN_OUT_SCOPE,
[[SCOPE1 + 'sw=fetch&url=' +
encodeURIComponent(OTHER_ORIGIN_OUT_SCOPE)],
[],
[]]);
});
}, 'SW-fetched redirect to other-origin out-scope.');
promise_test(function(t) {
return setup_environment(t).then(function() {
return test_redirect(
SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OTHER_ORIGIN_SCOPE),
OTHER_ORIGIN_SCOPE,
[[SCOPE1 + 'sw=fetch&url=' +
encodeURIComponent(OTHER_ORIGIN_SCOPE)],
[],
[OTHER_ORIGIN_SCOPE]]);
});
}, 'SW fetched redirect to same-origin other-scope.');
}, 'SW-fetched redirect to other-origin in-scope.');
// Opaque redirect.
// SW: event.respondWith(fetch(
......
......@@ -20,6 +20,9 @@ promise_test(t => {
assert_equals(result.url, frame.src, 'request.url');
assert_equals(result.method, 'GET', 'request.method');
assert_equals(result.referrer, location.href, 'request.referrer');
assert_equals(result.mode, 'same-origin', 'request.mode');
assert_equals(result.credentials, 'include', 'request.credentials');
assert_equals(result.redirect, 'manual', 'request.redirect');
assert_equals(result.headers['user-agent'], navigator.userAgent,
'User-Agent header');
assert_equals(result.append_header_error, 'TypeError',
......
......@@ -16,6 +16,9 @@ onfetch = function(e) {
method: e.request.method,
referrer: e.request.referrer,
headers: headers,
mode: e.request.mode,
credentials: e.request.credentials,
redirect: e.request.redirect,
append_header_error: append_header_error
})));
};
......@@ -40,65 +40,28 @@ struct FrameLoadRequest {
STACK_ALLOCATED();
public:
explicit FrameLoadRequest(Document* originDocument)
: m_originDocument(originDocument)
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(CheckContentSecurityPolicy)
: FrameLoadRequest(originDocument, ResourceRequest())
{
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
}
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest)
: m_originDocument(originDocument)
, m_resourceRequest(resourceRequest)
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(CheckContentSecurityPolicy)
: FrameLoadRequest(originDocument, resourceRequest, AtomicString())
{
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
}
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const AtomicString& frameName)
: m_originDocument(originDocument)
, m_resourceRequest(resourceRequest)
, m_frameName(frameName)
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(CheckContentSecurityPolicy)
: FrameLoadRequest(originDocument, resourceRequest, frameName, CheckContentSecurityPolicy)
{
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
}
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const AtomicString& frameName, ContentSecurityPolicyDisposition shouldCheckMainWorldContentSecurityPolicy)
: m_originDocument(originDocument)
, m_resourceRequest(resourceRequest)
, m_frameName(frameName)
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(shouldCheckMainWorldContentSecurityPolicy)
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const SubstituteData& substituteData)
: FrameLoadRequest(originDocument, resourceRequest, AtomicString(), substituteData, CheckContentSecurityPolicy)
{
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
}
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const SubstituteData& substituteData)
: m_originDocument(originDocument)
, m_resourceRequest(resourceRequest)
, m_substituteData(substituteData)
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(CheckContentSecurityPolicy)
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const AtomicString& frameName, ContentSecurityPolicyDisposition shouldCheckMainWorldContentSecurityPolicy)
: FrameLoadRequest(originDocument, resourceRequest, frameName, SubstituteData(), shouldCheckMainWorldContentSecurityPolicy)
{
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
}
Document* originDocument() const { return m_originDocument.get(); }
......@@ -129,6 +92,27 @@ public:
ContentSecurityPolicyDisposition shouldCheckMainWorldContentSecurityPolicy() const { return m_shouldCheckMainWorldContentSecurityPolicy; }
private:
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const AtomicString& frameName, const SubstituteData& substituteData, ContentSecurityPolicyDisposition shouldCheckMainWorldContentSecurityPolicy)
: m_originDocument(originDocument)
, m_resourceRequest(resourceRequest)
, m_frameName(frameName)
, m_substituteData(substituteData)
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(shouldCheckMainWorldContentSecurityPolicy)
{
initializeFetchFlags();
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
}
void initializeFetchFlags()
{
// These flags are passed to a service worker which controls the page.
m_resourceRequest.setFetchRequestMode(WebURLRequest::FetchRequestModeSameOrigin);
m_resourceRequest.setFetchCredentialsMode(WebURLRequest::FetchCredentialsModeInclude);
m_resourceRequest.setFetchRedirectMode(WebURLRequest::FetchRedirectModeManual);
}
RefPtrWillBeMember<Document> m_originDocument;
ResourceRequest m_resourceRequest;
AtomicString m_frameName;
......
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