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

Side by Side Diff: content/renderer/service_worker/service_worker_context_client.cc

Issue 2733283004: Expose WebServiceWorkerNetworkProvider on DataSource (Closed)
Patch Set: consistency Created 3 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/service_worker/service_worker_context_client.h" 5 #include "content/renderer/service_worker/service_worker_context_client.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 #include "third_party/WebKit/public/platform/URLConversion.h" 54 #include "third_party/WebKit/public/platform/URLConversion.h"
55 #include "third_party/WebKit/public/platform/WebMessagePortChannel.h" 55 #include "third_party/WebKit/public/platform/WebMessagePortChannel.h"
56 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h" 56 #include "third_party/WebKit/public/platform/WebReferrerPolicy.h"
57 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h" 57 #include "third_party/WebKit/public/platform/WebSecurityOrigin.h"
58 #include "third_party/WebKit/public/platform/WebString.h" 58 #include "third_party/WebKit/public/platform/WebString.h"
59 #include "third_party/WebKit/public/platform/WebURLResponse.h" 59 #include "third_party/WebKit/public/platform/WebURLResponse.h"
60 #include "third_party/WebKit/public/platform/modules/notifications/WebNotificati onData.h" 60 #include "third_party/WebKit/public/platform/modules/notifications/WebNotificati onData.h"
61 #include "third_party/WebKit/public/platform/modules/payments/WebPaymentAppReque st.h" 61 #include "third_party/WebKit/public/platform/modules/payments/WebPaymentAppReque st.h"
62 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerClientQueryOptions.h" 62 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerClientQueryOptions.h"
63 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerError.h" 63 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerError.h"
64 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerNetworkProvider.h"
64 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerRequest.h" 65 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerRequest.h"
65 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerResponse.h" 66 #include "third_party/WebKit/public/platform/modules/serviceworker/WebServiceWor kerResponse.h"
66 #include "third_party/WebKit/public/web/WebDataSource.h"
67 #include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerCo ntextClient.h" 67 #include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerCo ntextClient.h"
68 #include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerCo ntextProxy.h" 68 #include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerCo ntextProxy.h"
69 #include "third_party/WebKit/public/web/modules/serviceworker/WebServiceWorkerNe tworkProvider.h"
70 69
71 namespace content { 70 namespace content {
72 71
73 namespace { 72 namespace {
74 73
75 // For now client must be a per-thread instance. 74 // For now client must be a per-thread instance.
76 base::LazyInstance<base::ThreadLocalPointer<ServiceWorkerContextClient>>:: 75 base::LazyInstance<base::ThreadLocalPointer<ServiceWorkerContextClient>>::
77 Leaky g_worker_client_tls = LAZY_INSTANCE_INITIALIZER; 76 Leaky g_worker_client_tls = LAZY_INSTANCE_INITIALIZER;
78 77
79 void CallWorkerContextDestroyedOnMainThread(int embedded_worker_id) { 78 void CallWorkerContextDestroyedOnMainThread(int embedded_worker_id) {
80 if (!RenderThreadImpl::current() || 79 if (!RenderThreadImpl::current() ||
81 !RenderThreadImpl::current()->embedded_worker_dispatcher()) 80 !RenderThreadImpl::current()->embedded_worker_dispatcher())
82 return; 81 return;
83 RenderThreadImpl::current()->embedded_worker_dispatcher()-> 82 RenderThreadImpl::current()->embedded_worker_dispatcher()->
84 WorkerContextDestroyed(embedded_worker_id); 83 WorkerContextDestroyed(embedded_worker_id);
85 } 84 }
86 85
87 // We store an instance of this class in the "extra data" of the WebDataSource
88 // and attach a ServiceWorkerNetworkProvider to it as base::UserData.
89 // (see createServiceWorkerNetworkProvider).
90 class DataSourceExtraData
91 : public blink::WebDataSource::ExtraData,
92 public base::SupportsUserData {
93 public:
94 DataSourceExtraData() {}
95 ~DataSourceExtraData() override {}
96 };
97
98 // Called on the main thread only and blink owns it. 86 // Called on the main thread only and blink owns it.
99 class WebServiceWorkerNetworkProviderImpl 87 class WebServiceWorkerNetworkProviderImpl
100 : public blink::WebServiceWorkerNetworkProvider { 88 : public blink::WebServiceWorkerNetworkProvider {
101 public: 89 public:
90 explicit WebServiceWorkerNetworkProviderImpl(
91 std::unique_ptr<ServiceWorkerNetworkProvider> provider)
92 : provider_(std::move(provider)) {}
93
102 // Blink calls this method for each request starting with the main script, 94 // Blink calls this method for each request starting with the main script,
103 // we tag them with the provider id. 95 // we tag them with the provider id.
104 void willSendRequest(blink::WebDataSource* data_source, 96 void willSendRequest(blink::WebURLRequest& request) override {
105 blink::WebURLRequest& request) override {
106 ServiceWorkerNetworkProvider* provider =
107 ServiceWorkerNetworkProvider::FromDocumentState(
108 static_cast<DataSourceExtraData*>(data_source->getExtraData()));
109 std::unique_ptr<RequestExtraData> extra_data(new RequestExtraData); 97 std::unique_ptr<RequestExtraData> extra_data(new RequestExtraData);
110 extra_data->set_service_worker_provider_id(provider->provider_id()); 98 extra_data->set_service_worker_provider_id(provider_->provider_id());
111 extra_data->set_originated_from_service_worker(true); 99 extra_data->set_originated_from_service_worker(true);
112 // Service workers are only available in secure contexts, so all requests 100 // Service workers are only available in secure contexts, so all requests
113 // are initiated in a secure context. 101 // are initiated in a secure context.
114 extra_data->set_initiated_in_secure_context(true); 102 extra_data->set_initiated_in_secure_context(true);
115 request.setExtraData(extra_data.release()); 103 request.setExtraData(extra_data.release());
116 } 104 }
105
106 private:
107 std::unique_ptr<ServiceWorkerNetworkProvider> provider_;
117 }; 108 };
118 109
119 ServiceWorkerStatusCode EventResultToStatus( 110 ServiceWorkerStatusCode EventResultToStatus(
120 blink::WebServiceWorkerEventResult result) { 111 blink::WebServiceWorkerEventResult result) {
121 switch (result) { 112 switch (result) {
122 case blink::WebServiceWorkerEventResultCompleted: 113 case blink::WebServiceWorkerEventResultCompleted:
123 return SERVICE_WORKER_OK; 114 return SERVICE_WORKER_OK;
124 case blink::WebServiceWorkerEventResultRejected: 115 case blink::WebServiceWorkerEventResultRejected:
125 return SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED; 116 return SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED;
126 } 117 }
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 double event_dispatch_time) { 779 double event_dispatch_time) {
789 const PaymentRequestEventCallback* callback = 780 const PaymentRequestEventCallback* callback =
790 context_->payment_request_event_callbacks.Lookup(request_id); 781 context_->payment_request_event_callbacks.Lookup(request_id);
791 DCHECK(callback); 782 DCHECK(callback);
792 callback->Run(EventResultToStatus(result), 783 callback->Run(EventResultToStatus(result),
793 base::Time::FromDoubleT(event_dispatch_time)); 784 base::Time::FromDoubleT(event_dispatch_time));
794 context_->payment_request_event_callbacks.Remove(request_id); 785 context_->payment_request_event_callbacks.Remove(request_id);
795 } 786 }
796 787
797 blink::WebServiceWorkerNetworkProvider* 788 blink::WebServiceWorkerNetworkProvider*
798 ServiceWorkerContextClient::createServiceWorkerNetworkProvider( 789 ServiceWorkerContextClient::createServiceWorkerNetworkProvider() {
799 blink::WebDataSource* data_source) {
800 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); 790 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread());
801 791
802 // Create a content::ServiceWorkerNetworkProvider for this data source so 792 // Create a content::ServiceWorkerNetworkProvider for this data source so
803 // we can observe its requests. 793 // we can observe its requests.
804 std::unique_ptr<ServiceWorkerNetworkProvider> provider = 794 std::unique_ptr<ServiceWorkerNetworkProvider> provider =
805 base::MakeUnique<ServiceWorkerNetworkProvider>( 795 base::MakeUnique<ServiceWorkerNetworkProvider>(
806 MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, 796 MSG_ROUTING_NONE, SERVICE_WORKER_PROVIDER_FOR_CONTROLLER,
807 true /* is_parent_frame_secure */); 797 true /* is_parent_frame_secure */);
808 provider_context_ = provider->context(); 798 provider_context_ = provider->context();
809 799
810 // Tell the network provider about which version to load. 800 // Tell the network provider about which version to load.
811 provider->SetServiceWorkerVersionId(service_worker_version_id_, 801 provider->SetServiceWorkerVersionId(service_worker_version_id_,
812 embedded_worker_id_); 802 embedded_worker_id_);
813 803
814 // The provider is kept around for the lifetime of the DataSource
815 // and ownership is transferred to the DataSource.
816 DataSourceExtraData* extra_data = new DataSourceExtraData();
817 data_source->setExtraData(extra_data);
818 ServiceWorkerNetworkProvider::AttachToDocumentState(extra_data,
819 std::move(provider));
820
821 // Blink is responsible for deleting the returned object. 804 // Blink is responsible for deleting the returned object.
822 return new WebServiceWorkerNetworkProviderImpl(); 805 return new WebServiceWorkerNetworkProviderImpl(std::move(provider));
823 } 806 }
824 807
825 blink::WebServiceWorkerProvider* 808 blink::WebServiceWorkerProvider*
826 ServiceWorkerContextClient::createServiceWorkerProvider() { 809 ServiceWorkerContextClient::createServiceWorkerProvider() {
827 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread()); 810 DCHECK(main_thread_task_runner_->RunsTasksOnCurrentThread());
828 DCHECK(provider_context_); 811 DCHECK(provider_context_);
829 812
830 // Blink is responsible for deleting the returned object. 813 // Blink is responsible for deleting the returned object.
831 return new WebServiceWorkerProviderImpl( 814 return new WebServiceWorkerProviderImpl(
832 sender_.get(), provider_context_.get()); 815 sender_.get(), provider_context_.get());
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after
1305 } 1288 }
1306 1289
1307 base::WeakPtr<ServiceWorkerContextClient> 1290 base::WeakPtr<ServiceWorkerContextClient>
1308 ServiceWorkerContextClient::GetWeakPtr() { 1291 ServiceWorkerContextClient::GetWeakPtr() {
1309 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread()); 1292 DCHECK(worker_task_runner_->RunsTasksOnCurrentThread());
1310 DCHECK(context_); 1293 DCHECK(context_);
1311 return context_->weak_factory.GetWeakPtr(); 1294 return context_->weak_factory.GetWeakPtr();
1312 } 1295 }
1313 1296
1314 } // namespace content 1297 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698