blob: fa9eb8a7921e35133e52a45f78cf5d6d37ea6331 [file] [log] [blame]
// Copyright 2014 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_service_worker_helper.h"
#include <tuple>
#include <vector>
#include "base/bind.h"
#include "base/location.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/service_worker_context.h"
using content::BrowserThread;
using content::ServiceWorkerContext;
using content::ServiceWorkerUsageInfo;
namespace {
void GetAllOriginsInfoForServiceWorkerCallback(
const BrowsingDataServiceWorkerHelper::FetchCallback& callback,
const std::vector<ServiceWorkerUsageInfo>& origins) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
DCHECK(!callback.is_null());
std::list<ServiceWorkerUsageInfo> result;
for (const ServiceWorkerUsageInfo& origin : origins) {
if (!BrowsingDataHelper::HasWebScheme(origin.origin))
continue; // Non-websafe state is not considered browsing data.
result.push_back(origin);
}
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::BindOnce(callback, result));
}
void EmptySuccessCallback(bool success) {}
} // namespace
BrowsingDataServiceWorkerHelper::BrowsingDataServiceWorkerHelper(
ServiceWorkerContext* service_worker_context)
: service_worker_context_(service_worker_context) {
DCHECK(service_worker_context_);
}
BrowsingDataServiceWorkerHelper::~BrowsingDataServiceWorkerHelper() {}
void BrowsingDataServiceWorkerHelper::StartFetching(
const FetchCallback& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(!callback.is_null());
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::BindOnce(&BrowsingDataServiceWorkerHelper::
FetchServiceWorkerUsageInfoOnIOThread,
this, callback));
}
void BrowsingDataServiceWorkerHelper::DeleteServiceWorkers(const GURL& origin) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::BindOnce(
&BrowsingDataServiceWorkerHelper::DeleteServiceWorkersOnIOThread,
this, origin));
}
void BrowsingDataServiceWorkerHelper::FetchServiceWorkerUsageInfoOnIOThread(
const FetchCallback& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
DCHECK(!callback.is_null());
service_worker_context_->GetAllOriginsInfo(
base::BindOnce(&GetAllOriginsInfoForServiceWorkerCallback, callback));
}
void BrowsingDataServiceWorkerHelper::DeleteServiceWorkersOnIOThread(
const GURL& origin) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
service_worker_context_->DeleteForOrigin(origin,
base::Bind(&EmptySuccessCallback));
}
CannedBrowsingDataServiceWorkerHelper::PendingServiceWorkerUsageInfo::
PendingServiceWorkerUsageInfo(const GURL& origin,
const std::vector<GURL>& scopes)
: origin(origin), scopes(scopes) {
}
CannedBrowsingDataServiceWorkerHelper::PendingServiceWorkerUsageInfo::
PendingServiceWorkerUsageInfo(const PendingServiceWorkerUsageInfo& other) =
default;
CannedBrowsingDataServiceWorkerHelper::PendingServiceWorkerUsageInfo::
~PendingServiceWorkerUsageInfo() {
}
bool CannedBrowsingDataServiceWorkerHelper::PendingServiceWorkerUsageInfo::
operator<(const PendingServiceWorkerUsageInfo& other) const {
return std::tie(origin, scopes) < std::tie(other.origin, other.scopes);
}
CannedBrowsingDataServiceWorkerHelper::CannedBrowsingDataServiceWorkerHelper(
content::ServiceWorkerContext* context)
: BrowsingDataServiceWorkerHelper(context) {
}
CannedBrowsingDataServiceWorkerHelper::
~CannedBrowsingDataServiceWorkerHelper() {
}
void CannedBrowsingDataServiceWorkerHelper::AddServiceWorker(
const GURL& origin, const std::vector<GURL>& scopes) {
if (!BrowsingDataHelper::HasWebScheme(origin))
return; // Non-websafe state is not considered browsing data.
pending_service_worker_info_.insert(
PendingServiceWorkerUsageInfo(origin, scopes));
}
void CannedBrowsingDataServiceWorkerHelper::Reset() {
pending_service_worker_info_.clear();
}
bool CannedBrowsingDataServiceWorkerHelper::empty() const {
return pending_service_worker_info_.empty();
}
size_t CannedBrowsingDataServiceWorkerHelper::GetServiceWorkerCount() const {
return pending_service_worker_info_.size();
}
const std::set<
CannedBrowsingDataServiceWorkerHelper::PendingServiceWorkerUsageInfo>&
CannedBrowsingDataServiceWorkerHelper::GetServiceWorkerUsageInfo() const {
return pending_service_worker_info_;
}
void CannedBrowsingDataServiceWorkerHelper::StartFetching(
const FetchCallback& callback) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
DCHECK(!callback.is_null());
std::list<ServiceWorkerUsageInfo> result;
for (const PendingServiceWorkerUsageInfo& pending_info :
pending_service_worker_info_) {
ServiceWorkerUsageInfo info(pending_info.origin, pending_info.scopes);
result.push_back(info);
}
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::BindOnce(callback, result));
}
void CannedBrowsingDataServiceWorkerHelper::DeleteServiceWorkers(
const GURL& origin) {
for (std::set<PendingServiceWorkerUsageInfo>::iterator it =
pending_service_worker_info_.begin();
it != pending_service_worker_info_.end();) {
if (it->origin == origin)
pending_service_worker_info_.erase(it++);
else
++it;
}
BrowsingDataServiceWorkerHelper::DeleteServiceWorkers(origin);
}