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

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

Issue 2164113003: [M53] service worker: Wait for inflight requests before activating (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2785
Patch Set: 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 custom_requests_.Remove(request_id); 547 custom_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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 OnControlleeAdded(this, provider_host)); 598 OnControlleeAdded(this, provider_host));
596 } 599 }
597 600
598 void ServiceWorkerVersion::RemoveControllee( 601 void ServiceWorkerVersion::RemoveControllee(
599 ServiceWorkerProviderHost* provider_host) { 602 ServiceWorkerProviderHost* provider_host) {
600 const std::string& uuid = provider_host->client_uuid(); 603 const std::string& uuid = provider_host->client_uuid();
601 DCHECK(ContainsKey(controllee_map_, uuid)); 604 DCHECK(ContainsKey(controllee_map_, uuid));
602 controllee_map_.erase(uuid); 605 controllee_map_.erase(uuid);
603 FOR_EACH_OBSERVER(Listener, listeners_, 606 FOR_EACH_OBSERVER(Listener, listeners_,
604 OnControlleeRemoved(this, provider_host)); 607 OnControlleeRemoved(this, provider_host));
605 if (HasControllee()) 608 if (!HasControllee())
606 return; 609 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this));
607 FOR_EACH_OBSERVER(Listener, listeners_, OnNoControllees(this));
608 } 610 }
609 611
610 void ServiceWorkerVersion::AddStreamingURLRequestJob( 612 void ServiceWorkerVersion::AddStreamingURLRequestJob(
611 const ServiceWorkerURLRequestJob* request_job) { 613 const ServiceWorkerURLRequestJob* request_job) {
612 DCHECK(streaming_url_request_jobs_.find(request_job) == 614 DCHECK(streaming_url_request_jobs_.find(request_job) ==
613 streaming_url_request_jobs_.end()); 615 streaming_url_request_jobs_.end());
614 streaming_url_request_jobs_.insert(request_job); 616 streaming_url_request_jobs_.insert(request_job);
615 } 617 }
616 618
617 void ServiceWorkerVersion::RemoveStreamingURLRequestJob( 619 void ServiceWorkerVersion::RemoveStreamingURLRequestJob(
618 const ServiceWorkerURLRequestJob* request_job) { 620 const ServiceWorkerURLRequestJob* request_job) {
619 streaming_url_request_jobs_.erase(request_job); 621 streaming_url_request_jobs_.erase(request_job);
622 if (!HasWork())
623 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this));
620 } 624 }
621 625
622 void ServiceWorkerVersion::AddListener(Listener* listener) { 626 void ServiceWorkerVersion::AddListener(Listener* listener) {
623 listeners_.AddObserver(listener); 627 listeners_.AddObserver(listener);
624 } 628 }
625 629
626 void ServiceWorkerVersion::RemoveListener(Listener* listener) { 630 void ServiceWorkerVersion::RemoveListener(Listener* listener) {
627 listeners_.RemoveObserver(listener); 631 listeners_.RemoveObserver(listener);
628 } 632 }
629 633
(...skipping 877 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 !custom_requests_.IsEmpty() || !streaming_url_request_jobs_.empty(); 1533 return !custom_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 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1710 custom_requests_.Clear(); 1715 custom_requests_.Clear();
1711 1716
1712 // Close all mojo services. This will also fire and clear all callbacks 1717 // Close all mojo services. This will also fire and clear all callbacks
1713 // for messages that are still outstanding for those services. 1718 // for messages that are still outstanding for those services.
1714 mojo_services_.clear(); 1719 mojo_services_.clear();
1715 1720
1716 // TODO(falken): Call SWURLRequestJob::ClearStream here? 1721 // TODO(falken): Call SWURLRequestJob::ClearStream here?
1717 streaming_url_request_jobs_.clear(); 1722 streaming_url_request_jobs_.clear();
1718 1723
1719 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this)); 1724 FOR_EACH_OBSERVER(Listener, listeners_, OnRunningStateChanged(this));
1720
1721 if (should_restart) 1725 if (should_restart)
1722 StartWorkerInternal(); 1726 StartWorkerInternal();
1727 else if (!HasWork())
1728 FOR_EACH_OBSERVER(Listener, listeners_, OnNoWork(this));
1723 } 1729 }
1724 1730
1725 void ServiceWorkerVersion::OnMojoConnectionError(const char* service_name) { 1731 void ServiceWorkerVersion::OnMojoConnectionError(const char* service_name) {
1726 // Simply deleting the service will cause error callbacks to be called from 1732 // Simply deleting the service will cause error callbacks to be called from
1727 // the destructor of the MojoServiceWrapper instance. 1733 // the destructor of the MojoServiceWrapper instance.
1728 mojo_services_.erase(service_name); 1734 mojo_services_.erase(service_name);
1729 } 1735 }
1730 1736
1731 void ServiceWorkerVersion::OnBeginEvent() { 1737 void ServiceWorkerVersion::OnBeginEvent() {
1732 if (should_exclude_from_uma_ || 1738 if (should_exclude_from_uma_ ||
1733 running_status() != EmbeddedWorkerStatus::RUNNING || 1739 running_status() != EmbeddedWorkerStatus::RUNNING ||
1734 idle_time_.is_null()) { 1740 idle_time_.is_null()) {
1735 return; 1741 return;
1736 } 1742 }
1737 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() - 1743 ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeTicks::Now() -
1738 idle_time_); 1744 idle_time_);
1739 } 1745 }
1740 1746
1741 } // namespace content 1747 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698