| 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/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/profiler/scoped_tracker.h" | 8 #include "base/profiler/scoped_tracker.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
| 11 #include "content/browser/bad_message.h" |
| 11 #include "content/browser/message_port_message_filter.h" | 12 #include "content/browser/message_port_message_filter.h" |
| 12 #include "content/browser/message_port_service.h" | 13 #include "content/browser/message_port_service.h" |
| 13 #include "content/browser/service_worker/embedded_worker_registry.h" | 14 #include "content/browser/service_worker/embedded_worker_registry.h" |
| 14 #include "content/browser/service_worker/service_worker_context_core.h" | 15 #include "content/browser/service_worker/service_worker_context_core.h" |
| 15 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 16 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| 16 #include "content/browser/service_worker/service_worker_handle.h" | 17 #include "content/browser/service_worker/service_worker_handle.h" |
| 17 #include "content/browser/service_worker/service_worker_registration.h" | 18 #include "content/browser/service_worker/service_worker_registration.h" |
| 18 #include "content/browser/service_worker/service_worker_registration_handle.h" | 19 #include "content/browser/service_worker/service_worker_registration_handle.h" |
| 19 #include "content/browser/service_worker/service_worker_utils.h" | 20 #include "content/browser/service_worker/service_worker_utils.h" |
| 20 #include "content/common/service_worker/embedded_worker_messages.h" | 21 #include "content/common/service_worker/embedded_worker_messages.h" |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, | 199 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_DecrementRegistrationRefCount, |
| 199 OnDecrementRegistrationRefCount) | 200 OnDecrementRegistrationRefCount) |
| 200 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) | 201 IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_TerminateWorker, OnTerminateWorker) |
| 201 IPC_MESSAGE_UNHANDLED(handled = false) | 202 IPC_MESSAGE_UNHANDLED(handled = false) |
| 202 IPC_END_MESSAGE_MAP() | 203 IPC_END_MESSAGE_MAP() |
| 203 | 204 |
| 204 if (!handled && GetContext()) { | 205 if (!handled && GetContext()) { |
| 205 handled = GetContext()->embedded_worker_registry()->OnMessageReceived( | 206 handled = GetContext()->embedded_worker_registry()->OnMessageReceived( |
| 206 message, render_process_id_); | 207 message, render_process_id_); |
| 207 if (!handled) | 208 if (!handled) |
| 208 BadMessageReceived(); | 209 bad_message::ReceivedBadMessage(this, bad_message::SWDH_NOT_HANDLED); |
| 209 } | 210 } |
| 210 | 211 |
| 211 return handled; | 212 return handled; |
| 212 } | 213 } |
| 213 | 214 |
| 214 bool ServiceWorkerDispatcherHost::Send(IPC::Message* message) { | 215 bool ServiceWorkerDispatcherHost::Send(IPC::Message* message) { |
| 215 if (channel_ready_) { | 216 if (channel_ready_) { |
| 216 BrowserMessageFilter::Send(message); | 217 BrowserMessageFilter::Send(message); |
| 217 // Don't bother passing through Send()'s result: it's not reliable. | 218 // Don't bother passing through Send()'s result: it's not reliable. |
| 218 return true; | 219 return true; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 TRACE_EVENT0("ServiceWorker", | 280 TRACE_EVENT0("ServiceWorker", |
| 280 "ServiceWorkerDispatcherHost::OnRegisterServiceWorker"); | 281 "ServiceWorkerDispatcherHost::OnRegisterServiceWorker"); |
| 281 if (!GetContext()) { | 282 if (!GetContext()) { |
| 282 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 283 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
| 283 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, | 284 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
| 284 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + | 285 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + |
| 285 base::ASCIIToUTF16(kShutdownErrorMessage))); | 286 base::ASCIIToUTF16(kShutdownErrorMessage))); |
| 286 return; | 287 return; |
| 287 } | 288 } |
| 288 if (!pattern.is_valid() || !script_url.is_valid()) { | 289 if (!pattern.is_valid() || !script_url.is_valid()) { |
| 289 BadMessageReceived(); | 290 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_BAD_URL); |
| 290 return; | 291 return; |
| 291 } | 292 } |
| 292 | 293 |
| 293 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( | 294 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( |
| 294 render_process_id_, provider_id); | 295 render_process_id_, provider_id); |
| 295 if (!provider_host) { | 296 if (!provider_host) { |
| 296 BadMessageReceived(); | 297 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_NO_HOST); |
| 297 return; | 298 return; |
| 298 } | 299 } |
| 299 if (!provider_host->IsContextAlive()) { | 300 if (!provider_host->IsContextAlive()) { |
| 300 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 301 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
| 301 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, | 302 thread_id, request_id, WebServiceWorkerError::ErrorTypeAbort, |
| 302 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + | 303 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + |
| 303 base::ASCIIToUTF16(kShutdownErrorMessage))); | 304 base::ASCIIToUTF16(kShutdownErrorMessage))); |
| 304 return; | 305 return; |
| 305 } | 306 } |
| 306 | 307 |
| 307 // TODO(ksakamoto): Currently, document_url is empty if the document is in an | 308 // TODO(ksakamoto): Currently, document_url is empty if the document is in an |
| 308 // IFRAME using frame.contentDocument.write(...). We can remove this check | 309 // IFRAME using frame.contentDocument.write(...). We can remove this check |
| 309 // once crbug.com/439697 is fixed. | 310 // once crbug.com/439697 is fixed. |
| 310 if (provider_host->document_url().is_empty()) { | 311 if (provider_host->document_url().is_empty()) { |
| 311 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 312 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
| 312 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, | 313 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
| 313 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + | 314 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + |
| 314 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); | 315 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); |
| 315 return; | 316 return; |
| 316 } | 317 } |
| 317 | 318 |
| 318 if (!CanRegisterServiceWorker( | 319 if (!CanRegisterServiceWorker( |
| 319 provider_host->document_url(), pattern, script_url)) { | 320 provider_host->document_url(), pattern, script_url)) { |
| 320 BadMessageReceived(); | 321 bad_message::ReceivedBadMessage(this, bad_message::SWDH_REGISTER_CANNOT); |
| 321 return; | 322 return; |
| 322 } | 323 } |
| 323 | 324 |
| 324 std::string error_message; | 325 std::string error_message; |
| 325 if (ServiceWorkerUtils::ContainsDisallowedCharacter(pattern, script_url, | 326 if (ServiceWorkerUtils::ContainsDisallowedCharacter(pattern, script_url, |
| 326 &error_message)) { | 327 &error_message)) { |
| 327 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( | 328 Send(new ServiceWorkerMsg_ServiceWorkerRegistrationError( |
| 328 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, | 329 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
| 329 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + | 330 base::ASCIIToUTF16(kServiceWorkerRegisterErrorPrefix) + |
| 330 base::UTF8ToUTF16(error_message))); | 331 base::UTF8ToUTF16(error_message))); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 366 "ServiceWorkerDispatcherHost::OnUnregisterServiceWorker"); | 367 "ServiceWorkerDispatcherHost::OnUnregisterServiceWorker"); |
| 367 if (!GetContext()) { | 368 if (!GetContext()) { |
| 368 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( | 369 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( |
| 369 thread_id, | 370 thread_id, |
| 370 request_id, | 371 request_id, |
| 371 blink::WebServiceWorkerError::ErrorTypeAbort, | 372 blink::WebServiceWorkerError::ErrorTypeAbort, |
| 372 base::ASCIIToUTF16(kShutdownErrorMessage))); | 373 base::ASCIIToUTF16(kShutdownErrorMessage))); |
| 373 return; | 374 return; |
| 374 } | 375 } |
| 375 if (!pattern.is_valid()) { | 376 if (!pattern.is_valid()) { |
| 376 BadMessageReceived(); | 377 bad_message::ReceivedBadMessage(this, bad_message::SWDH_UNREGISTER_BAD_URL); |
| 377 return; | 378 return; |
| 378 } | 379 } |
| 379 | 380 |
| 380 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( | 381 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( |
| 381 render_process_id_, provider_id); | 382 render_process_id_, provider_id); |
| 382 if (!provider_host) { | 383 if (!provider_host) { |
| 383 BadMessageReceived(); | 384 bad_message::ReceivedBadMessage(this, bad_message::SWDH_UNREGISTER_NO_HOST); |
| 384 return; | 385 return; |
| 385 } | 386 } |
| 386 if (!provider_host->IsContextAlive()) { | 387 if (!provider_host->IsContextAlive()) { |
| 387 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( | 388 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( |
| 388 thread_id, | 389 thread_id, |
| 389 request_id, | 390 request_id, |
| 390 blink::WebServiceWorkerError::ErrorTypeAbort, | 391 blink::WebServiceWorkerError::ErrorTypeAbort, |
| 391 base::ASCIIToUTF16(kShutdownErrorMessage))); | 392 base::ASCIIToUTF16(kShutdownErrorMessage))); |
| 392 return; | 393 return; |
| 393 } | 394 } |
| 394 | 395 |
| 395 // TODO(ksakamoto): This check can be removed once crbug.com/439697 is fixed. | 396 // TODO(ksakamoto): This check can be removed once crbug.com/439697 is fixed. |
| 396 if (provider_host->document_url().is_empty()) { | 397 if (provider_host->document_url().is_empty()) { |
| 397 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( | 398 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( |
| 398 thread_id, | 399 thread_id, |
| 399 request_id, | 400 request_id, |
| 400 WebServiceWorkerError::ErrorTypeSecurity, | 401 WebServiceWorkerError::ErrorTypeSecurity, |
| 401 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); | 402 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); |
| 402 return; | 403 return; |
| 403 } | 404 } |
| 404 | 405 |
| 405 if (!CanUnregisterServiceWorker(provider_host->document_url(), pattern)) { | 406 if (!CanUnregisterServiceWorker(provider_host->document_url(), pattern)) { |
| 406 BadMessageReceived(); | 407 bad_message::ReceivedBadMessage(this, bad_message::SWDH_UNREGISTER_CANNOT); |
| 407 return; | 408 return; |
| 408 } | 409 } |
| 409 | 410 |
| 410 if (!GetContentClient()->browser()->AllowServiceWorker( | 411 if (!GetContentClient()->browser()->AllowServiceWorker( |
| 411 pattern, provider_host->topmost_frame_url(), resource_context_, | 412 pattern, provider_host->topmost_frame_url(), resource_context_, |
| 412 render_process_id_, provider_host->frame_id())) { | 413 render_process_id_, provider_host->frame_id())) { |
| 413 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( | 414 Send(new ServiceWorkerMsg_ServiceWorkerUnregistrationError( |
| 414 thread_id, | 415 thread_id, |
| 415 request_id, | 416 request_id, |
| 416 WebServiceWorkerError::ErrorTypeUnknown, | 417 WebServiceWorkerError::ErrorTypeUnknown, |
| (...skipping 22 matching lines...) Expand all Loading... |
| 439 TRACE_EVENT0("ServiceWorker", | 440 TRACE_EVENT0("ServiceWorker", |
| 440 "ServiceWorkerDispatcherHost::OnGetRegistration"); | 441 "ServiceWorkerDispatcherHost::OnGetRegistration"); |
| 441 if (!GetContext()) { | 442 if (!GetContext()) { |
| 442 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( | 443 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( |
| 443 thread_id, request_id, blink::WebServiceWorkerError::ErrorTypeAbort, | 444 thread_id, request_id, blink::WebServiceWorkerError::ErrorTypeAbort, |
| 444 base::ASCIIToUTF16(kServiceWorkerGetRegistrationErrorPrefix) + | 445 base::ASCIIToUTF16(kServiceWorkerGetRegistrationErrorPrefix) + |
| 445 base::ASCIIToUTF16(kShutdownErrorMessage))); | 446 base::ASCIIToUTF16(kShutdownErrorMessage))); |
| 446 return; | 447 return; |
| 447 } | 448 } |
| 448 if (!document_url.is_valid()) { | 449 if (!document_url.is_valid()) { |
| 449 BadMessageReceived(); | 450 bad_message::ReceivedBadMessage(this, |
| 451 bad_message::SWDH_GET_REGISTRATION_BAD_URL); |
| 450 return; | 452 return; |
| 451 } | 453 } |
| 452 | 454 |
| 453 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( | 455 ServiceWorkerProviderHost* provider_host = GetContext()->GetProviderHost( |
| 454 render_process_id_, provider_id); | 456 render_process_id_, provider_id); |
| 455 if (!provider_host) { | 457 if (!provider_host) { |
| 456 BadMessageReceived(); | 458 bad_message::ReceivedBadMessage(this, |
| 459 bad_message::SWDH_GET_REGISTRATION_NO_HOST); |
| 457 return; | 460 return; |
| 458 } | 461 } |
| 459 if (!provider_host->IsContextAlive()) { | 462 if (!provider_host->IsContextAlive()) { |
| 460 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( | 463 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( |
| 461 thread_id, request_id, blink::WebServiceWorkerError::ErrorTypeAbort, | 464 thread_id, request_id, blink::WebServiceWorkerError::ErrorTypeAbort, |
| 462 base::ASCIIToUTF16(kServiceWorkerGetRegistrationErrorPrefix) + | 465 base::ASCIIToUTF16(kServiceWorkerGetRegistrationErrorPrefix) + |
| 463 base::ASCIIToUTF16(kShutdownErrorMessage))); | 466 base::ASCIIToUTF16(kShutdownErrorMessage))); |
| 464 return; | 467 return; |
| 465 } | 468 } |
| 466 | 469 |
| 467 // TODO(ksakamoto): This check can be removed once crbug.com/439697 is fixed. | 470 // TODO(ksakamoto): This check can be removed once crbug.com/439697 is fixed. |
| 468 if (provider_host->document_url().is_empty()) { | 471 if (provider_host->document_url().is_empty()) { |
| 469 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( | 472 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( |
| 470 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, | 473 thread_id, request_id, WebServiceWorkerError::ErrorTypeSecurity, |
| 471 base::ASCIIToUTF16(kServiceWorkerGetRegistrationErrorPrefix) + | 474 base::ASCIIToUTF16(kServiceWorkerGetRegistrationErrorPrefix) + |
| 472 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); | 475 base::ASCIIToUTF16(kNoDocumentURLErrorMessage))); |
| 473 return; | 476 return; |
| 474 } | 477 } |
| 475 | 478 |
| 476 if (!CanGetRegistration(provider_host->document_url(), document_url)) { | 479 if (!CanGetRegistration(provider_host->document_url(), document_url)) { |
| 477 BadMessageReceived(); | 480 bad_message::ReceivedBadMessage(this, |
| 481 bad_message::SWDH_GET_REGISTRATION_CANNOT); |
| 478 return; | 482 return; |
| 479 } | 483 } |
| 480 | 484 |
| 481 if (!GetContentClient()->browser()->AllowServiceWorker( | 485 if (!GetContentClient()->browser()->AllowServiceWorker( |
| 482 provider_host->document_url(), provider_host->topmost_frame_url(), | 486 provider_host->document_url(), provider_host->topmost_frame_url(), |
| 483 resource_context_, render_process_id_, provider_host->frame_id())) { | 487 resource_context_, render_process_id_, provider_host->frame_id())) { |
| 484 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( | 488 Send(new ServiceWorkerMsg_ServiceWorkerGetRegistrationError( |
| 485 thread_id, request_id, WebServiceWorkerError::ErrorTypeUnknown, | 489 thread_id, request_id, WebServiceWorkerError::ErrorTypeUnknown, |
| 486 base::ASCIIToUTF16(kServiceWorkerGetRegistrationErrorPrefix) + | 490 base::ASCIIToUTF16(kServiceWorkerGetRegistrationErrorPrefix) + |
| 487 base::ASCIIToUTF16(kUserDeniedPermissionMessage))); | 491 base::ASCIIToUTF16(kUserDeniedPermissionMessage))); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 513 int thread_id, | 517 int thread_id, |
| 514 int request_id, | 518 int request_id, |
| 515 int provider_id) { | 519 int provider_id) { |
| 516 TRACE_EVENT0("ServiceWorker", | 520 TRACE_EVENT0("ServiceWorker", |
| 517 "ServiceWorkerDispatcherHost::OnGetRegistrationForReady"); | 521 "ServiceWorkerDispatcherHost::OnGetRegistrationForReady"); |
| 518 if (!GetContext()) | 522 if (!GetContext()) |
| 519 return; | 523 return; |
| 520 ServiceWorkerProviderHost* provider_host = | 524 ServiceWorkerProviderHost* provider_host = |
| 521 GetContext()->GetProviderHost(render_process_id_, provider_id); | 525 GetContext()->GetProviderHost(render_process_id_, provider_id); |
| 522 if (!provider_host) { | 526 if (!provider_host) { |
| 523 BadMessageReceived(); | 527 bad_message::ReceivedBadMessage( |
| 528 this, bad_message::SWDH_GET_REGISTRATION_FOR_READY_NO_HOST); |
| 524 return; | 529 return; |
| 525 } | 530 } |
| 526 if (!provider_host->IsContextAlive()) | 531 if (!provider_host->IsContextAlive()) |
| 527 return; | 532 return; |
| 528 | 533 |
| 529 TRACE_EVENT_ASYNC_BEGIN0( | 534 TRACE_EVENT_ASYNC_BEGIN0( |
| 530 "ServiceWorker", | 535 "ServiceWorker", |
| 531 "ServiceWorkerDispatcherHost::GetRegistrationForReady", | 536 "ServiceWorkerDispatcherHost::GetRegistrationForReady", |
| 532 request_id); | 537 request_id); |
| 533 | 538 |
| 534 if (!provider_host->GetRegistrationForReady(base::Bind( | 539 if (!provider_host->GetRegistrationForReady(base::Bind( |
| 535 &ServiceWorkerDispatcherHost::GetRegistrationForReadyComplete, | 540 &ServiceWorkerDispatcherHost::GetRegistrationForReadyComplete, |
| 536 this, thread_id, request_id, provider_host->AsWeakPtr()))) { | 541 this, thread_id, request_id, provider_host->AsWeakPtr()))) { |
| 537 BadMessageReceived(); | 542 bad_message::ReceivedBadMessage( |
| 543 this, bad_message::SWDH_GET_REGISTRATION_FOR_READY_ALREADY_IN_PROGRESS); |
| 538 } | 544 } |
| 539 } | 545 } |
| 540 | 546 |
| 541 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( | 547 void ServiceWorkerDispatcherHost::OnPostMessageToWorker( |
| 542 int handle_id, | 548 int handle_id, |
| 543 const base::string16& message, | 549 const base::string16& message, |
| 544 const std::vector<TransferredMessagePort>& sent_message_ports) { | 550 const std::vector<TransferredMessagePort>& sent_message_ports) { |
| 545 TRACE_EVENT0("ServiceWorker", | 551 TRACE_EVENT0("ServiceWorker", |
| 546 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); | 552 "ServiceWorkerDispatcherHost::OnPostMessageToWorker"); |
| 547 if (!GetContext()) | 553 if (!GetContext()) |
| 548 return; | 554 return; |
| 549 | 555 |
| 550 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); | 556 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); |
| 551 if (!handle) { | 557 if (!handle) { |
| 552 BadMessageReceived(); | 558 bad_message::ReceivedBadMessage(this, bad_message::SWDH_POST_MESSAGE); |
| 553 return; | 559 return; |
| 554 } | 560 } |
| 555 | 561 |
| 556 handle->version()->DispatchMessageEvent( | 562 handle->version()->DispatchMessageEvent( |
| 557 message, sent_message_ports, | 563 message, sent_message_ports, |
| 558 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 564 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 559 } | 565 } |
| 560 | 566 |
| 561 void ServiceWorkerDispatcherHost::OnProviderCreated( | 567 void ServiceWorkerDispatcherHost::OnProviderCreated( |
| 562 int provider_id, | 568 int provider_id, |
| 563 int render_frame_id, | 569 int render_frame_id, |
| 564 ServiceWorkerProviderType provider_type) { | 570 ServiceWorkerProviderType provider_type) { |
| 565 // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed. | 571 // TODO(pkasting): Remove ScopedTracker below once crbug.com/477117 is fixed. |
| 566 tracked_objects::ScopedTracker tracking_profile( | 572 tracked_objects::ScopedTracker tracking_profile( |
| 567 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 573 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 568 "477117 ServiceWorkerDispatcherHost::OnProviderCreated")); | 574 "477117 ServiceWorkerDispatcherHost::OnProviderCreated")); |
| 569 TRACE_EVENT0("ServiceWorker", | 575 TRACE_EVENT0("ServiceWorker", |
| 570 "ServiceWorkerDispatcherHost::OnProviderCreated"); | 576 "ServiceWorkerDispatcherHost::OnProviderCreated"); |
| 571 if (!GetContext()) | 577 if (!GetContext()) |
| 572 return; | 578 return; |
| 573 if (GetContext()->GetProviderHost(render_process_id_, provider_id)) { | 579 if (GetContext()->GetProviderHost(render_process_id_, provider_id)) { |
| 574 BadMessageReceived(); | 580 bad_message::ReceivedBadMessage(this, |
| 581 bad_message::SWDH_PROVIDER_CREATED_NO_HOST); |
| 575 return; | 582 return; |
| 576 } | 583 } |
| 577 scoped_ptr<ServiceWorkerProviderHost> provider_host( | 584 scoped_ptr<ServiceWorkerProviderHost> provider_host( |
| 578 new ServiceWorkerProviderHost(render_process_id_, | 585 new ServiceWorkerProviderHost(render_process_id_, |
| 579 render_frame_id, | 586 render_frame_id, |
| 580 provider_id, | 587 provider_id, |
| 581 provider_type, | 588 provider_type, |
| 582 GetContext()->AsWeakPtr(), | 589 GetContext()->AsWeakPtr(), |
| 583 this)); | 590 this)); |
| 584 GetContext()->AddProviderHost(provider_host.Pass()); | 591 GetContext()->AddProviderHost(provider_host.Pass()); |
| 585 } | 592 } |
| 586 | 593 |
| 587 void ServiceWorkerDispatcherHost::OnProviderDestroyed(int provider_id) { | 594 void ServiceWorkerDispatcherHost::OnProviderDestroyed(int provider_id) { |
| 588 TRACE_EVENT0("ServiceWorker", | 595 TRACE_EVENT0("ServiceWorker", |
| 589 "ServiceWorkerDispatcherHost::OnProviderDestroyed"); | 596 "ServiceWorkerDispatcherHost::OnProviderDestroyed"); |
| 590 if (!GetContext()) | 597 if (!GetContext()) |
| 591 return; | 598 return; |
| 592 if (!GetContext()->GetProviderHost(render_process_id_, provider_id)) { | 599 if (!GetContext()->GetProviderHost(render_process_id_, provider_id)) { |
| 593 BadMessageReceived(); | 600 bad_message::ReceivedBadMessage( |
| 601 this, bad_message::SWDH_PROVIDER_DESTROYED_NO_HOST); |
| 594 return; | 602 return; |
| 595 } | 603 } |
| 596 GetContext()->RemoveProviderHost(render_process_id_, provider_id); | 604 GetContext()->RemoveProviderHost(render_process_id_, provider_id); |
| 597 } | 605 } |
| 598 | 606 |
| 599 void ServiceWorkerDispatcherHost::OnSetHostedVersionId( | 607 void ServiceWorkerDispatcherHost::OnSetHostedVersionId( |
| 600 int provider_id, int64 version_id) { | 608 int provider_id, int64 version_id) { |
| 601 TRACE_EVENT0("ServiceWorker", | 609 TRACE_EVENT0("ServiceWorker", |
| 602 "ServiceWorkerDispatcherHost::OnSetHostedVersionId"); | 610 "ServiceWorkerDispatcherHost::OnSetHostedVersionId"); |
| 603 if (!GetContext()) | 611 if (!GetContext()) |
| 604 return; | 612 return; |
| 605 ServiceWorkerProviderHost* provider_host = | 613 ServiceWorkerProviderHost* provider_host = |
| 606 GetContext()->GetProviderHost(render_process_id_, provider_id); | 614 GetContext()->GetProviderHost(render_process_id_, provider_id); |
| 607 if (!provider_host) { | 615 if (!provider_host) { |
| 608 BadMessageReceived(); | 616 bad_message::ReceivedBadMessage( |
| 617 this, bad_message::SWDH_SET_HOSTED_VERSION_NO_HOST); |
| 609 return; | 618 return; |
| 610 } | 619 } |
| 611 if (!provider_host->IsContextAlive()) | 620 if (!provider_host->IsContextAlive()) |
| 612 return; | 621 return; |
| 613 if (!provider_host->SetHostedVersionId(version_id)) | 622 if (!provider_host->SetHostedVersionId(version_id)) |
| 614 BadMessageReceived(); | 623 bad_message::ReceivedBadMessage(this, bad_message::SWDH_SET_HOSTED_VERSION); |
| 615 | 624 |
| 616 ServiceWorkerVersion* version = GetContext()->GetLiveVersion(version_id); | 625 ServiceWorkerVersion* version = GetContext()->GetLiveVersion(version_id); |
| 617 if (!version) | 626 if (!version) |
| 618 return; | 627 return; |
| 619 | 628 |
| 620 // Retrieve the registration associated with |version|. The registration | 629 // Retrieve the registration associated with |version|. The registration |
| 621 // must be alive because the version keeps it during starting worker. | 630 // must be alive because the version keeps it during starting worker. |
| 622 ServiceWorkerRegistration* registration = | 631 ServiceWorkerRegistration* registration = |
| 623 GetContext()->GetLiveRegistration(version->registration_id()); | 632 GetContext()->GetLiveRegistration(version->registration_id()); |
| 624 DCHECK(registration); | 633 DCHECK(registration); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 729 int thread_id, | 738 int thread_id, |
| 730 int provider_id) { | 739 int provider_id) { |
| 731 TRACE_EVENT0("ServiceWorker", | 740 TRACE_EVENT0("ServiceWorker", |
| 732 "ServiceWorkerDispatcherHost::OnWorkerScriptLoaded"); | 741 "ServiceWorkerDispatcherHost::OnWorkerScriptLoaded"); |
| 733 if (!GetContext()) | 742 if (!GetContext()) |
| 734 return; | 743 return; |
| 735 | 744 |
| 736 ServiceWorkerProviderHost* provider_host = | 745 ServiceWorkerProviderHost* provider_host = |
| 737 GetContext()->GetProviderHost(render_process_id_, provider_id); | 746 GetContext()->GetProviderHost(render_process_id_, provider_id); |
| 738 if (!provider_host) { | 747 if (!provider_host) { |
| 739 BadMessageReceived(); | 748 bad_message::ReceivedBadMessage( |
| 749 this, bad_message::SWDH_WORKER_SCRIPT_LOAD_NO_HOST); |
| 740 return; | 750 return; |
| 741 } | 751 } |
| 742 | 752 |
| 743 provider_host->SetReadyToSendMessagesToWorker(thread_id); | 753 provider_host->SetReadyToSendMessagesToWorker(thread_id); |
| 744 | 754 |
| 745 EmbeddedWorkerRegistry* registry = GetContext()->embedded_worker_registry(); | 755 EmbeddedWorkerRegistry* registry = GetContext()->embedded_worker_registry(); |
| 746 if (!registry->CanHandle(embedded_worker_id)) | 756 if (!registry->CanHandle(embedded_worker_id)) |
| 747 return; | 757 return; |
| 748 registry->OnWorkerScriptLoaded( | 758 registry->OnWorkerScriptLoaded( |
| 749 render_process_id_, thread_id, embedded_worker_id); | 759 render_process_id_, thread_id, embedded_worker_id); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 844 params.line_number, | 854 params.line_number, |
| 845 params.source_url); | 855 params.source_url); |
| 846 } | 856 } |
| 847 | 857 |
| 848 void ServiceWorkerDispatcherHost::OnIncrementServiceWorkerRefCount( | 858 void ServiceWorkerDispatcherHost::OnIncrementServiceWorkerRefCount( |
| 849 int handle_id) { | 859 int handle_id) { |
| 850 TRACE_EVENT0("ServiceWorker", | 860 TRACE_EVENT0("ServiceWorker", |
| 851 "ServiceWorkerDispatcherHost::OnIncrementServiceWorkerRefCount"); | 861 "ServiceWorkerDispatcherHost::OnIncrementServiceWorkerRefCount"); |
| 852 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); | 862 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); |
| 853 if (!handle) { | 863 if (!handle) { |
| 854 BadMessageReceived(); | 864 bad_message::ReceivedBadMessage( |
| 865 this, bad_message::SWDH_INCREMENT_WORKER_BAD_HANDLE); |
| 855 return; | 866 return; |
| 856 } | 867 } |
| 857 handle->IncrementRefCount(); | 868 handle->IncrementRefCount(); |
| 858 } | 869 } |
| 859 | 870 |
| 860 void ServiceWorkerDispatcherHost::OnDecrementServiceWorkerRefCount( | 871 void ServiceWorkerDispatcherHost::OnDecrementServiceWorkerRefCount( |
| 861 int handle_id) { | 872 int handle_id) { |
| 862 TRACE_EVENT0("ServiceWorker", | 873 TRACE_EVENT0("ServiceWorker", |
| 863 "ServiceWorkerDispatcherHost::OnDecrementServiceWorkerRefCount"); | 874 "ServiceWorkerDispatcherHost::OnDecrementServiceWorkerRefCount"); |
| 864 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); | 875 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); |
| 865 if (!handle) { | 876 if (!handle) { |
| 866 BadMessageReceived(); | 877 bad_message::ReceivedBadMessage( |
| 878 this, bad_message::SWDH_DECREMENT_WORKER_BAD_HANDLE); |
| 867 return; | 879 return; |
| 868 } | 880 } |
| 869 handle->DecrementRefCount(); | 881 handle->DecrementRefCount(); |
| 870 if (handle->HasNoRefCount()) | 882 if (handle->HasNoRefCount()) |
| 871 handles_.Remove(handle_id); | 883 handles_.Remove(handle_id); |
| 872 } | 884 } |
| 873 | 885 |
| 874 void ServiceWorkerDispatcherHost::OnIncrementRegistrationRefCount( | 886 void ServiceWorkerDispatcherHost::OnIncrementRegistrationRefCount( |
| 875 int registration_handle_id) { | 887 int registration_handle_id) { |
| 876 TRACE_EVENT0("ServiceWorker", | 888 TRACE_EVENT0("ServiceWorker", |
| 877 "ServiceWorkerDispatcherHost::OnIncrementRegistrationRefCount"); | 889 "ServiceWorkerDispatcherHost::OnIncrementRegistrationRefCount"); |
| 878 ServiceWorkerRegistrationHandle* handle = | 890 ServiceWorkerRegistrationHandle* handle = |
| 879 registration_handles_.Lookup(registration_handle_id); | 891 registration_handles_.Lookup(registration_handle_id); |
| 880 if (!handle) { | 892 if (!handle) { |
| 881 BadMessageReceived(); | 893 bad_message::ReceivedBadMessage( |
| 894 this, bad_message::SWDH_INCREMENT_REGISTRATION_BAD_HANDLE); |
| 882 return; | 895 return; |
| 883 } | 896 } |
| 884 handle->IncrementRefCount(); | 897 handle->IncrementRefCount(); |
| 885 } | 898 } |
| 886 | 899 |
| 887 void ServiceWorkerDispatcherHost::OnDecrementRegistrationRefCount( | 900 void ServiceWorkerDispatcherHost::OnDecrementRegistrationRefCount( |
| 888 int registration_handle_id) { | 901 int registration_handle_id) { |
| 889 TRACE_EVENT0("ServiceWorker", | 902 TRACE_EVENT0("ServiceWorker", |
| 890 "ServiceWorkerDispatcherHost::OnDecrementRegistrationRefCount"); | 903 "ServiceWorkerDispatcherHost::OnDecrementRegistrationRefCount"); |
| 891 ServiceWorkerRegistrationHandle* handle = | 904 ServiceWorkerRegistrationHandle* handle = |
| 892 registration_handles_.Lookup(registration_handle_id); | 905 registration_handles_.Lookup(registration_handle_id); |
| 893 if (!handle) { | 906 if (!handle) { |
| 894 BadMessageReceived(); | 907 bad_message::ReceivedBadMessage( |
| 908 this, bad_message::SWDH_DECREMENT_REGISTRATION_BAD_HANDLE); |
| 895 return; | 909 return; |
| 896 } | 910 } |
| 897 handle->DecrementRefCount(); | 911 handle->DecrementRefCount(); |
| 898 if (handle->HasNoRefCount()) | 912 if (handle->HasNoRefCount()) |
| 899 registration_handles_.Remove(registration_handle_id); | 913 registration_handles_.Remove(registration_handle_id); |
| 900 } | 914 } |
| 901 | 915 |
| 902 void ServiceWorkerDispatcherHost::UnregistrationComplete( | 916 void ServiceWorkerDispatcherHost::UnregistrationComplete( |
| 903 int thread_id, | 917 int thread_id, |
| 904 int request_id, | 918 int request_id, |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1025 | 1039 |
| 1026 ServiceWorkerContextCore* ServiceWorkerDispatcherHost::GetContext() { | 1040 ServiceWorkerContextCore* ServiceWorkerDispatcherHost::GetContext() { |
| 1027 if (!context_wrapper_.get()) | 1041 if (!context_wrapper_.get()) |
| 1028 return nullptr; | 1042 return nullptr; |
| 1029 return context_wrapper_->context(); | 1043 return context_wrapper_->context(); |
| 1030 } | 1044 } |
| 1031 | 1045 |
| 1032 void ServiceWorkerDispatcherHost::OnTerminateWorker(int handle_id) { | 1046 void ServiceWorkerDispatcherHost::OnTerminateWorker(int handle_id) { |
| 1033 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); | 1047 ServiceWorkerHandle* handle = handles_.Lookup(handle_id); |
| 1034 if (!handle) { | 1048 if (!handle) { |
| 1035 BadMessageReceived(); | 1049 bad_message::ReceivedBadMessage(this, |
| 1050 bad_message::SWDH_TERMINATE_BAD_HANDLE); |
| 1036 return; | 1051 return; |
| 1037 } | 1052 } |
| 1038 handle->version()->StopWorker( | 1053 handle->version()->StopWorker( |
| 1039 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); | 1054 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| 1040 } | 1055 } |
| 1041 | 1056 |
| 1042 } // namespace content | 1057 } // namespace content |
| OLD | NEW |