OLD | NEW |
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/api/preference/preference_api.h" | 5 #include "chrome/browser/extensions/api/preference/preference_api.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
11 #include "base/memory/singleton.h" | 11 #include "base/memory/singleton.h" |
12 #include "base/prefs/pref_service.h" | 12 #include "base/prefs/pref_service.h" |
13 #include "base/profiler/scoped_profile.h" | 13 #include "base/profiler/scoped_profile.h" |
14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
15 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
16 #include "base/values.h" | 16 #include "base/values.h" |
17 #include "chrome/browser/chrome_notification_types.h" | 17 #include "chrome/browser/chrome_notification_types.h" |
18 #include "chrome/browser/extensions/api/content_settings/content_settings_servic
e.h" | 18 #include "chrome/browser/extensions/api/content_settings/content_settings_servic
e.h" |
19 #include "chrome/browser/extensions/api/preference/preference_api_constants.h" | 19 #include "chrome/browser/extensions/api/preference/preference_api_constants.h" |
20 #include "chrome/browser/extensions/api/preference/preference_helpers.h" | 20 #include "chrome/browser/extensions/api/preference/preference_helpers.h" |
21 #include "chrome/browser/extensions/api/proxy/proxy_api.h" | 21 #include "chrome/browser/extensions/api/proxy/proxy_api.h" |
22 #include "chrome/browser/extensions/extension_service.h" | 22 #include "chrome/browser/extensions/extension_service.h" |
| 23 #include "chrome/browser/net/prediction_options.h" |
23 #include "chrome/browser/profiles/profile.h" | 24 #include "chrome/browser/profiles/profile.h" |
24 #include "chrome/common/pref_names.h" | 25 #include "chrome/common/pref_names.h" |
25 #include "components/translate/core/common/translate_pref_names.h" | 26 #include "components/translate/core/common/translate_pref_names.h" |
26 #include "content/public/browser/notification_details.h" | 27 #include "content/public/browser/notification_details.h" |
27 #include "content/public/browser/notification_source.h" | 28 #include "content/public/browser/notification_source.h" |
28 #include "extensions/browser/extension_pref_value_map.h" | 29 #include "extensions/browser/extension_pref_value_map.h" |
29 #include "extensions/browser/extension_pref_value_map_factory.h" | 30 #include "extensions/browser/extension_pref_value_map_factory.h" |
30 #include "extensions/browser/extension_prefs.h" | 31 #include "extensions/browser/extension_prefs.h" |
31 #include "extensions/browser/extension_prefs_factory.h" | 32 #include "extensions/browser/extension_prefs_factory.h" |
32 #include "extensions/browser/extension_system_provider.h" | 33 #include "extensions/browser/extension_system_provider.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 "Internal error: Stored value for preference '*' cannot be converted " | 69 "Internal error: Stored value for preference '*' cannot be converted " |
69 "properly."; | 70 "properly."; |
70 | 71 |
71 PrefMappingEntry kPrefMapping[] = { | 72 PrefMappingEntry kPrefMapping[] = { |
72 {"alternateErrorPagesEnabled", prefs::kAlternateErrorPagesEnabled, | 73 {"alternateErrorPagesEnabled", prefs::kAlternateErrorPagesEnabled, |
73 APIPermission::kPrivacy, APIPermission::kPrivacy}, | 74 APIPermission::kPrivacy, APIPermission::kPrivacy}, |
74 {"autofillEnabled", autofill::prefs::kAutofillEnabled, | 75 {"autofillEnabled", autofill::prefs::kAutofillEnabled, |
75 APIPermission::kPrivacy, APIPermission::kPrivacy}, | 76 APIPermission::kPrivacy, APIPermission::kPrivacy}, |
76 {"hyperlinkAuditingEnabled", prefs::kEnableHyperlinkAuditing, | 77 {"hyperlinkAuditingEnabled", prefs::kEnableHyperlinkAuditing, |
77 APIPermission::kPrivacy, APIPermission::kPrivacy}, | 78 APIPermission::kPrivacy, APIPermission::kPrivacy}, |
78 {"networkPredictionEnabled", prefs::kNetworkPredictionEnabled, | 79 {"networkPredictionEnabled", prefs::kNetworkPredictionOptions, |
79 APIPermission::kPrivacy, APIPermission::kPrivacy}, | |
80 {"networkPredictionOptions", prefs::kNetworkPredictionOptions, | |
81 APIPermission::kPrivacy, APIPermission::kPrivacy}, | 80 APIPermission::kPrivacy, APIPermission::kPrivacy}, |
82 {"passwordSavingEnabled", | 81 {"passwordSavingEnabled", |
83 password_manager::prefs::kPasswordManagerSavingEnabled, | 82 password_manager::prefs::kPasswordManagerSavingEnabled, |
84 APIPermission::kPrivacy, APIPermission::kPrivacy}, | 83 APIPermission::kPrivacy, APIPermission::kPrivacy}, |
85 {"protectedContentEnabled", prefs::kEnableDRM, APIPermission::kPrivacy, | 84 {"protectedContentEnabled", prefs::kEnableDRM, APIPermission::kPrivacy, |
86 APIPermission::kPrivacy}, | 85 APIPermission::kPrivacy}, |
87 {"proxy", prefs::kProxy, APIPermission::kProxy, APIPermission::kProxy}, | 86 {"proxy", prefs::kProxy, APIPermission::kProxy, APIPermission::kProxy}, |
88 {"referrersEnabled", prefs::kEnableReferrers, APIPermission::kPrivacy, | 87 {"referrersEnabled", prefs::kEnableReferrers, APIPermission::kPrivacy, |
89 APIPermission::kPrivacy}, | 88 APIPermission::kPrivacy}, |
90 {"safeBrowsingEnabled", prefs::kSafeBrowsingEnabled, | 89 {"safeBrowsingEnabled", prefs::kSafeBrowsingEnabled, |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 | 150 |
152 private: | 151 private: |
153 static base::Value* InvertBooleanValue(const base::Value* value) { | 152 static base::Value* InvertBooleanValue(const base::Value* value) { |
154 bool bool_value = false; | 153 bool bool_value = false; |
155 bool result = value->GetAsBoolean(&bool_value); | 154 bool result = value->GetAsBoolean(&bool_value); |
156 DCHECK(result); | 155 DCHECK(result); |
157 return new base::FundamentalValue(!bool_value); | 156 return new base::FundamentalValue(!bool_value); |
158 } | 157 } |
159 }; | 158 }; |
160 | 159 |
| 160 class NetworkPredictionTransformer : public PrefTransformerInterface { |
| 161 public: |
| 162 virtual base::Value* ExtensionToBrowserPref(const base::Value* extension_pref, |
| 163 std::string* error, |
| 164 bool* bad_message) override { |
| 165 bool bool_value = false; |
| 166 DCHECK(extension_pref->GetAsBoolean(&bool_value)); |
| 167 if (bool_value) { |
| 168 return new base::FundamentalValue( |
| 169 chrome_browser_net::NETWORK_PREDICTION_DEFAULT); |
| 170 } else { |
| 171 return new base::FundamentalValue( |
| 172 chrome_browser_net::NETWORK_PREDICTION_NEVER); |
| 173 } |
| 174 } |
| 175 |
| 176 virtual base::Value* BrowserToExtensionPref( |
| 177 const base::Value* browser_pref) override { |
| 178 int int_value = chrome_browser_net::NETWORK_PREDICTION_NEVER; |
| 179 DCHECK(browser_pref->GetAsInteger(&int_value)); |
| 180 return new base::FundamentalValue( |
| 181 int_value != chrome_browser_net::NETWORK_PREDICTION_NEVER); |
| 182 } |
| 183 }; |
| 184 |
161 class PrefMapping { | 185 class PrefMapping { |
162 public: | 186 public: |
163 static PrefMapping* GetInstance() { | 187 static PrefMapping* GetInstance() { |
164 return Singleton<PrefMapping>::get(); | 188 return Singleton<PrefMapping>::get(); |
165 } | 189 } |
166 | 190 |
167 bool FindBrowserPrefForExtensionPref(const std::string& extension_pref, | 191 bool FindBrowserPrefForExtensionPref(const std::string& extension_pref, |
168 std::string* browser_pref, | 192 std::string* browser_pref, |
169 APIPermission::ID* read_permission, | 193 APIPermission::ID* read_permission, |
170 APIPermission::ID* write_permission) { | 194 APIPermission::ID* write_permission) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 event_mapping_[kPrefMapping[i].browser_pref] = | 240 event_mapping_[kPrefMapping[i].browser_pref] = |
217 PrefMapData(event_name, | 241 PrefMapData(event_name, |
218 kPrefMapping[i].read_permission, | 242 kPrefMapping[i].read_permission, |
219 kPrefMapping[i].write_permission); | 243 kPrefMapping[i].write_permission); |
220 } | 244 } |
221 DCHECK_EQ(arraysize(kPrefMapping), mapping_.size()); | 245 DCHECK_EQ(arraysize(kPrefMapping), mapping_.size()); |
222 DCHECK_EQ(arraysize(kPrefMapping), event_mapping_.size()); | 246 DCHECK_EQ(arraysize(kPrefMapping), event_mapping_.size()); |
223 RegisterPrefTransformer(prefs::kProxy, new ProxyPrefTransformer()); | 247 RegisterPrefTransformer(prefs::kProxy, new ProxyPrefTransformer()); |
224 RegisterPrefTransformer(prefs::kBlockThirdPartyCookies, | 248 RegisterPrefTransformer(prefs::kBlockThirdPartyCookies, |
225 new InvertBooleanTransformer()); | 249 new InvertBooleanTransformer()); |
| 250 RegisterPrefTransformer(prefs::kNetworkPredictionOptions, |
| 251 new NetworkPredictionTransformer()); |
226 } | 252 } |
227 | 253 |
228 ~PrefMapping() { | 254 ~PrefMapping() { |
229 STLDeleteContainerPairSecondPointers(transformers_.begin(), | 255 STLDeleteContainerPairSecondPointers(transformers_.begin(), |
230 transformers_.end()); | 256 transformers_.end()); |
231 } | 257 } |
232 | 258 |
233 void RegisterPrefTransformer(const std::string& browser_pref, | 259 void RegisterPrefTransformer(const std::string& browser_pref, |
234 PrefTransformerInterface* transformer) { | 260 PrefTransformerInterface* transformer) { |
235 DCHECK_EQ(0u, transformers_.count(browser_pref)) << | 261 DCHECK_EQ(0u, transformers_.count(browser_pref)) << |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 if (!ValidateBrowserPref( | 669 if (!ValidateBrowserPref( |
644 pref_key, PreferenceFunction::PERMISSION_TYPE_WRITE, &browser_pref)) { | 670 pref_key, PreferenceFunction::PERMISSION_TYPE_WRITE, &browser_pref)) { |
645 return false; | 671 return false; |
646 } | 672 } |
647 ExtensionPrefs* prefs = ExtensionPrefs::Get(GetProfile()); | 673 ExtensionPrefs* prefs = ExtensionPrefs::Get(GetProfile()); |
648 const PrefService::Preference* pref = | 674 const PrefService::Preference* pref = |
649 prefs->pref_service()->FindPreference(browser_pref.c_str()); | 675 prefs->pref_service()->FindPreference(browser_pref.c_str()); |
650 CHECK(pref); | 676 CHECK(pref); |
651 | 677 |
652 // Validate new value. | 678 // Validate new value. |
653 EXTENSION_FUNCTION_VALIDATE(value->GetType() == pref->GetType()); | |
654 PrefTransformerInterface* transformer = | 679 PrefTransformerInterface* transformer = |
655 PrefMapping::GetInstance()->FindTransformerForBrowserPref(browser_pref); | 680 PrefMapping::GetInstance()->FindTransformerForBrowserPref(browser_pref); |
656 std::string error; | 681 std::string error; |
657 bool bad_message = false; | 682 bool bad_message = false; |
658 scoped_ptr<base::Value> browser_pref_value( | 683 scoped_ptr<base::Value> browser_pref_value( |
659 transformer->ExtensionToBrowserPref(value, &error, &bad_message)); | 684 transformer->ExtensionToBrowserPref(value, &error, &bad_message)); |
660 if (!browser_pref_value) { | 685 if (!browser_pref_value) { |
661 error_ = error; | 686 error_ = error; |
662 bad_message_ = bad_message; | 687 bad_message_ = bad_message; |
663 return false; | 688 return false; |
664 } | 689 } |
| 690 EXTENSION_FUNCTION_VALIDATE(browser_pref_value->GetType() == pref->GetType()); |
665 | 691 |
666 // Validate also that the stored value can be converted back by the | 692 // Validate also that the stored value can be converted back by the |
667 // transformer. | 693 // transformer. |
668 scoped_ptr<base::Value> extensionPrefValue( | 694 scoped_ptr<base::Value> extensionPrefValue( |
669 transformer->BrowserToExtensionPref(browser_pref_value.get())); | 695 transformer->BrowserToExtensionPref(browser_pref_value.get())); |
670 if (!extensionPrefValue) { | 696 if (!extensionPrefValue) { |
671 error_ = ErrorUtils::FormatErrorMessage(kConversionErrorMessage, | 697 error_ = ErrorUtils::FormatErrorMessage(kConversionErrorMessage, |
672 pref->name()); | 698 pref->name()); |
673 bad_message_ = true; | 699 bad_message_ = true; |
674 return false; | 700 return false; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
717 pref_key, PreferenceFunction::PERMISSION_TYPE_WRITE, &browser_pref)) { | 743 pref_key, PreferenceFunction::PERMISSION_TYPE_WRITE, &browser_pref)) { |
718 return false; | 744 return false; |
719 } | 745 } |
720 | 746 |
721 PreferenceAPI::Get(GetProfile()) | 747 PreferenceAPI::Get(GetProfile()) |
722 ->RemoveExtensionControlledPref(extension_id(), browser_pref, scope); | 748 ->RemoveExtensionControlledPref(extension_id(), browser_pref, scope); |
723 return true; | 749 return true; |
724 } | 750 } |
725 | 751 |
726 } // namespace extensions | 752 } // namespace extensions |
OLD | NEW |