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

Side by Side Diff: content/browser/service_worker/service_worker_dispatcher_host.cc

Issue 2638313002: Manage ServiceWorkerDispatcherHost in ServiceWorkerContextCore (Closed)
Patch Set: Add a newline Created 3 years, 11 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/browser/service_worker/service_worker_dispatcher_host.h" 5 #include "content/browser/service_worker/service_worker_dispatcher_host.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/debug/crash_logging.h" 9 #include "base/debug/crash_logging.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 resource_context_(resource_context), 116 resource_context_(resource_context),
117 channel_ready_(false), 117 channel_ready_(false),
118 weak_factory_(this) { 118 weak_factory_(this) {
119 AddAssociatedInterface( 119 AddAssociatedInterface(
120 mojom::ServiceWorkerDispatcherHost::Name_, 120 mojom::ServiceWorkerDispatcherHost::Name_,
121 base::Bind(&ServiceWorkerDispatcherHost::AddMojoBinding, 121 base::Bind(&ServiceWorkerDispatcherHost::AddMojoBinding,
122 base::Unretained(this))); 122 base::Unretained(this)));
123 } 123 }
124 124
125 ServiceWorkerDispatcherHost::~ServiceWorkerDispatcherHost() { 125 ServiceWorkerDispatcherHost::~ServiceWorkerDispatcherHost() {
126 if (GetContext()) { 126 if (GetContext())
127 GetContext()->RemoveAllProviderHostsForProcess(render_process_id_); 127 GetContext()->RemoveDispatcherHost(render_process_id_);
128 GetContext()->embedded_worker_registry()->RemoveChildProcessSender(
129 render_process_id_);
130 }
131 } 128 }
132 129
133 void ServiceWorkerDispatcherHost::Init( 130 void ServiceWorkerDispatcherHost::Init(
134 ServiceWorkerContextWrapper* context_wrapper) { 131 ServiceWorkerContextWrapper* context_wrapper) {
135 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) { 132 if (!BrowserThread::CurrentlyOn(BrowserThread::IO)) {
136 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, 133 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
137 base::Bind(&ServiceWorkerDispatcherHost::Init, this, 134 base::Bind(&ServiceWorkerDispatcherHost::Init, this,
138 base::RetainedRef(context_wrapper))); 135 base::RetainedRef(context_wrapper)));
139 return; 136 return;
140 } 137 }
141 138
142 context_wrapper_ = context_wrapper; 139 context_wrapper_ = context_wrapper;
143 if (!GetContext()) 140 if (!GetContext())
144 return; 141 return;
145 GetContext()->embedded_worker_registry()->AddChildProcessSender( 142 GetContext()->AddDispatcherHost(render_process_id_, this);
146 render_process_id_, this, message_port_message_filter_);
147 } 143 }
148 144
149 void ServiceWorkerDispatcherHost::OnFilterAdded(IPC::Channel* channel) { 145 void ServiceWorkerDispatcherHost::OnFilterAdded(IPC::Channel* channel) {
150 TRACE_EVENT0("ServiceWorker", 146 TRACE_EVENT0("ServiceWorker",
151 "ServiceWorkerDispatcherHost::OnFilterAdded"); 147 "ServiceWorkerDispatcherHost::OnFilterAdded");
152 channel_ready_ = true; 148 channel_ready_ = true;
153 std::vector<std::unique_ptr<IPC::Message>> messages; 149 std::vector<std::unique_ptr<IPC::Message>> messages;
154 messages.swap(pending_messages_); 150 messages.swap(pending_messages_);
155 for (auto& message : messages) { 151 for (auto& message : messages) {
156 BrowserMessageFilter::Send(message.release()); 152 BrowserMessageFilter::Send(message.release());
157 } 153 }
158 } 154 }
159 155
160 void ServiceWorkerDispatcherHost::OnFilterRemoved() { 156 void ServiceWorkerDispatcherHost::OnFilterRemoved() {
161 // Don't wait until the destructor to teardown since a new dispatcher host 157 // Don't wait until the destructor to teardown since a new dispatcher host
162 // for this process might be created before then. 158 // for this process might be created before then.
163 if (GetContext()) { 159 if (GetContext())
164 GetContext()->RemoveAllProviderHostsForProcess(render_process_id_); 160 GetContext()->RemoveDispatcherHost(render_process_id_);
165 GetContext()->embedded_worker_registry()->RemoveChildProcessSender(
166 render_process_id_);
167 }
168 context_wrapper_ = nullptr; 161 context_wrapper_ = nullptr;
169 channel_ready_ = false; 162 channel_ready_ = false;
170 } 163 }
171 164
172 void ServiceWorkerDispatcherHost::OnDestruct() const { 165 void ServiceWorkerDispatcherHost::OnDestruct() const {
173 BrowserThread::DeleteOnIOThread::Destruct(this); 166 BrowserThread::DeleteOnIOThread::Destruct(this);
174 } 167 }
175 168
176 bool ServiceWorkerDispatcherHost::OnMessageReceived( 169 bool ServiceWorkerDispatcherHost::OnMessageReceived(
177 const IPC::Message& message) { 170 const IPC::Message& message) {
178 bool handled = true; 171 bool handled = true;
179 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcherHost, message) 172 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcherHost, message)
180 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_RegisterServiceWorker, 173 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_RegisterServiceWorker,
181 OnRegisterServiceWorker) 174 OnRegisterServiceWorker)
182 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_UpdateServiceWorker, 175 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_UpdateServiceWorker,
183 OnUpdateServiceWorker) 176 OnUpdateServiceWorker)
184 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_UnregisterServiceWorker, 177 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_UnregisterServiceWorker,
185 OnUnregisterServiceWorker) 178 OnUnregisterServiceWorker)
186 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistration, 179 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistration,
187 OnGetRegistration) 180 OnGetRegistration)
188 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistrations, 181 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistrations,
189 OnGetRegistrations) 182 OnGetRegistrations)
190 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistrationForReady, 183 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GetRegistrationForReady,
191 OnGetRegistrationForReady) 184 OnGetRegistrationForReady)
192 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ProviderCreated,
193 OnProviderCreated)
194 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ProviderDestroyed,
195 OnProviderDestroyed)
196 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetVersionId,
197 OnSetHostedVersionId)
198 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToWorker, 185 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToWorker,
199 OnPostMessageToWorker) 186 OnPostMessageToWorker)
200 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerReadyForInspection, 187 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerReadyForInspection,
201 OnWorkerReadyForInspection) 188 OnWorkerReadyForInspection)
202 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerScriptLoaded, 189 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerScriptLoaded,
203 OnWorkerScriptLoaded) 190 OnWorkerScriptLoaded)
204 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerThreadStarted, 191 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerThreadStarted,
205 OnWorkerThreadStarted) 192 OnWorkerThreadStarted)
206 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerScriptLoadFailed, 193 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerScriptLoadFailed,
207 OnWorkerScriptLoadFailed) 194 OnWorkerScriptLoadFailed)
(...skipping 795 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 break; 990 break;
1004 } 991 }
1005 case SERVICE_WORKER_PROVIDER_UNKNOWN: 992 case SERVICE_WORKER_PROVIDER_UNKNOWN:
1006 default: 993 default:
1007 NOTREACHED() << sender_provider_host->provider_type(); 994 NOTREACHED() << sender_provider_host->provider_type();
1008 break; 995 break;
1009 } 996 }
1010 } 997 }
1011 998
1012 void ServiceWorkerDispatcherHost::OnProviderCreated( 999 void ServiceWorkerDispatcherHost::OnProviderCreated(
1013 int provider_id, 1000 ServiceWorkerProviderHostInfo info) {
1014 int route_id,
1015 ServiceWorkerProviderType provider_type,
1016 bool is_parent_frame_secure) {
1017 // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed. 1001 // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed.
1018 tracked_objects::ScopedTracker tracking_profile( 1002 tracked_objects::ScopedTracker tracking_profile(
1019 FROM_HERE_WITH_EXPLICIT_FUNCTION( 1003 FROM_HERE_WITH_EXPLICIT_FUNCTION(
1020 "477117 ServiceWorkerDispatcherHost::OnProviderCreated")); 1004 "477117 ServiceWorkerDispatcherHost::OnProviderCreated"));
1021 TRACE_EVENT0("ServiceWorker", 1005 TRACE_EVENT0("ServiceWorker",
1022 "ServiceWorkerDispatcherHost::OnProviderCreated"); 1006 "ServiceWorkerDispatcherHost::OnProviderCreated");
1023 if (!GetContext()) 1007 if (!GetContext())
1024 return; 1008 return;
1025 if (GetContext()->GetProviderHost(render_process_id_, provider_id)) { 1009 if (GetContext()->GetProviderHost(render_process_id_, info.provider_id)) {
1026 bad_message::ReceivedBadMessage(this, 1010 bad_message::ReceivedBadMessage(this,
1027 bad_message::SWDH_PROVIDER_CREATED_NO_HOST); 1011 bad_message::SWDH_PROVIDER_CREATED_NO_HOST);
1028 return; 1012 return;
1029 } 1013 }
1030 1014
1031 std::unique_ptr<ServiceWorkerProviderHost> provider_host;
1032 if (IsBrowserSideNavigationEnabled() && 1015 if (IsBrowserSideNavigationEnabled() &&
1033 ServiceWorkerUtils::IsBrowserAssignedProviderId(provider_id)) { 1016 ServiceWorkerUtils::IsBrowserAssignedProviderId(info.provider_id)) {
1017 std::unique_ptr<ServiceWorkerProviderHost> provider_host;
1034 // PlzNavigate 1018 // PlzNavigate
1035 // Retrieve the provider host previously created for navigation requests. 1019 // Retrieve the provider host previously created for navigation requests.
1036 ServiceWorkerNavigationHandleCore* navigation_handle_core = 1020 ServiceWorkerNavigationHandleCore* navigation_handle_core =
1037 GetContext()->GetNavigationHandleCore(provider_id); 1021 GetContext()->GetNavigationHandleCore(info.provider_id);
1038 if (navigation_handle_core != nullptr) 1022 if (navigation_handle_core != nullptr)
1039 provider_host = navigation_handle_core->RetrievePreCreatedHost(); 1023 provider_host = navigation_handle_core->RetrievePreCreatedHost();
1040 1024
1041 // If no host is found, the navigation has been cancelled in the meantime. 1025 // If no host is found, the navigation has been cancelled in the meantime.
1042 // Just return as the navigation will be stopped in the renderer as well. 1026 // Just return as the navigation will be stopped in the renderer as well.
1043 if (provider_host == nullptr) 1027 if (provider_host == nullptr)
1044 return; 1028 return;
1045 DCHECK_EQ(SERVICE_WORKER_PROVIDER_FOR_WINDOW, provider_type); 1029 DCHECK_EQ(SERVICE_WORKER_PROVIDER_FOR_WINDOW, info.type);
1046 provider_host->CompleteNavigationInitialized(render_process_id_, route_id, 1030 provider_host->CompleteNavigationInitialized(render_process_id_,
1047 this); 1031 info.route_id, this);
1032 GetContext()->AddProviderHost(std::move(provider_host));
1048 } else { 1033 } else {
1049 if (ServiceWorkerUtils::IsBrowserAssignedProviderId(provider_id)) { 1034 if (ServiceWorkerUtils::IsBrowserAssignedProviderId(info.provider_id)) {
1050 bad_message::ReceivedBadMessage( 1035 bad_message::ReceivedBadMessage(
1051 this, bad_message::SWDH_PROVIDER_CREATED_NO_HOST); 1036 this, bad_message::SWDH_PROVIDER_CREATED_NO_HOST);
1052 return; 1037 return;
1053 } 1038 }
1054 ServiceWorkerProviderHost::FrameSecurityLevel parent_frame_security_level = 1039 GetContext()->AddProviderHost(render_process_id_, std::move(info));
1055 is_parent_frame_secure
1056 ? ServiceWorkerProviderHost::FrameSecurityLevel::SECURE
1057 : ServiceWorkerProviderHost::FrameSecurityLevel::INSECURE;
1058 provider_host = std::unique_ptr<ServiceWorkerProviderHost>(
1059 new ServiceWorkerProviderHost(
1060 render_process_id_, route_id, provider_id, provider_type,
1061 parent_frame_security_level, GetContext()->AsWeakPtr(), this));
1062 } 1040 }
1063 GetContext()->AddProviderHost(std::move(provider_host));
1064 } 1041 }
1065 1042
1066 void ServiceWorkerDispatcherHost::OnProviderDestroyed(int provider_id) { 1043 void ServiceWorkerDispatcherHost::OnProviderDestroyed(int provider_id) {
1067 TRACE_EVENT0("ServiceWorker", 1044 TRACE_EVENT0("ServiceWorker",
1068 "ServiceWorkerDispatcherHost::OnProviderDestroyed"); 1045 "ServiceWorkerDispatcherHost::OnProviderDestroyed");
1069 if (!GetContext()) 1046 if (!GetContext())
1070 return; 1047 return;
1071 if (!GetContext()->GetProviderHost(render_process_id_, provider_id)) { 1048 if (!GetContext()->GetProviderHost(render_process_id_, provider_id)) {
1072 // PlzNavigate: in some cancellation of navigation cases, it is possible 1049 // PlzNavigate: in some cancellation of navigation cases, it is possible
1073 // for the pre-created hoist to have been destroyed before being claimed by 1050 // for the pre-created hoist to have been destroyed before being claimed by
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after
1806 if (!handle) { 1783 if (!handle) {
1807 bad_message::ReceivedBadMessage(this, 1784 bad_message::ReceivedBadMessage(this,
1808 bad_message::SWDH_TERMINATE_BAD_HANDLE); 1785 bad_message::SWDH_TERMINATE_BAD_HANDLE);
1809 return; 1786 return;
1810 } 1787 }
1811 handle->version()->StopWorker( 1788 handle->version()->StopWorker(
1812 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 1789 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
1813 } 1790 }
1814 1791
1815 } // namespace content 1792 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698