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/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "base/threading/thread_local.h" | 9 #include "base/threading/thread_local.h" |
10 #include "content/child/child_thread.h" | 10 #include "content/child/child_thread.h" |
11 #include "content/child/service_worker/service_worker_handle_reference.h" | 11 #include "content/child/service_worker/service_worker_handle_reference.h" |
12 #include "content/child/service_worker/service_worker_provider_context.h" | 12 #include "content/child/service_worker/service_worker_provider_context.h" |
13 #include "content/child/service_worker/web_service_worker_impl.h" | 13 #include "content/child/service_worker/web_service_worker_impl.h" |
14 #include "content/child/thread_safe_sender.h" | 14 #include "content/child/thread_safe_sender.h" |
15 #include "content/child/webmessageportchannel_impl.h" | 15 #include "content/child/webmessageportchannel_impl.h" |
16 #include "content/common/service_worker/service_worker_messages.h" | 16 #include "content/common/service_worker/service_worker_messages.h" |
| 17 #include "content/public/common/url_utils.h" |
17 #include "third_party/WebKit/public/platform/WebServiceWorkerProviderClient.h" | 18 #include "third_party/WebKit/public/platform/WebServiceWorkerProviderClient.h" |
18 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" | 19 #include "third_party/WebKit/public/web/WebSecurityOrigin.h" |
19 | 20 |
20 using blink::WebServiceWorkerError; | 21 using blink::WebServiceWorkerError; |
21 using blink::WebServiceWorkerProvider; | 22 using blink::WebServiceWorkerProvider; |
22 using base::ThreadLocalPointer; | 23 using base::ThreadLocalPointer; |
23 | 24 |
24 namespace content { | 25 namespace content { |
25 | 26 |
26 namespace { | 27 namespace { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 bool ServiceWorkerDispatcher::Send(IPC::Message* msg) { | 72 bool ServiceWorkerDispatcher::Send(IPC::Message* msg) { |
72 return thread_safe_sender_->Send(msg); | 73 return thread_safe_sender_->Send(msg); |
73 } | 74 } |
74 | 75 |
75 void ServiceWorkerDispatcher::RegisterServiceWorker( | 76 void ServiceWorkerDispatcher::RegisterServiceWorker( |
76 int provider_id, | 77 int provider_id, |
77 const GURL& pattern, | 78 const GURL& pattern, |
78 const GURL& script_url, | 79 const GURL& script_url, |
79 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks) { | 80 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks) { |
80 DCHECK(callbacks); | 81 DCHECK(callbacks); |
| 82 |
| 83 if (pattern.possibly_invalid_spec().size() > GetMaxURLChars() || |
| 84 script_url.possibly_invalid_spec().size() > GetMaxURLChars()) { |
| 85 scoped_ptr<WebServiceWorkerProvider::WebServiceWorkerCallbacks> |
| 86 owned_callbacks(callbacks); |
| 87 scoped_ptr<WebServiceWorkerError> error(new WebServiceWorkerError( |
| 88 WebServiceWorkerError::ErrorTypeSecurity, "URL too long")); |
| 89 callbacks->onError(error.release()); |
| 90 return; |
| 91 } |
| 92 |
81 int request_id = pending_callbacks_.Add(callbacks); | 93 int request_id = pending_callbacks_.Add(callbacks); |
82 thread_safe_sender_->Send(new ServiceWorkerHostMsg_RegisterServiceWorker( | 94 thread_safe_sender_->Send(new ServiceWorkerHostMsg_RegisterServiceWorker( |
83 CurrentWorkerId(), request_id, provider_id, pattern, script_url)); | 95 CurrentWorkerId(), request_id, provider_id, pattern, script_url)); |
84 } | 96 } |
85 | 97 |
86 void ServiceWorkerDispatcher::UnregisterServiceWorker( | 98 void ServiceWorkerDispatcher::UnregisterServiceWorker( |
87 int provider_id, | 99 int provider_id, |
88 const GURL& pattern, | 100 const GURL& pattern, |
89 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks) { | 101 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks) { |
90 DCHECK(callbacks); | 102 DCHECK(callbacks); |
| 103 |
| 104 if (pattern.possibly_invalid_spec().size() > GetMaxURLChars()) { |
| 105 scoped_ptr<WebServiceWorkerProvider::WebServiceWorkerCallbacks> |
| 106 owned_callbacks(callbacks); |
| 107 scoped_ptr<WebServiceWorkerError> error(new WebServiceWorkerError( |
| 108 WebServiceWorkerError::ErrorTypeSecurity, "URL too long")); |
| 109 callbacks->onError(error.release()); |
| 110 return; |
| 111 } |
| 112 |
91 int request_id = pending_callbacks_.Add(callbacks); | 113 int request_id = pending_callbacks_.Add(callbacks); |
92 thread_safe_sender_->Send(new ServiceWorkerHostMsg_UnregisterServiceWorker( | 114 thread_safe_sender_->Send(new ServiceWorkerHostMsg_UnregisterServiceWorker( |
93 CurrentWorkerId(), request_id, provider_id, pattern)); | 115 CurrentWorkerId(), request_id, provider_id, pattern)); |
94 } | 116 } |
95 | 117 |
96 void ServiceWorkerDispatcher::AddProviderContext( | 118 void ServiceWorkerDispatcher::AddProviderContext( |
97 ServiceWorkerProviderContext* provider_context) { | 119 ServiceWorkerProviderContext* provider_context) { |
98 DCHECK(provider_context); | 120 DCHECK(provider_context); |
99 int provider_id = provider_context->provider_id(); | 121 int provider_id = provider_context->provider_id(); |
100 DCHECK(!ContainsKey(provider_contexts_, provider_id)); | 122 DCHECK(!ContainsKey(provider_contexts_, provider_id)); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 int thread_id, | 230 int thread_id, |
209 int request_id, | 231 int request_id, |
210 WebServiceWorkerError::ErrorType error_type, | 232 WebServiceWorkerError::ErrorType error_type, |
211 const base::string16& message) { | 233 const base::string16& message) { |
212 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks = | 234 WebServiceWorkerProvider::WebServiceWorkerCallbacks* callbacks = |
213 pending_callbacks_.Lookup(request_id); | 235 pending_callbacks_.Lookup(request_id); |
214 DCHECK(callbacks); | 236 DCHECK(callbacks); |
215 if (!callbacks) | 237 if (!callbacks) |
216 return; | 238 return; |
217 | 239 |
218 scoped_ptr<WebServiceWorkerError> error( | 240 scoped_ptr<WebServiceWorkerError> error( |
219 new WebServiceWorkerError(error_type, message)); | 241 new WebServiceWorkerError(error_type, message)); |
220 callbacks->onError(error.release()); | 242 callbacks->onError(error.release()); |
221 pending_callbacks_.Remove(request_id); | 243 pending_callbacks_.Remove(request_id); |
222 } | 244 } |
223 | 245 |
224 void ServiceWorkerDispatcher::OnServiceWorkerStateChanged( | 246 void ServiceWorkerDispatcher::OnServiceWorkerStateChanged( |
225 int thread_id, | 247 int thread_id, |
226 int handle_id, | 248 int handle_id, |
227 blink::WebServiceWorkerState state) { | 249 blink::WebServiceWorkerState state) { |
228 WorkerObjectMap::iterator worker = service_workers_.find(handle_id); | 250 WorkerObjectMap::iterator worker = service_workers_.find(handle_id); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 DCHECK(!ContainsKey(service_workers_, handle_id)); | 335 DCHECK(!ContainsKey(service_workers_, handle_id)); |
314 service_workers_[handle_id] = worker; | 336 service_workers_[handle_id] = worker; |
315 } | 337 } |
316 | 338 |
317 void ServiceWorkerDispatcher::RemoveServiceWorker(int handle_id) { | 339 void ServiceWorkerDispatcher::RemoveServiceWorker(int handle_id) { |
318 DCHECK(ContainsKey(service_workers_, handle_id)); | 340 DCHECK(ContainsKey(service_workers_, handle_id)); |
319 service_workers_.erase(handle_id); | 341 service_workers_.erase(handle_id); |
320 } | 342 } |
321 | 343 |
322 } // namespace content | 344 } // namespace content |
OLD | NEW |