Chromium Code Reviews| 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 |