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