Chromium Code Reviews| Index: content/renderer/service_worker/embedded_worker_context_client.cc |
| diff --git a/content/renderer/service_worker/embedded_worker_context_client.cc b/content/renderer/service_worker/embedded_worker_context_client.cc |
| index c0e1191388f8a5aa6e3504e87006e92694365446..cef5c641c1de39cf2bac1175c9b4d5d082b00379 100644 |
| --- a/content/renderer/service_worker/embedded_worker_context_client.cc |
| +++ b/content/renderer/service_worker/embedded_worker_context_client.cc |
| @@ -8,17 +8,22 @@ |
| #include "base/message_loop/message_loop_proxy.h" |
| #include "base/pickle.h" |
| #include "base/threading/thread_local.h" |
| +#include "content/child/request_extra_data.h" |
| +#include "content/child/service_worker/service_worker_network_provider.h" |
| #include "content/child/thread_safe_sender.h" |
| #include "content/child/worker_task_runner.h" |
| #include "content/child/worker_thread_task_runner.h" |
| #include "content/common/service_worker/embedded_worker_messages.h" |
| #include "content/common/service_worker/service_worker_types.h" |
| +#include "content/public/renderer/document_state.h" |
| #include "content/renderer/render_thread_impl.h" |
| #include "content/renderer/service_worker/embedded_worker_dispatcher.h" |
| #include "content/renderer/service_worker/service_worker_script_context.h" |
| #include "ipc/ipc_message_macros.h" |
| #include "third_party/WebKit/public/platform/WebServiceWorkerResponse.h" |
| #include "third_party/WebKit/public/platform/WebString.h" |
| +#include "third_party/WebKit/public/web/WebDataSource.h" |
| +#include "third_party/WebKit/public/web/WebServiceWorkerNetworkProvider.h" |
| namespace content { |
| @@ -38,6 +43,34 @@ void CallWorkerContextDestroyedOnMainThread(int embedded_worker_id) { |
| WorkerContextDestroyed(embedded_worker_id); |
| } |
| +// We store an instance of this class in the "extra data" of the WebDataSource |
| +// and attach a ServiceWorkerNetworkProvider to it as base::UserData. |
| +// (see createServiceWorkerNetworkProvider). |
| +class DataSourceExtraData |
| + : public blink::WebDataSource::ExtraData, |
| + public base::SupportsUserData { |
| + public: |
| + DataSourceExtraData() {} |
| + virtual ~DataSourceExtraData() {} |
| +}; |
| + |
| +// Called on the main thread only and blink owns it. |
| +class WebServiceWorkerNetworkProviderImpl |
| + : public blink::WebServiceWorkerNetworkProvider { |
| + public: |
| + // Blink calls this method for each request starting with the main script, |
| + // we tag them with the provider id. |
| + virtual void willSendRequest( |
| + blink::WebDataSource* data_source, |
| + blink::WebURLRequest& request, |
| + const blink::WebURLResponse& redirectResponse) { |
| + ServiceWorkerNetworkProvider* provider = |
| + ServiceWorkerNetworkProvider::FromDocumentState( |
| + static_cast<DataSourceExtraData*>(data_source->extraData())); |
| + request.setExtraData(new RequestExtraData(provider->provider_id())); |
| + } |
| +}; |
| + |
| } // namespace |
| EmbeddedWorkerContextClient* |
| @@ -55,7 +88,6 @@ EmbeddedWorkerContextClient::EmbeddedWorkerContextClient( |
| sender_(ChildThread::current()->thread_safe_sender()), |
| main_thread_proxy_(base::MessageLoopProxy::current()), |
| weak_factory_(this) { |
| - g_worker_client_tls.Pointer()->Set(this); |
| } |
| EmbeddedWorkerContextClient::~EmbeddedWorkerContextClient() { |
| @@ -145,6 +177,28 @@ void EmbeddedWorkerContextClient::didHandleFetchEvent( |
| request_id, SERVICE_WORKER_FETCH_EVENT_RESULT_RESPONSE, response); |
| } |
| +blink::WebServiceWorkerNetworkProvider* |
| +EmbeddedWorkerContextClient::createServiceWorkerNetworkProvider( |
| + blink::WebDataSource* data_source) { |
| + // Create a content::ServiceWorkerNetworkProvider for this data source so |
| + // we can observe its requests. |
| + scoped_ptr<ServiceWorkerNetworkProvider> provider( |
| + new ServiceWorkerNetworkProvider()); |
| + |
| + // Tell the network provider about which version to load. |
| + provider->SetServiceWorkerVersionId(service_worker_version_id_); |
| + |
| + // The provider is kept around for the lifetime of the DataSource |
| + // and ownership is transferred to the DataSource. |
| + DataSourceExtraData* extra_data = new DataSourceExtraData(); |
| + data_source->setExtraData(extra_data); |
| + ServiceWorkerNetworkProvider::AttachToDocumentState( |
| + extra_data, provider.Pass()); |
|
dcheng
2014/03/17 22:12:10
Who gets ownership of |extra_data|?
michaeln
2014/03/17 22:53:58
It's in the code comment.
// and ownership is tran
dcheng
2014/03/18 04:05:49
The comment sounds like it's referring to the prov
|
| + |
| + // Blink is responsible for deleting the returned object. |
| + return new WebServiceWorkerNetworkProviderImpl(); |
| +} |
| + |
| void EmbeddedWorkerContextClient::OnSendMessageToWorker( |
| int thread_id, |
| int embedded_worker_id, |