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 |