| Index: chrome/browser/extensions/extension_preference_api.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/extension_preference_api.cc (revision 124408)
|
| +++ chrome/browser/extensions/extension_preference_api.cc (working copy)
|
| @@ -26,6 +26,9 @@
|
| #include "content/public/browser/notification_details.h"
|
| #include "content/public/browser/notification_source.h"
|
|
|
| +namespace keys = extension_preference_api_constants;
|
| +namespace helpers = extension_preference_helpers;
|
| +
|
| namespace {
|
|
|
| struct PrefMappingEntry {
|
| @@ -41,15 +44,6 @@
|
| ExtensionAPIPermission::ID permission;
|
| };
|
|
|
| -const char kNotControllable[] = "not_controllable";
|
| -const char kControlledByOtherExtensions[] = "controlled_by_other_extensions";
|
| -const char kControllableByThisExtension[] = "controllable_by_this_extension";
|
| -const char kControlledByThisExtension[] = "controlled_by_this_extension";
|
| -
|
| -const char kIncognitoSpecific[] = "incognitoSpecific";
|
| -const char kLevelOfControl[] = "levelOfControl";
|
| -const char kValue[] = "value";
|
| -
|
| const char kOnPrefChangeFormat[] = "types.ChromeSetting.%s.onChange";
|
|
|
| PrefMappingEntry kPrefMapping[] = {
|
| @@ -69,6 +63,10 @@
|
| prefs::kInstantEnabled,
|
| ExtensionAPIPermission::kPrivacy
|
| },
|
| + { "managedModeEnabled",
|
| + prefs::kInManagedMode,
|
| + ExtensionAPIPermission::kManagedMode
|
| + },
|
| { "networkPredictionEnabled",
|
| prefs::kNetworkPredictionEnabled,
|
| ExtensionAPIPermission::kPrivacy
|
| @@ -148,15 +146,15 @@
|
| ExtensionPrefs* ep = profile->GetExtensionService()->extension_prefs();
|
|
|
| if (!pref->IsExtensionModifiable())
|
| - return kNotControllable;
|
| + return keys::kNotControllable;
|
|
|
| if (ep->DoesExtensionControlPref(extension_id, browser_pref, incognito))
|
| - return kControlledByThisExtension;
|
| + return keys::kControlledByThisExtension;
|
|
|
| if (ep->CanExtensionControlPref(extension_id, browser_pref, incognito))
|
| - return kControllableByThisExtension;
|
| + return keys::kControllableByThisExtension;
|
|
|
| - return kControlledByOtherExtensions;
|
| + return keys::kControlledByOtherExtensions;
|
| }
|
|
|
| class PrefMapping {
|
| @@ -253,9 +251,6 @@
|
|
|
| } // namespace
|
|
|
| -namespace keys = extension_preference_api_constants;
|
| -namespace helpers = extension_preference_helpers;
|
| -
|
| ExtensionPreferenceEventRouter::ExtensionPreferenceEventRouter(
|
| Profile* profile) : profile_(profile) {
|
| registrar_.Init(profile_->GetPrefs());
|
| @@ -301,10 +296,11 @@
|
| ExtensionService* extension_service = profile_->GetExtensionService();
|
| PrefTransformerInterface* transformer =
|
| PrefMapping::GetInstance()->FindTransformerForBrowserPref(browser_pref);
|
| - dict->Set(kValue, transformer->BrowserToExtensionPref(pref->GetValue()));
|
| + dict->Set(keys::kValue,
|
| + transformer->BrowserToExtensionPref(pref->GetValue()));
|
| if (incognito) {
|
| ExtensionPrefs* ep = extension_service->extension_prefs();
|
| - dict->SetBoolean(kIncognitoSpecific,
|
| + dict->SetBoolean(keys::kIncognitoSpecific,
|
| ep->HasIncognitoPrefValue(browser_pref));
|
| }
|
|
|
| @@ -321,7 +317,7 @@
|
| (!incognito || extension_service->CanCrossIncognito(*it))) {
|
| std::string level_of_control =
|
| GetLevelOfControl(profile_, extension_id, browser_pref, incognito);
|
| - dict->SetString(kLevelOfControl, level_of_control);
|
| + dict->SetString(keys::kLevelOfControl, level_of_control);
|
|
|
| std::string json_args;
|
| base::JSONWriter::Write(&args, false, &json_args);
|
| @@ -339,8 +335,22 @@
|
| extension_id, event_name, json_args, NULL, GURL());
|
| }
|
|
|
| -// TODO(battre): Factor out common parts once this is stable.
|
| +PreferenceFunction::~PreferenceFunction() { }
|
|
|
| +bool PreferenceFunction::ValidateBrowserPref(std::string extension_pref_key,
|
| + std::string* browser_pref_key) {
|
| + ExtensionAPIPermission::ID permission = ExtensionAPIPermission::kInvalid;
|
| + EXTENSION_FUNCTION_VALIDATE(
|
| + PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref(
|
| + extension_pref_key, browser_pref_key, &permission));
|
| + if (!GetExtension()->HasAPIPermission(permission)) {
|
| + error_ = ExtensionErrorUtils::FormatErrorMessage(
|
| + keys::kPermissionErrorMessage, extension_pref_key);
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| GetPreferenceFunction::~GetPreferenceFunction() { }
|
|
|
| bool GetPreferenceFunction::RunImpl() {
|
| @@ -354,40 +364,42 @@
|
| EXTENSION_FUNCTION_VALIDATE(details->GetBoolean(keys::kIncognitoKey,
|
| &incognito));
|
|
|
| + // Check incognito access.
|
| if (incognito && !include_incognito()) {
|
| error_ = keys::kIncognitoErrorMessage;
|
| return false;
|
| }
|
|
|
| + // Obtain pref.
|
| + std::string browser_pref;
|
| + if (!ValidateBrowserPref(pref_key, &browser_pref))
|
| + return false;
|
| PrefService* prefs = incognito ? profile_->GetOffTheRecordPrefs()
|
| : profile_->GetPrefs();
|
| - std::string browser_pref;
|
| - ExtensionAPIPermission::ID permission = ExtensionAPIPermission::kInvalid;
|
| - EXTENSION_FUNCTION_VALIDATE(
|
| - PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref(
|
| - pref_key, &browser_pref, &permission));
|
| - if (!GetExtension()->HasAPIPermission(permission)) {
|
| - error_ = ExtensionErrorUtils::FormatErrorMessage(
|
| - keys::kPermissionErrorMessage, pref_key);
|
| - return false;
|
| - }
|
| -
|
| const PrefService::Preference* pref =
|
| prefs->FindPreference(browser_pref.c_str());
|
| CHECK(pref);
|
| +
|
| + scoped_ptr<DictionaryValue> result(new DictionaryValue);
|
| +
|
| + // Retrieve level of control.
|
| std::string level_of_control =
|
| GetLevelOfControl(profile_, extension_id(), browser_pref, incognito);
|
| + result->SetString(keys::kLevelOfControl, level_of_control);
|
|
|
| - scoped_ptr<DictionaryValue> result(new DictionaryValue);
|
| + // Retrieve pref value.
|
| PrefTransformerInterface* transformer =
|
| PrefMapping::GetInstance()->FindTransformerForBrowserPref(browser_pref);
|
| - result->Set(kValue, transformer->BrowserToExtensionPref(pref->GetValue()));
|
| - result->SetString(kLevelOfControl, level_of_control);
|
| + result->Set(keys::kValue,
|
| + transformer->BrowserToExtensionPref(pref->GetValue()));
|
| +
|
| + // Retrieve incognito status.
|
| if (incognito) {
|
| ExtensionPrefs* ep = profile_->GetExtensionService()->extension_prefs();
|
| - result->SetBoolean(kIncognitoSpecific,
|
| + result->SetBoolean(keys::kIncognitoSpecific,
|
| ep->HasIncognitoPrefValue(browser_pref));
|
| }
|
| +
|
| result_.reset(result.release());
|
| return true;
|
| }
|
| @@ -401,7 +413,7 @@
|
| EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &details));
|
|
|
| Value* value = NULL;
|
| - EXTENSION_FUNCTION_VALIDATE(details->Get(kValue, &value));
|
| + EXTENSION_FUNCTION_VALIDATE(details->Get(keys::kValue, &value));
|
|
|
| ExtensionPrefsScope scope = kExtensionPrefsScopeRegular;
|
| if (details->HasKey(keys::kScopeKey)) {
|
| @@ -412,6 +424,7 @@
|
| EXTENSION_FUNCTION_VALIDATE(helpers::StringToScope(scope_str, &scope));
|
| }
|
|
|
| + // Check incognito scope.
|
| bool incognito = (scope == kExtensionPrefsScopeIncognitoPersistent ||
|
| scope == kExtensionPrefsScopeIncognitoSessionOnly);
|
| if (incognito) {
|
| @@ -435,20 +448,16 @@
|
| return false;
|
| }
|
|
|
| + // Obtain pref.
|
| std::string browser_pref;
|
| - ExtensionAPIPermission::ID permission = ExtensionAPIPermission::kInvalid;
|
| - EXTENSION_FUNCTION_VALIDATE(
|
| - PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref(
|
| - pref_key, &browser_pref, &permission));
|
| - if (!GetExtension()->HasAPIPermission(permission)) {
|
| - error_ = ExtensionErrorUtils::FormatErrorMessage(
|
| - keys::kPermissionErrorMessage, pref_key);
|
| + if (!ValidateBrowserPref(pref_key, &browser_pref))
|
| return false;
|
| - }
|
| ExtensionPrefs* prefs = profile_->GetExtensionService()->extension_prefs();
|
| const PrefService::Preference* pref =
|
| prefs->pref_service()->FindPreference(browser_pref.c_str());
|
| CHECK(pref);
|
| +
|
| + // Validate new value.
|
| EXTENSION_FUNCTION_VALIDATE(value->GetType() == pref->GetType());
|
| PrefTransformerInterface* transformer =
|
| PrefMapping::GetInstance()->FindTransformerForBrowserPref(browser_pref);
|
| @@ -461,6 +470,7 @@
|
| bad_message_ = bad_message;
|
| return false;
|
| }
|
| +
|
| prefs->SetExtensionControlledPref(extension_id(),
|
| browser_pref,
|
| scope,
|
| @@ -485,6 +495,7 @@
|
| EXTENSION_FUNCTION_VALIDATE(helpers::StringToScope(scope_str, &scope));
|
| }
|
|
|
| + // Check incognito scope.
|
| bool incognito = (scope == kExtensionPrefsScopeIncognitoPersistent ||
|
| scope == kExtensionPrefsScopeIncognitoSessionOnly);
|
| if (incognito) {
|
| @@ -500,15 +511,9 @@
|
| }
|
|
|
| std::string browser_pref;
|
| - ExtensionAPIPermission::ID permission = ExtensionAPIPermission::kInvalid;
|
| - EXTENSION_FUNCTION_VALIDATE(
|
| - PrefMapping::GetInstance()->FindBrowserPrefForExtensionPref(
|
| - pref_key, &browser_pref, &permission));
|
| - if (!GetExtension()->HasAPIPermission(permission)) {
|
| - error_ = ExtensionErrorUtils::FormatErrorMessage(
|
| - keys::kPermissionErrorMessage, pref_key);
|
| + if (!ValidateBrowserPref(pref_key, &browser_pref))
|
| return false;
|
| - }
|
| +
|
| ExtensionPrefs* prefs = profile_->GetExtensionService()->extension_prefs();
|
| prefs->RemoveExtensionControlledPref(extension_id(), browser_pref, scope);
|
| return true;
|
|
|