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 527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
538 // TODO(kinuko): Record other event statuses too. | 538 // TODO(kinuko): Record other event statuses too. |
539 metrics_->RecordEventHandledStatus(request->event_type, was_handled); | 539 metrics_->RecordEventHandledStatus(request->event_type, was_handled); |
540 ServiceWorkerMetrics::RecordEventDuration( | 540 ServiceWorkerMetrics::RecordEventDuration( |
541 request->event_type, base::TimeTicks::Now() - request->start_time, | 541 request->event_type, base::TimeTicks::Now() - request->start_time, |
542 was_handled); | 542 was_handled); |
543 | 543 |
544 RestartTick(&idle_time_); | 544 RestartTick(&idle_time_); |
545 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", | 545 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", |
546 request, "Handled", was_handled); | 546 request, "Handled", was_handled); |
547 pending_requests_.Remove(request_id); | 547 pending_requests_.Remove(request_id); |
| 548 if (!HasWork()) |
| 549 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); |
| 550 |
548 return true; | 551 return true; |
549 } | 552 } |
550 | 553 |
551 void ServiceWorkerVersion::RunAfterStartWorker( | 554 void ServiceWorkerVersion::RunAfterStartWorker( |
552 ServiceWorkerMetrics::EventType purpose, | 555 ServiceWorkerMetrics::EventType purpose, |
553 const base::Closure& task, | 556 const base::Closure& task, |
554 const StatusCallback& error_callback) { | 557 const StatusCallback& error_callback) { |
555 if (running_status() == EmbeddedWorkerStatus::RUNNING) { | 558 if (running_status() == EmbeddedWorkerStatus::RUNNING) { |
556 DCHECK(start_callbacks_.empty()); | 559 DCHECK(start_callbacks_.empty()); |
557 task.Run(); | 560 task.Run(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 OnControlleeAdded(this, provider_host)); | 597 OnControlleeAdded(this, provider_host)); |
595 } | 598 } |
596 | 599 |
597 void ServiceWorkerVersion::RemoveControllee( | 600 void ServiceWorkerVersion::RemoveControllee( |
598 ServiceWorkerProviderHost* provider_host) { | 601 ServiceWorkerProviderHost* provider_host) { |
599 const std::string& uuid = provider_host->client_uuid(); | 602 const std::string& uuid = provider_host->client_uuid(); |
600 DCHECK(ContainsKey(controllee_map_, uuid)); | 603 DCHECK(ContainsKey(controllee_map_, uuid)); |
601 controllee_map_.erase(uuid); | 604 controllee_map_.erase(uuid); |
602 FOR_EACH_OBSERVER(Listener, listeners_, | 605 FOR_EACH_OBSERVER(Listener, listeners_, |
603 OnControlleeRemoved(this, provider_host)); | 606 OnControlleeRemoved(this, provider_host)); |
604 if (HasControllee()) | 607 if (!HasControllee()) |
605 return; | 608 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this)); |
606 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this)); | |
607 } | 609 } |
608 | 610 |
609 void ServiceWorkerVersion::AddStreamingURLRequestJob( | 611 void ServiceWorkerVersion::AddStreamingURLRequestJob( |
610 const ServiceWorkerURLRequestJob* request_job) { | 612 const ServiceWorkerURLRequestJob* request_job) { |
611 DCHECK(streaming_url_request_jobs_.find(request_job) == | 613 DCHECK(streaming_url_request_jobs_.find(request_job) == |
612 streaming_url_request_jobs_.end()); | 614 streaming_url_request_jobs_.end()); |
613 streaming_url_request_jobs_.insert(request_job); | 615 streaming_url_request_jobs_.insert(request_job); |
614 } | 616 } |
615 | 617 |
616 void ServiceWorkerVersion::RemoveStreamingURLRequestJob( | 618 void ServiceWorkerVersion::RemoveStreamingURLRequestJob( |
617 const ServiceWorkerURLRequestJob* request_job) { | 619 const ServiceWorkerURLRequestJob* request_job) { |
618 streaming_url_request_jobs_.erase(request_job); | 620 streaming_url_request_jobs_.erase(request_job); |
| 621 if (!HasWork()) |
| 622 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); |
619 } | 623 } |
620 | 624 |
621 void ServiceWorkerVersion::AddListener(Listener* listener) { | 625 void ServiceWorkerVersion::AddListener(Listener* listener) { |
622 listeners_.AddObserver(listener); | 626 listeners_.AddObserver(listener); |
623 } | 627 } |
624 | 628 |
625 void ServiceWorkerVersion::RemoveListener(Listener* listener) { | 629 void ServiceWorkerVersion::RemoveListener(Listener* listener) { |
626 listeners_.RemoveObserver(listener); | 630 listeners_.RemoveObserver(listener); |
627 } | 631 } |
628 | 632 |
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1507 void ServiceWorkerVersion::OnPingTimeout() { | 1511 void ServiceWorkerVersion::OnPingTimeout() { |
1508 DCHECK(running_status() == EmbeddedWorkerStatus::STARTING || | 1512 DCHECK(running_status() == EmbeddedWorkerStatus::STARTING || |
1509 running_status() == EmbeddedWorkerStatus::RUNNING); | 1513 running_status() == EmbeddedWorkerStatus::RUNNING); |
1510 // TODO(falken): Show a message to the developer that the SW was stopped due | 1514 // TODO(falken): Show a message to the developer that the SW was stopped due |
1511 // to timeout (crbug.com/457968). Also, change the error code to | 1515 // to timeout (crbug.com/457968). Also, change the error code to |
1512 // SERVICE_WORKER_ERROR_TIMEOUT. | 1516 // SERVICE_WORKER_ERROR_TIMEOUT. |
1513 StopWorkerIfIdle(); | 1517 StopWorkerIfIdle(); |
1514 } | 1518 } |
1515 | 1519 |
1516 void ServiceWorkerVersion::StopWorkerIfIdle() { | 1520 void ServiceWorkerVersion::StopWorkerIfIdle() { |
1517 if (HasInflightRequests() && !ping_controller_->IsTimedOut()) | 1521 if (HasWork() && !ping_controller_->IsTimedOut()) |
1518 return; | 1522 return; |
1519 if (running_status() == EmbeddedWorkerStatus::STOPPED || | 1523 if (running_status() == EmbeddedWorkerStatus::STOPPED || |
1520 running_status() == EmbeddedWorkerStatus::STOPPING || | 1524 running_status() == EmbeddedWorkerStatus::STOPPING || |
1521 !stop_callbacks_.empty()) { | 1525 !stop_callbacks_.empty()) { |
1522 return; | 1526 return; |
1523 } | 1527 } |
1524 | 1528 |
1525 embedded_worker_->StopIfIdle(); | 1529 embedded_worker_->StopIfIdle(); |
1526 } | 1530 } |
1527 | 1531 |
1528 bool ServiceWorkerVersion::HasInflightRequests() const { | 1532 bool ServiceWorkerVersion::HasWork() const { |
1529 return !pending_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); | 1533 return !pending_requests_.IsEmpty() || !streaming_url_request_jobs_.empty() || |
| 1534 !start_callbacks_.empty(); |
1530 } | 1535 } |
1531 | 1536 |
1532 void ServiceWorkerVersion::RecordStartWorkerResult( | 1537 void ServiceWorkerVersion::RecordStartWorkerResult( |
1533 ServiceWorkerMetrics::EventType purpose, | 1538 ServiceWorkerMetrics::EventType purpose, |
1534 Status prestart_status, | 1539 Status prestart_status, |
1535 int trace_id, | 1540 int trace_id, |
1536 bool is_browser_startup_complete, | 1541 bool is_browser_startup_complete, |
1537 ServiceWorkerStatusCode status) { | 1542 ServiceWorkerStatusCode status) { |
1538 if (trace_id != kInvalidTraceId) { | 1543 if (trace_id != kInvalidTraceId) { |
1539 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::StartWorker", | 1544 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::StartWorker", |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1709 pending_requests_.Clear(); | 1714 pending_requests_.Clear(); |
1710 | 1715 |
1711 // Close all mojo services. This will also fire and clear all callbacks | 1716 // Close all mojo services. This will also fire and clear all callbacks |
1712 // for messages that are still outstanding for those services. | 1717 // for messages that are still outstanding for those services. |
1713 mojo_services_.clear(); | 1718 mojo_services_.clear(); |
1714 | 1719 |
1715 // TODO(falken): Call SWURLRequestJob::ClearStream here? | 1720 // TODO(falken): Call SWURLRequestJob::ClearStream here? |
1716 streaming_url_request_jobs_.clear(); | 1721 streaming_url_request_jobs_.clear(); |
1717 | 1722 |
1718 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 1723 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
1719 | |
1720 if (should_restart) | 1724 if (should_restart) |
1721 StartWorkerInternal(); | 1725 StartWorkerInternal(); |
| 1726 else if (!HasWork()) |
| 1727 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); |
1722 } | 1728 } |
1723 | 1729 |
1724 void ServiceWorkerVersion::OnMojoConnectionError(const char* service_name) { | 1730 void ServiceWorkerVersion::OnMojoConnectionError(const char* service_name) { |
1725 // Simply deleting the service will cause error callbacks to be called from | 1731 // Simply deleting the service will cause error callbacks to be called from |
1726 // the destructor of the MojoServiceWrapper instance. | 1732 // the destructor of the MojoServiceWrapper instance. |
1727 mojo_services_.erase(service_name); | 1733 mojo_services_.erase(service_name); |
1728 } | 1734 } |
1729 | 1735 |
1730 void ServiceWorkerVersion::OnBeginEvent() { | 1736 void ServiceWorkerVersion::OnBeginEvent() { |
1731 if (should_exclude_from_uma_ || | 1737 if (should_exclude_from_uma_ || |
1732 running_status() != EmbeddedWorkerStatus::RUNNING || | 1738 running_status() != EmbeddedWorkerStatus::RUNNING || |
1733 idle_time_.is_null()) { | 1739 idle_time_.is_null()) { |
1734 return; | 1740 return; |
1735 } | 1741 } |
1736 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1742 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
1737 idle_time_); | 1743 idle_time_); |
1738 } | 1744 } |
1739 | 1745 |
1740 } // namespace content | 1746 } // namespace content |
OLD | NEW |