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 | |
|
michaeln
2016/10/06 19:22:31
where does external_request_uuid_to_request_id_[uu
lazyboy
2016/10/07 06:00:57
It's supposed to be here, but I don't see it in th
| |
| 574 ignore_result( | |
| 575 StartRequest(ServiceWorkerMetrics::EventType::EXTERNAL_REQUEST, | |
| 576 base::Bind(&ServiceWorkerVersion::CleanUpExternalRequest, | |
| 577 this, request_uuid))); | |
| 578 return true; | |
| 579 } | |
| 580 | |
| 567 bool ServiceWorkerVersion::FinishRequest(int request_id, | 581 bool ServiceWorkerVersion::FinishRequest(int request_id, |
| 568 bool was_handled, | 582 bool was_handled, |
| 569 base::Time dispatch_event_time) { | 583 base::Time dispatch_event_time) { |
| 570 PendingRequest* request = pending_requests_.Lookup(request_id); | 584 PendingRequest* request = pending_requests_.Lookup(request_id); |
| 571 if (!request) | 585 if (!request) |
| 572 return false; | 586 return false; |
| 573 // TODO(kinuko): Record other event statuses too. | 587 // TODO(kinuko): Record other event statuses too. |
| 574 metrics_->RecordEventHandledStatus(request->event_type, was_handled); | 588 metrics_->RecordEventHandledStatus(request->event_type, was_handled); |
| 575 ServiceWorkerMetrics::RecordEventDuration( | 589 ServiceWorkerMetrics::RecordEventDuration( |
| 576 request->event_type, base::TimeTicks::Now() - request->start_time_ticks, | 590 request->event_type, base::TimeTicks::Now() - request->start_time_ticks, |
| 577 was_handled); | 591 was_handled); |
| 578 ServiceWorkerMetrics::RecordEventDispatchingDelay( | 592 ServiceWorkerMetrics::RecordEventDispatchingDelay( |
| 579 request->event_type, dispatch_event_time - request->start_time, | 593 request->event_type, dispatch_event_time - request->start_time, |
| 580 site_for_uma()); | 594 site_for_uma()); |
| 581 | 595 |
| 582 RestartTick(&idle_time_); | 596 RestartTick(&idle_time_); |
| 583 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", | 597 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", |
| 584 request, "Handled", was_handled); | 598 request, "Handled", was_handled); |
| 585 pending_requests_.Remove(request_id); | 599 pending_requests_.Remove(request_id); |
| 586 if (!HasWork()) | 600 if (!HasWork()) |
| 587 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); | 601 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); |
| 588 | 602 |
| 589 return true; | 603 return true; |
| 590 } | 604 } |
| 591 | 605 |
| 606 bool ServiceWorkerVersion::FinishExternalRequest( | |
| 607 const std::string& request_uuid) { | |
| 608 // It's possible that the renderer is lying or the version started stopping | |
| 609 // right around the time of the IPC. | |
| 610 if (running_status() != EmbeddedWorkerStatus::RUNNING) | |
| 611 return false; | |
| 612 | |
| 613 RequestUUIDToRequestIDMap::iterator iter = | |
| 614 external_request_uuid_to_request_id_.find(request_uuid); | |
| 615 if (iter != external_request_uuid_to_request_id_.end()) { | |
| 616 int request_id = iter->second; | |
| 617 external_request_uuid_to_request_id_.erase(iter); | |
| 618 return FinishRequest(request_id, true, base::Time::Now()); | |
| 619 } | |
| 620 | |
| 621 // It is possible that the request was cancelled or timed out before and we | |
| 622 // won't find it in |external_request_uuid_to_request_id_|. | |
| 623 // Return true so we don't kill the process. | |
| 624 return true; | |
| 625 } | |
| 626 | |
| 592 void ServiceWorkerVersion::RunAfterStartWorker( | 627 void ServiceWorkerVersion::RunAfterStartWorker( |
| 593 ServiceWorkerMetrics::EventType purpose, | 628 ServiceWorkerMetrics::EventType purpose, |
| 594 const base::Closure& task, | 629 const base::Closure& task, |
| 595 const StatusCallback& error_callback) { | 630 const StatusCallback& error_callback) { |
| 596 if (running_status() == EmbeddedWorkerStatus::RUNNING) { | 631 if (running_status() == EmbeddedWorkerStatus::RUNNING) { |
| 597 DCHECK(start_callbacks_.empty()); | 632 DCHECK(start_callbacks_.empty()); |
| 598 task.Run(); | 633 task.Run(); |
| 599 return; | 634 return; |
| 600 } | 635 } |
| 601 StartWorker(purpose, | 636 StartWorker(purpose, |
| (...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1757 // Let all message callbacks fail (this will also fire and clear all | 1792 // Let all message callbacks fail (this will also fire and clear all |
| 1758 // callbacks for events). | 1793 // callbacks for events). |
| 1759 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. | 1794 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. |
| 1760 IDMap<PendingRequest, IDMapOwnPointer>::iterator iter(&pending_requests_); | 1795 IDMap<PendingRequest, IDMapOwnPointer>::iterator iter(&pending_requests_); |
| 1761 while (!iter.IsAtEnd()) { | 1796 while (!iter.IsAtEnd()) { |
| 1762 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", | 1797 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", |
| 1763 iter.GetCurrentValue(), "Error", "Worker Stopped"); | 1798 iter.GetCurrentValue(), "Error", "Worker Stopped"); |
| 1764 iter.GetCurrentValue()->error_callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1799 iter.GetCurrentValue()->error_callback.Run(SERVICE_WORKER_ERROR_FAILED); |
| 1765 iter.Advance(); | 1800 iter.Advance(); |
| 1766 } | 1801 } |
| 1767 pending_requests_.Clear(); | 1802 pending_requests_.Clear(); |
|
michaeln
2016/10/06 19:22:31
probably be good to also clear the external_reques
lazyboy
2016/10/07 06:00:57
Done.
| |
| 1768 | 1803 |
| 1769 // Close all mojo services. This will also fire and clear all callbacks | 1804 // Close all mojo services. This will also fire and clear all callbacks |
| 1770 // for messages that are still outstanding for those services. | 1805 // for messages that are still outstanding for those services. |
| 1771 mojo_services_.clear(); | 1806 mojo_services_.clear(); |
| 1772 | 1807 |
| 1773 // TODO(falken): Call SWURLRequestJob::ClearStream here? | 1808 // TODO(falken): Call SWURLRequestJob::ClearStream here? |
| 1774 streaming_url_request_jobs_.clear(); | 1809 streaming_url_request_jobs_.clear(); |
| 1775 | 1810 |
| 1776 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 1811 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
| 1777 if (should_restart) | 1812 if (should_restart) |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1794 } | 1829 } |
| 1795 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1830 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
| 1796 idle_time_); | 1831 idle_time_); |
| 1797 } | 1832 } |
| 1798 | 1833 |
| 1799 void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { | 1834 void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { |
| 1800 start_worker_first_purpose_ = base::nullopt; | 1835 start_worker_first_purpose_ = base::nullopt; |
| 1801 RunCallbacks(this, &start_callbacks_, status); | 1836 RunCallbacks(this, &start_callbacks_, status); |
| 1802 } | 1837 } |
| 1803 | 1838 |
| 1839 void ServiceWorkerVersion::CleanUpExternalRequest( | |
| 1840 const std::string& request_uuid, | |
| 1841 ServiceWorkerStatusCode status) { | |
| 1842 if (status == SERVICE_WORKER_OK) | |
| 1843 return; | |
| 1844 external_request_uuid_to_request_id_.erase(request_uuid); | |
| 1845 } | |
| 1846 | |
| 1804 } // namespace content | 1847 } // namespace content |
| OLD | NEW |