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

Unified Diff: content/browser/devtools/protocol/service_worker_handler.cc

Issue 998173002: Revise ServiceWorker DevTools protocols. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/devtools/protocol/service_worker_handler.cc
diff --git a/content/browser/devtools/protocol/service_worker_handler.cc b/content/browser/devtools/protocol/service_worker_handler.cc
index 68f05c08f01e0b08e914169631b867db7c22cdd6..2e29e2eaa762e9055a2f9cd05547aaf477f5127a 100644
--- a/content/browser/devtools/protocol/service_worker_handler.cc
+++ b/content/browser/devtools/protocol/service_worker_handler.cc
@@ -5,11 +5,13 @@
#include "content/browser/devtools/protocol/service_worker_handler.h"
#include "base/bind.h"
+#include "base/containers/scoped_ptr_hash_map.h"
#include "base/strings/string_number_conversions.h"
#include "content/browser/devtools/service_worker_devtools_agent_host.h"
#include "content/browser/devtools/service_worker_devtools_manager.h"
#include "content/browser/service_worker/service_worker_context_observer.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
+#include "content/browser/service_worker/service_worker_version.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/devtools_agent_host.h"
@@ -83,25 +85,17 @@ scoped_refptr<ServiceWorkerRegistration> CreateRegistrationDictionaryValue(
ServiceWorkerRegistration::Create()
->set_registration_id(
base::Int64ToString(registration_info.registration_id))
- ->set_scope_url(registration_info.pattern.spec()));
- if (registration_info.active_version.version_id !=
- kInvalidServiceWorkerVersionId) {
- registration->set_active_version(
- CreateVersionDictionaryValue(registration_info.active_version));
- }
- if (registration_info.waiting_version.version_id !=
- kInvalidServiceWorkerVersionId) {
- registration->set_waiting_version(
- CreateVersionDictionaryValue(registration_info.waiting_version));
- }
- if (registration_info.installing_version.version_id !=
- kInvalidServiceWorkerVersionId) {
- registration->set_installing_version(
- CreateVersionDictionaryValue(registration_info.installing_version));
- }
+ ->set_scope_url(registration_info.pattern.spec())
+ ->set_is_deleted(registration_info.is_deleted));
return registration;
}
+bool IsStoppedAndRedundant(const ServiceWorkerVersionInfo& version_info) {
+ return version_info.running_status ==
+ content::ServiceWorkerVersion::STOPPED &&
+ version_info.status == content::ServiceWorkerVersion::REDUNDANT;
+}
+
} // namespace
using Response = DevToolsProtocolClient::Response;
@@ -120,20 +114,37 @@ class ServiceWorkerHandler::ContextObserver
~ContextObserver() override;
void GetStoredRegistrationsOnIOThread();
void OnStoredRegistrationsOnIOThread(
- const std::vector<ServiceWorkerRegistrationInfo>& registrations);
+ const std::vector<ServiceWorkerRegistrationInfo>& stored_registrations);
void StopOnIOThread();
- void OnVersionUpdated(int64 version_id);
- void OnRegistrationUpdated(int64 registration_id);
+ void StoreRegistrationInfo(
+ const ServiceWorkerRegistrationInfo& registration,
+ base::ScopedPtrHashMap<int64, ServiceWorkerRegistrationInfo>* info_map);
+ void StoreVersionInfo(const ServiceWorkerVersionInfo& version);
+
+ void SendRegistrationInfo(int64 registration_id,
+ const GURL& pattern,
+ bool is_deleted);
+ void SendVersionInfo(const ServiceWorkerVersionInfo& version);
// ServiceWorkerContextObserver implements
- void OnRunningStateChanged(int64 version_id) override;
- void OnVersionStateChanged(int64 version_id) override;
+ virtual void OnNewLiveRegistration(int64 registration_id,
+ const GURL& pattern) override;
+ virtual void OnNewLiveVersion(int64 version_id,
+ int64 registration_id,
+ const GURL& script_url) override;
+ void OnRunningStateChanged(
+ int64 version_id,
+ content::ServiceWorkerVersion::RunningStatus running_status) override;
+ void OnVersionStateChanged(
+ int64 version_id,
+ content::ServiceWorkerVersion::Status status) override;
void OnRegistrationStored(int64 registration_id,
const GURL& pattern) override;
void OnRegistrationDeleted(int64 registration_id,
const GURL& pattern) override;
+ base::ScopedPtrHashMap<int64, ServiceWorkerVersionInfo> version_info_map_;
scoped_refptr<ServiceWorkerContextWrapper> context_;
base::WeakPtr<ServiceWorkerHandler> handler_;
};
@@ -168,21 +179,46 @@ void ServiceWorkerHandler::ContextObserver::GetStoredRegistrationsOnIOThread() {
}
void ServiceWorkerHandler::ContextObserver::OnStoredRegistrationsOnIOThread(
- const std::vector<ServiceWorkerRegistrationInfo>& registrations) {
+ const std::vector<ServiceWorkerRegistrationInfo>& stored_registrations) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
context_->AddObserver(this);
+
+ base::ScopedPtrHashMap<int64, ServiceWorkerRegistrationInfo>
+ registration_info_map;
+ for (const auto& registration : stored_registrations)
+ StoreRegistrationInfo(registration, &registration_info_map);
+ for (const auto& registration :
+ context_->context()->GetAllLiveRegistrationInfo()) {
+ StoreRegistrationInfo(registration, &registration_info_map);
+ }
+ for (const auto& version : context_->context()->GetAllLiveVersionInfo())
+ StoreVersionInfo(version);
+
+ std::vector<ServiceWorkerRegistrationInfo> registrations;
+ registrations.reserve(registration_info_map.size());
+ for (const auto& registration_id_info_pair : registration_info_map)
+ registrations.push_back(*registration_id_info_pair.second);
+
+ std::vector<ServiceWorkerVersionInfo> versions;
+ versions.reserve(version_info_map_.size());
+
+ for (auto version_it = version_info_map_.begin();
+ version_it != version_info_map_.end();) {
+ versions.push_back(*version_it->second);
+ if (IsStoppedAndRedundant(*version_it->second))
+ version_info_map_.erase(version_it++);
+ else
+ ++version_it;
+ }
+
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::Bind(&ServiceWorkerHandler::OnWorkerRegistrationUpdated, handler_,
registrations));
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
- base::Bind(&ServiceWorkerHandler::OnWorkerRegistrationUpdated, handler_,
- context_->context()->GetAllLiveRegistrationInfo()));
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
base::Bind(&ServiceWorkerHandler::OnWorkerVersionUpdated, handler_,
- context_->context()->GetAllLiveVersionInfo()));
+ versions));
}
void ServiceWorkerHandler::ContextObserver::StopOnIOThread() {
@@ -193,68 +229,115 @@ void ServiceWorkerHandler::ContextObserver::StopOnIOThread() {
ServiceWorkerHandler::ContextObserver::~ContextObserver() {
}
-void ServiceWorkerHandler::ContextObserver::OnVersionUpdated(int64 version_id) {
+void ServiceWorkerHandler::ContextObserver::StoreRegistrationInfo(
+ const ServiceWorkerRegistrationInfo& registration_info,
+ base::ScopedPtrHashMap<int64, ServiceWorkerRegistrationInfo>* info_map) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- content::ServiceWorkerVersion* version =
- context_->context()->GetLiveVersion(version_id);
- if (!version)
+ if (registration_info.registration_id == kInvalidServiceWorkerRegistrationId)
return;
- OnRegistrationUpdated(version->registration_id());
- std::vector<ServiceWorkerVersionInfo> versions;
- versions.push_back(version->GetInfo());
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&ServiceWorkerHandler::OnWorkerVersionUpdated, handler_,
- versions));
+ info_map->set(registration_info.registration_id,
+ scoped_ptr<ServiceWorkerRegistrationInfo>(
+ new ServiceWorkerRegistrationInfo(registration_info)));
+ StoreVersionInfo(registration_info.active_version);
+ StoreVersionInfo(registration_info.waiting_version);
+ StoreVersionInfo(registration_info.installing_version);
}
-void ServiceWorkerHandler::ContextObserver::OnRegistrationUpdated(
- int64 registration_id) {
- content::ServiceWorkerRegistration* registration =
- context_->context()->GetLiveRegistration(registration_id);
- if (!registration)
+void ServiceWorkerHandler::ContextObserver::StoreVersionInfo(
+ const ServiceWorkerVersionInfo& version_info) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ if (version_info.version_id == kInvalidServiceWorkerVersionId)
return;
+ version_info_map_.set(version_info.version_id,
+ scoped_ptr<ServiceWorkerVersionInfo>(
+ new ServiceWorkerVersionInfo(version_info)));
+}
+
+void ServiceWorkerHandler::ContextObserver::SendRegistrationInfo(
+ int64 registration_id,
+ const GURL& pattern,
+ bool is_deleted) {
std::vector<ServiceWorkerRegistrationInfo> registrations;
- registrations.push_back(registration->GetInfo());
+ registrations.push_back(
+ ServiceWorkerRegistrationInfo(pattern, registration_id, is_deleted));
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::Bind(&ServiceWorkerHandler::OnWorkerRegistrationUpdated, handler_,
registrations));
}
+void ServiceWorkerHandler::ContextObserver::SendVersionInfo(
+ const ServiceWorkerVersionInfo& version_info) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ std::vector<ServiceWorkerVersionInfo> versions;
+ versions.push_back(version_info);
+ BrowserThread::PostTask(
+ BrowserThread::UI, FROM_HERE,
+ base::Bind(&ServiceWorkerHandler::OnWorkerVersionUpdated, handler_,
+ versions));
+}
+
+void ServiceWorkerHandler::ContextObserver::OnNewLiveRegistration(
+ int64 registration_id,
+ const GURL& pattern) {
+ SendRegistrationInfo(registration_id, pattern, false);
+}
+
+void ServiceWorkerHandler::ContextObserver::OnNewLiveVersion(
+ int64 version_id,
+ int64 registration_id,
+ const GURL& script_url) {
+ if (ServiceWorkerVersionInfo* version = version_info_map_.get(version_id)) {
+ DCHECK(version->registration_id == registration_id);
+ DCHECK(version->script_url == script_url);
+ return;
+ }
+
+ scoped_ptr<ServiceWorkerVersionInfo> version(new ServiceWorkerVersionInfo());
+ version->version_id = version_id;
+ version->registration_id = registration_id;
+ version->script_url = script_url;
+ SendVersionInfo(*version);
+ if (!IsStoppedAndRedundant(*version))
+ version_info_map_.set(version_id, version.Pass());
+}
+
void ServiceWorkerHandler::ContextObserver::OnRunningStateChanged(
- int64 version_id) {
- OnVersionUpdated(version_id);
+ int64 version_id,
+ content::ServiceWorkerVersion::RunningStatus running_status) {
+ ServiceWorkerVersionInfo* version = version_info_map_.get(version_id);
+ DCHECK(version);
+ if (version->running_status == running_status)
+ return;
+ version->running_status = running_status;
+ SendVersionInfo(*version);
+ if (IsStoppedAndRedundant(*version))
+ version_info_map_.erase(version_id);
}
void ServiceWorkerHandler::ContextObserver::OnVersionStateChanged(
- int64 version_id) {
- OnVersionUpdated(version_id);
+ int64 version_id,
+ content::ServiceWorkerVersion::Status status) {
+ ServiceWorkerVersionInfo* version = version_info_map_.get(version_id);
+ DCHECK(version);
+ if (version->status == status)
+ return;
+ version->status = status;
+ SendVersionInfo(*version);
+ if (IsStoppedAndRedundant(*version))
+ version_info_map_.erase(version_id);
}
void ServiceWorkerHandler::ContextObserver::OnRegistrationStored(
int64 registration_id,
const GURL& pattern) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- content::ServiceWorkerRegistration* registration =
- context_->context()->GetLiveRegistration(registration_id);
- DCHECK(registration);
- std::vector<ServiceWorkerRegistrationInfo> registrations;
- registrations.push_back(registration->GetInfo());
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&ServiceWorkerHandler::OnWorkerRegistrationUpdated, handler_,
- registrations));
+ SendRegistrationInfo(registration_id, pattern, false);
}
void ServiceWorkerHandler::ContextObserver::OnRegistrationDeleted(
int64 registration_id,
const GURL& pattern) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- BrowserThread::PostTask(
- BrowserThread::UI, FROM_HERE,
- base::Bind(&ServiceWorkerHandler::OnWorkerRegistrationDeleted, handler_,
- registration_id));
+ SendRegistrationInfo(registration_id, pattern, true);
}
ServiceWorkerHandler::ServiceWorkerHandler()
@@ -386,12 +469,6 @@ void ServiceWorkerHandler::OnWorkerVersionUpdated(
WorkerVersionUpdatedParams::Create()->set_versions(version_values));
}
-void ServiceWorkerHandler::OnWorkerRegistrationDeleted(int64 registration_id) {
- client_->WorkerRegistrationDeleted(
- WorkerRegistrationDeletedParams::Create()->set_registration_id(
- base::Int64ToString(registration_id)));
-}
-
void ServiceWorkerHandler::DispatchProtocolMessage(
DevToolsAgentHost* host,
const std::string& message) {

Powered by Google App Engine
This is Rietveld 408576698