OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "chrome/browser/android/preferences/website_preference_bridge.h" | 5 #include "chrome/browser/android/preferences/website_preference_bridge.h" |
6 | 6 |
7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
9 #include "base/android/scoped_java_ref.h" | 9 #include "base/android/scoped_java_ref.h" |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
13 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
14 #include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h" | 14 #include "chrome/browser/browsing_data/browsing_data_local_storage_helper.h" |
15 #include "chrome/browser/browsing_data/cookies_tree_model.h" | |
16 #include "chrome/browser/browsing_data/local_data_container.h" | |
15 #include "chrome/browser/content_settings/cookie_settings.h" | 17 #include "chrome/browser/content_settings/cookie_settings.h" |
16 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
17 #include "chrome/browser/profiles/profile_manager.h" | 19 #include "chrome/browser/profiles/profile_manager.h" |
18 #include "components/content_settings/core/browser/host_content_settings_map.h" | 20 #include "components/content_settings/core/browser/host_content_settings_map.h" |
19 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
20 #include "content/public/browser/storage_partition.h" | 22 #include "content/public/browser/storage_partition.h" |
21 #include "jni/WebsitePreferenceBridge_jni.h" | 23 #include "jni/WebsitePreferenceBridge_jni.h" |
22 #include "storage/browser/quota/quota_client.h" | 24 #include "storage/browser/quota/quota_client.h" |
23 #include "storage/browser/quota/quota_manager.h" | 25 #include "storage/browser/quota/quota_manager.h" |
24 | 26 |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
278 if (value == -1) { | 280 if (value == -1) { |
279 GetCookieSettings()->ResetCookieSetting(primary_pattern, secondary_pattern); | 281 GetCookieSettings()->ResetCookieSetting(primary_pattern, secondary_pattern); |
280 } else { | 282 } else { |
281 GetCookieSettings()->SetCookieSetting(primary_pattern, secondary_pattern, | 283 GetCookieSettings()->SetCookieSetting(primary_pattern, secondary_pattern, |
282 value ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); | 284 value ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); |
283 } | 285 } |
284 } | 286 } |
285 | 287 |
286 namespace { | 288 namespace { |
287 | 289 |
290 class SiteDataDeleteHelper : | |
291 public base::RefCountedThreadSafe<SiteDataDeleteHelper>, | |
292 public CookiesTreeModel::Observer { | |
293 public: | |
294 SiteDataDeleteHelper(Profile* profile, const GURL& domain) | |
295 : profile_(profile), domain_(domain), ending_batch_processing_(false) { | |
296 } | |
297 | |
298 void Run() { | |
299 AddRef(); // Balanced in TreeModelEndBatch. | |
300 | |
301 content::StoragePartition* storage_partition = | |
302 content::BrowserContext::GetDefaultStoragePartition(profile_); | |
303 content::IndexedDBContext* indexed_db_context = | |
304 storage_partition->GetIndexedDBContext(); | |
305 content::ServiceWorkerContext* service_worker_context = | |
306 storage_partition->GetServiceWorkerContext(); | |
307 storage::FileSystemContext* file_system_context = | |
308 storage_partition->GetFileSystemContext(); | |
309 LocalDataContainer* container = new LocalDataContainer( | |
310 new BrowsingDataCookieHelper(profile_->GetRequestContext()), | |
311 new BrowsingDataDatabaseHelper(profile_), | |
312 new BrowsingDataLocalStorageHelper(profile_), | |
313 NULL, | |
314 new BrowsingDataAppCacheHelper(profile_), | |
315 new BrowsingDataIndexedDBHelper(indexed_db_context), | |
316 BrowsingDataFileSystemHelper::Create(file_system_context), | |
317 BrowsingDataQuotaHelper::Create(profile_), | |
318 BrowsingDataChannelIDHelper::Create(profile_->GetRequestContext()), | |
319 new BrowsingDataServiceWorkerHelper(service_worker_context), | |
320 NULL); | |
321 | |
322 cookies_tree_model_.reset(new CookiesTreeModel( | |
323 container, profile_->GetExtensionSpecialStoragePolicy(), false)); | |
324 cookies_tree_model_->AddCookiesTreeObserver(this); | |
325 } | |
326 | |
327 // TreeModelObserver: | |
328 void TreeNodesAdded(ui::TreeModel* model, | |
329 ui::TreeModelNode* parent, | |
330 int start, | |
331 int count) override {} | |
332 void TreeNodesRemoved(ui::TreeModel* model, | |
333 ui::TreeModelNode* parent, | |
334 int start, | |
335 int count) override {} | |
336 | |
337 // CookiesTreeModel::Observer: | |
338 void TreeNodeChanged(ui::TreeModel* model, ui::TreeModelNode* node) override { | |
339 } | |
340 | |
341 void TreeModelBeginBatch(CookiesTreeModel* model) override { | |
342 DCHECK(!ending_batch_processing_); // Extra batch-start sent. | |
343 } | |
344 | |
345 void TreeModelEndBatch(CookiesTreeModel* model) override { | |
newt (away)
2015/01/23 02:23:14
It's not clear to me that TreeModelEndBatch is gua
Finnur
2015/01/26 10:47:22
Incidentally, I've become intimately familiar with
| |
346 DCHECK(!ending_batch_processing_); // Already in end-stage. | |
347 ending_batch_processing_ = true; | |
348 | |
349 RecursivelyFindSiteAndDelete(cookies_tree_model_->GetRoot()); | |
350 | |
351 // This will result in this class getting deleted. | |
352 Release(); | |
353 } | |
354 | |
355 void RecursivelyFindSiteAndDelete(CookieTreeNode* node) { | |
356 CookieTreeNode::DetailedInfo info = node->GetDetailedInfo(); | |
357 bool delete_this_node = false; | |
358 if (info.node_type == CookieTreeNode::DetailedInfo::TYPE_COOKIE && | |
359 info.cookie && | |
360 domain_.DomainIs(info.cookie->Domain().c_str())) | |
361 delete_this_node = true; | |
362 | |
363 for (int i = node->child_count(); i > 0; --i) | |
newt (away)
2015/01/23 02:23:14
Why can't you move this for loop up to before the
Finnur
2015/01/26 10:47:22
At one point I needed to delete last, but then man
| |
364 RecursivelyFindSiteAndDelete(node->GetChild(i - 1)); | |
newt (away)
2015/01/23 02:23:14
Can COOKIE nodes contain other COOKIE nodes?
Finnur
2015/01/26 10:47:22
I don't believe so. What I see is a tree that look
| |
365 | |
366 if (delete_this_node) | |
367 cookies_tree_model_->DeleteCookieNode(node); | |
368 } | |
369 | |
370 private: | |
371 friend class base::RefCountedThreadSafe<SiteDataDeleteHelper>; | |
372 | |
373 virtual ~SiteDataDeleteHelper() {} | |
374 | |
375 Profile* profile_; | |
376 | |
377 // The domain we want to delete data for. | |
378 GURL domain_; | |
379 | |
380 // Keeps track of when we're ready to close batch processing. | |
381 bool ending_batch_processing_; | |
382 | |
383 scoped_ptr<CookiesTreeModel> cookies_tree_model_; | |
384 | |
385 DISALLOW_COPY_AND_ASSIGN(SiteDataDeleteHelper); | |
386 }; | |
387 | |
288 class StorageInfoFetcher : | 388 class StorageInfoFetcher : |
289 public base::RefCountedThreadSafe<StorageInfoFetcher> { | 389 public base::RefCountedThreadSafe<StorageInfoFetcher> { |
290 public: | 390 public: |
291 StorageInfoFetcher(storage::QuotaManager* quota_manager, | 391 StorageInfoFetcher(storage::QuotaManager* quota_manager, |
292 const JavaRef<jobject>& java_callback) | 392 const JavaRef<jobject>& java_callback) |
293 : env_(base::android::AttachCurrentThread()), | 393 : env_(base::android::AttachCurrentThread()), |
294 quota_manager_(quota_manager), | 394 quota_manager_(quota_manager), |
295 java_callback_(java_callback) { | 395 java_callback_(java_callback) { |
296 } | 396 } |
297 | 397 |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
493 std::string host = ConvertJavaStringToUTF8(env, jhost); | 593 std::string host = ConvertJavaStringToUTF8(env, jhost); |
494 scoped_refptr<StorageDataDeleter> storage_data_deleter(new StorageDataDeleter( | 594 scoped_refptr<StorageDataDeleter> storage_data_deleter(new StorageDataDeleter( |
495 content::BrowserContext::GetDefaultStoragePartition( | 595 content::BrowserContext::GetDefaultStoragePartition( |
496 profile)->GetQuotaManager(), | 596 profile)->GetQuotaManager(), |
497 host, | 597 host, |
498 static_cast<storage::StorageType>(type), | 598 static_cast<storage::StorageType>(type), |
499 ScopedJavaLocalRef<jobject>(env, java_callback))); | 599 ScopedJavaLocalRef<jobject>(env, java_callback))); |
500 storage_data_deleter->Run(); | 600 storage_data_deleter->Run(); |
501 } | 601 } |
502 | 602 |
603 static void ClearCookieData(JNIEnv* env, jclass clazz, jstring jorigin) { | |
604 Profile* profile = ProfileManager::GetActiveUserProfile(); | |
605 GURL url(ConvertJavaStringToUTF8(env, jorigin)); | |
606 scoped_refptr<SiteDataDeleteHelper> site_data_deleter( | |
607 new SiteDataDeleteHelper(profile, url)); | |
608 site_data_deleter->Run(); | |
609 } | |
610 | |
503 // Register native methods | 611 // Register native methods |
504 bool RegisterWebsitePreferenceBridge(JNIEnv* env) { | 612 bool RegisterWebsitePreferenceBridge(JNIEnv* env) { |
505 return RegisterNativesImpl(env); | 613 return RegisterNativesImpl(env); |
506 } | 614 } |
OLD | NEW |