Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(145)

Unified Diff: content/renderer/service_worker/embedded_worker_context_client.cc

Issue 193723003: Identify service worker version at main resource load time. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/service_worker/embedded_worker_context_client.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 56fa30cfac6c4ac4e9df21c2faa119bb4c5b5bf6..1669826a4588bb62ac1376f3f3e29fd642730f41 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,35 @@ 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) {
+ ServiceWorkerNetworkProvider* provider =
+ ServiceWorkerNetworkProvider::FromDocumentState(
+ static_cast<DataSourceExtraData*>(data_source->extraData()));
+ scoped_ptr<RequestExtraData> extra_data(new RequestExtraData);
+ extra_data->set_service_worker_provider_id(provider->provider_id());
+ request.setExtraData(extra_data.release());
+ }
+};
+
} // namespace
EmbeddedWorkerContextClient*
@@ -55,7 +89,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() {
@@ -147,6 +180,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());
+
+ // Blink is responsible for deleting the returned object.
+ return new WebServiceWorkerNetworkProviderImpl();
+}
+
void EmbeddedWorkerContextClient::OnSendMessageToWorker(
int thread_id,
int embedded_worker_id,
« no previous file with comments | « content/renderer/service_worker/embedded_worker_context_client.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698