OLD | NEW |
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/native/aw_quota_manager_bridge_impl.h" | 5 #include "android_webview/native/aw_quota_manager_bridge_impl.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "android_webview/browser/aw_browser_context.h" | 9 #include "android_webview/browser/aw_browser_context.h" |
10 #include "android_webview/browser/aw_content_browser_client.h" | 10 #include "android_webview/browser/aw_content_browser_client.h" |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 size_t num_callbacks_received_; | 67 size_t num_callbacks_received_; |
68 | 68 |
69 DISALLOW_COPY_AND_ASSIGN(GetOriginsTask); | 69 DISALLOW_COPY_AND_ASSIGN(GetOriginsTask); |
70 }; | 70 }; |
71 | 71 |
72 GetOriginsTask::GetOriginsTask( | 72 GetOriginsTask::GetOriginsTask( |
73 const AwQuotaManagerBridgeImpl::GetOriginsCallback& callback, | 73 const AwQuotaManagerBridgeImpl::GetOriginsCallback& callback, |
74 QuotaManager* quota_manager) | 74 QuotaManager* quota_manager) |
75 : ui_callback_(callback), | 75 : ui_callback_(callback), |
76 quota_manager_(quota_manager) { | 76 quota_manager_(quota_manager) { |
77 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 77 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
78 } | 78 } |
79 | 79 |
80 GetOriginsTask::~GetOriginsTask() {} | 80 GetOriginsTask::~GetOriginsTask() {} |
81 | 81 |
82 void GetOriginsTask::Run() { | 82 void GetOriginsTask::Run() { |
83 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 83 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
84 BrowserThread::PostTask( | 84 BrowserThread::PostTask( |
85 BrowserThread::IO, | 85 BrowserThread::IO, |
86 FROM_HERE, | 86 FROM_HERE, |
87 base::Bind(&QuotaManager::GetOriginsModifiedSince, | 87 base::Bind(&QuotaManager::GetOriginsModifiedSince, |
88 quota_manager_, | 88 quota_manager_, |
89 storage::kStorageTypeTemporary, | 89 storage::kStorageTypeTemporary, |
90 base::Time() /* Since beginning of time. */, | 90 base::Time() /* Since beginning of time. */, |
91 base::Bind(&GetOriginsTask::OnOriginsObtained, this))); | 91 base::Bind(&GetOriginsTask::OnOriginsObtained, this))); |
92 } | 92 } |
93 | 93 |
94 void GetOriginsTask::OnOriginsObtained(const std::set<GURL>& origins, | 94 void GetOriginsTask::OnOriginsObtained(const std::set<GURL>& origins, |
95 storage::StorageType type) { | 95 storage::StorageType type) { |
96 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 96 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
97 num_callbacks_to_wait_ = origins.size(); | 97 num_callbacks_to_wait_ = origins.size(); |
98 num_callbacks_received_ = 0u; | 98 num_callbacks_received_ = 0u; |
99 | 99 |
100 for (std::set<GURL>::const_iterator origin = origins.begin(); | 100 for (std::set<GURL>::const_iterator origin = origins.begin(); |
101 origin != origins.end(); | 101 origin != origins.end(); |
102 ++origin) { | 102 ++origin) { |
103 quota_manager_->GetUsageAndQuota( | 103 quota_manager_->GetUsageAndQuota( |
104 *origin, | 104 *origin, |
105 type, | 105 type, |
106 base::Bind(&GetOriginsTask::OnUsageAndQuotaObtained, this, *origin)); | 106 base::Bind(&GetOriginsTask::OnUsageAndQuotaObtained, this, *origin)); |
107 } | 107 } |
108 | 108 |
109 CheckDone(); | 109 CheckDone(); |
110 } | 110 } |
111 | 111 |
112 void GetOriginsTask::OnUsageAndQuotaObtained( | 112 void GetOriginsTask::OnUsageAndQuotaObtained( |
113 const GURL& origin, | 113 const GURL& origin, |
114 storage::QuotaStatusCode status_code, | 114 storage::QuotaStatusCode status_code, |
115 int64 usage, | 115 int64 usage, |
116 int64 quota) { | 116 int64 quota) { |
117 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 117 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
118 if (status_code == storage::kQuotaStatusOk) { | 118 if (status_code == storage::kQuotaStatusOk) { |
119 origin_.push_back(origin.spec()); | 119 origin_.push_back(origin.spec()); |
120 usage_.push_back(usage); | 120 usage_.push_back(usage); |
121 quota_.push_back(quota); | 121 quota_.push_back(quota); |
122 } | 122 } |
123 | 123 |
124 ++num_callbacks_received_; | 124 ++num_callbacks_received_; |
125 CheckDone(); | 125 CheckDone(); |
126 } | 126 } |
127 | 127 |
128 void GetOriginsTask::CheckDone() { | 128 void GetOriginsTask::CheckDone() { |
129 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 129 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
130 if (num_callbacks_received_ == num_callbacks_to_wait_) { | 130 if (num_callbacks_received_ == num_callbacks_to_wait_) { |
131 BrowserThread::PostTask( | 131 BrowserThread::PostTask( |
132 BrowserThread::UI, | 132 BrowserThread::UI, |
133 FROM_HERE, | 133 FROM_HERE, |
134 base::Bind(&GetOriginsTask::DoneOnUIThread, this)); | 134 base::Bind(&GetOriginsTask::DoneOnUIThread, this)); |
135 } else if (num_callbacks_received_ > num_callbacks_to_wait_) { | 135 } else if (num_callbacks_received_ > num_callbacks_to_wait_) { |
136 NOTREACHED(); | 136 NOTREACHED(); |
137 } | 137 } |
138 } | 138 } |
139 | 139 |
140 // This method is to avoid copying the 3 vector arguments into a bound callback. | 140 // This method is to avoid copying the 3 vector arguments into a bound callback. |
141 void GetOriginsTask::DoneOnUIThread() { | 141 void GetOriginsTask::DoneOnUIThread() { |
142 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 142 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
143 ui_callback_.Run(origin_, usage_, quota_); | 143 ui_callback_.Run(origin_, usage_, quota_); |
144 } | 144 } |
145 | 145 |
146 void RunOnUIThread(const base::Closure& task) { | 146 void RunOnUIThread(const base::Closure& task) { |
147 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { | 147 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
148 task.Run(); | 148 task.Run(); |
149 } else { | 149 } else { |
150 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, task); | 150 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, task); |
151 } | 151 } |
152 } | 152 } |
(...skipping 24 matching lines...) Expand all Loading... |
177 weak_factory_(this) { | 177 weak_factory_(this) { |
178 } | 178 } |
179 | 179 |
180 AwQuotaManagerBridgeImpl::~AwQuotaManagerBridgeImpl() {} | 180 AwQuotaManagerBridgeImpl::~AwQuotaManagerBridgeImpl() {} |
181 | 181 |
182 void AwQuotaManagerBridgeImpl::Init(JNIEnv* env, jobject object) { | 182 void AwQuotaManagerBridgeImpl::Init(JNIEnv* env, jobject object) { |
183 java_ref_ = JavaObjectWeakGlobalRef(env, object); | 183 java_ref_ = JavaObjectWeakGlobalRef(env, object); |
184 } | 184 } |
185 | 185 |
186 StoragePartition* AwQuotaManagerBridgeImpl::GetStoragePartition() const { | 186 StoragePartition* AwQuotaManagerBridgeImpl::GetStoragePartition() const { |
187 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 187 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
188 | 188 |
189 // AndroidWebview does not use per-site storage partitions. | 189 // AndroidWebview does not use per-site storage partitions. |
190 StoragePartition* storage_partition = | 190 StoragePartition* storage_partition = |
191 content::BrowserContext::GetDefaultStoragePartition(browser_context_); | 191 content::BrowserContext::GetDefaultStoragePartition(browser_context_); |
192 DCHECK(storage_partition); | 192 DCHECK(storage_partition); |
193 return storage_partition; | 193 return storage_partition; |
194 } | 194 } |
195 | 195 |
196 QuotaManager* AwQuotaManagerBridgeImpl::GetQuotaManager() const { | 196 QuotaManager* AwQuotaManagerBridgeImpl::GetQuotaManager() const { |
197 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 197 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
198 | 198 |
199 QuotaManager* quota_manager = GetStoragePartition()->GetQuotaManager(); | 199 QuotaManager* quota_manager = GetStoragePartition()->GetQuotaManager(); |
200 DCHECK(quota_manager); | 200 DCHECK(quota_manager); |
201 return quota_manager; | 201 return quota_manager; |
202 } | 202 } |
203 | 203 |
204 void AwQuotaManagerBridgeImpl::DeleteAllData(JNIEnv* env, jobject object) { | 204 void AwQuotaManagerBridgeImpl::DeleteAllData(JNIEnv* env, jobject object) { |
205 RunOnUIThread(base::Bind(&AwQuotaManagerBridgeImpl::DeleteAllDataOnUiThread, | 205 RunOnUIThread(base::Bind(&AwQuotaManagerBridgeImpl::DeleteAllDataOnUiThread, |
206 this)); | 206 this)); |
207 } | 207 } |
208 | 208 |
209 void AwQuotaManagerBridgeImpl::DeleteAllDataOnUiThread() { | 209 void AwQuotaManagerBridgeImpl::DeleteAllDataOnUiThread() { |
210 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 210 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
211 GetStoragePartition()->ClearData( | 211 GetStoragePartition()->ClearData( |
212 // Clear all web storage data except cookies. | 212 // Clear all web storage data except cookies. |
213 StoragePartition::REMOVE_DATA_MASK_APPCACHE | | 213 StoragePartition::REMOVE_DATA_MASK_APPCACHE | |
214 StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS | | 214 StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS | |
215 StoragePartition::REMOVE_DATA_MASK_INDEXEDDB | | 215 StoragePartition::REMOVE_DATA_MASK_INDEXEDDB | |
216 StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE | | 216 StoragePartition::REMOVE_DATA_MASK_LOCAL_STORAGE | |
217 StoragePartition::REMOVE_DATA_MASK_WEBSQL, | 217 StoragePartition::REMOVE_DATA_MASK_WEBSQL, |
218 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_TEMPORARY, | 218 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_TEMPORARY, |
219 GURL(), StoragePartition::OriginMatcherFunction(), | 219 GURL(), StoragePartition::OriginMatcherFunction(), |
220 base::Time(), base::Time::Max(), base::Bind(&base::DoNothing)); | 220 base::Time(), base::Time::Max(), base::Bind(&base::DoNothing)); |
221 } | 221 } |
222 | 222 |
223 void AwQuotaManagerBridgeImpl::DeleteOrigin( | 223 void AwQuotaManagerBridgeImpl::DeleteOrigin( |
224 JNIEnv* env, jobject object, jstring origin) { | 224 JNIEnv* env, jobject object, jstring origin) { |
225 base::string16 origin_string( | 225 base::string16 origin_string( |
226 base::android::ConvertJavaStringToUTF16(env, origin)); | 226 base::android::ConvertJavaStringToUTF16(env, origin)); |
227 RunOnUIThread(base::Bind(&AwQuotaManagerBridgeImpl::DeleteOriginOnUiThread, | 227 RunOnUIThread(base::Bind(&AwQuotaManagerBridgeImpl::DeleteOriginOnUiThread, |
228 this, | 228 this, |
229 origin_string)); | 229 origin_string)); |
230 } | 230 } |
231 | 231 |
232 void AwQuotaManagerBridgeImpl::DeleteOriginOnUiThread( | 232 void AwQuotaManagerBridgeImpl::DeleteOriginOnUiThread( |
233 const base::string16& origin) { | 233 const base::string16& origin) { |
234 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 234 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
235 StoragePartition* storage_partition = GetStoragePartition(); | 235 StoragePartition* storage_partition = GetStoragePartition(); |
236 storage_partition->ClearDataForOrigin( | 236 storage_partition->ClearDataForOrigin( |
237 // All (temporary) QuotaClient types. | 237 // All (temporary) QuotaClient types. |
238 StoragePartition::REMOVE_DATA_MASK_APPCACHE | | 238 StoragePartition::REMOVE_DATA_MASK_APPCACHE | |
239 StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS | | 239 StoragePartition::REMOVE_DATA_MASK_FILE_SYSTEMS | |
240 StoragePartition::REMOVE_DATA_MASK_INDEXEDDB | | 240 StoragePartition::REMOVE_DATA_MASK_INDEXEDDB | |
241 StoragePartition::REMOVE_DATA_MASK_WEBSQL, | 241 StoragePartition::REMOVE_DATA_MASK_WEBSQL, |
242 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_TEMPORARY, | 242 StoragePartition::QUOTA_MANAGED_STORAGE_MASK_TEMPORARY, |
243 GURL(origin), | 243 GURL(origin), |
244 storage_partition->GetURLRequestContext(), | 244 storage_partition->GetURLRequestContext(), |
245 base::Bind(&base::DoNothing)); | 245 base::Bind(&base::DoNothing)); |
246 } | 246 } |
247 | 247 |
248 void AwQuotaManagerBridgeImpl::GetOrigins( | 248 void AwQuotaManagerBridgeImpl::GetOrigins( |
249 JNIEnv* env, jobject object, jint callback_id) { | 249 JNIEnv* env, jobject object, jint callback_id) { |
250 RunOnUIThread(base::Bind(&AwQuotaManagerBridgeImpl::GetOriginsOnUiThread, | 250 RunOnUIThread(base::Bind(&AwQuotaManagerBridgeImpl::GetOriginsOnUiThread, |
251 this, | 251 this, |
252 callback_id)); | 252 callback_id)); |
253 } | 253 } |
254 | 254 |
255 void AwQuotaManagerBridgeImpl::GetOriginsOnUiThread(jint callback_id) { | 255 void AwQuotaManagerBridgeImpl::GetOriginsOnUiThread(jint callback_id) { |
256 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 256 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
257 | 257 |
258 const GetOriginsCallback ui_callback = base::Bind( | 258 const GetOriginsCallback ui_callback = base::Bind( |
259 &AwQuotaManagerBridgeImpl::GetOriginsCallbackImpl, | 259 &AwQuotaManagerBridgeImpl::GetOriginsCallbackImpl, |
260 weak_factory_.GetWeakPtr(), | 260 weak_factory_.GetWeakPtr(), |
261 callback_id); | 261 callback_id); |
262 | 262 |
263 (new GetOriginsTask(ui_callback, GetQuotaManager()))->Run(); | 263 (new GetOriginsTask(ui_callback, GetQuotaManager()))->Run(); |
264 } | 264 } |
265 | 265 |
266 void AwQuotaManagerBridgeImpl::GetOriginsCallbackImpl( | 266 void AwQuotaManagerBridgeImpl::GetOriginsCallbackImpl( |
267 int jcallback_id, | 267 int jcallback_id, |
268 const std::vector<std::string>& origin, | 268 const std::vector<std::string>& origin, |
269 const std::vector<int64>& usage, | 269 const std::vector<int64>& usage, |
270 const std::vector<int64>& quota) { | 270 const std::vector<int64>& quota) { |
271 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 271 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
272 JNIEnv* env = AttachCurrentThread(); | 272 JNIEnv* env = AttachCurrentThread(); |
273 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 273 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
274 if (obj.is_null()) | 274 if (obj.is_null()) |
275 return; | 275 return; |
276 | 276 |
277 Java_AwQuotaManagerBridge_onGetOriginsCallback( | 277 Java_AwQuotaManagerBridge_onGetOriginsCallback( |
278 env, | 278 env, |
279 obj.obj(), | 279 obj.obj(), |
280 jcallback_id, | 280 jcallback_id, |
281 base::android::ToJavaArrayOfStrings(env, origin).obj(), | 281 base::android::ToJavaArrayOfStrings(env, origin).obj(), |
282 base::android::ToJavaLongArray(env, usage).obj(), | 282 base::android::ToJavaLongArray(env, usage).obj(), |
283 base::android::ToJavaLongArray(env, quota).obj()); | 283 base::android::ToJavaLongArray(env, quota).obj()); |
284 } | 284 } |
285 | 285 |
286 namespace { | 286 namespace { |
287 | 287 |
288 void OnUsageAndQuotaObtained( | 288 void OnUsageAndQuotaObtained( |
289 const AwQuotaManagerBridgeImpl::QuotaUsageCallback& ui_callback, | 289 const AwQuotaManagerBridgeImpl::QuotaUsageCallback& ui_callback, |
290 storage::QuotaStatusCode status_code, | 290 storage::QuotaStatusCode status_code, |
291 int64 usage, | 291 int64 usage, |
292 int64 quota) { | 292 int64 quota) { |
293 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 293 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
294 if (status_code != storage::kQuotaStatusOk) { | 294 if (status_code != storage::kQuotaStatusOk) { |
295 usage = 0; | 295 usage = 0; |
296 quota = 0; | 296 quota = 0; |
297 } | 297 } |
298 BrowserThread::PostTask( | 298 BrowserThread::PostTask( |
299 BrowserThread::UI, | 299 BrowserThread::UI, |
300 FROM_HERE, | 300 FROM_HERE, |
301 base::Bind(ui_callback, usage, quota)); | 301 base::Bind(ui_callback, usage, quota)); |
302 } | 302 } |
303 | 303 |
(...skipping 11 matching lines...) Expand all Loading... |
315 this, | 315 this, |
316 origin_string, | 316 origin_string, |
317 callback_id, | 317 callback_id, |
318 is_quota)); | 318 is_quota)); |
319 } | 319 } |
320 | 320 |
321 void AwQuotaManagerBridgeImpl::GetUsageAndQuotaForOriginOnUiThread( | 321 void AwQuotaManagerBridgeImpl::GetUsageAndQuotaForOriginOnUiThread( |
322 const base::string16& origin, | 322 const base::string16& origin, |
323 jint callback_id, | 323 jint callback_id, |
324 bool is_quota) { | 324 bool is_quota) { |
325 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 325 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
326 const QuotaUsageCallback ui_callback = base::Bind( | 326 const QuotaUsageCallback ui_callback = base::Bind( |
327 &AwQuotaManagerBridgeImpl::QuotaUsageCallbackImpl, | 327 &AwQuotaManagerBridgeImpl::QuotaUsageCallbackImpl, |
328 weak_factory_.GetWeakPtr(), | 328 weak_factory_.GetWeakPtr(), |
329 callback_id, | 329 callback_id, |
330 is_quota); | 330 is_quota); |
331 | 331 |
332 BrowserThread::PostTask( | 332 BrowserThread::PostTask( |
333 BrowserThread::IO, | 333 BrowserThread::IO, |
334 FROM_HERE, | 334 FROM_HERE, |
335 base::Bind(&QuotaManager::GetUsageAndQuota, | 335 base::Bind(&QuotaManager::GetUsageAndQuota, |
336 GetQuotaManager(), | 336 GetQuotaManager(), |
337 GURL(origin), | 337 GURL(origin), |
338 storage::kStorageTypeTemporary, | 338 storage::kStorageTypeTemporary, |
339 base::Bind(&OnUsageAndQuotaObtained, ui_callback))); | 339 base::Bind(&OnUsageAndQuotaObtained, ui_callback))); |
340 } | 340 } |
341 | 341 |
342 void AwQuotaManagerBridgeImpl::QuotaUsageCallbackImpl( | 342 void AwQuotaManagerBridgeImpl::QuotaUsageCallbackImpl( |
343 int jcallback_id, bool is_quota, int64 usage, int64 quota) { | 343 int jcallback_id, bool is_quota, int64 usage, int64 quota) { |
344 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 344 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
345 JNIEnv* env = AttachCurrentThread(); | 345 JNIEnv* env = AttachCurrentThread(); |
346 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 346 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
347 if (obj.is_null()) | 347 if (obj.is_null()) |
348 return; | 348 return; |
349 | 349 |
350 Java_AwQuotaManagerBridge_onGetUsageAndQuotaForOriginCallback( | 350 Java_AwQuotaManagerBridge_onGetUsageAndQuotaForOriginCallback( |
351 env, obj.obj(), jcallback_id, is_quota, usage, quota); | 351 env, obj.obj(), jcallback_id, is_quota, usage, quota); |
352 } | 352 } |
353 | 353 |
354 bool RegisterAwQuotaManagerBridge(JNIEnv* env) { | 354 bool RegisterAwQuotaManagerBridge(JNIEnv* env) { |
355 return RegisterNativesImpl(env); | 355 return RegisterNativesImpl(env); |
356 } | 356 } |
357 | 357 |
358 } // namespace android_webview | 358 } // namespace android_webview |
OLD | NEW |