Chromium Code Reviews| 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 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 557 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", "ServiceWorkerVersion::Request", | 557 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", "ServiceWorkerVersion::Request", |
| 558 pending_requests_.Lookup(request_id), "Request id", | 558 pending_requests_.Lookup(request_id), "Request id", |
| 559 request_id, "Event type", | 559 request_id, "Event type", |
| 560 ServiceWorkerMetrics::EventTypeToString(event_type)); | 560 ServiceWorkerMetrics::EventTypeToString(event_type)); |
| 561 base::TimeTicks expiration_time = base::TimeTicks::Now() + timeout; | 561 base::TimeTicks expiration_time = base::TimeTicks::Now() + timeout; |
| 562 timeout_queue_.push( | 562 timeout_queue_.push( |
| 563 RequestInfo(request_id, event_type, expiration_time, timeout_behavior)); | 563 RequestInfo(request_id, event_type, expiration_time, timeout_behavior)); |
| 564 return request_id; | 564 return request_id; |
| 565 } | 565 } |
| 566 | 566 |
| 567 bool ServiceWorkerVersion::StartExternalRequest( | |
| 568 const std::string& request_uuid) { | |
| 569 // It's possible that the renderer is lying or the version started stopping | |
| 570 // right around the time of the IPC. | |
| 571 if (running_status() != EmbeddedWorkerStatus::RUNNING) | |
| 572 return false; | |
| 573 | |
| 574 int request_id = | |
| 575 StartRequest(ServiceWorkerMetrics::EventType::EXTERNAL_REQUEST, | |
| 576 base::Bind(&ServiceWorkerVersion::CleanUpExternalRequest, | |
| 577 this, request_uuid)); | |
| 578 external_request_uuid_to_request_id_[request_uuid] = request_id; | |
| 579 return true; | |
| 580 } | |
| 581 | |
| 567 bool ServiceWorkerVersion::FinishRequest(int request_id, | 582 bool ServiceWorkerVersion::FinishRequest(int request_id, |
| 568 bool was_handled, | 583 bool was_handled, |
| 569 base::Time dispatch_event_time) { | 584 base::Time dispatch_event_time) { |
| 570 PendingRequest* request = pending_requests_.Lookup(request_id); | 585 PendingRequest* request = pending_requests_.Lookup(request_id); |
| 571 if (!request) | 586 if (!request) |
| 572 return false; | 587 return false; |
| 573 // TODO(kinuko): Record other event statuses too. | 588 // TODO(kinuko): Record other event statuses too. |
| 574 metrics_->RecordEventHandledStatus(request->event_type, was_handled); | 589 metrics_->RecordEventHandledStatus(request->event_type, was_handled); |
| 575 ServiceWorkerMetrics::RecordEventDuration( | 590 ServiceWorkerMetrics::RecordEventDuration( |
| 576 request->event_type, base::TimeTicks::Now() - request->start_time_ticks, | 591 request->event_type, base::TimeTicks::Now() - request->start_time_ticks, |
| 577 was_handled); | 592 was_handled); |
| 578 ServiceWorkerMetrics::RecordEventDispatchingDelay( | 593 ServiceWorkerMetrics::RecordEventDispatchingDelay( |
| 579 request->event_type, dispatch_event_time - request->start_time, | 594 request->event_type, dispatch_event_time - request->start_time, |
| 580 site_for_uma()); | 595 site_for_uma()); |
| 581 | 596 |
| 582 RestartTick(&idle_time_); | 597 RestartTick(&idle_time_); |
| 583 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", | 598 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", |
| 584 request, "Handled", was_handled); | 599 request, "Handled", was_handled); |
| 585 pending_requests_.Remove(request_id); | 600 pending_requests_.Remove(request_id); |
| 586 if (!HasWork()) | 601 if (!HasWork()) |
| 587 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); | 602 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); |
| 588 | 603 |
| 589 return true; | 604 return true; |
| 590 } | 605 } |
| 591 | 606 |
| 607 bool ServiceWorkerVersion::FinishExternalRequest( | |
| 608 const std::string& request_uuid) { | |
| 609 // It's possible that the renderer is lying or the version started stopping | |
| 610 // right around the time of the IPC. | |
| 611 if (running_status() != EmbeddedWorkerStatus::RUNNING) | |
| 612 return false; | |
| 613 | |
| 614 RequestUUIDToRequestIDMap::iterator iter = | |
| 615 external_request_uuid_to_request_id_.find(request_uuid); | |
| 616 if (iter != external_request_uuid_to_request_id_.end()) { | |
| 617 int request_id = iter->second; | |
| 618 external_request_uuid_to_request_id_.erase(iter); | |
| 619 return FinishRequest(request_id, true, base::Time::Now()); | |
| 620 } | |
| 621 | |
| 622 // It is possible that the request was cancelled or timed out before and we | |
| 623 // won't find it in |external_request_uuid_to_request_id_|. | |
| 624 // Return true so we don't kill the process. | |
| 625 return true; | |
| 626 } | |
| 627 | |
| 592 void ServiceWorkerVersion::RunAfterStartWorker( | 628 void ServiceWorkerVersion::RunAfterStartWorker( |
| 593 ServiceWorkerMetrics::EventType purpose, | 629 ServiceWorkerMetrics::EventType purpose, |
| 594 const base::Closure& task, | 630 const base::Closure& task, |
| 595 const StatusCallback& error_callback) { | 631 const StatusCallback& error_callback) { |
| 596 if (running_status() == EmbeddedWorkerStatus::RUNNING) { | 632 if (running_status() == EmbeddedWorkerStatus::RUNNING) { |
| 597 DCHECK(start_callbacks_.empty()); | 633 DCHECK(start_callbacks_.empty()); |
| 598 task.Run(); | 634 task.Run(); |
| 599 return; | 635 return; |
| 600 } | 636 } |
| 601 StartWorker(purpose, | 637 StartWorker(purpose, |
| (...skipping 1156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1758 // callbacks for events). | 1794 // callbacks for events). |
| 1759 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. | 1795 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. |
| 1760 IDMap<PendingRequest, IDMapOwnPointer>::iterator iter(&pending_requests_); | 1796 IDMap<PendingRequest, IDMapOwnPointer>::iterator iter(&pending_requests_); |
| 1761 while (!iter.IsAtEnd()) { | 1797 while (!iter.IsAtEnd()) { |
| 1762 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", | 1798 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", |
| 1763 iter.GetCurrentValue(), "Error", "Worker Stopped"); | 1799 iter.GetCurrentValue(), "Error", "Worker Stopped"); |
| 1764 iter.GetCurrentValue()->error_callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1800 iter.GetCurrentValue()->error_callback.Run(SERVICE_WORKER_ERROR_FAILED); |
| 1765 iter.Advance(); | 1801 iter.Advance(); |
| 1766 } | 1802 } |
| 1767 pending_requests_.Clear(); | 1803 pending_requests_.Clear(); |
| 1804 external_request_uuid_to_request_id_.clear(); | |
|
Devlin
2016/10/07 15:13:22
For my own edification, how can the SW be stopped
falken
2016/10/07 15:22:03
It could be intentional: the browser process kills
Devlin
2016/10/07 15:46:37
Couple of thoughts here (not necessarily ones that
lazyboy
2016/10/07 18:50:10
Interesting, we definitely need to tackle this 5 m
Devlin
2016/10/07 19:06:44
Yeah, I think it's fine to land this part, since t
| |
| 1768 | 1805 |
| 1769 // Close all mojo services. This will also fire and clear all callbacks | 1806 // Close all mojo services. This will also fire and clear all callbacks |
| 1770 // for messages that are still outstanding for those services. | 1807 // for messages that are still outstanding for those services. |
| 1771 mojo_services_.clear(); | 1808 mojo_services_.clear(); |
| 1772 | 1809 |
| 1773 // TODO(falken): Call SWURLRequestJob::ClearStream here? | 1810 // TODO(falken): Call SWURLRequestJob::ClearStream here? |
| 1774 streaming_url_request_jobs_.clear(); | 1811 streaming_url_request_jobs_.clear(); |
| 1775 | 1812 |
| 1776 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 1813 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
| 1777 if (should_restart) | 1814 if (should_restart) |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1794 } | 1831 } |
| 1795 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1832 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
| 1796 idle_time_); | 1833 idle_time_); |
| 1797 } | 1834 } |
| 1798 | 1835 |
| 1799 void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { | 1836 void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { |
| 1800 start_worker_first_purpose_ = base::nullopt; | 1837 start_worker_first_purpose_ = base::nullopt; |
| 1801 RunCallbacks(this, &start_callbacks_, status); | 1838 RunCallbacks(this, &start_callbacks_, status); |
| 1802 } | 1839 } |
| 1803 | 1840 |
| 1841 void ServiceWorkerVersion::CleanUpExternalRequest( | |
| 1842 const std::string& request_uuid, | |
| 1843 ServiceWorkerStatusCode status) { | |
| 1844 if (status == SERVICE_WORKER_OK) | |
| 1845 return; | |
| 1846 external_request_uuid_to_request_id_.erase(request_uuid); | |
| 1847 } | |
| 1848 | |
| 1804 } // namespace content | 1849 } // namespace content |
| OLD | NEW |