| 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, ®istration_info_map);
|
| + for (const auto& registration :
|
| + context_->context()->GetAllLiveRegistrationInfo()) {
|
| + StoreRegistrationInfo(registration, ®istration_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) {
|
|
|