| Index: chrome/browser/extensions/extension_prefs.cc
|
| diff --git a/chrome/browser/extensions/extension_prefs.cc b/chrome/browser/extensions/extension_prefs.cc
|
| index 9676f74170c8c9cf48b6f36ed0e1bbfb06197aa8..3437643a4d4ab5b8b1688ad08ba7fd30a844d527 100644
|
| --- a/chrome/browser/extensions/extension_prefs.cc
|
| +++ b/chrome/browser/extensions/extension_prefs.cc
|
| @@ -178,6 +178,15 @@ const char kFilteredEvents[] = "filtered_events";
|
| // Persisted value for omnibox.setDefaultSuggestion.
|
| const char kOmniboxDefaultSuggestion[] = "omnibox_default_suggestion";
|
|
|
| +// List of media gallery permissions.
|
| +const char kMediaGalleriesPermissions[] = "media_galleries_permissions";
|
| +
|
| +// Key for Media Gallery ID.
|
| +const char kMediaGalleryIdKey[] = "id";
|
| +
|
| +// Key for Media Gallery Permission Value.
|
| +const char kMediaGalleryHasPermissionKey[] = "has_permission";
|
| +
|
| // Provider of write access to a dictionary storing extension prefs.
|
| class ScopedExtensionPrefUpdate : public DictionaryPrefUpdate {
|
| public:
|
| @@ -1150,6 +1159,121 @@ void ExtensionPrefs::SetLaunchType(const std::string& extension_id,
|
| Value::CreateIntegerValue(static_cast<int>(launch_type)));
|
| }
|
|
|
| +namespace {
|
| +
|
| +bool GetMediaGalleryPermissionFromDictionary(
|
| + const DictionaryValue* dict,
|
| + MediaGalleryPermission* out_permission) {
|
| + std::string string_id;
|
| + if (dict->GetString(kMediaGalleryIdKey, &string_id) &&
|
| + base::StringToUint64(string_id, &out_permission->pref_id) &&
|
| + dict->GetBoolean(kMediaGalleryHasPermissionKey,
|
| + &out_permission->has_permission)) {
|
| + return true;
|
| + }
|
| + NOTREACHED();
|
| + return false;
|
| +}
|
| +
|
| +void RemoveMediaGalleryPermissionsFromExtension(PrefService* prefs,
|
| + const std::string& extension_id,
|
| + MediaGalleryPrefId gallery_id) {
|
| + ScopedExtensionPrefUpdate update(prefs, extension_id);
|
| + DictionaryValue* extension_dict = update.Get();
|
| + ListValue* permissions = NULL;
|
| + if (!extension_dict->GetList(kMediaGalleriesPermissions, &permissions))
|
| + return;
|
| +
|
| + for (ListValue::iterator it = permissions->begin();
|
| + it != permissions->end();
|
| + ++it) {
|
| + const DictionaryValue* dict = NULL;
|
| + if (!(*it)->GetAsDictionary(&dict))
|
| + continue;
|
| + MediaGalleryPermission perm;
|
| + if (!GetMediaGalleryPermissionFromDictionary(dict, &perm))
|
| + continue;
|
| + if (perm.pref_id == gallery_id) {
|
| + permissions->Erase(it, NULL);
|
| + return;
|
| + }
|
| + }
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +void ExtensionPrefs::SetMediaGalleryPermission(const std::string& extension_id,
|
| + MediaGalleryPrefId gallery,
|
| + bool has_access) {
|
| + ScopedExtensionPrefUpdate update(prefs_, extension_id);
|
| + DictionaryValue* extension_dict = update.Get();
|
| + ListValue* permissions = NULL;
|
| + if (!extension_dict->GetList(kMediaGalleriesPermissions, &permissions)) {
|
| + permissions = new ListValue;
|
| + extension_dict->Set(kMediaGalleriesPermissions, permissions);
|
| + } else {
|
| + // If the gallery is already in the list, update the permission.
|
| + for (ListValue::const_iterator it = permissions->begin();
|
| + it != permissions->end();
|
| + ++it) {
|
| + DictionaryValue* dict = NULL;
|
| + if (!(*it)->GetAsDictionary(&dict))
|
| + continue;
|
| + MediaGalleryPermission perm;
|
| + if (!GetMediaGalleryPermissionFromDictionary(dict, &perm))
|
| + continue;
|
| + if (perm.pref_id == gallery) {
|
| + dict->SetBoolean(kMediaGalleryHasPermissionKey, has_access);
|
| + return;
|
| + }
|
| + }
|
| + }
|
| +
|
| + DictionaryValue* dict = new DictionaryValue;
|
| + dict->SetString(kMediaGalleryIdKey, base::Uint64ToString(gallery));
|
| + dict->SetBoolean(kMediaGalleryHasPermissionKey, has_access);
|
| + permissions->Append(dict);
|
| +}
|
| +
|
| +std::vector<MediaGalleryPermission> ExtensionPrefs::GetMediaGalleryPermissions(
|
| + const std::string& extension_id) {
|
| + std::vector<MediaGalleryPermission> result;
|
| + const ListValue* permissions = NULL;
|
| + if (ReadExtensionPrefList(extension_id, kMediaGalleriesPermissions,
|
| + &permissions)) {
|
| + for (ListValue::const_iterator it = permissions->begin();
|
| + it != permissions->end();
|
| + ++it) {
|
| + DictionaryValue* dict = NULL;
|
| + if (!(*it)->GetAsDictionary(&dict))
|
| + continue;
|
| + MediaGalleryPermission perm;
|
| + if (!GetMediaGalleryPermissionFromDictionary(dict, &perm))
|
| + continue;
|
| + result.push_back(perm);
|
| + }
|
| + }
|
| + return result;
|
| +}
|
| +
|
| +void ExtensionPrefs::RemoveMediaGalleryPermissions(
|
| + MediaGalleryPrefId gallery_id) {
|
| + const DictionaryValue* extensions = prefs_->GetDictionary(kExtensionsPref);
|
| + if (!extensions)
|
| + return;
|
| +
|
| + for (DictionaryValue::key_iterator it = extensions->begin_keys();
|
| + it != extensions->end_keys();
|
| + ++it) {
|
| + const std::string& id(*it);
|
| + if (!Extension::IdIsValid(id)) {
|
| + NOTREACHED();
|
| + continue;
|
| + }
|
| + RemoveMediaGalleryPermissionsFromExtension(prefs_, id, gallery_id);
|
| + }
|
| +}
|
| +
|
| bool ExtensionPrefs::DoesExtensionHaveState(
|
| const std::string& id, Extension::State check_state) const {
|
| const DictionaryValue* extension = GetExtensionPref(id);
|
|
|