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 <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/debug/crash_logging.h" | 9 #include "base/debug/crash_logging.h" |
10 #include "base/debug/dump_without_crashing.h" | 10 #include "base/debug/dump_without_crashing.h" |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 provider_host, registration)); | 291 provider_host, registration)); |
292 ServiceWorkerRegistrationHandle* new_handle_ptr = new_handle.get(); | 292 ServiceWorkerRegistrationHandle* new_handle_ptr = new_handle.get(); |
293 RegisterServiceWorkerRegistrationHandle(std::move(new_handle)); | 293 RegisterServiceWorkerRegistrationHandle(std::move(new_handle)); |
294 return new_handle_ptr; | 294 return new_handle_ptr; |
295 } | 295 } |
296 | 296 |
297 void ServiceWorkerDispatcherHost::OnRegisterServiceWorker( | 297 void ServiceWorkerDispatcherHost::OnRegisterServiceWorker( |
298 int thread_id, | 298 int thread_id, |
299 int request_id, | 299 int request_id, |
300 int provider_id, | 300 int provider_id, |
301 const GURL& pattern, | 301 const GURL& script_url, |
302 const GURL& script_url) { | 302 const ServiceWorkerRegistrationOptions& options) { |
303 TRACE_EVENT0("ServiceWorker", | 303 TRACE_EVENT0("ServiceWorker", |
304 "ServiceWorkerDispatcherHost::OnRegisterServiceWorker"); | 304 "ServiceWorkerDispatcherHost::OnRegisterServiceWorker"); |
305 ProviderStatus provider_status; | 305 ProviderStatus provider_status; |
306 ServiceWorkerProviderHost* provider_host = | 306 ServiceWorkerProviderHost* provider_host = |
307 GetProviderHostForRequest(&provider_status, provider_id); | 307 GetProviderHostForRequest(&provider_status, provider_id); |
308 switch (provider_status) { | 308 switch (provider_status) { |
309 case ProviderStatus::NO_CONTEXT: // fallthrough | 309 case ProviderStatus::NO_CONTEXT: // fallthrough |
310 case ProviderStatus::DEAD_HOST: | 310 case ProviderStatus::DEAD_HOST: |
311 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 311 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
312 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, | 312 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
313 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + | 313 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + |
314 base::ASCIIToUTF16(kShutdownErrorMessage))); | 314 base::ASCIIToUTF16(kShutdownErrorMessage))); |
315 return; | 315 return; |
316 case ProviderStatus::NO_HOST: | 316 case ProviderStatus::NO_HOST: |
317 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_NO_HOST); | 317 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_NO_HOST); |
318 return; | 318 return; |
319 case ProviderStatus::NO_URL: | 319 case ProviderStatus::NO_URL: |
320 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 320 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
321 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, | 321 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
322 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + | 322 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + |
323 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); | 323 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); |
324 return; | 324 return; |
325 case ProviderStatus::OK: | 325 case ProviderStatus::OK: |
326 break; | 326 break; |
327 } | 327 } |
328 | 328 |
329 if (!pattern.is_valid() || !script_url.is_valid()) { | 329 if (!options.scope.is_valid() || !script_url.is_valid()) { |
330 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_BAD_URL); | 330 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_BAD_URL); |
331 return; | 331 return; |
332 } | 332 } |
333 | 333 |
334 std::string error_message; | 334 std::string error_message; |
335 if (ServiceWorkerUtils::ContainsDisallowedCharacter(pattern, script_url, | 335 if (ServiceWorkerUtils::ContainsDisallowedCharacter(options.scope, script_url, |
336 &error_message)) { | 336 &error_message)) { |
337 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_CANNOT); | 337 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_CANNOT); |
338 return; | 338 return; |
339 } | 339 } |
340 | 340 |
341 std::vector<GURL> urls = {provider_host->document_url(), pattern, script_url}; | 341 std::vector<GURL> urls = {provider_host->document_url(), options.scope, |
| 342 script_url}; |
342 if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { | 343 if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { |
343 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_CANNOT); | 344 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_CANNOT); |
344 return; | 345 return; |
345 } | 346 } |
346 | 347 |
347 if (!GetContentClient()->browser()->AllowServiceWorker( | 348 if (!GetContentClient()->browser()->AllowServiceWorker( |
348 pattern, provider_host->topmost_frame_url(), resource_context_, | 349 options.scope, provider_host->topmost_frame_url(), resource_context_, |
349 base::Bind(&GetWebContents, render_process_id_, | 350 base::Bind(&GetWebContents, render_process_id_, |
350 provider_host->frame_id()))) { | 351 provider_host->frame_id()))) { |
351 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 352 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
352 thread_id, request_id, WebServiceWorkerError::ErrorTypeDisabled, | 353 thread_id, request_id, WebServiceWorkerError::ErrorTypeDisabled, |
353 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + | 354 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + |
354 base::ASCIIToUTF16(kUserDeniedPermissionMessage))); | 355 base::ASCIIToUTF16(kUserDeniedPermissionMessage))); |
355 return; | 356 return; |
356 } | 357 } |
357 | 358 |
358 TRACE_EVENT_ASYNC_BEGIN2( | 359 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", |
359 "ServiceWorker", "ServiceWorkerDispatcherHost::RegisterServiceWorker", | 360 "ServiceWorkerDispatcherHost::RegisterServiceWorker", |
360 request_id, "Scope", pattern.spec(), "Script URL", script_url.spec()); | 361 request_id, "Scope", options.scope.spec(), |
| 362 "Script URL", script_url.spec()); |
361 GetContext()->RegisterServiceWorker( | 363 GetContext()->RegisterServiceWorker( |
362 pattern, | 364 script_url, options, provider_host, |
363 script_url, | 365 base::Bind(&ServiceWorkerDispatcherHost::RegistrationComplete, this, |
364 provider_host, | 366 thread_id, provider_id, request_id)); |
365 base::Bind(&ServiceWorkerDispatcherHost::RegistrationComplete, | |
366 this, | |
367 thread_id, | |
368 provider_id, | |
369 request_id)); | |
370 } | 367 } |
371 | 368 |
372 void ServiceWorkerDispatcherHost::OnUpdateServiceWorker( | 369 void ServiceWorkerDispatcherHost::OnUpdateServiceWorker( |
373 int thread_id, | 370 int thread_id, |
374 int request_id, | 371 int request_id, |
375 int provider_id, | 372 int provider_id, |
376 int64_t registration_id) { | 373 int64_t registration_id) { |
377 TRACE_EVENT0("ServiceWorker", | 374 TRACE_EVENT0("ServiceWorker", |
378 "ServiceWorkerDispatcherHost::OnUpdateServiceWorker"); | 375 "ServiceWorkerDispatcherHost::OnUpdateServiceWorker"); |
379 ProviderStatus provider_status; | 376 ProviderStatus provider_status; |
(...skipping 1400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1780 if (!handle) { | 1777 if (!handle) { |
1781 bad_message::ReceivedBadMessage(this, | 1778 bad_message::ReceivedBadMessage(this, |
1782 bad_message::SWDH_TERMINATE_BAD_HANDLE); | 1779 bad_message::SWDH_TERMINATE_BAD_HANDLE); |
1783 return; | 1780 return; |
1784 } | 1781 } |
1785 handle->version()->StopWorker( | 1782 handle->version()->StopWorker( |
1786 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1783 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
1787 } | 1784 } |
1788 | 1785 |
1789 } // namespace content | 1786 } // namespace content |
OLD | NEW |