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

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: sync@tott 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 547 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | content/public/browser/service_worker_context.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698