Commit 89252e8f authored by horo's avatar horo Committed by Commit bot

[ServiceWorker] Plumbing the request credentials mode to the ServiceWorker. [2/2 chromium]

Currently the credentials mode of the FetchEvent's request is always 'omit'.
But this should be 'same-origin' or 'include'.
ex:
- <img src="./test.png">
 mode: no CORS
 credentials mode: same-origin
- <img src="./test.png" crossOrigin="anonymous">
 mode: CORS
 credentials mode: same-origin
- <img src="./test.png" crossOrigin="use-credentials">
 mode: CORS
 credentials mode: include

[1/2] blink: https://codereview.chromium.org/610403002/
[2/2] chromium: https://codereview.chromium.org/615493003/

This value is passed from the renederer to the ServiceWorker in the following steps.

In the renederer process:
  blink::ResourceRequest::setFetchCredentialsMode()  // not called yet
 blink::ResourceRequest::m_fetchCredentialsMode
  content::WebURLLoaderImpl::Context::Start()
   blink::WebURLRequest::fetchCredentialsMode()
    GetFetchCredentialsMode()
 conetnt::RequestInfo::fetch_credentials_mode

In the browser process:
 conetnt::RequestInfo::fetch_credentials_mode
  content::ResourceDispatcherHostImpl::BeginRequest()
   content::ServiceWorkerRequestHandler::InitializeHandler()
    content::ServiceWorkerProviderHost::CreateRequestHandler()
     content::ServiceWorkerControlleeRequestHandler::ServiceWorkerControlleeRequestHandler()
 content::ServiceWorkerControlleeRequestHandler::request_credentials_mode_
  content::ServiceWorkerControlleeRequestHandler::MaybeCreateJob()
   content::ServiceWorkerURLRequestJob::ServiceWorkerURLRequestJob()
 content::ServiceWorkerURLRequestJob::request_credentials_mode_
  content::ServiceWorkerURLRequestJob::CreateFetchRequest()
 content::ServiceWorkerFetchRequest::credentials_mode

In the ServiceWorker process:
 content::ServiceWorkerFetchRequest::credentials_mode
   content::ServiceWorkerScriptContext::OnFetchEvent()
   GetBlinkFetchRequestCredentialsMode()
   blink::WebServiceWorkerRequest::setCredentialsMode()
 blink::WebServiceWorkerRequest::WebServiceWorkerRequestPrivate::m_credentialsMode
  blink::Request::create()
  blink::FetchRequestData::create()
 blink::FetchRequestData::m_credentials

BUG=418509

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

