Index: chrome/browser/extensions/extension_prefs.cc |
diff --git a/chrome/browser/extensions/extension_prefs.cc b/chrome/browser/extensions/extension_prefs.cc |
index 584ed3b94dad2d92fce8691557ac85a41d4afee6..5f2001839d871a4d0d66e5898001e3d9ad70d068 100644 |
--- a/chrome/browser/extensions/extension_prefs.cc |
+++ b/chrome/browser/extensions/extension_prefs.cc |
@@ -509,19 +509,45 @@ PermissionSet* ExtensionPrefs::ReadExtensionPrefPermissionSet( |
if (!GetExtensionPref(extension_id)) |
return NULL; |
- // Retrieve the API permissions. |
+ // Retrieve the API permissions. Please refer SetExtensionPrefPermissionSet() |
+ // for api_values format. |
APIPermissionSet apis; |
const ListValue* api_values = NULL; |
std::string api_pref = JoinPrefs(pref_key, kPrefAPIs); |
if (ReadExtensionPrefList(extension_id, api_pref, &api_values)) { |
PermissionsInfo* info = PermissionsInfo::GetInstance(); |
for (size_t i = 0; i < api_values->GetSize(); ++i) { |
+ const DictionaryValue* permission_dict = NULL; |
std::string permission_name; |
- if (api_values->GetString(i, &permission_name)) { |
- APIPermission *permission = info->GetByName(permission_name); |
- if (permission) |
- apis.insert(permission->id()); |
+ if (!api_values->GetString(i, &permission_name) && |
+ !api_values->GetDictionary(i, &permission_dict)) { |
+ NOTREACHED() << "Permission is not a string or dict. "; |
+ continue; |
+ } |
+ |
+ const base::Value *permission_detail = NULL; |
+ if (permission_dict) { |
+ if (permission_dict->size() != 1u) { |
+ NOTREACHED() << "Permission is not a single key dict."; |
+ continue; |
+ } |
+ base::DictionaryValue::Iterator it(*permission_dict); |
+ permission_name = it.key(); |
+ permission_detail = &it.value(); |
+ } |
+ |
+ APIPermission *permission = info->GetByName(permission_name); |
+ if (!permission) { |
+ NOTREACHED() << "Unknown permission[" << permission_name << "]."; |
+ continue; |
+ } |
+ |
+ scoped_refptr<APIPermissionDetail> detail = permission->CreateDetail(); |
+ if (!detail->FromValue(permission_detail)) { |
+ NOTREACHED() << "Parse permission detail failed."; |
+ continue; |
} |
+ apis.insert(detail); |
} |
} |
@@ -545,15 +571,27 @@ void ExtensionPrefs::SetExtensionPrefPermissionSet( |
const std::string& pref_key, |
const PermissionSet* new_value) { |
// Set the API permissions. |
+ // The format of api_values is: |
+ // [ "permission_name1", // permissions do not support detail. |
+ // "permission_name2", |
+ // {"permission_name3": value }, |
+ // // permission supports detail, permission detail will be stored in value. |
+ // ... |
+ // ] |
ListValue* api_values = new ListValue(); |
APIPermissionSet apis = new_value->apis(); |
- PermissionsInfo* info = PermissionsInfo::GetInstance(); |
std::string api_pref = JoinPrefs(pref_key, kPrefAPIs); |
for (APIPermissionSet::const_iterator i = apis.begin(); |
i != apis.end(); ++i) { |
- APIPermission* perm = info->GetByID(*i); |
- if (perm) |
- api_values->Append(Value::CreateStringValue(perm->name())); |
+ Value* detail = NULL; |
+ i->ToValue(&detail); |
+ if (detail) { |
+ DictionaryValue* tmp = new DictionaryValue(); |
+ tmp->Set(i->name(), detail); |
+ api_values->Append(tmp); |
+ } else { |
+ api_values->Append(Value::CreateStringValue(i->name())); |
+ } |
} |
UpdateExtensionPref(extension_id, api_pref, api_values); |