Chromium Code Reviews| Index: chrome/common/extensions/api/extension_action/action_info.cc |
| diff --git a/chrome/common/extensions/api/extension_action/action_info.cc b/chrome/common/extensions/api/extension_action/action_info.cc |
| index ec957f84779d6abd985cfa773b684c0042904d8e..840fdaecfed42d0fdfb25cbc69fb4556c522ed39 100644 |
| --- a/chrome/common/extensions/api/extension_action/action_info.cc |
| +++ b/chrome/common/extensions/api/extension_action/action_info.cc |
| @@ -5,9 +5,15 @@ |
| #include "chrome/common/extensions/api/extension_action/action_info.h" |
| #include "base/memory/scoped_ptr.h" |
| +#include "base/utf_string_conversions.h" |
| #include "chrome/common/extensions/api/commands/commands_handler.h" |
| #include "chrome/common/extensions/extension.h" |
| #include "chrome/common/extensions/extension_manifest_constants.h" |
| +#include "chrome/common/extensions/manifest_handler_helpers.h" |
| +#include "extensions/common/error_utils.h" |
| + |
| +namespace errors = extension_manifest_errors; |
| +namespace keys = extension_manifest_keys; |
|
Yoyo Zhou
2013/03/21 00:07:50
You can use these to shorten some declarations fur
Devlin
2013/03/23 22:23:08
Done.
|
| namespace extensions { |
| @@ -46,6 +52,136 @@ ActionInfo::~ActionInfo() { |
| } |
| // static |
| +scoped_ptr<ActionInfo> ActionInfo::Load(const Extension* extension, |
| + const base::DictionaryValue* dict, |
| + string16* error) { |
| + scoped_ptr<ActionInfo> result(new ActionInfo()); |
| + |
| + if (extension->manifest_version() == 1) { |
| + // kPageActionIcons is obsolete, and used by very few extensions. Continue |
| + // loading it, but only take the first icon as the default_icon path. |
| + const ListValue* icons = NULL; |
| + if (dict->HasKey(keys::kPageActionIcons) && |
| + dict->GetList(keys::kPageActionIcons, &icons)) { |
| + for (ListValue::const_iterator iter = icons->begin(); |
| + iter != icons->end(); ++iter) { |
| + std::string path; |
| + if (!(*iter)->GetAsString(&path) || |
| + !manifest_handler_helpers::NormalizeAndValidatePath(&path)) { |
| + *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); |
| + return scoped_ptr<ActionInfo>(); |
| + } |
| + |
| + result->default_icon.Add(extension_misc::EXTENSION_ICON_ACTION, path); |
| + break; |
| + } |
| + } |
| + |
| + std::string id; |
| + if (dict->HasKey(keys::kPageActionId)) { |
| + if (!dict->GetString(keys::kPageActionId, &id)) { |
| + *error = ASCIIToUTF16(errors::kInvalidPageActionId); |
| + return scoped_ptr<ActionInfo>(); |
| + } |
| + result->id = id; |
| + } |
| + } |
| + |
| + // Read the page action |default_icon| (optional). |
| + // The |default_icon| value can be either dictionary {icon size -> icon path} |
| + // or non empty string value. |
| + if (dict->HasKey(keys::kPageActionDefaultIcon)) { |
| + const DictionaryValue* icons_value = NULL; |
| + std::string default_icon; |
| + if (dict->GetDictionary(keys::kPageActionDefaultIcon, &icons_value)) { |
| + if (!manifest_handler_helpers::LoadIconsFromDictionary( |
| + icons_value, |
| + extension_misc::kExtensionActionIconSizes, |
| + extension_misc::kNumExtensionActionIconSizes, |
| + &result->default_icon, |
| + error)) { |
| + return scoped_ptr<ActionInfo>(); |
| + } |
| + } else if (dict->GetString(keys::kPageActionDefaultIcon, &default_icon) && |
| + manifest_handler_helpers::NormalizeAndValidatePath( |
| + &default_icon)) { |
| + result->default_icon.Add(extension_misc::EXTENSION_ICON_ACTION, |
| + default_icon); |
| + } else { |
| + *error = ASCIIToUTF16(errors::kInvalidPageActionIconPath); |
| + return scoped_ptr<ActionInfo>(); |
| + } |
| + } |
| + |
| + // Read the page action title from |default_title| if present, |name| if not |
| + // (both optional). |
| + if (dict->HasKey(keys::kPageActionDefaultTitle)) { |
| + if (!dict->GetString(keys::kPageActionDefaultTitle, |
| + &result->default_title)) { |
| + *error = ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle); |
| + return scoped_ptr<ActionInfo>(); |
| + } |
| + } else if (extension->manifest_version() == 1 && dict->HasKey(keys::kName)) { |
| + if (!dict->GetString(keys::kName, &result->default_title)) { |
| + *error = ASCIIToUTF16(errors::kInvalidPageActionName); |
| + return scoped_ptr<ActionInfo>(); |
| + } |
| + } |
| + |
| + // Read the action's |popup| (optional). |
| + const char* popup_key = NULL; |
| + if (dict->HasKey(keys::kPageActionDefaultPopup)) |
| + popup_key = keys::kPageActionDefaultPopup; |
| + |
| + if (extension->manifest_version() == 1 && |
| + dict->HasKey(keys::kPageActionPopup)) { |
| + if (popup_key) { |
| + *error = ErrorUtils::FormatErrorMessageUTF16( |
| + errors::kInvalidPageActionOldAndNewKeys, |
| + keys::kPageActionDefaultPopup, |
| + keys::kPageActionPopup); |
| + return scoped_ptr<ActionInfo>(); |
| + } |
| + popup_key = keys::kPageActionPopup; |
| + } |
| + |
| + if (popup_key) { |
| + const DictionaryValue* popup = NULL; |
| + std::string url_str; |
| + |
| + if (dict->GetString(popup_key, &url_str)) { |
| + // On success, |url_str| is set. Nothing else to do. |
| + } else if (extension->manifest_version() == 1 && |
| + dict->GetDictionary(popup_key, &popup)) { |
| + if (!popup->GetString(keys::kPageActionPopupPath, &url_str)) { |
| + *error = ErrorUtils::FormatErrorMessageUTF16( |
| + errors::kInvalidPageActionPopupPath, "<missing>"); |
| + return scoped_ptr<ActionInfo>(); |
| + } |
| + } else { |
| + *error = ASCIIToUTF16(errors::kInvalidPageActionPopup); |
| + return scoped_ptr<ActionInfo>(); |
| + } |
| + |
| + if (!url_str.empty()) { |
| + // An empty string is treated as having no popup. |
| + result->default_popup_url = Extension::GetResourceURL(extension->url(), |
| + url_str); |
| + if (!result->default_popup_url.is_valid()) { |
| + *error = ErrorUtils::FormatErrorMessageUTF16( |
| + errors::kInvalidPageActionPopupPath, url_str); |
| + return scoped_ptr<ActionInfo>(); |
| + } |
| + } else { |
| + DCHECK(result->default_popup_url.is_empty()) |
| + << "Shouldn't be possible for the popup to be set."; |
| + } |
| + } |
| + |
| + return result.Pass(); |
| +} |
| + |
| +// static |
| const ActionInfo* ActionInfo::GetBrowserActionInfo(const Extension* extension) { |
| return GetActionInfo(extension, extension_manifest_keys::kBrowserAction); |
| } |
| @@ -65,6 +201,12 @@ const ActionInfo* ActionInfo::GetPageLauncherInfo(const Extension* extension) { |
| } |
| // static |
| +const ActionInfo* ActionInfo::GetSystemIndicatorInfo( |
| + const Extension* extension) { |
| + return GetActionInfo(extension, extension_manifest_keys::kSystemIndicator); |
| +} |
| + |
| +// static |
| void ActionInfo::SetBrowserActionInfo(Extension* extension, ActionInfo* info) { |
| extension->SetManifestData(extension_manifest_keys::kBrowserAction, |
| new ActionInfoData(info)); |
| @@ -89,6 +231,13 @@ void ActionInfo::SetPageLauncherInfo(Extension* extension, ActionInfo* info) { |
| } |
| // static |
| +void ActionInfo::SetSystemIndicatorInfo(Extension* extension, |
| + ActionInfo* info) { |
| + extension->SetManifestData(extension_manifest_keys::kSystemIndicator, |
| + new ActionInfoData(info)); |
| +} |
| + |
| +// static |
| bool ActionInfo::IsVerboseInstallMessage(const Extension* extension) { |
| const ActionInfo* page_action_info = GetPageActionInfo(extension); |
| return page_action_info && |