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) { ...@@ -66,7 +66,7 @@ async_test(function(t) {
worker, worker,
[{ [{
url: host_info['HTTP_ORIGIN'] + '/serviceworker/' + SCOPE, url: host_info['HTTP_ORIGIN'] + '/serviceworker/' + SCOPE,
mode: 'no-cors' mode: 'same-origin'
}], }],
'The SW must intercept the request for a main resourc.'); 'The SW must intercept the request for a main resourc.');
}) })
......
...@@ -260,14 +260,11 @@ promise_test(function(t) { ...@@ -260,14 +260,11 @@ promise_test(function(t) {
// SW fetched redirect. // SW fetched redirect.
// SW: event.respondWith(fetch(event.request)); // 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) { promise_test(function(t) {
return setup_environment(t).then(function() { return setup_environment(t).then(function() {
return test_redirect( return test_redirect(
SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE), SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE),
SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE), OUT_SCOPE,
[[SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE)], [[SCOPE1 + 'sw=fetch&url=' + encodeURIComponent(OUT_SCOPE)],
[], [],
[]]); []]);
...@@ -277,18 +274,45 @@ promise_test(function(t) { ...@@ -277,18 +274,45 @@ promise_test(function(t) {
return setup_environment(t).then(function() { return setup_environment(t).then(function() {
return test_redirect( 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=fetch&url=' + encodeURIComponent(SCOPE1), SCOPE1],
[],
[]]);
}); });
}, 'SW-fetched redirect to same-origin same-scope.'); }, 'SW-fetched redirect to same-origin same-scope.');
promise_test(function(t) { promise_test(function(t) {
return setup_environment(t).then(function() { return setup_environment(t).then(function() {
return test_redirect( 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)], [], []]); [[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. // Opaque redirect.
// SW: event.respondWith(fetch( // SW: event.respondWith(fetch(
......
...@@ -20,6 +20,9 @@ promise_test(t => { ...@@ -20,6 +20,9 @@ promise_test(t => {
assert_equals(result.url, frame.src, 'request.url'); assert_equals(result.url, frame.src, 'request.url');
assert_equals(result.method, 'GET', 'request.method'); assert_equals(result.method, 'GET', 'request.method');
assert_equals(result.referrer, location.href, 'request.referrer'); 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, assert_equals(result.headers['user-agent'], navigator.userAgent,
'User-Agent header'); 'User-Agent header');
assert_equals(result.append_header_error, 'TypeError', assert_equals(result.append_header_error, 'TypeError',
......
...@@ -16,6 +16,9 @@ onfetch = function(e) { ...@@ -16,6 +16,9 @@ onfetch = function(e) {
method: e.request.method, method: e.request.method,
referrer: e.request.referrer, referrer: e.request.referrer,
headers: headers, headers: headers,
mode: e.request.mode,
credentials: e.request.credentials,
redirect: e.request.redirect,
append_header_error: append_header_error append_header_error: append_header_error
}))); })));
}; };
...@@ -40,65 +40,28 @@ struct FrameLoadRequest { ...@@ -40,65 +40,28 @@ struct FrameLoadRequest {
STACK_ALLOCATED(); STACK_ALLOCATED();
public: public:
explicit FrameLoadRequest(Document* originDocument) explicit FrameLoadRequest(Document* originDocument)
: m_originDocument(originDocument) : FrameLoadRequest(originDocument, ResourceRequest())
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(CheckContentSecurityPolicy)
{ {
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
} }
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest) FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest)
: m_originDocument(originDocument) : FrameLoadRequest(originDocument, resourceRequest, AtomicString())
, m_resourceRequest(resourceRequest)
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(CheckContentSecurityPolicy)
{ {
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
} }
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const AtomicString& frameName) FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const AtomicString& frameName)
: m_originDocument(originDocument) : FrameLoadRequest(originDocument, resourceRequest, frameName, CheckContentSecurityPolicy)
, m_resourceRequest(resourceRequest)
, m_frameName(frameName)
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(CheckContentSecurityPolicy)
{ {
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
} }
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const AtomicString& frameName, ContentSecurityPolicyDisposition shouldCheckMainWorldContentSecurityPolicy) FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const SubstituteData& substituteData)
: m_originDocument(originDocument) : FrameLoadRequest(originDocument, resourceRequest, AtomicString(), substituteData, CheckContentSecurityPolicy)
, m_resourceRequest(resourceRequest)
, m_frameName(frameName)
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(shouldCheckMainWorldContentSecurityPolicy)
{ {
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
} }
FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const SubstituteData& substituteData) FrameLoadRequest(Document* originDocument, const ResourceRequest& resourceRequest, const AtomicString& frameName, ContentSecurityPolicyDisposition shouldCheckMainWorldContentSecurityPolicy)
: m_originDocument(originDocument) : FrameLoadRequest(originDocument, resourceRequest, frameName, SubstituteData(), shouldCheckMainWorldContentSecurityPolicy)
, m_resourceRequest(resourceRequest)
, m_substituteData(substituteData)
, m_replacesCurrentItem(false)
, m_clientRedirect(NotClientRedirect)
, m_shouldSendReferrer(MaybeSendReferrer)
, m_shouldCheckMainWorldContentSecurityPolicy(CheckContentSecurityPolicy)
{ {
if (originDocument)
m_resourceRequest.setRequestorOrigin(SecurityOrigin::create(originDocument->url()));
} }
Document* originDocument() const { return m_originDocument.get(); } Document* originDocument() const { return m_originDocument.get(); }
...@@ -129,6 +92,27 @@ public: ...@@ -129,6 +92,27 @@ public:
ContentSecurityPolicyDisposition shouldCheckMainWorldContentSecurityPolicy() const { return m_shouldCheckMainWorldContentSecurityPolicy; } ContentSecurityPolicyDisposition shouldCheckMainWorldContentSecurityPolicy() const { return m_shouldCheckMainWorldContentSecurityPolicy; }
private: 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; RefPtrWillBeMember<Document> m_originDocument;
ResourceRequest m_resourceRequest; ResourceRequest m_resourceRequest;
AtomicString m_frameName; 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