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/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
10 #include "content/browser/message_port_message_filter.h" | 10 #include "content/browser/message_port_message_filter.h" |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 url_a.GetOrigin() == url_c.GetOrigin(); | 45 url_a.GetOrigin() == url_c.GetOrigin(); |
46 } | 46 } |
47 | 47 |
48 // TODO(dominicc): When crbug.com/362214 is fixed use that to be | 48 // TODO(dominicc): When crbug.com/362214 is fixed use that to be |
49 // consistent with Blink's | 49 // consistent with Blink's |
50 // SecurityOrigin::canAccessFeatureRequiringSecureOrigin. | 50 // SecurityOrigin::canAccessFeatureRequiringSecureOrigin. |
51 bool OriginCanAccessServiceWorkers(const GURL& url) { | 51 bool OriginCanAccessServiceWorkers(const GURL& url) { |
52 return url.SchemeIsSecure() || net::IsLocalhost(url.host()); | 52 return url.SchemeIsSecure() || net::IsLocalhost(url.host()); |
53 } | 53 } |
54 | 54 |
| 55 bool CheckPatternIsUnderTheScriptDirectory(const GURL& pattern, |
| 56 const GURL& script_url) { |
| 57 size_t slash_pos = script_url.spec().rfind('/'); |
| 58 if (slash_pos == std::string::npos) |
| 59 return false; |
| 60 return pattern.spec().compare( |
| 61 0, slash_pos + 1, script_url.spec(), 0, slash_pos + 1) == 0; |
| 62 } |
| 63 |
55 bool CanRegisterServiceWorker(const GURL& document_url, | 64 bool CanRegisterServiceWorker(const GURL& document_url, |
56 const GURL& pattern, | 65 const GURL& pattern, |
57 const GURL& script_url) { | 66 const GURL& script_url) { |
| 67 DCHECK(document_url.is_valid()); |
| 68 DCHECK(pattern.is_valid()); |
| 69 DCHECK(script_url.is_valid()); |
58 return AllOriginsMatch(document_url, pattern, script_url) && | 70 return AllOriginsMatch(document_url, pattern, script_url) && |
59 OriginCanAccessServiceWorkers(document_url); | 71 OriginCanAccessServiceWorkers(document_url) && |
| 72 CheckPatternIsUnderTheScriptDirectory(pattern, script_url); |
60 } | 73 } |
61 | 74 |
62 bool CanUnregisterServiceWorker(const GURL& document_url, | 75 bool CanUnregisterServiceWorker(const GURL& document_url, |
63 const GURL& pattern) { | 76 const GURL& pattern) { |
| 77 DCHECK(document_url.is_valid()); |
| 78 DCHECK(pattern.is_valid()); |
64 return document_url.GetOrigin() == pattern.GetOrigin() && | 79 return document_url.GetOrigin() == pattern.GetOrigin() && |
65 OriginCanAccessServiceWorkers(document_url); | 80 OriginCanAccessServiceWorkers(document_url); |
66 } | 81 } |
67 | 82 |
68 bool CanGetRegistration(const GURL& document_url, | 83 bool CanGetRegistration(const GURL& document_url, |
69 const GURL& given_document_url) { | 84 const GURL& given_document_url) { |
| 85 DCHECK(document_url.is_valid()); |
| 86 DCHECK(given_document_url.is_valid()); |
70 return document_url.GetOrigin() == given_document_url.GetOrigin() && | 87 return document_url.GetOrigin() == given_document_url.GetOrigin() && |
71 OriginCanAccessServiceWorkers(document_url); | 88 OriginCanAccessServiceWorkers(document_url); |
72 } | 89 } |
73 | 90 |
74 } // namespace | 91 } // namespace |
75 | 92 |
76 ServiceWorkerDispatcherHost::ServiceWorkerDispatcherHost( | 93 ServiceWorkerDispatcherHost::ServiceWorkerDispatcherHost( |
77 int render_process_id, | 94 int render_process_id, |
78 MessagePortMessageFilter* message_port_message_filter, | 95 MessagePortMessageFilter* message_port_message_filter, |
79 ResourceContext* resource_context) | 96 ResourceContext* resource_context) |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
229 TRACE_EVENT0("ServiceWorker", | 246 TRACE_EVENT0("ServiceWorker", |
230 "ServiceWorkerDispatcherHost::OnRegisterServiceWorker"); | 247 "ServiceWorkerDispatcherHost::OnRegisterServiceWorker"); |
231 if (!GetContext()) { | 248 if (!GetContext()) { |
232 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 249 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
233 thread_id, | 250 thread_id, |
234 request_id, | 251 request_id, |
235 WebServiceWorkerError::ErrorTypeAbort, | 252 WebServiceWorkerError::ErrorTypeAbort, |
236 base::ASCIIToUTF16(kShutdownErrorMessage))); | 253 base::ASCIIToUTF16(kShutdownErrorMessage))); |
237 return; | 254 return; |
238 } | 255 } |
| 256 if (!pattern.is_valid() || !script_url.is_valid()) { |
| 257 BadMessageReceived(); |
| 258 return; |
| 259 } |
239 | 260 |
240 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( | 261 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( |
241 render_process_id_, provider_id); | 262 render_process_id_, provider_id); |
242 if (!provider_host) { | 263 if (!provider_host) { |
243 BadMessageReceived(); | 264 BadMessageReceived(); |
244 return; | 265 return; |
245 } | 266 } |
246 if (!provider_host->IsContextAlive()) { | 267 if (!provider_host->IsContextAlive()) { |
247 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 268 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
248 thread_id, | 269 thread_id, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 TRACE_EVENT0("ServiceWorker", | 313 TRACE_EVENT0("ServiceWorker", |
293 "ServiceWorkerDispatcherHost::OnUnregisterServiceWorker"); | 314 "ServiceWorkerDispatcherHost::OnUnregisterServiceWorker"); |
294 if (!GetContext()) { | 315 if (!GetContext()) { |
295 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( | 316 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( |
296 thread_id, | 317 thread_id, |
297 request_id, | 318 request_id, |
298 blink::WebServiceWorkerError::ErrorTypeAbort, | 319 blink::WebServiceWorkerError::ErrorTypeAbort, |
299 base::ASCIIToUTF16(kShutdownErrorMessage))); | 320 base::ASCIIToUTF16(kShutdownErrorMessage))); |
300 return; | 321 return; |
301 } | 322 } |
| 323 if (!pattern.is_valid()) { |
| 324 BadMessageReceived(); |
| 325 return; |
| 326 } |
302 | 327 |
303 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( | 328 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( |
304 render_process_id_, provider_id); | 329 render_process_id_, provider_id); |
305 if (!provider_host) { | 330 if (!provider_host) { |
306 BadMessageReceived(); | 331 BadMessageReceived(); |
307 return; | 332 return; |
308 } | 333 } |
309 if (!provider_host->IsContextAlive()) { | 334 if (!provider_host->IsContextAlive()) { |
310 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( | 335 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( |
311 thread_id, | 336 thread_id, |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 TRACE_EVENT0("ServiceWorker", | 376 TRACE_EVENT0("ServiceWorker", |
352 "ServiceWorkerDispatcherHost::OnGetRegistration"); | 377 "ServiceWorkerDispatcherHost::OnGetRegistration"); |
353 if (!GetContext()) { | 378 if (!GetContext()) { |
354 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( | 379 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( |
355 thread_id, | 380 thread_id, |
356 request_id, | 381 request_id, |
357 blink::WebServiceWorkerError::ErrorTypeAbort, | 382 blink::WebServiceWorkerError::ErrorTypeAbort, |
358 base::ASCIIToUTF16(kShutdownErrorMessage))); | 383 base::ASCIIToUTF16(kShutdownErrorMessage))); |
359 return; | 384 return; |
360 } | 385 } |
| 386 if (!document_url.is_valid()) { |
| 387 BadMessageReceived(); |
| 388 return; |
| 389 } |
361 | 390 |
362 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( | 391 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( |
363 render_process_id_, provider_id); | 392 render_process_id_, provider_id); |
364 if (!provider_host) { | 393 if (!provider_host) { |
365 BadMessageReceived(); | 394 BadMessageReceived(); |
366 return; | 395 return; |
367 } | 396 } |
368 if (!provider_host->IsContextAlive()) { | 397 if (!provider_host->IsContextAlive()) { |
369 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( | 398 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( |
370 thread_id, | 399 thread_id, |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
794 status, &error_type, &error_message); | 823 status, &error_type, &error_message); |
795 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( | 824 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( |
796 thread_id, request_id, error_type, error_message)); | 825 thread_id, request_id, error_type, error_message)); |
797 } | 826 } |
798 | 827 |
799 ServiceWorkerContextCore* ServiceWorkerDispatcherHost::GetContext() { | 828 ServiceWorkerContextCore* ServiceWorkerDispatcherHost::GetContext() { |
800 return context_wrapper_->context(); | 829 return context_wrapper_->context(); |
801 } | 830 } |
802 | 831 |
803 } // namespace content | 832 } // namespace content |
OLD | NEW |