diff options
author | joaodasilva@chromium.org <joaodasilva@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-18 22:21:46 +0000 |
---|---|---|
committer | joaodasilva@chromium.org <joaodasilva@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-04-18 22:21:46 +0000 |
commit | 419a0571dda6e5cc297331c845f68da7485302da (patch) | |
tree | 84f08f760b5023b8ab725b3e0dc0d6501a795181 /chrome/browser/prefs | |
parent | f2ee14875f7f7945613b7224e377467c2a864bee (diff) | |
download | chromium_src-419a0571dda6e5cc297331c845f68da7485302da.zip chromium_src-419a0571dda6e5cc297331c845f68da7485302da.tar.gz chromium_src-419a0571dda6e5cc297331c845f68da7485302da.tar.bz2 |
Added DisabledSchemes policy.
This is a list of strings. Any protocol scheme listed in this policy is
disabled, and URLs using that scheme won't load (either from the Omnibar, links,
bookmarks, or when requested from the renderer to the browser).
Also introduced ListPrefMember, to track a ListValue preference.
"Virtual" or "pseudo" protocol schemes such as "about" and "view-source" are
also handled.
BUG=57477
TEST=unit_tests, use a policy to disable specific schemes (e.g. "file", "ftp")
Review URL: http://codereview.chromium.org/6712065
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@82013 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/prefs')
-rw-r--r-- | chrome/browser/prefs/pref_member.cc | 24 | ||||
-rw-r--r-- | chrome/browser/prefs/pref_member.h | 1 | ||||
-rw-r--r-- | chrome/browser/prefs/pref_member_unittest.cc | 38 | ||||
-rw-r--r-- | chrome/browser/prefs/pref_service.cc | 4 | ||||
-rw-r--r-- | chrome/browser/prefs/pref_service.h | 3 |
5 files changed, 70 insertions, 0 deletions
diff --git a/chrome/browser/prefs/pref_member.cc b/chrome/browser/prefs/pref_member.cc index 2efeafc..90b369b 100644 --- a/chrome/browser/prefs/pref_member.cc +++ b/chrome/browser/prefs/pref_member.cc @@ -163,3 +163,27 @@ bool PrefMember<FilePath>::Internal::UpdateValueInternal(const Value& value) return base::GetValueAsFilePath(value, &value_); } +template <> +void PrefMember<ListValue*>::UpdatePref(ListValue*const& value) { + // prefs takes ownership of the value passed, so make a copy. + prefs()->SetList(pref_name().c_str(), value->DeepCopy()); +} + +template <> +bool PrefMember<ListValue*>::Internal::UpdateValueInternal(const Value& value) + const { + // Verify the type before doing the DeepCopy to avoid leaking the copy. + if (value.GetType() != Value::TYPE_LIST) + return false; + + // ListPrefMember keeps a copy of the ListValue and of its contents. + // GetAsList() assigns its |this| (the DeepCopy) to |value_|. + delete value_; + return value.DeepCopy()->GetAsList(&value_); +} + +template <> +PrefMember<ListValue*>::Internal::~Internal() { + delete value_; +} + diff --git a/chrome/browser/prefs/pref_member.h b/chrome/browser/prefs/pref_member.h index 5e58a39..5fdd91d 100644 --- a/chrome/browser/prefs/pref_member.h +++ b/chrome/browser/prefs/pref_member.h @@ -244,5 +244,6 @@ typedef PrefMember<int> IntegerPrefMember; typedef PrefMember<double> DoublePrefMember; typedef PrefMember<std::string> StringPrefMember; typedef PrefMember<FilePath> FilePathPrefMember; +typedef PrefMember<ListValue*> ListPrefMember; #endif // CHROME_BROWSER_PREFS_PREF_MEMBER_H_ diff --git a/chrome/browser/prefs/pref_member_unittest.cc b/chrome/browser/prefs/pref_member_unittest.cc index 9fca66b..b8079dd 100644 --- a/chrome/browser/prefs/pref_member_unittest.cc +++ b/chrome/browser/prefs/pref_member_unittest.cc @@ -19,12 +19,14 @@ const char kBoolPref[] = "bool"; const char kIntPref[] = "int"; const char kDoublePref[] = "double"; const char kStringPref[] = "string"; +const char kListPref[] = "list"; void RegisterTestPrefs(PrefService* prefs) { prefs->RegisterBooleanPref(kBoolPref, false); prefs->RegisterIntegerPref(kIntPref, 0); prefs->RegisterDoublePref(kDoublePref, 0.0); prefs->RegisterStringPref(kStringPref, "default"); + prefs->RegisterListPref(kListPref); } class GetPrefValueCallback @@ -179,6 +181,42 @@ TEST(PrefMemberTest, BasicGetAndSet) { EXPECT_EQ("bar", prefs.GetString(kStringPref)); EXPECT_EQ("bar", string.GetValue()); EXPECT_EQ("bar", *string); + + // Test list + ListPrefMember list; + list.Init(kListPref, &prefs, NULL); + + // Check the defaults + const ListValue* list_value = prefs.GetList(kListPref); + ASSERT_TRUE(list_value != NULL); + EXPECT_EQ(0u, list_value->GetSize()); + EXPECT_TRUE(list_value->empty()); + ASSERT_TRUE(list.GetValue() != NULL); + EXPECT_EQ(0u, list.GetValue()->GetSize()); + EXPECT_TRUE(list.GetValue()->empty()); + ASSERT_TRUE(*list != NULL); + EXPECT_EQ(0u, (*list)->GetSize()); + EXPECT_TRUE((*list)->empty()); + + // Try changing through the member variable. + scoped_ptr<ListValue> list_value_numbers(new ListValue()); + list_value_numbers->Append(new StringValue("one")); + list_value_numbers->Append(new StringValue("two")); + list_value_numbers->Append(new StringValue("three")); + list.SetValue(list_value_numbers.get()); + EXPECT_TRUE(list_value_numbers->Equals(list.GetValue())); + EXPECT_TRUE(list_value_numbers->Equals(prefs.GetList(kListPref))); + EXPECT_TRUE(list_value_numbers->Equals(*list)); + + // Try changing back through the pref. + ListValue* list_value_ints = new ListValue(); + list_value_ints->Append(new FundamentalValue(1)); + list_value_ints->Append(new FundamentalValue(2)); + list_value_ints->Append(new FundamentalValue(3)); + prefs.SetList(kListPref, list_value_ints); // takes ownership + EXPECT_TRUE(list_value_ints->Equals(list.GetValue())); + EXPECT_TRUE(list_value_ints->Equals(prefs.GetList(kListPref))); + EXPECT_TRUE(list_value_ints->Equals(*list)); } TEST(PrefMemberTest, TwoPrefs) { diff --git a/chrome/browser/prefs/pref_service.cc b/chrome/browser/prefs/pref_service.cc index abefe07..3beff39 100644 --- a/chrome/browser/prefs/pref_service.cc +++ b/chrome/browser/prefs/pref_service.cc @@ -521,6 +521,10 @@ void PrefService::SetFilePath(const char* path, const FilePath& value) { SetUserPrefValue(path, base::CreateFilePathValue(value)); } +void PrefService::SetList(const char* path, ListValue* value) { + SetUserPrefValue(path, value); +} + void PrefService::SetInt64(const char* path, int64 value) { SetUserPrefValue(path, Value::CreateStringValue(base::Int64ToString(value))); } diff --git a/chrome/browser/prefs/pref_service.h b/chrome/browser/prefs/pref_service.h index 690b8c2..200693d 100644 --- a/chrome/browser/prefs/pref_service.h +++ b/chrome/browser/prefs/pref_service.h @@ -203,6 +203,9 @@ class PrefService : public base::NonThreadSafe { void SetDouble(const char* path, double value); void SetString(const char* path, const std::string& value); void SetFilePath(const char* path, const FilePath& value); + // SetList() takes ownership of |value|. Pass a copy of the ListValue to + // keep ownership of the original list, if necessary. + void SetList(const char* path, ListValue* value); // Int64 helper methods that actually store the given value as a string. // Note that if obtaining the named value via GetDictionary or GetList, the |