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 |