Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5145)

Unified Diff: chrome/browser/extensions/extension_preference_api.cc

Issue 9566007: Initial Managed Mode extension API, supporting querying the setting and a stub for enabling the mod… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Fixed API test.js Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_preference_api.cc
===================================================================
--- chrome/browser/extensions/extension_preference_api.cc (revision 124628)
+++ 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,
Finnur 2012/03/05 10:45:02 const std::string& ?
+ 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;

Powered by Google App Engine
This is Rietveld 408576698