Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(194)

Side by Side Diff: content/browser/service_worker/service_worker_version.cc

Issue 2166523003: Add ref count to service workers for extension API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments from Devlin Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698