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

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

Issue 2119143002: service worker: Wait for inflight requests before activating (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: reg Created 4 years, 5 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 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 // TODO(kinuko): Record other event statuses too. 538 // TODO(kinuko): Record other event statuses too.
539 metrics_->RecordEventHandledStatus(request->event_type, was_handled); 539 metrics_->RecordEventHandledStatus(request->event_type, was_handled);
540 ServiceWorkerMetrics::RecordEventDuration( 540 ServiceWorkerMetrics::RecordEventDuration(
541 request->event_type, base::TimeTicks::Now() - request->start_time, 541 request->event_type, base::TimeTicks::Now() - request->start_time,
542 was_handled); 542 was_handled);
543 543
544 RestartTick(&idle_time_); 544 RestartTick(&idle_time_);
545 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request", 545 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::Request",
546 request, "Handled", was_handled); 546 request, "Handled", was_handled);
547 pending_requests_.Remove(request_id); 547 pending_requests_.Remove(request_id);
548 if (!HasWork())
549 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this));
550
548 return true; 551 return true;
549 } 552 }
550 553
551 void ServiceWorkerVersion::RunAfterStartWorker( 554 void ServiceWorkerVersion::RunAfterStartWorker(
552 ServiceWorkerMetrics::EventType purpose, 555 ServiceWorkerMetrics::EventType purpose,
553 const base::Closure& task, 556 const base::Closure& task,
554 const StatusCallback& error_callback) { 557 const StatusCallback& error_callback) {
555 if (running_status() == EmbeddedWorkerStatus::RUNNING) { 558 if (running_status() == EmbeddedWorkerStatus::RUNNING) {
556 DCHECK(start_callbacks_.empty()); 559 DCHECK(start_callbacks_.empty());
557 task.Run(); 560 task.Run();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 OnControlleeAdded(this, provider_host)); 597 OnControlleeAdded(this, provider_host));
595 } 598 }
596 599
597 void ServiceWorkerVersion::RemoveControllee( 600 void ServiceWorkerVersion::RemoveControllee(
598 ServiceWorkerProviderHost* provider_host) { 601 ServiceWorkerProviderHost* provider_host) {
599 const std::string& uuid = provider_host->client_uuid(); 602 const std::string& uuid = provider_host->client_uuid();
600 DCHECK(ContainsKey(controllee_map_, uuid)); 603 DCHECK(ContainsKey(controllee_map_, uuid));
601 controllee_map_.erase(uuid); 604 controllee_map_.erase(uuid);
602 FOR_EACH_OBSERVER(Listener, listeners_, 605 FOR_EACH_OBSERVER(Listener, listeners_,
603 OnControlleeRemoved(this, provider_host)); 606 OnControlleeRemoved(this, provider_host));
604 if (HasControllee()) 607 if (!HasControllee())
605 return; 608 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this));
606 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this));
607 } 609 }
608 610
609 void ServiceWorkerVersion::AddStreamingURLRequestJob( 611 void ServiceWorkerVersion::AddStreamingURLRequestJob(
610 const ServiceWorkerURLRequestJob* request_job) { 612 const ServiceWorkerURLRequestJob* request_job) {
611 DCHECK(streaming_url_request_jobs_.find(request_job) == 613 DCHECK(streaming_url_request_jobs_.find(request_job) ==
612 streaming_url_request_jobs_.end()); 614 streaming_url_request_jobs_.end());
613 streaming_url_request_jobs_.insert(request_job); 615 streaming_url_request_jobs_.insert(request_job);
614 } 616 }
615 617
616 void ServiceWorkerVersion::RemoveStreamingURLRequestJob( 618 void ServiceWorkerVersion::RemoveStreamingURLRequestJob(
617 const ServiceWorkerURLRequestJob* request_job) { 619 const ServiceWorkerURLRequestJob* request_job) {
618 streaming_url_request_jobs_.erase(request_job); 620 streaming_url_request_jobs_.erase(request_job);
621 if (!HasWork())
622 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this));
619 } 623 }
620 624
621 void ServiceWorkerVersion::AddListener(Listener* listener) { 625 void ServiceWorkerVersion::AddListener(Listener* listener) {
622 listeners_.AddObserver(listener); 626 listeners_.AddObserver(listener);
623 } 627 }
624 628
625 void ServiceWorkerVersion::RemoveListener(Listener* listener) { 629 void ServiceWorkerVersion::RemoveListener(Listener* listener) {
626 listeners_.RemoveObserver(listener); 630 listeners_.RemoveObserver(listener);
627 } 631 }
628 632
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after
1507 void ServiceWorkerVersion::OnPingTimeout() { 1511 void ServiceWorkerVersion::OnPingTimeout() {
1508 DCHECK(running_status() == EmbeddedWorkerStatus::STARTING || 1512 DCHECK(running_status() == EmbeddedWorkerStatus::STARTING ||
1509 running_status() == EmbeddedWorkerStatus::RUNNING); 1513 running_status() == EmbeddedWorkerStatus::RUNNING);
1510 // TODO(falken): Show a message to the developer that the SW was stopped due 1514 // TODO(falken): Show a message to the developer that the SW was stopped due
1511 // to timeout (crbug.com/457968). Also, change the error code to 1515 // to timeout (crbug.com/457968). Also, change the error code to
1512 // SERVICE_WORKER_ERROR_TIMEOUT. 1516 // SERVICE_WORKER_ERROR_TIMEOUT.
1513 StopWorkerIfIdle(); 1517 StopWorkerIfIdle();
1514 } 1518 }
1515 1519
1516 void ServiceWorkerVersion::StopWorkerIfIdle() { 1520 void ServiceWorkerVersion::StopWorkerIfIdle() {
1517 if (HasInflightRequests() && !ping_controller_->IsTimedOut()) 1521 if (HasWork() && !ping_controller_->IsTimedOut())
1518 return; 1522 return;
1519 if (running_status() == EmbeddedWorkerStatus::STOPPED || 1523 if (running_status() == EmbeddedWorkerStatus::STOPPED ||
1520 running_status() == EmbeddedWorkerStatus::STOPPING || 1524 running_status() == EmbeddedWorkerStatus::STOPPING ||
1521 !stop_callbacks_.empty()) { 1525 !stop_callbacks_.empty()) {
1522 return; 1526 return;
1523 } 1527 }
1524 1528
1525 embedded_worker_->StopIfIdle(); 1529 embedded_worker_->StopIfIdle();
1526 } 1530 }
1527 1531
1528 bool ServiceWorkerVersion::HasInflightRequests() const { 1532 bool ServiceWorkerVersion::HasWork() const {
1529 return !pending_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); 1533 return !pending_requests_.IsEmpty() || !streaming_url_request_jobs_.empty() ||
1534 !start_callbacks_.empty();
1530 } 1535 }
1531 1536
1532 void ServiceWorkerVersion::RecordStartWorkerResult( 1537 void ServiceWorkerVersion::RecordStartWorkerResult(
1533 ServiceWorkerMetrics::EventType purpose, 1538 ServiceWorkerMetrics::EventType purpose,
1534 Status prestart_status, 1539 Status prestart_status,
1535 int trace_id, 1540 int trace_id,
1536 bool is_browser_startup_complete, 1541 bool is_browser_startup_complete,
1537 ServiceWorkerStatusCode status) { 1542 ServiceWorkerStatusCode status) {
1538 if (trace_id != kInvalidTraceId) { 1543 if (trace_id != kInvalidTraceId) {
1539 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::StartWorker", 1544 TRACE_EVENT_ASYNC_END1("ServiceWorker", "ServiceWorkerVersion::StartWorker",
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
1709 pending_requests_.Clear(); 1714 pending_requests_.Clear();
1710 1715
1711 // Close all mojo services. This will also fire and clear all callbacks 1716 // Close all mojo services. This will also fire and clear all callbacks
1712 // for messages that are still outstanding for those services. 1717 // for messages that are still outstanding for those services.
1713 mojo_services_.clear(); 1718 mojo_services_.clear();
1714 1719
1715 // TODO(falken): Call SWURLRequestJob::ClearStream here? 1720 // TODO(falken): Call SWURLRequestJob::ClearStream here?
1716 streaming_url_request_jobs_.clear(); 1721 streaming_url_request_jobs_.clear();
1717 1722
1718 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); 1723 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this));
1719
1720 if (should_restart) 1724 if (should_restart)
1721 StartWorkerInternal(); 1725 StartWorkerInternal();
1726 else if (!HasWork())
1727 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this));
1722 } 1728 }
1723 1729
1724 void ServiceWorkerVersion::OnMojoConnectionError(const char* service_name) { 1730 void ServiceWorkerVersion::OnMojoConnectionError(const char* service_name) {
1725 // Simply deleting the service will cause error callbacks to be called from 1731 // Simply deleting the service will cause error callbacks to be called from
1726 // the destructor of the MojoServiceWrapper instance. 1732 // the destructor of the MojoServiceWrapper instance.
1727 mojo_services_.erase(service_name); 1733 mojo_services_.erase(service_name);
1728 } 1734 }
1729 1735
1730 void ServiceWorkerVersion::OnBeginEvent() { 1736 void ServiceWorkerVersion::OnBeginEvent() {
1731 if (should_exclude_from_uma_ || 1737 if (should_exclude_from_uma_ ||
1732 running_status() != EmbeddedWorkerStatus::RUNNING || 1738 running_status() != EmbeddedWorkerStatus::RUNNING ||
1733 idle_time_.is_null()) { 1739 idle_time_.is_null()) {
1734 return; 1740 return;
1735 } 1741 }
1736 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - 1742 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() -
1737 idle_time_); 1743 idle_time_);
1738 } 1744 }
1739 1745
1740 } // namespace content 1746 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698