blob: 7c9371d1e1dec4a414fa77b68a7c2d06db3c04a0 [file] [log] [blame]
// 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;
}
}
}