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