| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/browsing_data/browsing_data_shared_worker_helper.h" |
| |
| #include <tuple> |
| #include <vector> |
| |
| #include "base/bind.h" |
| #include "base/location.h" |
| #include "base/task/post_task.h" |
| #include "chrome/browser/browsing_data/browsing_data_helper.h" |
| #include "content/public/browser/browser_task_traits.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/shared_worker_service.h" |
| #include "content/public/browser/storage_partition.h" |
| |
| BrowsingDataSharedWorkerHelper::SharedWorkerInfo::SharedWorkerInfo( |
| const GURL& worker, |
| const std::string& name, |
| const url::Origin& constructor_origin) |
| : worker(worker), name(name), constructor_origin(constructor_origin) {} |
| |
| BrowsingDataSharedWorkerHelper::SharedWorkerInfo::SharedWorkerInfo( |
| const SharedWorkerInfo& other) = default; |
| |
| BrowsingDataSharedWorkerHelper::SharedWorkerInfo::~SharedWorkerInfo() = default; |
| |
| bool BrowsingDataSharedWorkerHelper::SharedWorkerInfo::operator<( |
| const SharedWorkerInfo& other) const { |
| return std::tie(worker, name, constructor_origin) < |
| std::tie(other.worker, other.name, other.constructor_origin); |
| } |
| |
| BrowsingDataSharedWorkerHelper::BrowsingDataSharedWorkerHelper( |
| content::StoragePartition* storage_partition, |
| content::ResourceContext* resource_context) |
| : storage_partition_(storage_partition), |
| resource_context_(resource_context) {} |
| |
| BrowsingDataSharedWorkerHelper::~BrowsingDataSharedWorkerHelper() = default; |
| |
| void BrowsingDataSharedWorkerHelper::StartFetching(FetchCallback callback) { |
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| DCHECK(!callback.is_null()); |
| |
| // We always return an empty list, as there are no "persistent" shared |
| // workers. |
| std::list<SharedWorkerInfo> result; |
| base::PostTaskWithTraits(FROM_HERE, {content::BrowserThread::UI}, |
| base::BindOnce(std::move(callback), result)); |
| } |
| void BrowsingDataSharedWorkerHelper::DeleteSharedWorker( |
| const GURL& worker, |
| const std::string& name, |
| const url::Origin& constructor_origin) { |
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| storage_partition_->GetSharedWorkerService()->TerminateWorker( |
| worker, name, constructor_origin); |
| } |
| |
| CannedBrowsingDataSharedWorkerHelper::CannedBrowsingDataSharedWorkerHelper( |
| content::StoragePartition* storage_partition, |
| content::ResourceContext* resource_context) |
| : BrowsingDataSharedWorkerHelper(storage_partition, resource_context) {} |
| |
| CannedBrowsingDataSharedWorkerHelper::~CannedBrowsingDataSharedWorkerHelper() = |
| default; |
| |
| void CannedBrowsingDataSharedWorkerHelper::AddSharedWorker( |
| const GURL& worker, |
| const std::string& name, |
| const url::Origin& constructor_origin) { |
| if (!BrowsingDataHelper::HasWebScheme(worker)) |
| return; // Non-websafe state is not considered browsing data. |
| |
| pending_shared_worker_info_.insert( |
| SharedWorkerInfo(worker, name, constructor_origin)); |
| } |
| |
| void CannedBrowsingDataSharedWorkerHelper::Reset() { |
| pending_shared_worker_info_.clear(); |
| } |
| |
| bool CannedBrowsingDataSharedWorkerHelper::empty() const { |
| return pending_shared_worker_info_.empty(); |
| } |
| |
| size_t CannedBrowsingDataSharedWorkerHelper::GetSharedWorkerCount() const { |
| return pending_shared_worker_info_.size(); |
| } |
| |
| const std::set<CannedBrowsingDataSharedWorkerHelper::SharedWorkerInfo>& |
| CannedBrowsingDataSharedWorkerHelper::GetSharedWorkerInfo() const { |
| return pending_shared_worker_info_; |
| } |
| |
| void CannedBrowsingDataSharedWorkerHelper::StartFetching( |
| FetchCallback callback) { |
| DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| DCHECK(!callback.is_null()); |
| |
| std::list<SharedWorkerInfo> result; |
| for (auto& it : pending_shared_worker_info_) |
| result.push_back(it); |
| base::PostTaskWithTraits(FROM_HERE, {content::BrowserThread::UI}, |
| base::BindOnce(std::move(callback), result)); |
| } |
| |
| void CannedBrowsingDataSharedWorkerHelper::DeleteSharedWorker( |
| const GURL& worker, |
| const std::string& name, |
| const url::Origin& constructor_origin) { |
| for (auto it = pending_shared_worker_info_.begin(); |
| it != pending_shared_worker_info_.end();) { |
| if (it->worker == worker && it->name == name && |
| it->constructor_origin == constructor_origin) { |
| BrowsingDataSharedWorkerHelper::DeleteSharedWorker( |
| it->worker, it->name, it->constructor_origin); |
| it = pending_shared_worker_info_.erase(it); |
| } else { |
| ++it; |
| } |
| } |
| } |