1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "components/browsing_data/content/service_worker_helper.h"
6
7 #include <tuple>
8 #include <utility>
9 #include <vector>
10
11 #include "base/bind.h"
12 #include "base/callback_helpers.h"
13 #include "base/location.h"
14 #include "components/browsing_data/content/browsing_data_helper.h"
15 #include "content/public/browser/browser_task_traits.h"
16 #include "content/public/browser/browser_thread.h"
17 #include "content/public/browser/service_worker_context.h"
18 #include "content/public/browser/storage_usage_info.h"
19
20 using content::BrowserThread;
21 using content::ServiceWorkerContext;
22 using content::StorageUsageInfo;
23
24 namespace browsing_data {
25 namespace {
26
GetAllOriginsInfoForServiceWorkerCallback(ServiceWorkerHelper::FetchCallback callback,const std::vector<StorageUsageInfo> & origins)27 void GetAllOriginsInfoForServiceWorkerCallback(
28 ServiceWorkerHelper::FetchCallback callback,
29 const std::vector<StorageUsageInfo>& origins) {
30 DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
31 DCHECK(!callback.is_null());
32
33 std::list<StorageUsageInfo> result;
34 for (const StorageUsageInfo& origin : origins) {
35 if (!HasWebScheme(origin.origin.GetURL()))
36 continue; // Non-websafe state is not considered browsing data.
37 result.push_back(origin);
38 }
39
40 content::RunOrPostTaskOnThread(FROM_HERE, BrowserThread::UI,
41 base::BindOnce(std::move(callback), result));
42 }
43
44 } // namespace
45
ServiceWorkerHelper(ServiceWorkerContext * service_worker_context)46 ServiceWorkerHelper::ServiceWorkerHelper(
47 ServiceWorkerContext* service_worker_context)
48 : service_worker_context_(service_worker_context) {
49 DCHECK(service_worker_context_);
50 }
51
~ServiceWorkerHelper()52 ServiceWorkerHelper::~ServiceWorkerHelper() {}
53
StartFetching(FetchCallback callback)54 void ServiceWorkerHelper::StartFetching(FetchCallback callback) {
55 DCHECK_CURRENTLY_ON(BrowserThread::UI);
56 DCHECK(!callback.is_null());
57 content::RunOrPostTaskOnThread(
58 FROM_HERE, ServiceWorkerContext::GetCoreThreadId(),
59 base::BindOnce(
60 &ServiceWorkerHelper::FetchServiceWorkerUsageInfoOnCoreThread, this,
61 std::move(callback)));
62 }
63
DeleteServiceWorkers(const url::Origin & origin)64 void ServiceWorkerHelper::DeleteServiceWorkers(const url::Origin& origin) {
65 DCHECK_CURRENTLY_ON(BrowserThread::UI);
66 content::RunOrPostTaskOnThread(
67 FROM_HERE, ServiceWorkerContext::GetCoreThreadId(),
68 base::BindOnce(&ServiceWorkerHelper::DeleteServiceWorkersOnCoreThread,
69 this, origin));
70 }
71
FetchServiceWorkerUsageInfoOnCoreThread(FetchCallback callback)72 void ServiceWorkerHelper::FetchServiceWorkerUsageInfoOnCoreThread(
73 FetchCallback callback) {
74 DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
75 DCHECK(!callback.is_null());
76
77 service_worker_context_->GetAllOriginsInfo(base::BindOnce(
78 &GetAllOriginsInfoForServiceWorkerCallback, std::move(callback)));
79 }
80
DeleteServiceWorkersOnCoreThread(const url::Origin & origin)81 void ServiceWorkerHelper::DeleteServiceWorkersOnCoreThread(
82 const url::Origin& origin) {
83 DCHECK_CURRENTLY_ON(ServiceWorkerContext::GetCoreThreadId());
84 service_worker_context_->DeleteForOrigin(origin, base::DoNothing());
85 }
86
CannedServiceWorkerHelper(content::ServiceWorkerContext * context)87 CannedServiceWorkerHelper::CannedServiceWorkerHelper(
88 content::ServiceWorkerContext* context)
89 : ServiceWorkerHelper(context) {}
90
~CannedServiceWorkerHelper()91 CannedServiceWorkerHelper::~CannedServiceWorkerHelper() {}
92
Add(const url::Origin & origin)93 void CannedServiceWorkerHelper::Add(const url::Origin& origin) {
94 if (!HasWebScheme(origin.GetURL()))
95 return; // Non-websafe state is not considered browsing data.
96
97 pending_origins_.insert(origin);
98 }
99
Reset()100 void CannedServiceWorkerHelper::Reset() {
101 pending_origins_.clear();
102 }
103
empty() const104 bool CannedServiceWorkerHelper::empty() const {
105 return pending_origins_.empty();
106 }
107
GetCount() const108 size_t CannedServiceWorkerHelper::GetCount() const {
109 return pending_origins_.size();
110 }
111
GetOrigins() const112 const std::set<url::Origin>& CannedServiceWorkerHelper::GetOrigins() const {
113 return pending_origins_;
114 }
115
StartFetching(FetchCallback callback)116 void CannedServiceWorkerHelper::StartFetching(FetchCallback callback) {
117 DCHECK_CURRENTLY_ON(BrowserThread::UI);
118 DCHECK(!callback.is_null());
119
120 std::list<StorageUsageInfo> result;
121 for (const auto& origin : pending_origins_)
122 result.emplace_back(origin, 0, base::Time());
123
124 content::GetUIThreadTaskRunner({})->PostTask(
125 FROM_HERE, base::BindOnce(std::move(callback), result));
126 }
127
DeleteServiceWorkers(const url::Origin & origin)128 void CannedServiceWorkerHelper::DeleteServiceWorkers(
129 const url::Origin& origin) {
130 pending_origins_.erase(origin);
131 ServiceWorkerHelper::DeleteServiceWorkers(origin);
132 }
133
134 } // namespace browsing_data
135