Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: android_webview/browser/aw_quota_manager_bridge.cc

Issue 2888173003: [WebView] Remove jni_dependency_factory.h (Closed)
Patch Set: add explicit Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "android_webview/browser/aw_quota_manager_bridge.h" 5 #include "android_webview/browser/aw_quota_manager_bridge.h"
6 6
7 #include <set>
8
9 #include "android_webview/browser/aw_browser_context.h"
10 #include "android_webview/browser/aw_content_browser_client.h"
11 #include "base/android/jni_array.h"
12 #include "base/android/jni_string.h"
13 #include "base/synchronization/waitable_event.h"
14 #include "content/public/browser/browser_thread.h"
15 #include "content/public/browser/storage_partition.h"
16 #include "content/public/common/content_client.h"
17 #include "jni/AwQuotaManagerBridge_jni.h"
18 #include "storage/browser/quota/quota_manager.h"
19 #include "storage/common/quota/quota_types.h"
20 #include "url/gurl.h"
21
22 using base::android::AttachCurrentThread;
23 using base::android::JavaParamRef;
24 using base::android::ScopedJavaLocalRef;
25 using content::BrowserThread;
26 using content::StoragePartition;
27 using storage::QuotaClient;
28 using storage::QuotaManager;
29
7 namespace android_webview { 30 namespace android_webview {
8 31
9 AwQuotaManagerBridge::AwQuotaManagerBridge() {} 32 namespace {
33
34 // This object lives on UI and IO threads. Care need to be taken to make sure
35 // there are no concurrent accesses to instance variables. Also this object
36 // is refcounted in the various callbacks, and is destroyed when all callbacks
37 // are destroyed at the end of DoneOnUIThread.
38 class GetOriginsTask : public base::RefCountedThreadSafe<GetOriginsTask> {
39 public:
40 GetOriginsTask(const AwQuotaManagerBridge::GetOriginsCallback& callback,
41 QuotaManager* quota_manager);
42
43 void Run();
44
45 private:
46 friend class base::RefCountedThreadSafe<GetOriginsTask>;
47 ~GetOriginsTask();
48
49 void OnOriginsObtained(const std::set<GURL>& origins,
50 storage::StorageType type);
51
52 void OnUsageAndQuotaObtained(const GURL& origin,
53 storage::QuotaStatusCode status_code,
54 int64_t usage,
55 int64_t quota);
56
57 void CheckDone();
58 void DoneOnUIThread();
59
60 AwQuotaManagerBridge::GetOriginsCallback ui_callback_;
61 scoped_refptr<QuotaManager> quota_manager_;
62
63 std::vector<std::string> origin_;
64 std::vector<int64_t> usage_;
65 std::vector<int64_t> quota_;
66
67 size_t num_callbacks_to_wait_;
68 size_t num_callbacks_received_;
69
70 DISALLOW_COPY_AND_ASSIGN(GetOriginsTask);
71 };
72
73 GetOriginsTask::GetOriginsTask(
74 const AwQuotaManagerBridge::GetOriginsCallback& callback,
75 QuotaManager* quota_manager)
76 : ui_callback_(callback), quota_manager_(quota_manager) {
77 DCHECK_CURRENTLY_ON(BrowserThread::UI);
78 }
79
80 GetOriginsTask::~GetOriginsTask() {}
81
82 void GetOriginsTask::Run() {
83 DCHECK_CURRENTLY_ON(BrowserThread::UI);
84 BrowserThread::PostTask(
85 BrowserThread::IO, FROM_HERE,
86 base::Bind(&QuotaManager::GetOriginsModifiedSince, quota_manager_,
87 storage::kStorageTypeTemporary,
88 base::Time() /* Since beginning of time. */,
89 base::Bind(&GetOriginsTask::OnOriginsObtained, this)));
90 }
91
92 void GetOriginsTask::OnOriginsObtained(const std::set<GURL>& origins,
93 storage::StorageType type) {
94 DCHECK_CURRENTLY_ON(BrowserThread::IO);
95 num_callbacks_to_wait_ = origins.size();
96 num_callbacks_received_ = 0u;
97
98 for (std::set<GURL>::const_iterator origin = origins.begin();
99 origin != origins.end(); ++origin) {
100 quota_manager_->GetUsageAndQuota(
101 *origin, type,
102 base::Bind(&GetOriginsTask::OnUsageAndQuotaObtained, this, *origin));
103 }
104
105 CheckDone();
106 }
107
108 void GetOriginsTask::OnUsageAndQuotaObtained(
109 const GURL& origin,
110 storage::QuotaStatusCode status_code,
111 int64_t usage,
112 int64_t quota) {
113 DCHECK_CURRENTLY_ON(BrowserThread::IO);
114 if (status_code == storage::kQuotaStatusOk) {
115 origin_.push_back(origin.spec());
116 usage_.push_back(usage);
117 quota_.push_back(quota);
118 }
119
120 ++num_callbacks_received_;
121 CheckDone();
122 }
123
124 void GetOriginsTask::CheckDone() {
125 DCHECK_CURRENTLY_ON(BrowserThread::IO);
126 if (num_callbacks_received_ == num_callbacks_to_wait_) {
127 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
128 base::Bind(&GetOriginsTask::DoneOnUIThread, this));
129 } else if (num_callbacks_received_ > num_callbacks_to_wait_) {
130 NOTREACHED();
131 }
132 }
133
134 // This method is to avoid copying the 3 vector arguments into a bound callback.
135 void GetOriginsTask::DoneOnUIThread() {
136 DCHECK_CURRENTLY_ON(BrowserThread::UI);
137 ui_callback_.Run(origin_, usage_, quota_);
138 }
139
140 void RunOnUIThread(const base::Closure& task) {
141 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
142 task.Run();
143 } else {
144 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, task);
145 }
146 }
147
148 } // namespace
149
150 // static
151 jlong GetDefaultNativeAwQuotaManagerBridge(JNIEnv* env,
152 const JavaParamRef<jclass>& clazz) {
153 AwBrowserContext* browser_context =
154 AwContentBrowserClient::GetAwBrowserContext();
155
156 AwQuotaManagerBridge* bridge = static_cast<AwQuotaManagerBridge*>(
157 browser_context->GetQuotaManagerBridge());
158 DCHECK(bridge);
159 return reinterpret_cast<intptr_t>(bridge);
160 }
161
162 // static
163 scoped_refptr<AwQuotaManagerBridge> AwQuotaManagerBridge::Create(
164 AwBrowserContext* browser_context) {
165 return new AwQuotaManagerBridge(browser_context);
166 }
167
168 AwQuotaManagerBridge::AwQuotaManagerBridge(AwBrowserContext* browser_context)
169 : browser_context_(browser_context), weak_factory_(this) {}
10 170
11 AwQuotaManagerBridge::~AwQuotaManagerBridge() {} 171 AwQuotaManagerBridge::~AwQuotaManagerBridge() {}
12 172
173 void AwQuotaManagerBridge::Init(JNIEnv* env,
174 const JavaParamRef<jobject>& object) {
175 java_ref_ = JavaObjectWeakGlobalRef(env, object);
176 }
177
178 StoragePartition* AwQuotaManagerBridge::GetStoragePartition() const {
179 DCHECK_CURRENTLY_ON(BrowserThread::UI);
180
181 // AndroidWebview does not use per-site storage partitions.
182 StoragePartition* storage_partition =
183 content::BrowserContext::GetDefaultStoragePartition(browser_context_);
184 DCHECK(storage_partition);
185 return storage_partition;
186 }
187
188 QuotaManager* AwQuotaManagerBridge::GetQuotaManager() const {
189 DCHECK_CURRENTLY_ON(BrowserThread::UI);
190
191 QuotaManager* quota_manager = GetStoragePartition()->GetQuotaManager();
192 DCHECK(quota_manager);
193 return quota_manager;
194 }
195
196 void AwQuotaManagerBridge::DeleteAllData(JNIEnv* env,
197 const JavaParamRef<jobject>& object) {
198 RunOnUIThread(
199 base::Bind(&AwQuotaManagerBridge::DeleteAllDataOnUiThread, this));
200 }
201
202 void AwQuotaManagerBridge::DeleteAllDataOnUiThread() {
203 DCHECK_CURRENTLY_ON(BrowserThread::UI);
204 GetStoragePartition()->ClearData(
205 // Clear all web storage data except cookies.
206 StoragePartition::REMOVE_DATA_MASK_APPCACHE |
207 StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
208 StoragePartition::REMOVE_DATA_MASK_INDEXEDDB |
209 StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE |
210 StoragePartition::REMOVE_DATA_MASK_WEBSQL,
211 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_TEMPORARY, GURL(),
212 StoragePartition::OriginMatcherFunction(), base::Time(),
213 base::Time::Max(), base::Bind(&base::DoNothing));
214 }
215
216 void AwQuotaManagerBridge::DeleteOrigin(JNIEnv* env,
217 const JavaParamRef<jobject>& object,
218 const JavaParamRef<jstring>& origin) {
219 base::string16 origin_string(
220 base::android::ConvertJavaStringToUTF16(env, origin));
221 RunOnUIThread(base::Bind(&AwQuotaManagerBridge::DeleteOriginOnUiThread, this,
222 origin_string));
223 }
224
225 void AwQuotaManagerBridge::DeleteOriginOnUiThread(
226 const base::string16& origin) {
227 DCHECK_CURRENTLY_ON(BrowserThread::UI);
228 StoragePartition* storage_partition = GetStoragePartition();
229 storage_partition->ClearDataForOrigin(
230 // All (temporary) QuotaClient types.
231 StoragePartition::REMOVE_DATA_MASK_APPCACHE |
232 StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS |
233 StoragePartition::REMOVE_DATA_MASK_INDEXEDDB |
234 StoragePartition::REMOVE_DATA_MASK_WEBSQL,
235 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_TEMPORARY, GURL(origin),
236 storage_partition->GetURLRequestContext(), base::Bind(&base::DoNothing));
237 }
238
239 void AwQuotaManagerBridge::GetOrigins(JNIEnv* env,
240 const JavaParamRef<jobject>& object,
241 jint callback_id) {
242 RunOnUIThread(base::Bind(&AwQuotaManagerBridge::GetOriginsOnUiThread, this,
243 callback_id));
244 }
245
246 void AwQuotaManagerBridge::GetOriginsOnUiThread(jint callback_id) {
247 DCHECK_CURRENTLY_ON(BrowserThread::UI);
248
249 const GetOriginsCallback ui_callback =
250 base::Bind(&AwQuotaManagerBridge::GetOriginsCallbackImpl,
251 weak_factory_.GetWeakPtr(), callback_id);
252
253 (new GetOriginsTask(ui_callback, GetQuotaManager()))->Run();
254 }
255
256 void AwQuotaManagerBridge::GetOriginsCallbackImpl(
257 int jcallback_id,
258 const std::vector<std::string>& origin,
259 const std::vector<int64_t>& usage,
260 const std::vector<int64_t>& quota) {
261 DCHECK_CURRENTLY_ON(BrowserThread::UI);
262 JNIEnv* env = AttachCurrentThread();
263 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
264 if (obj.is_null())
265 return;
266
267 Java_AwQuotaManagerBridge_onGetOriginsCallback(
268 env, obj, jcallback_id, base::android::ToJavaArrayOfStrings(env, origin),
269 base::android::ToJavaLongArray(env, usage),
270 base::android::ToJavaLongArray(env, quota));
271 }
272
273 namespace {
274
275 void OnUsageAndQuotaObtained(
276 const AwQuotaManagerBridge::QuotaUsageCallback& ui_callback,
277 storage::QuotaStatusCode status_code,
278 int64_t usage,
279 int64_t quota) {
280 DCHECK_CURRENTLY_ON(BrowserThread::IO);
281 if (status_code != storage::kQuotaStatusOk) {
282 usage = 0;
283 quota = 0;
284 }
285 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
286 base::Bind(ui_callback, usage, quota));
287 }
288
289 } // namespace
290
291 void AwQuotaManagerBridge::GetUsageAndQuotaForOrigin(
292 JNIEnv* env,
293 const JavaParamRef<jobject>& object,
294 const JavaParamRef<jstring>& origin,
295 jint callback_id,
296 bool is_quota) {
297 base::string16 origin_string(
298 base::android::ConvertJavaStringToUTF16(env, origin));
299 RunOnUIThread(
300 base::Bind(&AwQuotaManagerBridge::GetUsageAndQuotaForOriginOnUiThread,
301 this, origin_string, callback_id, is_quota));
302 }
303
304 void AwQuotaManagerBridge::GetUsageAndQuotaForOriginOnUiThread(
305 const base::string16& origin,
306 jint callback_id,
307 bool is_quota) {
308 DCHECK_CURRENTLY_ON(BrowserThread::UI);
309 const QuotaUsageCallback ui_callback =
310 base::Bind(&AwQuotaManagerBridge::QuotaUsageCallbackImpl,
311 weak_factory_.GetWeakPtr(), callback_id, is_quota);
312
313 BrowserThread::PostTask(
314 BrowserThread::IO, FROM_HERE,
315 base::Bind(&QuotaManager::GetUsageAndQuota, GetQuotaManager(),
316 GURL(origin), storage::kStorageTypeTemporary,
317 base::Bind(&OnUsageAndQuotaObtained, ui_callback)));
318 }
319
320 void AwQuotaManagerBridge::QuotaUsageCallbackImpl(int jcallback_id,
321 bool is_quota,
322 int64_t usage,
323 int64_t quota) {
324 DCHECK_CURRENTLY_ON(BrowserThread::UI);
325 JNIEnv* env = AttachCurrentThread();
326 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
327 if (obj.is_null())
328 return;
329
330 Java_AwQuotaManagerBridge_onGetUsageAndQuotaForOriginCallback(
331 env, obj, jcallback_id, is_quota, usage, quota);
332 }
333
334 bool RegisterAwQuotaManagerBridge(JNIEnv* env) {
335 return RegisterNativesImpl(env);
336 }
337
13 } // namespace android_webview 338 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/browser/aw_quota_manager_bridge.h ('k') | android_webview/browser/aw_quota_manager_bridge_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698