Index: chrome/browser/extensions/extension_preference_api.cc |
=================================================================== |
--- chrome/browser/extensions/extension_preference_api.cc (revision 125184) |
+++ 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,23 @@ |
extension_id, event_name, json_args, NULL, GURL()); |
} |
-// TODO(battre): Factor out common parts once this is stable. |
+PreferenceFunction::~PreferenceFunction() { } |
+bool PreferenceFunction::ValidateBrowserPref( |
+ const 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 +365,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 +414,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 +425,7 @@ |
EXTENSION_FUNCTION_VALIDATE(helpers::StringToScope(scope_str, &scope)); |
} |
+ // Check incognito scope. |
bool incognito = (scope == kExtensionPrefsScopeIncognitoPersistent || |
scope == kExtensionPrefsScopeIncognitoSessionOnly); |
if (incognito) { |
@@ -435,20 +449,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 +471,7 @@ |
bad_message_ = bad_message; |
return false; |
} |
+ |
prefs->SetExtensionControlledPref(extension_id(), |
browser_pref, |
scope, |
@@ -485,6 +496,7 @@ |
EXTENSION_FUNCTION_VALIDATE(helpers::StringToScope(scope_str, &scope)); |
} |
+ // Check incognito scope. |
bool incognito = (scope == kExtensionPrefsScopeIncognitoPersistent || |
scope == kExtensionPrefsScopeIncognitoSessionOnly); |
if (incognito) { |
@@ -500,15 +512,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; |