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

Side by Side Diff: chrome/browser/extensions/extension_prefs.cc

Issue 11415216: Make Blacklist::IsBlacklist asynchronous (it will need to be for safe (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/extensions/extension_prefs.h" 5 #include "chrome/browser/extensions/extension_prefs.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/prefs/pref_notifier.h" 8 #include "base/prefs/pref_notifier.h"
9 #include "base/string_number_conversions.h" 9 #include "base/string_number_conversions.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
(...skipping 730 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 } else { 741 } else {
742 UpdateExtensionPref(extension_id, kPrefDisableReasons, 742 UpdateExtensionPref(extension_id, kPrefDisableReasons,
743 Value::CreateIntegerValue(new_value)); 743 Value::CreateIntegerValue(new_value));
744 } 744 }
745 } 745 }
746 746
747 void ExtensionPrefs::ClearDisableReasons(const std::string& extension_id) { 747 void ExtensionPrefs::ClearDisableReasons(const std::string& extension_id) {
748 UpdateExtensionPref(extension_id, kPrefDisableReasons, NULL); 748 UpdateExtensionPref(extension_id, kPrefDisableReasons, NULL);
749 } 749 }
750 750
751 void ExtensionPrefs::UpdateBlacklist( 751 std::set<std::string> ExtensionPrefs::GetBlacklistedExtensions() {
752 const std::set<std::string>& blacklist_set) { 752 std::set<std::string> ids;
753 ExtensionIdList remove_pref_ids; 753
754 std::set<std::string> used_id_set;
755 const DictionaryValue* extensions = prefs_->GetDictionary(kExtensionsPref); 754 const DictionaryValue* extensions = prefs_->GetDictionary(kExtensionsPref);
755 if (!extensions)
756 return ids;
756 757
757 if (extensions) { 758 for (DictionaryValue::Iterator it(*extensions); it.HasNext(); it.Advance()) {
758 for (DictionaryValue::key_iterator extension_id = extensions->begin_keys(); 759 if (!it.value().IsType(Value::TYPE_DICTIONARY)) {
759 extension_id != extensions->end_keys(); ++extension_id) { 760 NOTREACHED() << "Invalid pref for extension " << it.key();
760 const DictionaryValue* ext; 761 continue;
761 if (!extensions->GetDictionaryWithoutPathExpansion(*extension_id, &ext)) {
762 NOTREACHED() << "Invalid pref for extension " << *extension_id;
763 continue;
764 }
765 const std::string& id(*extension_id);
766 if (blacklist_set.find(id) == blacklist_set.end()) {
767 if (!IsBlacklistBitSet(ext)) {
768 // This extension is not in blacklist. And it was not blacklisted
769 // before.
770 continue;
771 } else {
772 if (ext->size() == 1) {
773 // We should remove the entry if the only flag here is blacklist.
774 remove_pref_ids.push_back(id);
775 } else {
776 // Remove the blacklist bit.
777 UpdateExtensionPref(id, kPrefBlacklist, NULL);
778 }
779 }
780 } else {
781 if (!IsBlacklistBitSet(ext)) {
782 // Only set the blacklist if it was not set.
783 UpdateExtensionPref(id, kPrefBlacklist,
784 Value::CreateBooleanValue(true));
785 }
786 // Keep the record if this extension is already processed.
787 used_id_set.insert(id);
788 }
789 } 762 }
763 if (IsBlacklistBitSet(static_cast<const DictionaryValue*>(&it.value())))
764 ids.insert(it.key());
790 } 765 }
791 766
792 // Iterate the leftovers to set blacklist in pref 767 return ids;
793 std::set<std::string>::const_iterator set_itr = blacklist_set.begin(); 768 }
794 for (; set_itr != blacklist_set.end(); ++set_itr) { 769
795 if (used_id_set.find(*set_itr) == used_id_set.end()) { 770 void ExtensionPrefs::SetExtensionBlacklisted(const std::string& extension_id,
796 UpdateExtensionPref(*set_itr, kPrefBlacklist, 771 bool is_blacklisted) {
797 Value::CreateBooleanValue(true)); 772 if (is_blacklisted) {
798 } 773 UpdateExtensionPref(extension_id,
774 kPrefBlacklist,
775 new base::FundamentalValue(true));
asargent_no_longer_on_chrome 2012/11/30 21:44:22 optional suggestion: I personally prefer "base::Cr
not at google - send to devlin 2012/11/30 23:09:54 I don't really have a preference though I'm used t
asargent_no_longer_on_chrome 2012/11/30 23:30:25 Ah, I missed that. Ok, probably better to go with
776 UpdateExtensionPref(extension_id,
777 kPrefBlacklistAcknowledged,
778 new base::FundamentalValue(true));
779 return;
799 } 780 }
800 for (size_t i = 0; i < remove_pref_ids.size(); ++i) { 781
801 DeleteExtensionPrefs(remove_pref_ids[i]); 782 // If we're clearing the blacklist bit, we also want to delete the entry for
802 } 783 // the extension in prefs altogether if the resulting entry is empty.
784 UpdateExtensionPref(extension_id, kPrefBlacklist, NULL);
785 UpdateExtensionPref(extension_id, kPrefBlacklistAcknowledged, NULL);
786 const DictionaryValue* dict = GetExtensionPref(extension_id);
787 if (dict && dict->empty())
788 DeleteExtensionPrefs(extension_id);
803 } 789 }
804 790
805 bool ExtensionPrefs::IsExtensionBlacklisted(const std::string& id) const { 791 bool ExtensionPrefs::IsExtensionBlacklisted(const std::string& id) const {
806 const DictionaryValue* ext_prefs = GetExtensionPref(id); 792 const DictionaryValue* ext_prefs = GetExtensionPref(id);
807 return ext_prefs && IsBlacklistBitSet(ext_prefs); 793 return ext_prefs && IsBlacklistBitSet(ext_prefs);
808 } 794 }
809 795
810 namespace { 796 namespace {
811 797
812 // Serializes |time| as a string value mapped to |key| in |dictionary|. 798 // Serializes |time| as a string value mapped to |key| in |dictionary|.
(...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after
1643 return extension; 1629 return extension;
1644 } 1630 }
1645 1631
1646 scoped_ptr<ExtensionInfo> ExtensionPrefs::GetInstalledExtensionInfo( 1632 scoped_ptr<ExtensionInfo> ExtensionPrefs::GetInstalledExtensionInfo(
1647 const std::string& extension_id) const { 1633 const std::string& extension_id) const {
1648 const DictionaryValue* ext; 1634 const DictionaryValue* ext;
1649 const DictionaryValue* extensions = prefs_->GetDictionary(kExtensionsPref); 1635 const DictionaryValue* extensions = prefs_->GetDictionary(kExtensionsPref);
1650 if (!extensions || 1636 if (!extensions ||
1651 !extensions->GetDictionaryWithoutPathExpansion(extension_id, &ext)) 1637 !extensions->GetDictionaryWithoutPathExpansion(extension_id, &ext))
1652 return scoped_ptr<ExtensionInfo>(); 1638 return scoped_ptr<ExtensionInfo>();
1653 if (IsBlacklistBitSet(ext))
1654 return scoped_ptr<ExtensionInfo>();
1655 int state_value; 1639 int state_value;
1656 if (!ext->GetInteger(kPrefState, &state_value) || 1640 if (!ext->GetInteger(kPrefState, &state_value) ||
1657 state_value == Extension::ENABLED_COMPONENT) { 1641 state_value == Extension::ENABLED_COMPONENT) {
1658 // Old preferences files may not have kPrefState for component extensions. 1642 // Old preferences files may not have kPrefState for component extensions.
1659 return scoped_ptr<ExtensionInfo>(); 1643 return scoped_ptr<ExtensionInfo>();
1660 } 1644 }
1661 1645
1662 if (state_value == Extension::EXTERNAL_EXTENSION_UNINSTALLED) { 1646 if (state_value == Extension::EXTERNAL_EXTENSION_UNINSTALLED) {
1663 LOG(WARNING) << "External extension with id " << extension_id 1647 LOG(WARNING) << "External extension with id " << extension_id
1664 << " has been uninstalled by the user"; 1648 << " has been uninstalled by the user";
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
2004 return result; // Empty set 1988 return result; // Empty set
2005 } 1989 }
2006 1990
2007 for (base::DictionaryValue::key_iterator it = extension_prefs->begin_keys(); 1991 for (base::DictionaryValue::key_iterator it = extension_prefs->begin_keys();
2008 it != extension_prefs->end_keys(); ++it) { 1992 it != extension_prefs->end_keys(); ++it) {
2009 const DictionaryValue* ext; 1993 const DictionaryValue* ext;
2010 if (!extension_prefs->GetDictionaryWithoutPathExpansion(*it, &ext)) { 1994 if (!extension_prefs->GetDictionaryWithoutPathExpansion(*it, &ext)) {
2011 NOTREACHED() << "Invalid pref for extension " << *it; 1995 NOTREACHED() << "Invalid pref for extension " << *it;
2012 continue; 1996 continue;
2013 } 1997 }
2014 if (!IsBlacklistBitSet(ext))
2015 result.push_back(*it);
2016 } 1998 }
2017 return result; 1999 return result;
2018 } 2000 }
2019 2001
2020 void ExtensionPrefs::FixMissingPrefs(const ExtensionIdList& extension_ids) { 2002 void ExtensionPrefs::FixMissingPrefs(const ExtensionIdList& extension_ids) {
2021 // Fix old entries that did not get an installation time entry when they 2003 // Fix old entries that did not get an installation time entry when they
2022 // were installed or don't have a preferences field. 2004 // were installed or don't have a preferences field.
2023 for (ExtensionIdList::const_iterator ext_id = extension_ids.begin(); 2005 for (ExtensionIdList::const_iterator ext_id = extension_ids.begin();
2024 ext_id != extension_ids.end(); ++ext_id) { 2006 ext_id != extension_ids.end(); ++ext_id) {
2025 if (GetInstallTime(*ext_id) == base::Time()) { 2007 if (GetInstallTime(*ext_id) == base::Time()) {
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after
2314 const ExtensionIdList& strings) { 2296 const ExtensionIdList& strings) {
2315 ListPrefUpdate update(prefs_, pref); 2297 ListPrefUpdate update(prefs_, pref);
2316 ListValue* list_of_values = update.Get(); 2298 ListValue* list_of_values = update.Get();
2317 list_of_values->Clear(); 2299 list_of_values->Clear();
2318 for (ExtensionIdList::const_iterator iter = strings.begin(); 2300 for (ExtensionIdList::const_iterator iter = strings.begin();
2319 iter != strings.end(); ++iter) 2301 iter != strings.end(); ++iter)
2320 list_of_values->Append(new StringValue(*iter)); 2302 list_of_values->Append(new StringValue(*iter));
2321 } 2303 }
2322 2304
2323 } // namespace extensions 2305 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698