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