Chromium Code Reviews| 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/child/service_worker/service_worker_dispatcher.h" | 5 #include "content/child/service_worker/service_worker_dispatcher.h" |
| 6 | 6 |
| 7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
| 8 #include "base/threading/thread_local.h" | 8 #include "base/threading/thread_local.h" |
| 9 #include "content/child/service_worker/web_service_worker_impl.h" | 9 #include "content/child/service_worker/web_service_worker_impl.h" |
| 10 #include "content/child/thread_safe_sender.h" | 10 #include "content/child/thread_safe_sender.h" |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 29 g_dispatcher_tls.Pointer()->Set(this); | 29 g_dispatcher_tls.Pointer()->Set(this); |
| 30 } | 30 } |
| 31 | 31 |
| 32 ServiceWorkerDispatcher::~ServiceWorkerDispatcher() { | 32 ServiceWorkerDispatcher::~ServiceWorkerDispatcher() { |
| 33 g_dispatcher_tls.Pointer()->Set(kHasBeenDeleted); | 33 g_dispatcher_tls.Pointer()->Set(kHasBeenDeleted); |
| 34 } | 34 } |
| 35 | 35 |
| 36 void ServiceWorkerDispatcher::OnMessageReceived(const IPC::Message& msg) { | 36 void ServiceWorkerDispatcher::OnMessageReceived(const IPC::Message& msg) { |
| 37 bool handled = true; | 37 bool handled = true; |
| 38 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcher, msg) | 38 IPC_BEGIN_MESSAGE_MAP(ServiceWorkerDispatcher, msg) |
| 39 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistered, | 39 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistered, OnRegistered) |
| 40 OnServiceWorkerRegistered) | |
| 41 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerUnregistered, | 40 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerUnregistered, |
| 42 OnServiceWorkerUnregistered) | 41 OnUnregistered) |
| 42 IPC_MESSAGE_HANDLER(ServiceWorkerMsg_ServiceWorkerRegistrationError, | |
| 43 OnRegistrationError) | |
|
kinuko
2013/10/10 07:57:22
Any particular reason we use a separate IPC for er
michaeln
2013/10/11 01:29:12
Either way does work. I was expecting register/reg
| |
| 43 IPC_MESSAGE_UNHANDLED(handled = false) | 44 IPC_MESSAGE_UNHANDLED(handled = false) |
| 44 IPC_END_MESSAGE_MAP() | 45 IPC_END_MESSAGE_MAP() |
| 45 DCHECK(handled) << "Unhandled message:" << msg.type(); | 46 DCHECK(handled) << "Unhandled message:" << msg.type(); |
| 46 } | 47 } |
| 47 | 48 |
| 48 bool ServiceWorkerDispatcher::Send(IPC::Message* msg) { | 49 bool ServiceWorkerDispatcher::Send(IPC::Message* msg) { |
| 49 return thread_safe_sender_->Send(msg); | 50 return thread_safe_sender_->Send(msg); |
| 50 } | 51 } |
| 51 | 52 |
| 52 static int CurrentWorkerId() { | 53 static int CurrentWorkerId() { |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 83 if (g_dispatcher_tls.Pointer()->Get()) | 84 if (g_dispatcher_tls.Pointer()->Get()) |
| 84 return g_dispatcher_tls.Pointer()->Get(); | 85 return g_dispatcher_tls.Pointer()->Get(); |
| 85 | 86 |
| 86 ServiceWorkerDispatcher* dispatcher = | 87 ServiceWorkerDispatcher* dispatcher = |
| 87 new ServiceWorkerDispatcher(thread_safe_sender); | 88 new ServiceWorkerDispatcher(thread_safe_sender); |
| 88 if (WorkerTaskRunner::Instance()->CurrentWorkerId()) | 89 if (WorkerTaskRunner::Instance()->CurrentWorkerId()) |
| 89 webkit_glue::WorkerTaskRunner::Instance()->AddStopObserver(dispatcher); | 90 webkit_glue::WorkerTaskRunner::Instance()->AddStopObserver(dispatcher); |
| 90 return dispatcher; | 91 return dispatcher; |
| 91 } | 92 } |
| 92 | 93 |
| 93 void ServiceWorkerDispatcher::OnServiceWorkerRegistered( | 94 void ServiceWorkerDispatcher::OnRegistered(int32 thread_id, |
| 94 int32 thread_id, | 95 int32 request_id, |
| 95 int32 request_id, | 96 int32 service_worker_id) { |
| 96 int32 service_worker_id) { | |
| 97 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks = | 97 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks = |
| 98 pending_callbacks_.Lookup(request_id); | 98 pending_callbacks_.Lookup(request_id); |
| 99 DCHECK(callbacks); | 99 DCHECK(callbacks); |
| 100 if (!callbacks) | 100 if (!callbacks) |
| 101 return; | 101 return; |
| 102 | 102 |
| 103 // the browser has to generate the service_worker_id so the same | 103 // the browser has to generate the service_worker_id so the same |
| 104 // worker can be called from different renderer contexts. However, | 104 // worker can be called from different renderer contexts. However, |
| 105 // the impl object doesn't have to be the same instance across calls | 105 // the impl object doesn't have to be the same instance across calls |
| 106 // unless we require the DOM objects to be identical when there's a | 106 // unless we require the DOM objects to be identical when there's a |
| 107 // duplicate registration. So for now we mint a new object each | 107 // duplicate registration. So for now we mint a new object each |
| 108 // time. | 108 // time. |
| 109 WebServiceWorkerImpl* worker = | 109 WebServiceWorkerImpl* worker = |
| 110 new WebServiceWorkerImpl(service_worker_id, true); | 110 new WebServiceWorkerImpl(service_worker_id, true); |
| 111 callbacks->onSuccess(worker); | 111 callbacks->onSuccess(worker); |
| 112 pending_callbacks_.Remove(request_id); | 112 pending_callbacks_.Remove(request_id); |
| 113 } | 113 } |
| 114 | 114 |
| 115 void ServiceWorkerDispatcher::OnServiceWorkerUnregistered( | 115 void ServiceWorkerDispatcher::OnUnregistered(int32 thread_id, |
| 116 int32 thread_id, | 116 int32 request_id, |
| 117 int32 request_id, | 117 int32 service_worker_id) { |
| 118 int32 service_worker_id) { | |
| 119 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks = | 118 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks = |
| 120 pending_callbacks_.Lookup(request_id); | 119 pending_callbacks_.Lookup(request_id); |
| 121 DCHECK(callbacks); | 120 DCHECK(callbacks); |
| 122 if (!callbacks) | 121 if (!callbacks) |
| 123 return; | 122 return; |
| 124 | 123 |
| 125 // see notes in ServiceWorkerRegistered | 124 // see notes in ServiceWorkerRegistered |
| 126 WebServiceWorkerImpl* worker = | 125 WebServiceWorkerImpl* worker = |
| 127 new WebServiceWorkerImpl(service_worker_id, false); | 126 new WebServiceWorkerImpl(service_worker_id, false); |
| 128 callbacks->onSuccess(worker); | 127 callbacks->onSuccess(worker); |
| 129 pending_callbacks_.Remove(request_id); | 128 pending_callbacks_.Remove(request_id); |
| 130 } | 129 } |
| 131 | 130 |
| 131 void ServiceWorkerDispatcher::OnRegistrationError(int32 thread_id, | |
| 132 int32 request_id) { | |
| 133 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks = | |
| 134 pending_callbacks_.Lookup(request_id); | |
| 135 DCHECK(callbacks); | |
| 136 if (!callbacks) | |
| 137 return; | |
| 138 | |
| 139 callbacks->onError(NULL); | |
|
kinuko
2013/10/10 07:57:22
Looks like this method expects WebSW ptr type for
| |
| 140 pending_callbacks_.Remove(request_id); | |
| 141 } | |
| 142 | |
| 132 void ServiceWorkerDispatcher::OnWorkerRunLoopStopped() { delete this; } | 143 void ServiceWorkerDispatcher::OnWorkerRunLoopStopped() { delete this; } |
| 133 | 144 |
| 134 } // namespace content | 145 } // namespace content |
| OLD | NEW |