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

Side by Side Diff: content/child/service_worker/service_worker_dispatcher.cc

Issue 342163005: ServiceWorker: Reject overly long scope/script URLs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix formatting nits Created 6 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698