| 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_version.h" | 5 #include "content/browser/service_worker/service_worker_version.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 // We've tried to start the worker (and it has succeeded), but | 107 // We've tried to start the worker (and it has succeeded), but |
| 108 // it looks it's not running yet. | 108 // it looks it's not running yet. |
| 109 NOTREACHED() << "The worker's not running after successful StartWorker"; | 109 NOTREACHED() << "The worker's not running after successful StartWorker"; |
| 110 if (!error_callback.is_null()) | 110 if (!error_callback.is_null()) |
| 111 error_callback.Run(SERVICE_WORKER_ERROR_START_WORKER_FAILED); | 111 error_callback.Run(SERVICE_WORKER_ERROR_START_WORKER_FAILED); |
| 112 return; | 112 return; |
| 113 } | 113 } |
| 114 task.Run(); | 114 task.Run(); |
| 115 } | 115 } |
| 116 | 116 |
| 117 void RunErrorMessageCallback( | |
| 118 const std::vector<TransferredMessagePort>& sent_message_ports, | |
| 119 const ServiceWorkerVersion::StatusCallback& callback, | |
| 120 ServiceWorkerStatusCode status) { | |
| 121 // Transfering the message ports failed, so destroy the ports. | |
| 122 for (const TransferredMessagePort& port : sent_message_ports) { | |
| 123 MessagePortService::GetInstance()->ClosePort(port.id); | |
| 124 } | |
| 125 callback.Run(status); | |
| 126 } | |
| 127 | |
| 128 void KillEmbeddedWorkerProcess(int process_id, ResultCode code) { | 117 void KillEmbeddedWorkerProcess(int process_id, ResultCode code) { |
| 129 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 118 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 130 RenderProcessHost* render_process_host = | 119 RenderProcessHost* render_process_host = |
| 131 RenderProcessHost::FromID(process_id); | 120 RenderProcessHost::FromID(process_id); |
| 132 if (render_process_host->GetHandle() != base::kNullProcessHandle) { | 121 if (render_process_host->GetHandle() != base::kNullProcessHandle) { |
| 133 bad_message::ReceivedBadMessage(render_process_host, | 122 bad_message::ReceivedBadMessage(render_process_host, |
| 134 bad_message::SERVICE_WORKER_BAD_URL); | 123 bad_message::SERVICE_WORKER_BAD_URL); |
| 135 } | 124 } |
| 136 } | 125 } |
| 137 | 126 |
| (...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 if (running_status() == RUNNING) { | 543 if (running_status() == RUNNING) { |
| 555 DCHECK(start_callbacks_.empty()); | 544 DCHECK(start_callbacks_.empty()); |
| 556 task.Run(); | 545 task.Run(); |
| 557 return; | 546 return; |
| 558 } | 547 } |
| 559 StartWorker(purpose, | 548 StartWorker(purpose, |
| 560 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | 549 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
| 561 error_callback, task)); | 550 error_callback, task)); |
| 562 } | 551 } |
| 563 | 552 |
| 564 void ServiceWorkerVersion::DispatchMessageEvent( | |
| 565 const base::string16& message, | |
| 566 const std::vector<TransferredMessagePort>& sent_message_ports, | |
| 567 const StatusCallback& callback) { | |
| 568 for (const TransferredMessagePort& port : sent_message_ports) { | |
| 569 MessagePortService::GetInstance()->HoldMessages(port.id); | |
| 570 } | |
| 571 | |
| 572 DispatchMessageEventInternal(message, sent_message_ports, callback); | |
| 573 } | |
| 574 | |
| 575 void ServiceWorkerVersion::DispatchMessageEventInternal( | |
| 576 const base::string16& message, | |
| 577 const std::vector<TransferredMessagePort>& sent_message_ports, | |
| 578 const StatusCallback& callback) { | |
| 579 OnBeginEvent(); | |
| 580 if (running_status() != RUNNING) { | |
| 581 // Schedule calling this method after starting the worker. | |
| 582 StartWorker(ServiceWorkerMetrics::EventType::MESSAGE, | |
| 583 base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), | |
| 584 base::Bind(&RunErrorMessageCallback, | |
| 585 sent_message_ports, callback), | |
| 586 base::Bind(&self::DispatchMessageEventInternal, | |
| 587 weak_factory_.GetWeakPtr(), message, | |
| 588 sent_message_ports, callback))); | |
| 589 return; | |
| 590 } | |
| 591 | |
| 592 // TODO(kinuko): Cleanup this (and corresponding unit test) when message | |
| 593 // event becomes extendable, round-trip event. (crbug.com/498596) | |
| 594 RestartTick(&idle_time_); | |
| 595 | |
| 596 MessagePortMessageFilter* filter = | |
| 597 embedded_worker_->message_port_message_filter(); | |
| 598 std::vector<int> new_routing_ids; | |
| 599 filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); | |
| 600 ServiceWorkerStatusCode status = | |
| 601 embedded_worker_->SendMessage(ServiceWorkerMsg_MessageToWorker( | |
| 602 message, sent_message_ports, new_routing_ids)); | |
| 603 RunSoon(base::Bind(callback, status)); | |
| 604 } | |
| 605 | |
| 606 void ServiceWorkerVersion::AddControllee( | 553 void ServiceWorkerVersion::AddControllee( |
| 607 ServiceWorkerProviderHost* provider_host) { | 554 ServiceWorkerProviderHost* provider_host) { |
| 608 const std::string& uuid = provider_host->client_uuid(); | 555 const std::string& uuid = provider_host->client_uuid(); |
| 609 CHECK(!provider_host->client_uuid().empty()); | 556 CHECK(!provider_host->client_uuid().empty()); |
| 610 DCHECK(!ContainsKey(controllee_map_, uuid)); | 557 DCHECK(!ContainsKey(controllee_map_, uuid)); |
| 611 controllee_map_[uuid] = provider_host; | 558 controllee_map_[uuid] = provider_host; |
| 612 // Keep the worker alive a bit longer right after a new controllee is added. | 559 // Keep the worker alive a bit longer right after a new controllee is added. |
| 613 RestartTick(&idle_time_); | 560 RestartTick(&idle_time_); |
| 614 FOR_EACH_OBSERVER(Listener, listeners_, | 561 FOR_EACH_OBSERVER(Listener, listeners_, |
| 615 OnControlleeAdded(this, provider_host)); | 562 OnControlleeAdded(this, provider_host)); |
| (...skipping 1114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1730 void ServiceWorkerVersion::OnBeginEvent() { | 1677 void ServiceWorkerVersion::OnBeginEvent() { |
| 1731 if (should_exclude_from_uma_ || running_status() != RUNNING || | 1678 if (should_exclude_from_uma_ || running_status() != RUNNING || |
| 1732 idle_time_.is_null()) { | 1679 idle_time_.is_null()) { |
| 1733 return; | 1680 return; |
| 1734 } | 1681 } |
| 1735 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1682 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
| 1736 idle_time_); | 1683 idle_time_); |
| 1737 } | 1684 } |
| 1738 | 1685 |
| 1739 } // namespace content | 1686 } // namespace content |
| OLD | NEW |