| 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 547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", "ServiceWorkerVersion::Request", | 558 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", "ServiceWorkerVersion::Request", |
| 559 pending_requests_.Lookup(request_id), "Request id", | 559 pending_requests_.Lookup(request_id), "Request id", |
| 560 request_id, "Event type", | 560 request_id, "Event type", |
| 561 ServiceWorkerMetrics::EventTypeToString(event_type)); | 561 ServiceWorkerMetrics::EventTypeToString(event_type)); |
| 562 base::TimeTicks expiration_time = base::TimeTicks::Now() + timeout; | 562 base::TimeTicks expiration_time = base::TimeTicks::Now() + timeout; |
| 563 timeout_queue_.push( | 563 timeout_queue_.push( |
| 564 RequestInfo(request_id, event_type, expiration_time, timeout_behavior)); | 564 RequestInfo(request_id, event_type, expiration_time, timeout_behavior)); |
| 565 return request_id; | 565 return request_id; |
| 566 } | 566 } |
| 567 | 567 |
| 568 bool ServiceWorkerVersion::StartExternalRequest( |
| 569 const std::string& request_uuid) { |
| 570 // It's possible that the renderer is lying or the version started stopping |
| 571 // right around the time of the IPC. |
| 572 if (running_status() != EmbeddedWorkerStatus::RUNNING) |
| 573 return false; |
| 574 |
| 575 if (external_request_uuid_to_request_id_.count(request_uuid) > 0u) |
| 576 return false; |
| 577 |
| 578 int request_id = |
| 579 StartRequest(ServiceWorkerMetrics::EventType::EXTERNAL_REQUEST, |
| 580 base::Bind(&ServiceWorkerVersion::CleanUpExternalRequest, |
| 581 this, request_uuid)); |
| 582 external_request_uuid_to_request_id_[request_uuid] = request_id; |
| 583 return true; |
| 584 } |
| 585 |
| 568 bool ServiceWorkerVersion::FinishRequest(int request_id, | 586 bool ServiceWorkerVersion::FinishRequest(int request_id, |
| 569 bool was_handled, | 587 bool was_handled, |
| 570 base::Time dispatch_event_time) { | 588 base::Time dispatch_event_time) { |
| 571 PendingRequest* request = pending_requests_.Lookup(request_id); | 589 PendingRequest* request = pending_requests_.Lookup(request_id); |
| 572 if (!request) | 590 if (!request) |
| 573 return false; | 591 return false; |
| 574 // TODO(kinuko): Record other event statuses too. | 592 // TODO(kinuko): Record other event statuses too. |
| 575 metrics_->RecordEventHandledStatus(request->event_type, was_handled); | 593 metrics_->RecordEventHandledStatus(request->event_type, was_handled); |
| 576 ServiceWorkerMetrics::RecordEventDuration( | 594 ServiceWorkerMetrics::RecordEventDuration( |
| 577 request->event_type, base::TimeTicks::Now() - request->start_time_ticks, | 595 request->event_type, base::TimeTicks::Now() - request->start_time_ticks, |
| 578 was_handled); | 596 was_handled); |
| 579 ServiceWorkerMetrics::RecordEventDispatchingDelay( | 597 ServiceWorkerMetrics::RecordEventDispatchingDelay( |
| 580 request->event_type, dispatch_event_time - request->start_time, | 598 request->event_type, dispatch_event_time - request->start_time, |
| 581 site_for_uma()); | 599 site_for_uma()); |
| 582 | 600 |
| 583 RestartTick(&idle_time_); | 601 RestartTick(&idle_time_); |
| 584 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", | 602 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", |
| 585 request, "Handled", was_handled); | 603 request, "Handled", was_handled); |
| 586 pending_requests_.Remove(request_id); | 604 pending_requests_.Remove(request_id); |
| 587 if (!HasWork()) | 605 if (!HasWork()) |
| 588 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); | 606 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); |
| 589 | 607 |
| 590 return true; | 608 return true; |
| 591 } | 609 } |
| 592 | 610 |
| 611 bool ServiceWorkerVersion::FinishExternalRequest( |
| 612 const std::string& request_uuid) { |
| 613 // It's possible that the renderer is lying or the version started stopping |
| 614 // right around the time of the IPC. |
| 615 if (running_status() != EmbeddedWorkerStatus::RUNNING) |
| 616 return false; |
| 617 |
| 618 RequestUUIDToRequestIDMap::iterator iter = |
| 619 external_request_uuid_to_request_id_.find(request_uuid); |
| 620 if (iter != external_request_uuid_to_request_id_.end()) { |
| 621 int request_id = iter->second; |
| 622 external_request_uuid_to_request_id_.erase(iter); |
| 623 return FinishRequest(request_id, true, base::Time::Now()); |
| 624 } |
| 625 |
| 626 // It is possible that the request was cancelled or timed out before and we |
| 627 // won't find it in |external_request_uuid_to_request_id_|. |
| 628 // Return true so we don't kill the process. |
| 629 return true; |
| 630 } |
| 631 |
| 593 void ServiceWorkerVersion::RunAfterStartWorker( | 632 void ServiceWorkerVersion::RunAfterStartWorker( |
| 594 ServiceWorkerMetrics::EventType purpose, | 633 ServiceWorkerMetrics::EventType purpose, |
| 595 const base::Closure& task, | 634 const base::Closure& task, |
| 596 const StatusCallback& error_callback) { | 635 const StatusCallback& error_callback) { |
| 597 if (running_status() == EmbeddedWorkerStatus::RUNNING) { | 636 if (running_status() == EmbeddedWorkerStatus::RUNNING) { |
| 598 DCHECK(start_callbacks_.empty()); | 637 DCHECK(start_callbacks_.empty()); |
| 599 task.Run(); | 638 task.Run(); |
| 600 return; | 639 return; |
| 601 } | 640 } |
| 602 StartWorker(purpose, | 641 StartWorker(purpose, |
| (...skipping 1174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1777 // callbacks for events). | 1816 // callbacks for events). |
| 1778 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. | 1817 // TODO(kinuko): Consider if we want to add queue+resend mechanism here. |
| 1779 IDMap<PendingRequest, IDMapOwnPointer>::iterator iter(&pending_requests_); | 1818 IDMap<PendingRequest, IDMapOwnPointer>::iterator iter(&pending_requests_); |
| 1780 while (!iter.IsAtEnd()) { | 1819 while (!iter.IsAtEnd()) { |
| 1781 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", | 1820 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", |
| 1782 iter.GetCurrentValue(), "Error", "Worker Stopped"); | 1821 iter.GetCurrentValue(), "Error", "Worker Stopped"); |
| 1783 iter.GetCurrentValue()->error_callback.Run(SERVICE_WORKER_ERROR_FAILED); | 1822 iter.GetCurrentValue()->error_callback.Run(SERVICE_WORKER_ERROR_FAILED); |
| 1784 iter.Advance(); | 1823 iter.Advance(); |
| 1785 } | 1824 } |
| 1786 pending_requests_.Clear(); | 1825 pending_requests_.Clear(); |
| 1826 external_request_uuid_to_request_id_.clear(); |
| 1787 | 1827 |
| 1788 // Close all mojo services. This will also fire and clear all callbacks | 1828 // Close all mojo services. This will also fire and clear all callbacks |
| 1789 // for messages that are still outstanding for those services. | 1829 // for messages that are still outstanding for those services. |
| 1790 mojo_services_.clear(); | 1830 mojo_services_.clear(); |
| 1791 | 1831 |
| 1792 // TODO(falken): Call SWURLRequestJob::ClearStream here? | 1832 // TODO(falken): Call SWURLRequestJob::ClearStream here? |
| 1793 streaming_url_request_jobs_.clear(); | 1833 streaming_url_request_jobs_.clear(); |
| 1794 | 1834 |
| 1795 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); | 1835 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); |
| 1796 if (should_restart) | 1836 if (should_restart) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1813 } | 1853 } |
| 1814 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1854 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
| 1815 idle_time_); | 1855 idle_time_); |
| 1816 } | 1856 } |
| 1817 | 1857 |
| 1818 void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { | 1858 void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { |
| 1819 start_worker_first_purpose_ = base::nullopt; | 1859 start_worker_first_purpose_ = base::nullopt; |
| 1820 RunCallbacks(this, &start_callbacks_, status); | 1860 RunCallbacks(this, &start_callbacks_, status); |
| 1821 } | 1861 } |
| 1822 | 1862 |
| 1863 void ServiceWorkerVersion::CleanUpExternalRequest( |
| 1864 const std::string& request_uuid, |
| 1865 ServiceWorkerStatusCode status) { |
| 1866 if (status == SERVICE_WORKER_OK) |
| 1867 return; |
| 1868 external_request_uuid_to_request_id_.erase(request_uuid); |
| 1869 } |
| 1870 |
| 1823 } // namespace content | 1871 } // namespace content |
| OLD | NEW |