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

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 & MichaelN 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698