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 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 OnBeginEvent(); | 543 OnBeginEvent(); |
544 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, running_status()) | 544 DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, running_status()) |
545 << "Can only start a request with a running worker."; | 545 << "Can only start a request with a running worker."; |
546 DCHECK(event_type == ServiceWorkerMetrics::EventType::INSTALL || | 546 DCHECK(event_type == ServiceWorkerMetrics::EventType::INSTALL || |
547 event_type == ServiceWorkerMetrics::EventType::ACTIVATE || | 547 event_type == ServiceWorkerMetrics::EventType::ACTIVATE || |
548 event_type == ServiceWorkerMetrics::EventType::MESSAGE || | 548 event_type == ServiceWorkerMetrics::EventType::MESSAGE || |
549 status() == ACTIVATED) | 549 status() == ACTIVATED) |
550 << "Event of type " << static_cast<int>(event_type) | 550 << "Event of type " << static_cast<int>(event_type) |
551 << " can only be dispatched to an active worker: " << status(); | 551 << " can only be dispatched to an active worker: " << status(); |
552 | 552 |
553 PendingRequest* request = | 553 PendingRequest* request = new PendingRequest( |
554 new PendingRequest(error_callback, base::TimeTicks::Now(), event_type); | 554 error_callback, base::Time::Now(), base::TimeTicks::Now(), event_type); |
555 int request_id = pending_requests_.Add(request); | 555 int request_id = pending_requests_.Add(request); |
556 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", "ServiceWorkerVersion::Request", | 556 TRACE_EVENT_ASYNC_BEGIN2("ServiceWorker", "ServiceWorkerVersion::Request", |
557 request, "Request id", request_id, "Event type", | 557 request, "Request id", request_id, "Event type", |
558 ServiceWorkerMetrics::EventTypeToString(event_type)); | 558 ServiceWorkerMetrics::EventTypeToString(event_type)); |
559 base::TimeTicks expiration_time = base::TimeTicks::Now() + timeout; | 559 base::TimeTicks expiration_time = base::TimeTicks::Now() + timeout; |
560 timeout_queue_.push( | 560 timeout_queue_.push( |
561 RequestInfo(request_id, event_type, expiration_time, timeout_behavior)); | 561 RequestInfo(request_id, event_type, expiration_time, timeout_behavior)); |
562 return request_id; | 562 return request_id; |
563 } | 563 } |
564 | 564 |
565 bool ServiceWorkerVersion::FinishRequest(int request_id, bool was_handled) { | 565 bool ServiceWorkerVersion::FinishRequest(int request_id, |
| 566 bool was_handled, |
| 567 base::Time dispatch_event_time) { |
566 PendingRequest* request = pending_requests_.Lookup(request_id); | 568 PendingRequest* request = pending_requests_.Lookup(request_id); |
567 if (!request) | 569 if (!request) |
568 return false; | 570 return false; |
569 // TODO(kinuko): Record other event statuses too. | 571 // TODO(kinuko): Record other event statuses too. |
570 metrics_->RecordEventHandledStatus(request->event_type, was_handled); | 572 metrics_->RecordEventHandledStatus(request->event_type, was_handled); |
571 ServiceWorkerMetrics::RecordEventDuration( | 573 ServiceWorkerMetrics::RecordEventDuration( |
572 request->event_type, base::TimeTicks::Now() - request->start_time, | 574 request->event_type, base::TimeTicks::Now() - request->start_time_ticks, |
573 was_handled); | 575 was_handled); |
| 576 ServiceWorkerMetrics::RecordEventDispatchingDelay( |
| 577 request->event_type, dispatch_event_time - request->start_time, |
| 578 site_for_uma()); |
574 | 579 |
575 RestartTick(&idle_time_); | 580 RestartTick(&idle_time_); |
576 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", | 581 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", |
577 request, "Handled", was_handled); | 582 request, "Handled", was_handled); |
578 pending_requests_.Remove(request_id); | 583 pending_requests_.Remove(request_id); |
579 if (!HasWork()) | 584 if (!HasWork()) |
580 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); | 585 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this)); |
581 | 586 |
582 return true; | 587 return true; |
583 } | 588 } |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
760 ServiceWorkerVersion::RequestInfo::~RequestInfo() { | 765 ServiceWorkerVersion::RequestInfo::~RequestInfo() { |
761 } | 766 } |
762 | 767 |
763 bool ServiceWorkerVersion::RequestInfo::operator>( | 768 bool ServiceWorkerVersion::RequestInfo::operator>( |
764 const RequestInfo& other) const { | 769 const RequestInfo& other) const { |
765 return expiration > other.expiration; | 770 return expiration > other.expiration; |
766 } | 771 } |
767 | 772 |
768 ServiceWorkerVersion::PendingRequest::PendingRequest( | 773 ServiceWorkerVersion::PendingRequest::PendingRequest( |
769 const StatusCallback& callback, | 774 const StatusCallback& callback, |
770 const base::TimeTicks& time, | 775 base::Time time, |
| 776 const base::TimeTicks& time_ticks, |
771 ServiceWorkerMetrics::EventType event_type) | 777 ServiceWorkerMetrics::EventType event_type) |
772 : error_callback(callback), start_time(time), event_type(event_type) {} | 778 : error_callback(callback), |
| 779 start_time(time), |
| 780 start_time_ticks(time_ticks), |
| 781 event_type(event_type) {} |
773 | 782 |
774 ServiceWorkerVersion::PendingRequest::~PendingRequest() {} | 783 ServiceWorkerVersion::PendingRequest::~PendingRequest() {} |
775 | 784 |
776 ServiceWorkerVersion::BaseMojoServiceWrapper::BaseMojoServiceWrapper( | 785 ServiceWorkerVersion::BaseMojoServiceWrapper::BaseMojoServiceWrapper( |
777 ServiceWorkerVersion* worker, | 786 ServiceWorkerVersion* worker, |
778 const char* service_name) | 787 const char* service_name) |
779 : worker_(worker), service_name_(service_name) {} | 788 : worker_(worker), service_name_(service_name) {} |
780 | 789 |
781 ServiceWorkerVersion::BaseMojoServiceWrapper::~BaseMojoServiceWrapper() { | 790 ServiceWorkerVersion::BaseMojoServiceWrapper::~BaseMojoServiceWrapper() { |
782 IDMap<PendingRequest, IDMapOwnPointer>::iterator iter( | 791 IDMap<PendingRequest, IDMapOwnPointer>::iterator iter( |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
984 running_status() != EmbeddedWorkerStatus::RUNNING) { | 993 running_status() != EmbeddedWorkerStatus::RUNNING) { |
985 return; | 994 return; |
986 } | 995 } |
987 | 996 |
988 embedded_worker_->SendMessage( | 997 embedded_worker_->SendMessage( |
989 ServiceWorkerMsg_DidGetClients(request_id, *clients)); | 998 ServiceWorkerMsg_DidGetClients(request_id, *clients)); |
990 } | 999 } |
991 | 1000 |
992 void ServiceWorkerVersion::OnSimpleEventResponse( | 1001 void ServiceWorkerVersion::OnSimpleEventResponse( |
993 int request_id, | 1002 int request_id, |
994 blink::WebServiceWorkerEventResult result) { | 1003 blink::WebServiceWorkerEventResult result, |
| 1004 base::Time dispatch_event_time) { |
995 // Copy error callback before calling FinishRequest. | 1005 // Copy error callback before calling FinishRequest. |
996 PendingRequest* request = pending_requests_.Lookup(request_id); | 1006 PendingRequest* request = pending_requests_.Lookup(request_id); |
997 DCHECK(request) << "Invalid request id"; | 1007 DCHECK(request) << "Invalid request id"; |
998 StatusCallback callback = request->error_callback; | 1008 StatusCallback callback = request->error_callback; |
999 | 1009 |
1000 FinishRequest(request_id, | 1010 FinishRequest(request_id, |
1001 result == blink::WebServiceWorkerEventResultCompleted); | 1011 result == blink::WebServiceWorkerEventResultCompleted, |
| 1012 dispatch_event_time); |
1002 | 1013 |
1003 ServiceWorkerStatusCode status = SERVICE_WORKER_OK; | 1014 ServiceWorkerStatusCode status = SERVICE_WORKER_OK; |
1004 if (result == blink::WebServiceWorkerEventResultRejected) | 1015 if (result == blink::WebServiceWorkerEventResultRejected) |
1005 status = SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED; | 1016 status = SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED; |
1006 callback.Run(status); | 1017 callback.Run(status); |
1007 } | 1018 } |
1008 | 1019 |
1009 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { | 1020 void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { |
1010 // Just abort if we are shutting down. | 1021 // Just abort if we are shutting down. |
1011 if (!context_) | 1022 if (!context_) |
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1778 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - | 1789 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - |
1779 idle_time_); | 1790 idle_time_); |
1780 } | 1791 } |
1781 | 1792 |
1782 void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { | 1793 void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { |
1783 start_worker_first_purpose_ = base::nullopt; | 1794 start_worker_first_purpose_ = base::nullopt; |
1784 RunCallbacks(this, &start_callbacks_, status); | 1795 RunCallbacks(this, &start_callbacks_, status); |
1785 } | 1796 } |
1786 | 1797 |
1787 } // namespace content | 1798 } // namespace content |
OLD | NEW |