Cr-Commit-Position: refs/heads/master@{#297812}
parent 7a1a0bc9
......@@ -1240,6 +1240,7 @@ void ResourceDispatcherHostImpl::BeginRequest(
request_data.service_worker_provider_id,
request_data.skip_service_worker || is_sync_load,
request_data.fetch_request_mode,
request_data.fetch_credentials_mode,
request_data.resource_type,
request_data.request_body);
......
......@@ -24,6 +24,7 @@ ServiceWorkerControlleeRequestHandler::ServiceWorkerControlleeRequestHandler(
base::WeakPtr<ServiceWorkerProviderHost> provider_host,
base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
FetchRequestMode request_mode,
FetchCredentialsMode credentials_mode,
ResourceType resource_type,
scoped_refptr<ResourceRequestBody> body)
: ServiceWorkerRequestHandler(context,
......@@ -33,6 +34,7 @@ ServiceWorkerControlleeRequestHandler::ServiceWorkerControlleeRequestHandler(
is_main_resource_load_(
ServiceWorkerUtils::IsMainResourceType(resource_type)),
request_mode_(request_mode),
credentials_mode_(credentials_mode),
body_(body),
weak_factory_(this) {
}
......@@ -83,6 +85,7 @@ net::URLRequestJob* ServiceWorkerControlleeRequestHandler::MaybeCreateJob(
provider_host_,
blob_storage_context_,
request_mode_,
credentials_mode_,
body_);
if (is_main_resource_load_)
PrepareForMainResource(request->url());
......
......@@ -31,6 +31,7 @@ class CONTENT_EXPORT ServiceWorkerControlleeRequestHandler
base::WeakPtr<ServiceWorkerProviderHost> provider_host,
base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
FetchRequestMode request_mode,
FetchCredentialsMode credentials_mode,
ResourceType resource_type,
scoped_refptr<ResourceRequestBody> body);
virtual ~ServiceWorkerControlleeRequestHandler();
......@@ -68,6 +69,7 @@ class CONTENT_EXPORT ServiceWorkerControlleeRequestHandler
bool is_main_resource_load_;
scoped_refptr<ServiceWorkerURLRequestJob> job_;
FetchRequestMode request_mode_;
FetchCredentialsMode credentials_mode_;
scoped_refptr<ResourceRequestBody> body_;
base::WeakPtrFactory<ServiceWorkerControlleeRequestHandler> weak_factory_;
......
......@@ -101,6 +101,7 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, ActivateWaitingVersion) {
provider_host_,
base::WeakPtr<storage::BlobStorageContext>(),
FETCH_REQUEST_MODE_NO_CORS,
FETCH_CREDENTIALS_MODE_OMIT,
RESOURCE_TYPE_MAIN_FRAME,
scoped_refptr<ResourceRequestBody>()));
scoped_refptr<net::URLRequestJob> job =
......@@ -152,6 +153,7 @@ TEST_F(ServiceWorkerControlleeRequestHandlerTest, DeletedProviderHost) {
provider_host_,
base::WeakPtr<storage::BlobStorageContext>(),
FETCH_REQUEST_MODE_NO_CORS,
FETCH_CREDENTIALS_MODE_OMIT,
RESOURCE_TYPE_MAIN_FRAME,
scoped_refptr<ResourceRequestBody>()));
scoped_refptr<net::URLRequestJob> job =
......
......@@ -147,6 +147,7 @@ void ServiceWorkerProviderHost::DisassociateRegistration() {
scoped_ptr<ServiceWorkerRequestHandler>
ServiceWorkerProviderHost::CreateRequestHandler(
FetchRequestMode request_mode,
FetchCredentialsMode credentials_mode,
ResourceType resource_type,
base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
scoped_refptr<ResourceRequestBody> body) {
......@@ -162,6 +163,7 @@ ServiceWorkerProviderHost::CreateRequestHandler(
AsWeakPtr(),
blob_storage_context,
request_mode,
credentials_mode,
resource_type,
body));
}
......
......@@ -95,6 +95,7 @@ class CONTENT_EXPORT ServiceWorkerProviderHost
// the request doesn't require special handling.
scoped_ptr<ServiceWorkerRequestHandler> CreateRequestHandler(
FetchRequestMode request_mode,
FetchCredentialsMode credentials_mode,
ResourceType resource_type,
base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
scoped_refptr<ResourceRequestBody> body);
......
......@@ -61,6 +61,7 @@ void ServiceWorkerRequestHandler::InitializeHandler(
int provider_id,
bool skip_service_worker,
FetchRequestMode request_mode,
FetchCredentialsMode credentials_mode,
ResourceType resource_type,
scoped_refptr<ResourceRequestBody> body) {
if (!request->url().SchemeIsHTTPOrHTTPS() ||
......@@ -86,6 +87,7 @@ void ServiceWorkerRequestHandler::InitializeHandler(
scoped_ptr<ServiceWorkerRequestHandler> handler(
provider_host->CreateRequestHandler(request_mode,
credentials_mode,
resource_type,
blob_storage_context->AsWeakPtr(),
body));
......
......@@ -51,6 +51,7 @@ class CONTENT_EXPORT ServiceWorkerRequestHandler
int provider_id,
bool skip_service_worker,
FetchRequestMode request_mode,
FetchCredentialsMode credentials_mode,
ResourceType resource_type,
scoped_refptr<ResourceRequestBody> body);
......
......@@ -83,14 +83,14 @@ class ServiceWorkerRequestHandlerTest : public testing::Test {
scoped_ptr<net::URLRequest> request = url_request_context_.CreateRequest(
kDocUrl, net::DEFAULT_PRIORITY, &url_request_delegate_, NULL);
request->set_method(method);
FetchRequestMode request_mode = FETCH_REQUEST_MODE_NO_CORS;
ServiceWorkerRequestHandler::InitializeHandler(request.get(),
context_wrapper(),
&blob_storage_context_,
kMockRenderProcessId,
kMockProviderId,
skip_service_worker,
request_mode,
FETCH_REQUEST_MODE_NO_CORS,
FETCH_CREDENTIALS_MODE_OMIT,
resource_type,
NULL);
return ServiceWorkerRequestHandler::GetHandler(request.get()) != NULL;
......
......@@ -47,6 +47,7 @@ ServiceWorkerURLRequestJob::ServiceWorkerURLRequestJob(
base::WeakPtr<ServiceWorkerProviderHost> provider_host,
base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
FetchRequestMode request_mode,
FetchCredentialsMode credentials_mode,
scoped_refptr<ResourceRequestBody> body)
: net::URLRequestJob(request, network_delegate),
provider_host_(provider_host),
......@@ -54,6 +55,7 @@ ServiceWorkerURLRequestJob::ServiceWorkerURLRequestJob(
is_started_(false),
blob_storage_context_(blob_storage_context),
request_mode_(request_mode),
credentials_mode_(credentials_mode),
fall_back_required_(false),
body_(body),
weak_factory_(this) {
......@@ -295,6 +297,7 @@ ServiceWorkerURLRequestJob::CreateFetchRequest() {
request->blob_uuid = blob_uuid;
request->blob_size = blob_size;
request->referrer = GURL(request_->referrer());
request->credentials_mode = credentials_mode_;
const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request_);
if (info) {
request->is_reload = ui::PageTransitionCoreTypeIs(
......
......@@ -39,6 +39,7 @@ class CONTENT_EXPORT ServiceWorkerURLRequestJob
base::WeakPtr<ServiceWorkerProviderHost> provider_host,
base::WeakPtr<storage::BlobStorageContext> blob_storage_context,
FetchRequestMode request_mode,
FetchCredentialsMode credentials_mode,
scoped_refptr<ResourceRequestBody> body);
// Sets the response type.
......@@ -161,6 +162,7 @@ class CONTENT_EXPORT ServiceWorkerURLRequestJob
base::WeakPtr<storage::BlobStorageContext> blob_storage_context_;
scoped_ptr<net::URLRequest> blob_request_;
FetchRequestMode request_mode_;
FetchCredentialsMode credentials_mode_;
bool fall_back_required_;
// ResourceRequestBody has a collection of BlobDataHandles attached to it
// using the userdata mechanism. So we have to keep it not to free the blobs.
......
......@@ -63,6 +63,7 @@ class MockHttpProtocolHandler
provider_host_,
blob_storage_context_,
FETCH_REQUEST_MODE_NO_CORS,
FETCH_CREDENTIALS_MODE_OMIT,
scoped_refptr<ResourceRequestBody>());
job->ForwardToServiceWorker();
return job;
......
......@@ -19,6 +19,7 @@ RequestInfo::RequestInfo()
has_user_gesture(false),
skip_service_worker(false),
fetch_request_mode(FETCH_REQUEST_MODE_NO_CORS),
fetch_credentials_mode(FETCH_CREDENTIALS_MODE_OMIT),
enable_load_timing(false),
extra_data(NULL) {
}
......
......@@ -82,6 +82,9 @@ struct CONTENT_EXPORT RequestInfo {
// The request mode passed to the ServiceWorker.
FetchRequestMode fetch_request_mode;
// The credentials mode passed to the ServiceWorker.
FetchCredentialsMode fetch_credentials_mode;
// TODO(mmenke): Investigate if enable_load_timing is safe to remove.
// True if load timing data should be collected for the request.
bool enable_load_timing;
......
......@@ -128,6 +128,7 @@ IPCResourceLoaderBridge::IPCResourceLoaderBridge(
request_.has_user_gesture = request_info.has_user_gesture;
request_.skip_service_worker = request_info.skip_service_worker;
request_.fetch_request_mode = request_info.fetch_request_mode;
request_.fetch_credentials_mode = request_info.fetch_credentials_mode;
request_.enable_load_timing = request_info.enable_load_timing;
const RequestExtraData kEmptyData;
......
......@@ -219,6 +219,17 @@ FetchRequestMode GetFetchRequestMode(const WebURLRequest& request) {
return static_cast<FetchRequestMode>(request.fetchRequestMode());
}
COMPILE_ASSERT_MATCHING_ENUMS(FETCH_CREDENTIALS_MODE_OMIT,
WebURLRequest::FetchCredentialsModeOmit);
COMPILE_ASSERT_MATCHING_ENUMS(FETCH_CREDENTIALS_MODE_SAME_ORIGIN,
WebURLRequest::FetchCredentialsModeSameOrigin);
COMPILE_ASSERT_MATCHING_ENUMS(FETCH_CREDENTIALS_MODE_INCLUDE,
WebURLRequest::FetchCredentialsModeInclude);
FetchCredentialsMode GetFetchCredentialsMode(const WebURLRequest& request) {
return static_cast<FetchCredentialsMode>(request.fetchCredentialsMode());
}
} // namespace
// WebURLLoaderImpl::Context --------------------------------------------------
......@@ -397,6 +408,9 @@ void WebURLLoaderImpl::Context::Start(const WebURLRequest& request,
// TODO(brettw) this should take parameter encoding into account when
// creating the GURLs.
// TODO(horo): Check credentials flag is unset when credentials mode is omit.
// Check credentials flag is set when credentials mode is include.
RequestInfo request_info;
request_info.method = method;
request_info.url = url;
......@@ -418,6 +432,7 @@ void WebURLLoaderImpl::Context::Start(const WebURLRequest& request,
request_info.has_user_gesture = request.hasUserGesture();
request_info.skip_service_worker = request.skipServiceWorker();
request_info.fetch_request_mode = GetFetchRequestMode(request);
request_info.fetch_credentials_mode = GetFetchCredentialsMode(request);
request_info.extra_data = request.extraData();
referrer_policy_ = request.referrerPolicy();
request_info.referrer_policy = request.referrerPolicy();
......
......@@ -88,6 +88,9 @@ IPC_ENUM_TRAITS_MAX_VALUE( \
IPC_ENUM_TRAITS_MAX_VALUE(content::FetchRequestMode,
content::FETCH_REQUEST_MODE_LAST)
IPC_ENUM_TRAITS_MAX_VALUE(content::FetchCredentialsMode,
content::FETCH_CREDENTIALS_MODE_LAST)
IPC_STRUCT_TRAITS_BEGIN(content::ResourceResponseHead)
IPC_STRUCT_TRAITS_PARENT(content::ResourceResponseInfo)
IPC_STRUCT_TRAITS_MEMBER(request_start)
......@@ -199,6 +202,9 @@ IPC_STRUCT_BEGIN(ResourceHostMsg_Request)
// The request mode passed to the ServiceWorker.
IPC_STRUCT_MEMBER(content::FetchRequestMode, fetch_request_mode)
// The credentials mode passed to the ServiceWorker.
IPC_STRUCT_MEMBER(content::FetchCredentialsMode, fetch_credentials_mode)
// Optional resource request body (may be null).
IPC_STRUCT_MEMBER(scoped_refptr<content::ResourceRequestBody>,
request_body)
......
......@@ -39,6 +39,7 @@ IPC_STRUCT_TRAITS_BEGIN(content::ServiceWorkerFetchRequest)
IPC_STRUCT_TRAITS_MEMBER(blob_uuid)
IPC_STRUCT_TRAITS_MEMBER(blob_size)
IPC_STRUCT_TRAITS_MEMBER(referrer)
IPC_STRUCT_TRAITS_MEMBER(credentials_mode)
IPC_STRUCT_TRAITS_MEMBER(is_reload)
IPC_STRUCT_TRAITS_END()
......
......@@ -7,7 +7,10 @@
namespace content {
ServiceWorkerFetchRequest::ServiceWorkerFetchRequest()
: mode(FETCH_REQUEST_MODE_NO_CORS), blob_size(0), is_reload(false) {
: mode(FETCH_REQUEST_MODE_NO_CORS),
blob_size(0),
credentials_mode(FETCH_CREDENTIALS_MODE_OMIT),
is_reload(false) {
}
ServiceWorkerFetchRequest::ServiceWorkerFetchRequest(
......@@ -22,6 +25,7 @@ ServiceWorkerFetchRequest::ServiceWorkerFetchRequest(
headers(headers),
blob_size(0),
referrer(referrer),
credentials_mode(FETCH_CREDENTIALS_MODE_OMIT),
is_reload(is_reload) {
}
......
......@@ -42,6 +42,13 @@ enum FetchRequestMode {
FETCH_REQUEST_MODE_LAST = FETCH_REQUEST_MODE_CORS_WITH_FORCED_PREFLIGHT
};
enum FetchCredentialsMode {
FETCH_CREDENTIALS_MODE_OMIT,
FETCH_CREDENTIALS_MODE_SAME_ORIGIN,
FETCH_CREDENTIALS_MODE_INCLUDE,
FETCH_CREDENTIALS_MODE_LAST = FETCH_CREDENTIALS_MODE_INCLUDE
};
// Indicates how the service worker handled a fetch event.
enum ServiceWorkerFetchEventResult {
// Browser should fallback to native fetch.
......@@ -77,6 +84,7 @@ struct CONTENT_EXPORT ServiceWorkerFetchRequest {
std::string blob_uuid;
uint64 blob_size;
GURL referrer;
FetchCredentialsMode credentials_mode;
bool is_reload;
};
......
......@@ -39,6 +39,12 @@ blink::WebURLRequest::FetchRequestMode GetBlinkFetchRequestMode(
return static_cast<blink::WebURLRequest::FetchRequestMode>(mode);
}
blink::WebURLRequest::FetchCredentialsMode GetBlinkFetchCredentialsMode(
FetchCredentialsMode credentials_mode) {
return static_cast<blink::WebURLRequest::FetchCredentialsMode>(
credentials_mode);
}
} // namespace
ServiceWorkerScriptContext::ServiceWorkerScriptContext(
......@@ -183,6 +189,8 @@ void ServiceWorkerScriptContext::OnFetchEvent(
webRequest.setReferrer(blink::WebString::fromUTF8(request.referrer.spec()),
blink::WebReferrerPolicyDefault);
webRequest.setMode(GetBlinkFetchRequestMode(request.mode));
webRequest.setCredentialsMode(
GetBlinkFetchCredentialsMode(request.credentials_mode));
webRequest.setIsReload(request.is_reload);
fetch_start_timings_[request_id] = base::TimeTicks::Now();
proxy_->dispatchFetchEvent(request_id, webRequest);
......
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