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..68606ebd1bf01a9d9fdf95a2a984f74be355c338 100644 |
--- a/content/renderer/service_worker/embedded_worker_context_client.cc |
+++ b/content/renderer/service_worker/embedded_worker_context_client.cc |
@@ -8,17 +8,21 @@ |
#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" |
namespace content { |
@@ -38,6 +42,37 @@ 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 DidCreateDataSource). |
+class DataSourceExtraData |
+ : public blink::WebDataSource::ExtraData, |
+ public base::SupportsUserData { |
+ public: |
+ DataSourceExtraData() {} |
+ virtual ~DataSourceExtraData() {} |
+ |
+ static DataSourceExtraData* FromDataSource(blink::WebDataSource* ds) { |
kinuko
2014/03/14 11:46:44
Um... this is probably not necessary?
michaeln
2014/03/15 01:19:26
Done.
|
+ return static_cast<DataSourceExtraData*>(ds->extraData()); |
+ } |
+}; |
+ |
+class WebServiceWorkerNetworkProviderImpl |
+ : public blink::WebServiceWorkerNetworkProvider { |
michaeln
2014/03/14 00:56:58
Had to introduce a new object for use on the main
kinuko
2014/03/14 11:46:44
Got it... can you add a brief class comment to not
michaeln
2014/03/15 01:19:26
Done.
|
+ 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( |
+ DocumentState::FromDataSource(data_source)); |
+ request.setExtraData(new RequestExtraData(provider->provider_id())); |
+ } |
+}; |
+ |
} // namespace |
EmbeddedWorkerContextClient* |
@@ -55,6 +90,8 @@ EmbeddedWorkerContextClient::EmbeddedWorkerContextClient( |
sender_(ChildThread::current()->thread_safe_sender()), |
main_thread_proxy_(base::MessageLoopProxy::current()), |
weak_factory_(this) { |
+ // TODO(michaeln): these are always created on the main thread so |
+ // the tls usage is not quite right. |
g_worker_client_tls.Pointer()->Set(this); |
kinuko
2014/03/14 11:46:44
Oops... can we just delete this line? We seem to r
michaeln
2014/03/15 01:19:26
Done.
|
} |
@@ -145,6 +182,27 @@ 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()); |
+ |
+ return new WebServiceWorkerNetworkProviderImpl(); |
+} |
+ |
void EmbeddedWorkerContextClient::OnSendMessageToWorker( |
int thread_id, |
int embedded_worker_id, |