OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/cookies_tree_model.h" | 5 #include "chrome/browser/cookies_tree_model.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <functional> | 8 #include <functional> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
| 11 #include "base/bind.h" |
11 #include "base/callback.h" | 12 #include "base/callback.h" |
12 #include "base/memory/linked_ptr.h" | 13 #include "base/memory/linked_ptr.h" |
13 #include "base/string_util.h" | 14 #include "base/string_util.h" |
14 #include "base/utf_string_conversions.h" | 15 #include "base/utf_string_conversions.h" |
| 16 #include "chrome/browser/browsing_data_cookie_helper.h" |
15 #include "chrome/browser/content_settings/host_content_settings_map.h" | 17 #include "chrome/browser/content_settings/host_content_settings_map.h" |
16 #include "chrome/browser/extensions/extension_service.h" | 18 #include "chrome/browser/extensions/extension_service.h" |
17 #include "content/browser/in_process_webkit/webkit_context.h" | 19 #include "content/browser/in_process_webkit/webkit_context.h" |
18 #include "grit/generated_resources.h" | 20 #include "grit/generated_resources.h" |
19 #include "grit/theme_resources.h" | 21 #include "grit/theme_resources.h" |
20 #include "grit/ui_resources.h" | 22 #include "grit/ui_resources.h" |
21 #include "net/base/cookie_monster.h" | 23 #include "net/base/cookie_monster.h" |
22 #include "net/base/registry_controlled_domain.h" | 24 #include "net/base/registry_controlled_domain.h" |
23 #include "net/url_request/url_request_context.h" | 25 #include "net/url_request/url_request_context.h" |
24 #include "third_party/skia/include/core/SkBitmap.h" | 26 #include "third_party/skia/include/core/SkBitmap.h" |
(...skipping 30 matching lines...) Expand all Loading... |
55 CookieTreeCookieNode::~CookieTreeCookieNode() {} | 57 CookieTreeCookieNode::~CookieTreeCookieNode() {} |
56 | 58 |
57 void CookieTreeCookieNode::DeleteStoredObjects() { | 59 void CookieTreeCookieNode::DeleteStoredObjects() { |
58 // notify CookieMonster that we should delete this cookie | 60 // notify CookieMonster that we should delete this cookie |
59 // We have stored a copy of all the cookies in the model, and our model is | 61 // We have stored a copy of all the cookies in the model, and our model is |
60 // never re-calculated. Thus, we just need to delete the nodes from our | 62 // never re-calculated. Thus, we just need to delete the nodes from our |
61 // model, and tell CookieMonster to delete the cookies. We can keep the | 63 // model, and tell CookieMonster to delete the cookies. We can keep the |
62 // vector storing the cookies in-tact and not delete from there (that would | 64 // vector storing the cookies in-tact and not delete from there (that would |
63 // invalidate our pointers), and the fact that it contains semi out-of-date | 65 // invalidate our pointers), and the fact that it contains semi out-of-date |
64 // data is not problematic as we don't re-build the model based on that. | 66 // data is not problematic as we don't re-build the model based on that. |
65 GetModel()->cookie_monster_->DeleteCanonicalCookie(*cookie_); | 67 GetModel()->cookie_helper_->DeleteCookie(*cookie_); |
66 } | 68 } |
67 | 69 |
68 CookieTreeNode::DetailedInfo CookieTreeCookieNode::GetDetailedInfo() const { | 70 CookieTreeNode::DetailedInfo CookieTreeCookieNode::GetDetailedInfo() const { |
69 return DetailedInfo(parent()->parent()->GetTitle(), | 71 return DetailedInfo(parent()->parent()->GetTitle(), |
70 DetailedInfo::TYPE_COOKIE, | 72 DetailedInfo::TYPE_COOKIE, |
71 cookie_, NULL, NULL, NULL, NULL, NULL, NULL, NULL); | 73 cookie_, NULL, NULL, NULL, NULL, NULL, NULL, NULL); |
72 } | 74 } |
73 | 75 |
74 namespace { | 76 namespace { |
75 // comparison functor, for use in CookieTreeRootNode | 77 // comparison functor, for use in CookieTreeRootNode |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 children().end(), | 580 children().end(), |
579 new_child, | 581 new_child, |
580 NodeTitleComparator()); | 582 NodeTitleComparator()); |
581 GetModel()->Add(this, new_child, iter - children().begin()); | 583 GetModel()->Add(this, new_child, iter - children().begin()); |
582 } | 584 } |
583 | 585 |
584 /////////////////////////////////////////////////////////////////////////////// | 586 /////////////////////////////////////////////////////////////////////////////// |
585 // CookiesTreeModel, public: | 587 // CookiesTreeModel, public: |
586 | 588 |
587 CookiesTreeModel::CookiesTreeModel( | 589 CookiesTreeModel::CookiesTreeModel( |
588 net::CookieMonster* cookie_monster, | 590 BrowsingDataCookieHelper* cookie_helper, |
589 BrowsingDataDatabaseHelper* database_helper, | 591 BrowsingDataDatabaseHelper* database_helper, |
590 BrowsingDataLocalStorageHelper* local_storage_helper, | 592 BrowsingDataLocalStorageHelper* local_storage_helper, |
591 BrowsingDataLocalStorageHelper* session_storage_helper, | 593 BrowsingDataLocalStorageHelper* session_storage_helper, |
592 BrowsingDataAppCacheHelper* appcache_helper, | 594 BrowsingDataAppCacheHelper* appcache_helper, |
593 BrowsingDataIndexedDBHelper* indexed_db_helper, | 595 BrowsingDataIndexedDBHelper* indexed_db_helper, |
594 BrowsingDataFileSystemHelper* file_system_helper, | 596 BrowsingDataFileSystemHelper* file_system_helper, |
595 BrowsingDataQuotaHelper* quota_helper, | 597 BrowsingDataQuotaHelper* quota_helper, |
596 bool use_cookie_source) | 598 bool use_cookie_source) |
597 : ALLOW_THIS_IN_INITIALIZER_LIST(ui::TreeNodeModel<CookieTreeNode>( | 599 : ALLOW_THIS_IN_INITIALIZER_LIST(ui::TreeNodeModel<CookieTreeNode>( |
598 new CookieTreeRootNode(this))), | 600 new CookieTreeRootNode(this))), |
599 cookie_monster_(cookie_monster), | |
600 appcache_helper_(appcache_helper), | 601 appcache_helper_(appcache_helper), |
| 602 cookie_helper_(cookie_helper), |
601 database_helper_(database_helper), | 603 database_helper_(database_helper), |
602 local_storage_helper_(local_storage_helper), | 604 local_storage_helper_(local_storage_helper), |
603 session_storage_helper_(session_storage_helper), | 605 session_storage_helper_(session_storage_helper), |
604 indexed_db_helper_(indexed_db_helper), | 606 indexed_db_helper_(indexed_db_helper), |
605 file_system_helper_(file_system_helper), | 607 file_system_helper_(file_system_helper), |
606 quota_helper_(quota_helper), | 608 quota_helper_(quota_helper), |
607 batch_update_(0), | 609 batch_update_(0), |
608 use_cookie_source_(use_cookie_source) { | 610 use_cookie_source_(use_cookie_source) { |
609 LoadCookies(); | 611 DCHECK(cookie_helper_); |
| 612 cookie_helper_->StartFetching( |
| 613 base::Bind(&CookiesTreeModel::OnCookiesModelInfoLoaded, |
| 614 base::Unretained(this))); |
610 DCHECK(database_helper_); | 615 DCHECK(database_helper_); |
611 database_helper_->StartFetching(NewCallback( | 616 database_helper_->StartFetching(NewCallback( |
612 this, &CookiesTreeModel::OnDatabaseModelInfoLoaded)); | 617 this, &CookiesTreeModel::OnDatabaseModelInfoLoaded)); |
613 DCHECK(local_storage_helper_); | 618 DCHECK(local_storage_helper_); |
614 local_storage_helper_->StartFetching(NewCallback( | 619 local_storage_helper_->StartFetching(NewCallback( |
615 this, &CookiesTreeModel::OnLocalStorageModelInfoLoaded)); | 620 this, &CookiesTreeModel::OnLocalStorageModelInfoLoaded)); |
616 if (session_storage_helper_) { | 621 if (session_storage_helper_) { |
617 session_storage_helper_->StartFetching(NewCallback( | 622 session_storage_helper_->StartFetching(NewCallback( |
618 this, &CookiesTreeModel::OnSessionStorageModelInfoLoaded)); | 623 this, &CookiesTreeModel::OnSessionStorageModelInfoLoaded)); |
619 } | 624 } |
(...skipping 15 matching lines...) Expand all Loading... |
635 this, &CookiesTreeModel::OnFileSystemModelInfoLoaded)); | 640 this, &CookiesTreeModel::OnFileSystemModelInfoLoaded)); |
636 } | 641 } |
637 | 642 |
638 if (quota_helper_) { | 643 if (quota_helper_) { |
639 quota_helper_->StartFetching(NewCallback( | 644 quota_helper_->StartFetching(NewCallback( |
640 this, &CookiesTreeModel::OnQuotaModelInfoLoaded)); | 645 this, &CookiesTreeModel::OnQuotaModelInfoLoaded)); |
641 } | 646 } |
642 } | 647 } |
643 | 648 |
644 CookiesTreeModel::~CookiesTreeModel() { | 649 CookiesTreeModel::~CookiesTreeModel() { |
| 650 cookie_helper_->CancelNotification(); |
645 database_helper_->CancelNotification(); | 651 database_helper_->CancelNotification(); |
646 local_storage_helper_->CancelNotification(); | 652 local_storage_helper_->CancelNotification(); |
647 if (session_storage_helper_) | 653 if (session_storage_helper_) |
648 session_storage_helper_->CancelNotification(); | 654 session_storage_helper_->CancelNotification(); |
649 if (appcache_helper_) | 655 if (appcache_helper_) |
650 appcache_helper_->CancelNotification(); | 656 appcache_helper_->CancelNotification(); |
651 if (indexed_db_helper_) | 657 if (indexed_db_helper_) |
652 indexed_db_helper_->CancelNotification(); | 658 indexed_db_helper_->CancelNotification(); |
653 if (file_system_helper_) | 659 if (file_system_helper_) |
654 file_system_helper_->CancelNotification(); | 660 file_system_helper_->CancelNotification(); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 case CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM: | 700 case CookieTreeNode::DetailedInfo::TYPE_FILE_SYSTEM: |
695 return DATABASE; // ditto | 701 return DATABASE; // ditto |
696 case CookieTreeNode::DetailedInfo::TYPE_QUOTA: | 702 case CookieTreeNode::DetailedInfo::TYPE_QUOTA: |
697 return -1; | 703 return -1; |
698 default: | 704 default: |
699 break; | 705 break; |
700 } | 706 } |
701 return -1; | 707 return -1; |
702 } | 708 } |
703 | 709 |
704 void CookiesTreeModel::LoadCookies() { | |
705 LoadCookiesWithFilter(std::wstring()); | |
706 } | |
707 | |
708 void CookiesTreeModel::LoadCookiesWithFilter(const std::wstring& filter) { | |
709 // mmargh mmargh mmargh! delicious! | |
710 | |
711 all_cookies_ = cookie_monster_->GetAllCookies(); | |
712 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); | |
713 for (CookieList::iterator it = all_cookies_.begin(); | |
714 it != all_cookies_.end(); ++it) { | |
715 std::string source_string = it->Source(); | |
716 if (source_string.empty() || !use_cookie_source_) { | |
717 std::string domain = it->Domain(); | |
718 if (domain.length() > 1 && domain[0] == '.') | |
719 domain = domain.substr(1); | |
720 | |
721 // We treat secure cookies just the same as normal ones. | |
722 source_string = std::string(chrome::kHttpScheme) + | |
723 chrome::kStandardSchemeSeparator + domain + "/"; | |
724 } | |
725 | |
726 GURL source(source_string); | |
727 if (!filter.size() || | |
728 (CookieTreeOriginNode::TitleForUrl(source).find(filter) != | |
729 std::string::npos)) { | |
730 CookieTreeOriginNode* origin_node = | |
731 root->GetOrCreateOriginNode(source); | |
732 CookieTreeCookiesNode* cookies_node = | |
733 origin_node->GetOrCreateCookiesNode(); | |
734 CookieTreeCookieNode* new_cookie = new CookieTreeCookieNode(&*it); | |
735 cookies_node->AddCookieNode(new_cookie); | |
736 } | |
737 } | |
738 } | |
739 | |
740 void CookiesTreeModel::DeleteAllStoredObjects() { | 710 void CookiesTreeModel::DeleteAllStoredObjects() { |
741 NotifyObserverBeginBatch(); | 711 NotifyObserverBeginBatch(); |
742 CookieTreeNode* root = GetRoot(); | 712 CookieTreeNode* root = GetRoot(); |
743 root->DeleteStoredObjects(); | 713 root->DeleteStoredObjects(); |
744 int num_children = root->child_count(); | 714 int num_children = root->child_count(); |
745 for (int i = num_children - 1; i >= 0; --i) | 715 for (int i = num_children - 1; i >= 0; --i) |
746 delete Remove(root, root->GetChild(i)); | 716 delete Remove(root, root->GetChild(i)); |
747 NotifyObserverTreeNodeChanged(root); | 717 NotifyObserverTreeNodeChanged(root); |
748 NotifyObserverEndBatch(); | 718 NotifyObserverEndBatch(); |
749 } | 719 } |
750 | 720 |
751 void CookiesTreeModel::DeleteCookieNode(CookieTreeNode* cookie_node) { | 721 void CookiesTreeModel::DeleteCookieNode(CookieTreeNode* cookie_node) { |
752 if (cookie_node == GetRoot()) | 722 if (cookie_node == GetRoot()) |
753 return; | 723 return; |
754 cookie_node->DeleteStoredObjects(); | 724 cookie_node->DeleteStoredObjects(); |
755 CookieTreeNode* parent_node = cookie_node->parent(); | 725 CookieTreeNode* parent_node = cookie_node->parent(); |
756 delete Remove(parent_node, cookie_node); | 726 delete Remove(parent_node, cookie_node); |
757 if (parent_node->empty()) | 727 if (parent_node->empty()) |
758 DeleteCookieNode(parent_node); | 728 DeleteCookieNode(parent_node); |
759 } | 729 } |
760 | 730 |
761 void CookiesTreeModel::UpdateSearchResults(const std::wstring& filter) { | 731 void CookiesTreeModel::UpdateSearchResults(const std::wstring& filter) { |
762 CookieTreeNode* root = GetRoot(); | 732 CookieTreeNode* root = GetRoot(); |
763 int num_children = root->child_count(); | 733 int num_children = root->child_count(); |
764 NotifyObserverBeginBatch(); | 734 NotifyObserverBeginBatch(); |
765 for (int i = num_children - 1; i >= 0; --i) | 735 for (int i = num_children - 1; i >= 0; --i) |
766 delete Remove(root, root->GetChild(i)); | 736 delete Remove(root, root->GetChild(i)); |
767 LoadCookiesWithFilter(filter); | 737 PopulateCookieInfoWithFilter(filter); |
768 PopulateDatabaseInfoWithFilter(filter); | 738 PopulateDatabaseInfoWithFilter(filter); |
769 PopulateLocalStorageInfoWithFilter(filter); | 739 PopulateLocalStorageInfoWithFilter(filter); |
770 PopulateSessionStorageInfoWithFilter(filter); | 740 PopulateSessionStorageInfoWithFilter(filter); |
771 PopulateAppCacheInfoWithFilter(filter); | 741 PopulateAppCacheInfoWithFilter(filter); |
772 PopulateIndexedDBInfoWithFilter(filter); | 742 PopulateIndexedDBInfoWithFilter(filter); |
773 PopulateFileSystemInfoWithFilter(filter); | 743 PopulateFileSystemInfoWithFilter(filter); |
774 PopulateQuotaInfoWithFilter(filter); | 744 PopulateQuotaInfoWithFilter(filter); |
775 NotifyObserverTreeNodeChanged(root); | 745 NotifyObserverTreeNodeChanged(root); |
776 NotifyObserverEndBatch(); | 746 NotifyObserverEndBatch(); |
777 } | 747 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
819 info != origin->second.end(); ++info) { | 789 info != origin->second.end(); ++info) { |
820 appcaches_node->AddAppCacheNode( | 790 appcaches_node->AddAppCacheNode( |
821 new CookieTreeAppCacheNode(&(*info))); | 791 new CookieTreeAppCacheNode(&(*info))); |
822 } | 792 } |
823 } | 793 } |
824 } | 794 } |
825 NotifyObserverTreeNodeChanged(root); | 795 NotifyObserverTreeNodeChanged(root); |
826 NotifyObserverEndBatch(); | 796 NotifyObserverEndBatch(); |
827 } | 797 } |
828 | 798 |
| 799 void CookiesTreeModel::OnCookiesModelInfoLoaded( |
| 800 const CookieList& cookie_list) { |
| 801 cookie_list_ = cookie_list; |
| 802 PopulateCookieInfoWithFilter(std::wstring()); |
| 803 } |
| 804 |
| 805 void CookiesTreeModel::PopulateCookieInfoWithFilter( |
| 806 const std::wstring& filter) { |
| 807 // mmargh mmargh mmargh! delicious! |
| 808 |
| 809 CookieTreeRootNode* root = static_cast<CookieTreeRootNode*>(GetRoot()); |
| 810 for (CookieList::iterator it = cookie_list_.begin(); |
| 811 it != cookie_list_.end(); ++it) { |
| 812 std::string source_string = it->Source(); |
| 813 if (source_string.empty() || !use_cookie_source_) { |
| 814 std::string domain = it->Domain(); |
| 815 if (domain.length() > 1 && domain[0] == '.') |
| 816 domain = domain.substr(1); |
| 817 |
| 818 // We treat secure cookies just the same as normal ones. |
| 819 source_string = std::string(chrome::kHttpScheme) + |
| 820 chrome::kStandardSchemeSeparator + domain + "/"; |
| 821 } |
| 822 |
| 823 GURL source(source_string); |
| 824 if (!filter.size() || |
| 825 (CookieTreeOriginNode::TitleForUrl(source).find(filter) != |
| 826 std::string::npos)) { |
| 827 CookieTreeOriginNode* origin_node = |
| 828 root->GetOrCreateOriginNode(source); |
| 829 CookieTreeCookiesNode* cookies_node = |
| 830 origin_node->GetOrCreateCookiesNode(); |
| 831 CookieTreeCookieNode* new_cookie = new CookieTreeCookieNode(&*it); |
| 832 cookies_node->AddCookieNode(new_cookie); |
| 833 } |
| 834 } |
| 835 } |
| 836 |
829 void CookiesTreeModel::OnDatabaseModelInfoLoaded( | 837 void CookiesTreeModel::OnDatabaseModelInfoLoaded( |
830 const DatabaseInfoList& database_info) { | 838 const DatabaseInfoList& database_info) { |
831 database_info_list_ = database_info; | 839 database_info_list_ = database_info; |
832 PopulateDatabaseInfoWithFilter(std::wstring()); | 840 PopulateDatabaseInfoWithFilter(std::wstring()); |
833 } | 841 } |
834 | 842 |
835 void CookiesTreeModel::PopulateDatabaseInfoWithFilter( | 843 void CookiesTreeModel::PopulateDatabaseInfoWithFilter( |
836 const std::wstring& filter) { | 844 const std::wstring& filter) { |
837 if (database_info_list_.empty()) | 845 if (database_info_list_.empty()) |
838 return; | 846 return; |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 | 1035 |
1028 void CookiesTreeModel::NotifyObserverEndBatch() { | 1036 void CookiesTreeModel::NotifyObserverEndBatch() { |
1029 // Only notify the observers if this is the outermost call to EndBatch() if | 1037 // Only notify the observers if this is the outermost call to EndBatch() if |
1030 // called in a nested manner. | 1038 // called in a nested manner. |
1031 if (--batch_update_ == 0) { | 1039 if (--batch_update_ == 0) { |
1032 FOR_EACH_OBSERVER(Observer, | 1040 FOR_EACH_OBSERVER(Observer, |
1033 cookies_observer_list_, | 1041 cookies_observer_list_, |
1034 TreeModelEndBatch(this)); | 1042 TreeModelEndBatch(this)); |
1035 } | 1043 } |
1036 } | 1044 } |
OLD | NEW |