Chromium Code Reviews| 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..1739d8b09e43febba2b3254ab32a1595c96defa0 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,22 +85,8 @@ 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; |
| } |
| @@ -120,20 +108,33 @@ 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); |
| + void StoreVersionInfo(const ServiceWorkerVersionInfo& version); |
| + |
| + void SendRegistrationInfo(const ServiceWorkerRegistrationInfo& registration); |
| + void SendVersionInfo(const ServiceWorkerVersionInfo& version); |
| // ServiceWorkerContextObserver implements |
| - void OnRunningStateChanged(int64 version_id) override; |
| - void OnVersionStateChanged(int64 version_id) override; |
| - void OnRegistrationStored(int64 registration_id, |
| - const GURL& pattern) 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 OnRegistrationDeleted(int64 registration_id, |
| const GURL& pattern) override; |
| + base::ScopedPtrHashMap<int64, ServiceWorkerRegistrationInfo> |
| + registration_info_map_; |
| + base::ScopedPtrHashMap<int64, ServiceWorkerVersionInfo> version_info_map_; |
|
Kunihiko Sakamoto
2015/03/12 08:08:46
It seems items entered in these maps are never rem
horo
2015/03/12 09:12:59
Changed to delete STOPPED & REDUNDANT versions.
|
| scoped_refptr<ServiceWorkerContextWrapper> context_; |
| base::WeakPtr<ServiceWorkerHandler> handler_; |
| }; |
| @@ -168,21 +169,36 @@ 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); |
| + |
| + for (const auto& registration : stored_registrations) |
| + StoreRegistrationInfo(registration); |
| + for (const auto& registration : |
| + context_->context()->GetAllLiveRegistrationInfo()) |
| + StoreRegistrationInfo(registration); |
| + for (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 (const auto& version_id_info_pair : version_info_map_) |
| + versions.push_back(*version_id_info_pair.second); |
| + |
| 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 +209,116 @@ void ServiceWorkerHandler::ContextObserver::StopOnIOThread() { |
| ServiceWorkerHandler::ContextObserver::~ContextObserver() { |
| } |
| -void ServiceWorkerHandler::ContextObserver::OnVersionUpdated(int64 version_id) { |
| +void ServiceWorkerHandler::ContextObserver::StoreRegistrationInfo( |
| + const ServiceWorkerRegistrationInfo& registration_info) { |
| 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)); |
| + registration_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( |
| + const ServiceWorkerRegistrationInfo& registration) { |
| std::vector<ServiceWorkerRegistrationInfo> registrations; |
| - registrations.push_back(registration->GetInfo()); |
| + registrations.push_back(registration); |
| BrowserThread::PostTask( |
| BrowserThread::UI, FROM_HERE, |
| base::Bind(&ServiceWorkerHandler::OnWorkerRegistrationUpdated, handler_, |
| registrations)); |
| } |
| -void ServiceWorkerHandler::ContextObserver::OnRunningStateChanged( |
| - int64 version_id) { |
| - OnVersionUpdated(version_id); |
| +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::OnVersionStateChanged( |
| - int64 version_id) { |
| - OnVersionUpdated(version_id); |
| +void ServiceWorkerHandler::ContextObserver::OnNewLiveRegistration( |
| + int64 registration_id, |
| + const GURL& pattern) { |
| + if (ServiceWorkerRegistrationInfo* registration_info = |
| + registration_info_map_.get(registration_id)) { |
| + DCHECK(registration_info->registration_id == registration_id); |
| + DCHECK(registration_info->pattern == pattern); |
| + return; |
| + } |
| + scoped_ptr<ServiceWorkerRegistrationInfo> registration_info( |
| + new ServiceWorkerRegistrationInfo()); |
| + registration_info->registration_id = registration_id; |
| + registration_info->pattern = pattern; |
| + SendRegistrationInfo(*registration_info); |
| + registration_info_map_.set(registration_id, registration_info.Pass()); |
| } |
| -void ServiceWorkerHandler::ContextObserver::OnRegistrationStored( |
| +void ServiceWorkerHandler::ContextObserver::OnNewLiveVersion( |
| + int64 version_id, |
| 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)); |
| + 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); |
| + version_info_map_.set(version_id, version.Pass()); |
| +} |
| + |
| +void ServiceWorkerHandler::ContextObserver::OnRunningStateChanged( |
| + 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); |
| +} |
| + |
| +void ServiceWorkerHandler::ContextObserver::OnVersionStateChanged( |
| + 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); |
| } |
| 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)); |
| + ServiceWorkerRegistrationInfo* registration = |
| + registration_info_map_.get(registration_id); |
| + DCHECK(registration); |
| + registration->is_deleted = true; |
|
Kunihiko Sakamoto
2015/03/12 08:08:46
A deleted registration can be revived if register(
horo
2015/03/12 09:12:59
Done.
|
| + SendRegistrationInfo(*registration); |
| } |
| ServiceWorkerHandler::ServiceWorkerHandler() |
| @@ -386,12 +450,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) { |