| OLD | NEW |
| 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 "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
| 9 #include "content/browser/message_port_message_filter.h" | 9 #include "content/browser/message_port_message_filter.h" |
| 10 #include "content/browser/message_port_service.h" | 10 #include "content/browser/message_port_service.h" |
| 11 #include "content/browser/service_worker/embedded_worker_registry.h" | 11 #include "content/browser/service_worker/embedded_worker_registry.h" |
| 12 #include "content/browser/service_worker/service_worker_context_core.h" | 12 #include "content/browser/service_worker/service_worker_context_core.h" |
| 13 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 13 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| 14 #include "content/browser/service_worker/service_worker_handle.h" |
| 14 #include "content/browser/service_worker/service_worker_registration.h" | 15 #include "content/browser/service_worker/service_worker_registration.h" |
| 15 #include "content/browser/service_worker/service_worker_utils.h" | 16 #include "content/browser/service_worker/service_worker_utils.h" |
| 16 #include "content/common/service_worker/embedded_worker_messages.h" | 17 #include "content/common/service_worker/embedded_worker_messages.h" |
| 17 #include "content/common/service_worker/service_worker_messages.h" | 18 #include "content/common/service_worker/service_worker_messages.h" |
| 18 #include "ipc/ipc_message_macros.h" | 19 #include "ipc/ipc_message_macros.h" |
| 19 #include "third_party/WebKit/public/platform/WebServiceWorkerError.h" | 20 #include "third_party/WebKit/public/platform/WebServiceWorkerError.h" |
| 20 #include "url/gurl.h" | 21 #include "url/gurl.h" |
| 21 | 22 |
| 22 using blink::WebServiceWorkerError; | 23 using blink::WebServiceWorkerError; |
| 23 | 24 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessage, | 97 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessage, |
| 97 OnPostMessage) | 98 OnPostMessage) |
| 98 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerStarted, | 99 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerStarted, |
| 99 OnWorkerStarted) | 100 OnWorkerStarted) |
| 100 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerStopped, | 101 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_WorkerStopped, |
| 101 OnWorkerStopped) | 102 OnWorkerStopped) |
| 102 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_SendMessageToBrowser, | 103 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_SendMessageToBrowser, |
| 103 OnSendMessageToBrowser) | 104 OnSendMessageToBrowser) |
| 104 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_ReportException, | 105 IPC_MESSAGE_HANDLER(EmbeddedWorkerHostMsg_ReportException, |
| 105 OnReportException) | 106 OnReportException) |
| 107 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_ServiceWorkerObjectDestroyed, |
| 108 OnServiceWorkerObjectDestroyed) |
| 106 IPC_MESSAGE_UNHANDLED(handled = false) | 109 IPC_MESSAGE_UNHANDLED(handled = false) |
| 107 IPC_END_MESSAGE_MAP() | 110 IPC_END_MESSAGE_MAP() |
| 108 | 111 |
| 109 return handled; | 112 return handled; |
| 110 } | 113 } |
| 111 | 114 |
| 115 int ServiceWorkerDispatcherHost::RegisterServiceWorkerHandle( |
| 116 scoped_ptr<ServiceWorkerHandle> handle) { |
| 117 return handles_.Add(handle.release()); |
| 118 } |
| 119 |
| 112 void ServiceWorkerDispatcherHost::OnRegisterServiceWorker( | 120 void ServiceWorkerDispatcherHost::OnRegisterServiceWorker( |
| 113 int32 thread_id, | 121 int32 thread_id, |
| 114 int32 request_id, | 122 int32 request_id, |
| 115 const GURL& pattern, | 123 const GURL& pattern, |
| 116 const GURL& script_url) { | 124 const GURL& script_url) { |
| 117 if (!context_ || !ServiceWorkerUtils::IsFeatureEnabled()) { | 125 if (!context_ || !ServiceWorkerUtils::IsFeatureEnabled()) { |
| 118 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 126 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
| 119 thread_id, | 127 thread_id, |
| 120 request_id, | 128 request_id, |
| 121 WebServiceWorkerError::DisabledError, | 129 WebServiceWorkerError::DisabledError, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 context_->UnregisterServiceWorker( | 172 context_->UnregisterServiceWorker( |
| 165 pattern, | 173 pattern, |
| 166 render_process_id_, | 174 render_process_id_, |
| 167 base::Bind(&ServiceWorkerDispatcherHost::UnregistrationComplete, | 175 base::Bind(&ServiceWorkerDispatcherHost::UnregistrationComplete, |
| 168 this, | 176 this, |
| 169 thread_id, | 177 thread_id, |
| 170 request_id)); | 178 request_id)); |
| 171 } | 179 } |
| 172 | 180 |
| 173 void ServiceWorkerDispatcherHost::OnPostMessage( | 181 void ServiceWorkerDispatcherHost::OnPostMessage( |
| 174 int64 version_id, | 182 int handle_id, |
| 175 const base::string16& message, | 183 const base::string16& message, |
| 176 const std::vector<int>& sent_message_port_ids) { | 184 const std::vector<int>& sent_message_port_ids) { |
| 177 if (!context_ || !ServiceWorkerUtils::IsFeatureEnabled()) | 185 if (!context_ || !ServiceWorkerUtils::IsFeatureEnabled()) |
| 178 return; | 186 return; |
| 179 | 187 |
| 180 std::vector<int> new_routing_ids(sent_message_port_ids.size()); | 188 std::vector<int> new_routing_ids(sent_message_port_ids.size()); |
| 181 for (size_t i = 0; i < sent_message_port_ids.size(); ++i) { | 189 for (size_t i = 0; i < sent_message_port_ids.size(); ++i) { |
| 182 new_routing_ids[i] = message_port_message_filter_->GetNextRoutingID(); | 190 new_routing_ids[i] = message_port_message_filter_->GetNextRoutingID(); |
| 183 MessagePortService::GetInstance()->UpdateMessagePort( | 191 MessagePortService::GetInstance()->UpdateMessagePort( |
| 184 sent_message_port_ids[i], | 192 sent_message_port_ids[i], |
| 185 message_port_message_filter_, | 193 message_port_message_filter_, |
| 186 new_routing_ids[i]); | 194 new_routing_ids[i]); |
| 187 } | 195 } |
| 188 | 196 |
| 189 // TODO(kinuko,michaeln): Make sure we keep the version that has | 197 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); |
| 190 // corresponding WebServiceWorkerImpl alive. | 198 if (!handle) { |
| 191 ServiceWorkerVersion* version = context_->GetLiveVersion(version_id); | 199 BadMessageReceived(); |
| 192 if (!version) | |
| 193 return; | 200 return; |
| 201 } |
| 194 | 202 |
| 195 version->SendMessage( | 203 handle->version()->SendMessage( |
| 196 ServiceWorkerMsg_Message(message, sent_message_port_ids, new_routing_ids), | 204 ServiceWorkerMsg_Message(message, sent_message_port_ids, new_routing_ids), |
| 197 base::Bind(&NoOpStatusCallback)); | 205 base::Bind(&NoOpStatusCallback)); |
| 198 } | 206 } |
| 199 | 207 |
| 200 void ServiceWorkerDispatcherHost::OnProviderCreated(int provider_id) { | 208 void ServiceWorkerDispatcherHost::OnProviderCreated(int provider_id) { |
| 201 if (!context_) | 209 if (!context_) |
| 202 return; | 210 return; |
| 203 if (context_->GetProviderHost(render_process_id_, provider_id)) { | 211 if (context_->GetProviderHost(render_process_id_, provider_id)) { |
| 204 BadMessageReceived(); | 212 BadMessageReceived(); |
| 205 return; | 213 return; |
| 206 } | 214 } |
| 207 scoped_ptr<ServiceWorkerProviderHost> provider_host( | 215 scoped_ptr<ServiceWorkerProviderHost> provider_host( |
| 208 new ServiceWorkerProviderHost( | 216 new ServiceWorkerProviderHost( |
| 209 render_process_id_, provider_id, context_)); | 217 render_process_id_, provider_id, context_, this)); |
| 210 context_->AddProviderHost(provider_host.Pass()); | 218 context_->AddProviderHost(provider_host.Pass()); |
| 211 } | 219 } |
| 212 | 220 |
| 213 void ServiceWorkerDispatcherHost::OnProviderDestroyed(int provider_id) { | 221 void ServiceWorkerDispatcherHost::OnProviderDestroyed(int provider_id) { |
| 214 if (!context_) | 222 if (!context_) |
| 215 return; | 223 return; |
| 216 if (!context_->GetProviderHost(render_process_id_, provider_id)) { | 224 if (!context_->GetProviderHost(render_process_id_, provider_id)) { |
| 217 BadMessageReceived(); | 225 BadMessageReceived(); |
| 218 return; | 226 return; |
| 219 } | 227 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 return; | 261 return; |
| 254 } | 262 } |
| 255 } | 263 } |
| 256 | 264 |
| 257 void ServiceWorkerDispatcherHost::RegistrationComplete( | 265 void ServiceWorkerDispatcherHost::RegistrationComplete( |
| 258 int32 thread_id, | 266 int32 thread_id, |
| 259 int32 request_id, | 267 int32 request_id, |
| 260 ServiceWorkerStatusCode status, | 268 ServiceWorkerStatusCode status, |
| 261 int64 registration_id, | 269 int64 registration_id, |
| 262 int64 version_id) { | 270 int64 version_id) { |
| 271 if (!context_) |
| 272 return; |
| 273 |
| 263 if (status != SERVICE_WORKER_OK) { | 274 if (status != SERVICE_WORKER_OK) { |
| 264 SendRegistrationError(thread_id, request_id, status); | 275 SendRegistrationError(thread_id, request_id, status); |
| 265 return; | 276 return; |
| 266 } | 277 } |
| 267 | 278 |
| 279 ServiceWorkerVersion* version = context_->GetLiveVersion(version_id); |
| 280 DCHECK(version); |
| 281 DCHECK_EQ(registration_id, version->registration_id()); |
| 282 int handle_id = RegisterServiceWorkerHandle( |
| 283 ServiceWorkerHandle::Create(context_, this, thread_id, version)); |
| 268 Send(new ServiceWorkerMsg_ServiceWorkerRegistered( | 284 Send(new ServiceWorkerMsg_ServiceWorkerRegistered( |
| 269 thread_id, request_id, version_id)); | 285 thread_id, request_id, handle_id)); |
| 270 } | 286 } |
| 271 | 287 |
| 272 void ServiceWorkerDispatcherHost::OnWorkerStarted( | 288 void ServiceWorkerDispatcherHost::OnWorkerStarted( |
| 273 int thread_id, int embedded_worker_id) { | 289 int thread_id, int embedded_worker_id) { |
| 274 if (!context_) | 290 if (!context_) |
| 275 return; | 291 return; |
| 276 context_->embedded_worker_registry()->OnWorkerStarted( | 292 context_->embedded_worker_registry()->OnWorkerStarted( |
| 277 render_process_id_, thread_id, embedded_worker_id); | 293 render_process_id_, thread_id, embedded_worker_id); |
| 278 } | 294 } |
| 279 | 295 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 299 const base::string16& error_message, | 315 const base::string16& error_message, |
| 300 int line_number, | 316 int line_number, |
| 301 int column_number, | 317 int column_number, |
| 302 const GURL& source_url) { | 318 const GURL& source_url) { |
| 303 // TODO(horo, nhiroki): Show the error on serviceworker-internals | 319 // TODO(horo, nhiroki): Show the error on serviceworker-internals |
| 304 // (http://crbug.com/359517). | 320 // (http://crbug.com/359517). |
| 305 DVLOG(2) << "[Error] " << error_message << " (" << source_url | 321 DVLOG(2) << "[Error] " << error_message << " (" << source_url |
| 306 << ":" << line_number << "," << column_number << ")"; | 322 << ":" << line_number << "," << column_number << ")"; |
| 307 } | 323 } |
| 308 | 324 |
| 325 void ServiceWorkerDispatcherHost::OnServiceWorkerObjectDestroyed( |
| 326 int handle_id) { |
| 327 handles_.Remove(handle_id); |
| 328 } |
| 329 |
| 309 void ServiceWorkerDispatcherHost::UnregistrationComplete( | 330 void ServiceWorkerDispatcherHost::UnregistrationComplete( |
| 310 int32 thread_id, | 331 int32 thread_id, |
| 311 int32 request_id, | 332 int32 request_id, |
| 312 ServiceWorkerStatusCode status) { | 333 ServiceWorkerStatusCode status) { |
| 313 if (status != SERVICE_WORKER_OK) { | 334 if (status != SERVICE_WORKER_OK) { |
| 314 SendRegistrationError(thread_id, request_id, status); | 335 SendRegistrationError(thread_id, request_id, status); |
| 315 return; | 336 return; |
| 316 } | 337 } |
| 317 | 338 |
| 318 Send(new ServiceWorkerMsg_ServiceWorkerUnregistered(thread_id, request_id)); | 339 Send(new ServiceWorkerMsg_ServiceWorkerUnregistered(thread_id, request_id)); |
| 319 } | 340 } |
| 320 | 341 |
| 321 void ServiceWorkerDispatcherHost::SendRegistrationError( | 342 void ServiceWorkerDispatcherHost::SendRegistrationError( |
| 322 int32 thread_id, | 343 int32 thread_id, |
| 323 int32 request_id, | 344 int32 request_id, |
| 324 ServiceWorkerStatusCode status) { | 345 ServiceWorkerStatusCode status) { |
| 325 base::string16 error_message; | 346 base::string16 error_message; |
| 326 blink::WebServiceWorkerError::ErrorType error_type; | 347 blink::WebServiceWorkerError::ErrorType error_type; |
| 327 GetServiceWorkerRegistrationStatusResponse( | 348 GetServiceWorkerRegistrationStatusResponse( |
| 328 status, &error_type, &error_message); | 349 status, &error_type, &error_message); |
| 329 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 350 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
| 330 thread_id, request_id, error_type, error_message)); | 351 thread_id, request_id, error_type, error_message)); |
| 331 } | 352 } |
| 332 | 353 |
| 333 } // namespace content | 354 } // namespace content |
| OLD | NEW |