| 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 |