| 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/logging.h" | 10 #include "base/logging.h" |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 provider_host, registration)); | 251 provider_host, registration)); |
| 252 ServiceWorkerRegistrationHandle* new_handle_ptr = new_handle.get(); | 252 ServiceWorkerRegistrationHandle* new_handle_ptr = new_handle.get(); |
| 253 RegisterServiceWorkerRegistrationHandle(std::move(new_handle)); | 253 RegisterServiceWorkerRegistrationHandle(std::move(new_handle)); |
| 254 return new_handle_ptr; | 254 return new_handle_ptr; |
| 255 } | 255 } |
| 256 | 256 |
| 257 void ServiceWorkerDispatcherHost::OnRegisterServiceWorker( | 257 void ServiceWorkerDispatcherHost::OnRegisterServiceWorker( |
| 258 int thread_id, | 258 int thread_id, |
| 259 int request_id, | 259 int request_id, |
| 260 int provider_id, | 260 int provider_id, |
| 261 const GURL& pattern, | 261 const GURL& script_url, |
| 262 const GURL& script_url) { | 262 const ServiceWorkerRegistrationOptions& options) { |
| 263 TRACE_EVENT0("ServiceWorker", | 263 TRACE_EVENT0("ServiceWorker", |
| 264 "ServiceWorkerDispatcherHost::OnRegisterServiceWorker"); | 264 "ServiceWorkerDispatcherHost::OnRegisterServiceWorker"); |
| 265 ProviderStatus provider_status; | 265 ProviderStatus provider_status; |
| 266 ServiceWorkerProviderHost* provider_host = | 266 ServiceWorkerProviderHost* provider_host = |
| 267 GetProviderHostForRequest(&provider_status, provider_id); | 267 GetProviderHostForRequest(&provider_status, provider_id); |
| 268 switch (provider_status) { | 268 switch (provider_status) { |
| 269 case ProviderStatus::NO_CONTEXT: // fallthrough | 269 case ProviderStatus::NO_CONTEXT: // fallthrough |
| 270 case ProviderStatus::DEAD_HOST: | 270 case ProviderStatus::DEAD_HOST: |
| 271 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 271 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
| 272 thread_id, request_id, WebServiceWorkerError::kErrorTypeAbort, | 272 thread_id, request_id, WebServiceWorkerError::kErrorTypeAbort, |
| 273 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + | 273 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + |
| 274 base::ASCIIToUTF16(kShutdownErrorMessage))); | 274 base::ASCIIToUTF16(kShutdownErrorMessage))); |
| 275 return; | 275 return; |
| 276 case ProviderStatus::NO_HOST: | 276 case ProviderStatus::NO_HOST: |
| 277 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_NO_HOST); | 277 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_NO_HOST); |
| 278 return; | 278 return; |
| 279 case ProviderStatus::NO_URL: | 279 case ProviderStatus::NO_URL: |
| 280 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 280 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
| 281 thread_id, request_id, WebServiceWorkerError::kErrorTypeSecurity, | 281 thread_id, request_id, WebServiceWorkerError::kErrorTypeSecurity, |
| 282 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + | 282 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + |
| 283 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); | 283 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); |
| 284 return; | 284 return; |
| 285 case ProviderStatus::OK: | 285 case ProviderStatus::OK: |
| 286 break; | 286 break; |
| 287 } | 287 } |
| 288 | 288 |
| 289 if (!pattern.is_valid() || !script_url.is_valid()) { | 289 if (!options.scope.is_valid() || !script_url.is_valid()) { |
| 290 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_BAD_URL); | 290 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_BAD_URL); |
| 291 return; | 291 return; |
| 292 } | 292 } |
| 293 | 293 |
| 294 std::string error_message; | 294 std::string error_message; |
| 295 if (ServiceWorkerUtils::ContainsDisallowedCharacter(pattern, script_url, | 295 if (ServiceWorkerUtils::ContainsDisallowedCharacter(options.scope, script_url, |
| 296 &error_message)) { | 296 &error_message)) { |
| 297 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_CANNOT); | 297 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_CANNOT); |
| 298 return; | 298 return; |
| 299 } | 299 } |
| 300 | 300 |
| 301 std::vector<GURL> urls = {provider_host->document_url(), pattern, script_url}; | 301 std::vector<GURL> urls = {provider_host->document_url(), options.scope, |
| 302 script_url}; |
| 302 if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { | 303 if (!ServiceWorkerUtils::AllOriginsMatchAndCanAccessServiceWorkers(urls)) { |
| 303 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_CANNOT); | 304 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_CANNOT); |
| 304 return; | 305 return; |
| 305 } | 306 } |
| 306 | 307 |
| 307 if (!GetContentClient()->browser()->AllowServiceWorker( | 308 if (!GetContentClient()->browser()->AllowServiceWorker( |
| 308 pattern, provider_host->topmost_frame_url(), resource_context_, | 309 options.scope, provider_host->topmost_frame_url(), resource_context_, |
| 309 base::Bind(&GetWebContents, render_process_id_, | 310 base::Bind(&GetWebContents, render_process_id_, |
| 310 provider_host->frame_id()))) { | 311 provider_host->frame_id()))) { |
| 311 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 312 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
| 312 thread_id, request_id, WebServiceWorkerError::kErrorTypeDisabled, | 313 thread_id, request_id, WebServiceWorkerError::kErrorTypeDisabled, |
| 313 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + | 314 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + |
| 314 base::ASCIIToUTF16(kUserDeniedPermissionMessage))); | 315 base::ASCIIToUTF16(kUserDeniedPermissionMessage))); |
| 315 return; | 316 return; |
| 316 } | 317 } |
| 317 | 318 |
| 318 TRACE_EVENT_ASYNC_BEGIN2( | 319 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", |
| 319 "ServiceWorker", "ServiceWorkerDispatcherHost::RegisterServiceWorker", | 320 "ServiceWorkerDispatcherHost::RegisterServiceWorker", |
| 320 request_id, "Scope", pattern.spec(), "Script URL", script_url.spec()); | 321 request_id, "Scope", options.scope.spec(), |
| 322 "Script URL", script_url.spec()); |
| 321 GetContext()->RegisterServiceWorker( | 323 GetContext()->RegisterServiceWorker( |
| 322 pattern, | 324 script_url, options, provider_host, |
| 323 script_url, | 325 base::Bind(&ServiceWorkerDispatcherHost::RegistrationComplete, this, |
| 324 provider_host, | 326 thread_id, provider_id, request_id)); |
| 325 base::Bind(&ServiceWorkerDispatcherHost::RegistrationComplete, | |
| 326 this, | |
| 327 thread_id, | |
| 328 provider_id, | |
| 329 request_id)); | |
| 330 } | 327 } |
| 331 | 328 |
| 332 void ServiceWorkerDispatcherHost::OnUpdateServiceWorker( | 329 void ServiceWorkerDispatcherHost::OnUpdateServiceWorker( |
| 333 int thread_id, | 330 int thread_id, |
| 334 int request_id, | 331 int request_id, |
| 335 int provider_id, | 332 int provider_id, |
| 336 int64_t registration_id) { | 333 int64_t registration_id) { |
| 337 TRACE_EVENT0("ServiceWorker", | 334 TRACE_EVENT0("ServiceWorker", |
| 338 "ServiceWorkerDispatcherHost::OnUpdateServiceWorker"); | 335 "ServiceWorkerDispatcherHost::OnUpdateServiceWorker"); |
| 339 ProviderStatus provider_status; | 336 ProviderStatus provider_status; |
| (...skipping 1229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1569 if (!handle) { | 1566 if (!handle) { |
| 1570 bad_message::ReceivedBadMessage(this, | 1567 bad_message::ReceivedBadMessage(this, |
| 1571 bad_message::SWDH_TERMINATE_BAD_HANDLE); | 1568 bad_message::SWDH_TERMINATE_BAD_HANDLE); |
| 1572 return; | 1569 return; |
| 1573 } | 1570 } |
| 1574 handle->version()->StopWorker( | 1571 handle->version()->StopWorker( |
| 1575 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1572 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 1576 } | 1573 } |
| 1577 | 1574 |
| 1578 } // namespace content | 1575 } // namespace content |
| OLD | NEW |