| 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 custom_requests_.Remove(request_id); | 547 custom_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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 595 OnControlleeAdded(this, provider_host)); | 598 OnControlleeAdded(this, provider_host)); |
| 596 } | 599 } |
| 597 | 600 |
| 598 void ServiceWorkerVersion::RemoveControllee( | 601 void ServiceWorkerVersion::RemoveControllee( |
| 599 ServiceWorkerProviderHost* provider_host) { | 602 ServiceWorkerProviderHost* provider_host) { |
| 600 const std::string& uuid = provider_host->client_uuid(); | 603 const std::string& uuid = provider_host->client_uuid(); |
| 601 DCHECK(ContainsKey(controllee_map_, uuid)); | 604 DCHECK(ContainsKey(controllee_map_, uuid)); |
| 602 controllee_map_.erase(uuid); | 605 controllee_map_.erase(uuid); |
| 603 FOR_EACH_OBSERVER(Listener, listeners_, | 606 FOR_EACH_OBSERVER(Listener, listeners_, |
| 604 OnControlleeRemoved(this, provider_host)); | 607 OnControlleeRemoved(this, provider_host)); |
| 605 if (HasControllee()) | 608 if (!HasControllee()) |
| 606 return; | 609 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this)); |
| 607 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this)); | |
| 608 } | 610 } |
| 609 | 611 |
| 610 void ServiceWorkerVersion::AddStreamingURLRequestJob( | 612 void ServiceWorkerVersion::AddStreamingURLRequestJob( |
| 611 const ServiceWorkerURLRequestJob* request_job) { | 613 const ServiceWorkerURLRequestJob* request_job) { |
| 612 DCHECK(streaming_url_request_jobs_.find(request_job) == | 614 DCHECK(streaming_url_request_jobs_.find(request_job) == |
| 613 streaming_url_request_jobs_.end()); | 615 streaming_url_request_jobs_.end()); |
| 614 streaming_url_request_jobs_.insert(request_job); | 616 streaming_url_request_jobs_.insert(request_job); |
| 615 } | 617 } |
| 616 | 618 |
| 617 void ServiceWorkerVersion::RemoveStreamingURLRequestJob( | 619 void ServiceWorkerVersion::RemoveStreamingURLRequestJob( |
| 618 const ServiceWorkerURLRequestJob* request_job) { | 620 const ServiceWorkerURLRequestJob* request_job) { |
| 619 streaming_url_request_jobs_.erase(request_job); | 621 streaming_url_request_jobs_.erase(request_job); |
| 622 if (!HasWork()) |
| 623 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); |
| 620 } | 624 } |
| 621 | 625 |
| 622 void ServiceWorkerVersion::AddListener(Listener* listener) { | 626 void ServiceWorkerVersion::AddListener(Listener* listener) { |
| 623 listeners_.AddObserver(listener); | 627 listeners_.AddObserver(listener); |
| 624 } | 628 } |
| 625 | 629 |
| 626 void ServiceWorkerVersion::RemoveListener(Listener* listener) { | 630 void ServiceWorkerVersion::RemoveListener(Listener* listener) { |
| 627 listeners_.RemoveObserver(listener); | 631 listeners_.RemoveObserver(listener); |
| 628 } | 632 } |
| 629 | 633 |
| (...skipping 877 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 !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); | 1533 return !custom_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 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1710 custom_requests_.Clear(); | 1715 custom_requests_.Clear(); |
| 1711 | 1716 |
| 1712 // Close all mojo services. This will also fire and clear all callbacks | 1717 // Close all mojo services. This will also fire and clear all callbacks |
| 1713 // for messages that are still outstanding for those services. | 1718 // for messages that are still outstanding for those services. |
| 1714 mojo_services_.clear(); | 1719 mojo_services_.clear(); |
| 1715 | 1720 |
| 1716 // TODO(falken): Call SWURLRequestJob::ClearStream here? | 1721 // TODO(falken): Call SWURLRequestJob::ClearStream here? |
| 1717 streaming_url_request_jobs_.clear(); | 1722 streaming_url_request_jobs_.clear(); |
| 1718 | 1723 |
| 1719 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 1724 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
| 1720 | |
| 1721 if (should_restart) | 1725 if (should_restart) |
| 1722 StartWorkerInternal(); | 1726 StartWorkerInternal(); |
| 1727 else if (!HasWork()) |
| 1728 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); |
| 1723 } | 1729 } |
| 1724 | 1730 |
| 1725 void ServiceWorkerVersion::OnMojoConnectionError(const char* service_name) { | 1731 void ServiceWorkerVersion::OnMojoConnectionError(const char* service_name) { |
| 1726 // Simply deleting the service will cause error callbacks to be called from | 1732 // Simply deleting the service will cause error callbacks to be called from |
| 1727 // the destructor of the MojoServiceWrapper instance. | 1733 // the destructor of the MojoServiceWrapper instance. |
| 1728 mojo_services_.erase(service_name); | 1734 mojo_services_.erase(service_name); |
| 1729 } | 1735 } |
| 1730 | 1736 |
| 1731 void ServiceWorkerVersion::OnBeginEvent() { | 1737 void ServiceWorkerVersion::OnBeginEvent() { |
| 1732 if (should_exclude_from_uma_ || | 1738 if (should_exclude_from_uma_ || |
| 1733 running_status() != EmbeddedWorkerStatus::RUNNING || | 1739 running_status() != EmbeddedWorkerStatus::RUNNING || |
| 1734 idle_time_.is_null()) { | 1740 idle_time_.is_null()) { |
| 1735 return; | 1741 return; |
| 1736 } | 1742 } |
| 1737 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1743 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
| 1738 idle_time_); | 1744 idle_time_); |
| 1739 } | 1745 } |
| 1740 | 1746 |
| 1741 } // namespace content | 1747 } // namespace content |
| OLD | NEW |