Commit fa07f657 authored by michaeln@chromium.org's avatar michaeln@chromium.org

Tease apart ServiceWorkerNetworkProvider from other stuff.

BUG=285976

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255324 0039d316-1c4b-4281-b951-d872f2087c98
parent 3459df27
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "content/child/request_extra_data.h" #include "content/child/request_extra_data.h"
#include "content/child/resource_dispatcher.h" #include "content/child/resource_dispatcher.h"
#include "content/child/web_url_loader_impl.h" #include "content/child/web_url_loader_impl.h"
#include "content/common/service_worker/service_worker_types.h"
#include "net/base/load_flags.h" #include "net/base/load_flags.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/http/http_response_headers.h" #include "net/http/http_response_headers.h"
...@@ -118,7 +119,8 @@ PluginURLFetcher::PluginURLFetcher(PluginStreamUrl* plugin_stream, ...@@ -118,7 +119,8 @@ PluginURLFetcher::PluginURLFetcher(PluginStreamUrl* plugin_stream,
PAGE_TRANSITION_LINK, PAGE_TRANSITION_LINK,
false, false,
-1, -1,
-1); -1,
kInvalidServiceWorkerProviderId);
request_info.extra_data = &extra_data; request_info.extra_data = &extra_data;
......
...@@ -21,7 +21,8 @@ RequestExtraData::RequestExtraData( ...@@ -21,7 +21,8 @@ RequestExtraData::RequestExtraData(
PageTransition transition_type, PageTransition transition_type,
bool should_replace_current_entry, bool should_replace_current_entry,
int transferred_request_child_id, int transferred_request_child_id,
int transferred_request_request_id) int transferred_request_request_id,
int service_worker_provider_id)
: webkit_glue::WebURLRequestExtraDataImpl(custom_user_agent, : webkit_glue::WebURLRequestExtraDataImpl(custom_user_agent,
was_after_preconnect_request), was_after_preconnect_request),
visibility_state_(visibility_state), visibility_state_(visibility_state),
...@@ -34,7 +35,8 @@ RequestExtraData::RequestExtraData( ...@@ -34,7 +35,8 @@ RequestExtraData::RequestExtraData(
transition_type_(transition_type), transition_type_(transition_type),
should_replace_current_entry_(should_replace_current_entry), should_replace_current_entry_(should_replace_current_entry),
transferred_request_child_id_(transferred_request_child_id), transferred_request_child_id_(transferred_request_child_id),
transferred_request_request_id_(transferred_request_request_id) { transferred_request_request_id_(transferred_request_request_id),
service_worker_provider_id_(service_worker_provider_id) {
} }
RequestExtraData::~RequestExtraData() { RequestExtraData::~RequestExtraData() {
......
...@@ -30,7 +30,8 @@ class CONTENT_EXPORT RequestExtraData ...@@ -30,7 +30,8 @@ class CONTENT_EXPORT RequestExtraData
PageTransition transition_type, PageTransition transition_type,
bool should_replace_current_entry, bool should_replace_current_entry,
int transferred_request_child_id, int transferred_request_child_id,
int transferred_request_request_id); int transferred_request_request_id,
int service_worker_provider_id);
virtual ~RequestExtraData(); virtual ~RequestExtraData();
blink::WebPageVisibilityState visibility_state() const { blink::WebPageVisibilityState visibility_state() const {
...@@ -52,6 +53,9 @@ class CONTENT_EXPORT RequestExtraData ...@@ -52,6 +53,9 @@ class CONTENT_EXPORT RequestExtraData
int transferred_request_request_id() const { int transferred_request_request_id() const {
return transferred_request_request_id_; return transferred_request_request_id_;
} }
int service_worker_provider_id() const {
return service_worker_provider_id_;
}
private: private:
blink::WebPageVisibilityState visibility_state_; blink::WebPageVisibilityState visibility_state_;
...@@ -65,6 +69,7 @@ class CONTENT_EXPORT RequestExtraData ...@@ -65,6 +69,7 @@ class CONTENT_EXPORT RequestExtraData
bool should_replace_current_entry_; bool should_replace_current_entry_;
int transferred_request_child_id_; int transferred_request_child_id_;
int transferred_request_request_id_; int transferred_request_request_id_;
int service_worker_provider_id_;
DISALLOW_COPY_AND_ASSIGN(RequestExtraData); DISALLOW_COPY_AND_ASSIGN(RequestExtraData);
}; };
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "content/child/request_extra_data.h" #include "content/child/request_extra_data.h"
#include "content/child/resource_dispatcher.h" #include "content/child/resource_dispatcher.h"
#include "content/common/resource_messages.h" #include "content/common/resource_messages.h"
#include "content/common/service_worker/service_worker_types.h"
#include "content/public/common/resource_response.h" #include "content/public/common/resource_response.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
#include "net/http/http_response_headers.h" #include "net/http/http_response_headers.h"
...@@ -178,7 +179,8 @@ class ResourceDispatcherTest : public testing::Test, public IPC::Sender { ...@@ -178,7 +179,8 @@ class ResourceDispatcherTest : public testing::Test, public IPC::Sender {
blink::WebString(), blink::WebString(),
false, MSG_ROUTING_NONE, true, GURL(), false, MSG_ROUTING_NONE, true, GURL(),
false, -1, true, false, -1, true,
PAGE_TRANSITION_LINK, false, -1, -1); PAGE_TRANSITION_LINK, false, -1, -1,
kInvalidServiceWorkerProviderId);
request_info.extra_data = &extra_data; request_info.extra_data = &extra_data;
return dispatcher_->CreateBridge(request_info); return dispatcher_->CreateBridge(request_info);
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/child/service_worker/service_worker_network_provider.h"
#include "base/atomic_sequence_num.h"
#include "content/child/child_thread.h"
#include "content/common/service_worker/service_worker_messages.h"
namespace content {
namespace {
const char kUserDataKey[] = "SWProviderKey";
// Must be unique in the child process.
int GetNextProviderId() {
static base::StaticAtomicSequenceNumber sequence;
return sequence.GetNext(); // We start at zero.
}
} // namespace
void ServiceWorkerNetworkProvider::AttachToDocumentState(
base::SupportsUserData* datasource_userdata,
scoped_ptr<ServiceWorkerNetworkProvider> network_provider) {
datasource_userdata->SetUserData(&kUserDataKey, network_provider.release());
}
ServiceWorkerNetworkProvider* ServiceWorkerNetworkProvider::FromDocumentState(
base::SupportsUserData* datasource_userdata) {
return static_cast<ServiceWorkerNetworkProvider*>(
datasource_userdata->GetUserData(&kUserDataKey));
}
ServiceWorkerNetworkProvider::ServiceWorkerNetworkProvider()
: provider_id_(GetNextProviderId()) {
if (!ChildThread::current())
return; // May be null in some tests.
ChildThread::current()->Send(
new ServiceWorkerHostMsg_ProviderCreated(provider_id_));
}
ServiceWorkerNetworkProvider::~ServiceWorkerNetworkProvider() {
if (!ChildThread::current())
return; // May be null in some tests.
ChildThread::current()->Send(
new ServiceWorkerHostMsg_ProviderDestroyed(provider_id_));
}
} // namespace content
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_CHILD_SERVICE_WORKER_SERVICE_WORKER_NETWORK_PROVIDER_IMPL_H_
#define CONTENT_CHILD_SERVICE_WORKER_SERVICE_WORKER_NETWORK_PROVIDER_IMPL_H_
#include "base/compiler_specific.h"
#include "base/memory/scoped_ptr.h"
#include "base/supports_user_data.h"
#include "content/common/content_export.h"
namespace content {
// A unique provider_id is generated for each instance.
// Instantiated prior to the main resource load being started and remains
// allocated until after the last subresource load has occurred.
// This is used to track the lifetime of a Document to create
// and dispose the ServiceWorkerProviderHost in the browser process
// to match its lifetime. Each request coming from the Document is
// tagged with this id in willSendRequest.
//
// Basically, it's a scoped integer that sends an ipc upon construction
// and destruction.
class CONTENT_EXPORT ServiceWorkerNetworkProvider
: public base::SupportsUserData::Data {
public:
// Ownership is transferred to the DocumentState.
static void AttachToDocumentState(
base::SupportsUserData* document_state,
scoped_ptr<ServiceWorkerNetworkProvider> network_provider);
static ServiceWorkerNetworkProvider* FromDocumentState(
base::SupportsUserData* document_state);
ServiceWorkerNetworkProvider();
virtual ~ServiceWorkerNetworkProvider();
int provider_id() const { return provider_id_; }
private:
const int provider_id_;
DISALLOW_COPY_AND_ASSIGN(ServiceWorkerNetworkProvider);
};
} // namespace content
#endif // CONTENT_CHILD_SERVICE_WORKER_WEB_SERVICE_WORKER_PROVIDER_IMPL_H_
...@@ -139,6 +139,8 @@ ...@@ -139,6 +139,8 @@
'child/service_worker/service_worker_dispatcher.h', 'child/service_worker/service_worker_dispatcher.h',
'child/service_worker/service_worker_message_filter.cc', 'child/service_worker/service_worker_message_filter.cc',
'child/service_worker/service_worker_message_filter.h', 'child/service_worker/service_worker_message_filter.h',
'child/service_worker/service_worker_network_provider.cc',
'child/service_worker/service_worker_network_provider.h',
'child/service_worker/web_service_worker_impl.cc', 'child/service_worker/web_service_worker_impl.cc',
'child/service_worker/web_service_worker_impl.h', 'child/service_worker/web_service_worker_impl.h',
'child/service_worker/web_service_worker_provider_impl.cc', 'child/service_worker/web_service_worker_provider_impl.cc',
......
...@@ -20,9 +20,11 @@ ...@@ -20,9 +20,11 @@
#include "content/child/plugin_messages.h" #include "content/child/plugin_messages.h"
#include "content/child/quota_dispatcher.h" #include "content/child/quota_dispatcher.h"
#include "content/child/request_extra_data.h" #include "content/child/request_extra_data.h"
#include "content/child/service_worker/service_worker_network_provider.h"
#include "content/child/service_worker/web_service_worker_provider_impl.h" #include "content/child/service_worker/web_service_worker_provider_impl.h"
#include "content/child/web_socket_stream_handle_impl.h" #include "content/child/web_socket_stream_handle_impl.h"
#include "content/common/frame_messages.h" #include "content/common/frame_messages.h"
#include "content/common/service_worker/service_worker_types.h"
#include "content/common/socket_stream_handle_data.h" #include "content/common/socket_stream_handle_data.h"
#include "content/common/swapped_out_messages.h" #include "content/common/swapped_out_messages.h"
#include "content/common/view_messages.h" #include "content/common/view_messages.h"
...@@ -1220,6 +1222,13 @@ void RenderFrameImpl::didCreateDataSource(blink::WebFrame* frame, ...@@ -1220,6 +1222,13 @@ void RenderFrameImpl::didCreateDataSource(blink::WebFrame* frame,
// * PopulateDocumentStateFromPending // * PopulateDocumentStateFromPending
// * CreateNavigationStateFromPending // * CreateNavigationStateFromPending
render_view_->didCreateDataSource(frame, datasource); render_view_->didCreateDataSource(frame, datasource);
// Create the serviceworker's per-document network observing object.
scoped_ptr<ServiceWorkerNetworkProvider>
network_provider(new ServiceWorkerNetworkProvider());
ServiceWorkerNetworkProvider::AttachToDocumentState(
DocumentState::FromDataSource(datasource),
network_provider.Pass());
} }
void RenderFrameImpl::didStartProvisionalLoad(blink::WebFrame* frame) { void RenderFrameImpl::didStartProvisionalLoad(blink::WebFrame* frame) {
...@@ -1791,6 +1800,25 @@ void RenderFrameImpl::willSendRequest( ...@@ -1791,6 +1800,25 @@ void RenderFrameImpl::willSendRequest(
should_replace_current_entry = should_replace_current_entry =
navigation_state->should_replace_current_entry(); navigation_state->should_replace_current_entry();
} }
int provider_id = kInvalidServiceWorkerProviderId;
if (request.targetType() == blink::WebURLRequest::TargetIsMainFrame ||
request.targetType() == blink::WebURLRequest::TargetIsSubframe) {
// |provisionalDataSource| may be null in some content::ResourceFetcher
// use cases, we don't hook those requests.
if (frame->provisionalDataSource()) {
ServiceWorkerNetworkProvider* provider =
ServiceWorkerNetworkProvider::FromDocumentState(
DocumentState::FromDataSource(frame->provisionalDataSource()));
provider_id = provider->provider_id();
}
} else if (frame->dataSource()) {
ServiceWorkerNetworkProvider* provider =
ServiceWorkerNetworkProvider::FromDocumentState(
DocumentState::FromDataSource(frame->dataSource()));
provider_id = provider->provider_id();
}
int parent_routing_id = frame->parent() ? int parent_routing_id = frame->parent() ?
FromWebFrame(frame->parent())->GetRoutingID() : -1; FromWebFrame(frame->parent())->GetRoutingID() : -1;
request.setExtraData( request.setExtraData(
...@@ -1806,7 +1834,8 @@ void RenderFrameImpl::willSendRequest( ...@@ -1806,7 +1834,8 @@ void RenderFrameImpl::willSendRequest(
transition_type, transition_type,
should_replace_current_entry, should_replace_current_entry,
navigation_state->transferred_request_child_id(), navigation_state->transferred_request_child_id(),
navigation_state->transferred_request_request_id())); navigation_state->transferred_request_request_id(),
provider_id));
DocumentState* top_document_state = DocumentState* top_document_state =
DocumentState::FromDataSource(top_data_source); DocumentState::FromDataSource(top_data_source);
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/win/windows_version.h" #include "base/win/windows_version.h"
#include "content/child/request_extra_data.h"
#include "content/child/service_worker/service_worker_network_provider.h"
#include "content/common/frame_messages.h" #include "content/common/frame_messages.h"
#include "content/common/ssl_status_serialization.h" #include "content/common/ssl_status_serialization.h"
#include "content/common/view_messages.h" #include "content/common/view_messages.h"
...@@ -2250,4 +2252,46 @@ TEST_F(RenderViewImplTest, FocusElementCallsFocusedNodeChanged) { ...@@ -2250,4 +2252,46 @@ TEST_F(RenderViewImplTest, FocusElementCallsFocusedNodeChanged) {
render_thread_->sink().ClearMessages(); render_thread_->sink().ClearMessages();
} }
TEST_F(RenderViewImplTest, ServiceWorkerNetworkProviderSetup) {
ServiceWorkerNetworkProvider* provider = NULL;
RequestExtraData* extra_data = NULL;
// Make sure each new document has a new provider and
// that the main request is tagged with the provider's id.
LoadHTML("<b>A Document</b>");
ASSERT_TRUE(GetMainFrame()->dataSource());
provider = ServiceWorkerNetworkProvider::FromDocumentState(
DocumentState::FromDataSource(GetMainFrame()->dataSource()));
ASSERT_TRUE(provider);
extra_data = static_cast<RequestExtraData*>(
GetMainFrame()->dataSource()->request().extraData());
ASSERT_TRUE(extra_data);
EXPECT_EQ(extra_data->service_worker_provider_id(),
provider->provider_id());
int provider1_id = provider->provider_id();
LoadHTML("<b>New Document B Goes Here</b>");
ASSERT_TRUE(GetMainFrame()->dataSource());
provider = ServiceWorkerNetworkProvider::FromDocumentState(
DocumentState::FromDataSource(GetMainFrame()->dataSource()));
ASSERT_TRUE(provider);
EXPECT_NE(provider1_id, provider->provider_id());
extra_data = static_cast<RequestExtraData*>(
GetMainFrame()->dataSource()->request().extraData());
ASSERT_TRUE(extra_data);
EXPECT_EQ(extra_data->service_worker_provider_id(),
provider->provider_id());
// See that subresource requests are also tagged with the provider's id.
EXPECT_EQ(frame(), RenderFrameImpl::FromWebFrame(GetMainFrame()));
blink::WebURLRequest request(GURL("http://foo.com"));
request.setTargetType(blink::WebURLRequest::TargetIsSubresource);
blink::WebURLResponse redirect_response;
frame()->willSendRequest(GetMainFrame(), 0, request, redirect_response);
extra_data = static_cast<RequestExtraData*>(request.extraData());
ASSERT_TRUE(extra_data);
EXPECT_EQ(extra_data->service_worker_provider_id(),
provider->provider_id());
}
} // namespace content } // namespace content
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