Index: chrome/common/extensions/extension.cc |
diff --git a/chrome/common/extensions/extension.cc b/chrome/common/extensions/extension.cc |
index 8b045771730df6fe927f799dafe53c01b57ddec9..1d34c97ddfb3c5690ae8dddecd7a6c0bb46b7588 100644 |
--- a/chrome/common/extensions/extension.cc |
+++ b/chrome/common/extensions/extension.cc |
@@ -104,7 +104,6 @@ const size_t Extension::kNumPermissions = |
arraysize(Extension::kPermissionNames); |
Extension::~Extension() { |
- STLDeleteValues(&page_actions_); |
} |
const std::string Extension::VersionString() const { |
@@ -146,20 +145,6 @@ GURL Extension::GetResourceURL(const GURL& extension_url, |
return ret_val; |
} |
-const ExtensionAction* Extension::GetExtensionAction( |
- std::string id, ExtensionAction::ExtensionActionType action_type) const { |
- if (action_type == ExtensionAction::BROWSER_ACTION) { |
- DCHECK(id.empty()); // Multiple browser actions are not allowed. |
- return browser_action_.get(); |
- } else { |
- ExtensionActionMap::const_iterator it = page_actions_.find(id); |
- if (it == page_actions_.end()) |
- return NULL; |
- |
- return it->second; |
- } |
-} |
- |
Extension::Location Extension::ExternalExtensionInstallType( |
std::string registry_path) { |
#if defined(OS_WIN) |
@@ -310,73 +295,66 @@ bool Extension::LoadUserScriptHelper(const DictionaryValue* content_script, |
// Helper method that loads a PageAction or BrowserAction object from a |
// dictionary in the page_actions list or browser_action key of the manifest. |
ExtensionAction* Extension::LoadExtensionActionHelper( |
- const DictionaryValue* page_action, int definition_index, |
- std::string* error, ExtensionAction::ExtensionActionType action_type) { |
+ const DictionaryValue* page_action, std::string* error, |
+ ExtensionAction::ExtensionActionType action_type) { |
scoped_ptr<ExtensionAction> result(new ExtensionAction()); |
result->set_extension_id(id()); |
result->set_type(action_type); |
+ // TODO(EXTENSIONS_DEPRECATED): icons list is obsolete. |
ListValue* icons = NULL; |
- // Read the page action |icons|. |
- if (!page_action->HasKey(keys::kPageActionIcons) || |
- !page_action->GetList(keys::kPageActionIcons, &icons) || |
- icons->GetSize() == 0) { |
- // Icons are only required for page actions. |
- if (action_type == ExtensionAction::PAGE_ACTION) { |
- *error = ExtensionErrorUtils::FormatErrorMessage( |
- errors::kInvalidPageActionIconPaths, IntToString(definition_index)); |
- return NULL; |
- } |
- } |
- |
- int icon_count = 0; |
- if (icons) { |
+ if (page_action->HasKey(keys::kPageActionIcons) && |
+ page_action->GetList(keys::kPageActionIcons, &icons)) { |
for (ListValue::const_iterator iter = icons->begin(); |
iter != icons->end(); ++iter) { |
std::string path; |
if (!(*iter)->GetAsString(&path) || path.empty()) { |
- *error = ExtensionErrorUtils::FormatErrorMessage( |
- errors::kInvalidPageActionIconPath, |
- IntToString(definition_index), IntToString(icon_count)); |
+ *error = errors::kInvalidPageActionIconPath; |
return NULL; |
} |
result->AddIconPath(path); |
- ++icon_count; |
} |
} |
- if (action_type == ExtensionAction::BROWSER_ACTION) { |
- result->set_id(""); // Not needed (only 1 browser action per extension). |
- } else { |
- // Read the page action |id|. |
- std::string id; |
- if (!page_action->GetString(keys::kPageActionId, &id)) { |
- *error = ExtensionErrorUtils::FormatErrorMessage( |
- errors::kInvalidPageActionId, IntToString(definition_index)); |
+ // TODO(EXTENSIONS_DEPRECATED): Read the page action |id| (optional). |
+ std::string id; |
+ if (action_type == ExtensionAction::PAGE_ACTION) |
+ page_action->GetString(keys::kPageActionId, &id); |
+ result->set_id(id); |
+ |
+ std::string default_icon; |
+ // Read the page action |default_icon| (optional). |
+ if (page_action->HasKey(keys::kPageActionDefaultIcon)) { |
+ if (!page_action->GetString(keys::kPageActionDefaultIcon, &default_icon) || |
+ default_icon.empty()) { |
+ *error = errors::kInvalidPageActionIconPath; |
return NULL; |
} |
- result->set_id(id); |
+ // TODO(EXTENSIONS_DEPRECATED): one icon. |
+ result->AddIconPath(default_icon); |
} |
- // Read the page action |name|. |
- std::string name; |
- if (!page_action->GetString(keys::kName, &name)) { |
- *error = ExtensionErrorUtils::FormatErrorMessage(errors::kInvalidName, |
- IntToString(definition_index)); |
+ // Read the page action |default_title|. |
+ std::string title; |
+ if (!page_action->GetString(keys::kName, &title) && |
+ !page_action->GetString(keys::kPageActionDefaultTitle, &title)) { |
+ *error = errors::kInvalidPageActionDefaultTitle; |
return NULL; |
} |
- result->set_name(name); |
+ result->set_title(title); |
// Read the action's |popup| (optional). |
DictionaryValue* popup = NULL; |
+ std::string url_str; |
if (page_action->HasKey(keys::kPageActionPopup) && |
- !page_action->GetDictionary(keys::kPageActionPopup, &popup)) { |
+ !page_action->GetDictionary(keys::kPageActionPopup, &popup) && |
+ !page_action->GetString(keys::kPageActionPopup, &url_str)) { |
*error = errors::kInvalidPageActionPopup; |
return NULL; |
} |
if (popup) { |
- std::string url_str; |
+ // TODO(EXTENSIONS_DEPRECATED): popup is a string only |
if (!popup->GetString(keys::kPageActionPopupPath, &url_str)) { |
*error = ExtensionErrorUtils::FormatErrorMessage( |
errors::kInvalidPageActionPopupPath, "<missing>"); |
@@ -397,6 +375,17 @@ ExtensionAction* Extension::LoadExtensionActionHelper( |
return NULL; |
} |
result->set_popup_height(height); |
+ } else if (!url_str.empty()) { |
+ GURL url = GetResourceURL(url_str); |
+ if (!url.is_valid()) { |
+ *error = ExtensionErrorUtils::FormatErrorMessage( |
+ errors::kInvalidPageActionPopupPath, url_str); |
+ return NULL; |
+ } |
+ result->set_popup_url(url); |
+ // TODO(erikkay): Need dynamic sizing of popups. |
+ // http://code.google.com/p/chromium/issues/detail?id=24471 |
+ result->set_popup_height(100); |
} |
return result.release(); |
@@ -929,7 +918,7 @@ bool Extension::InitFromValue(const DictionaryValue& source, bool require_id, |
} |
} |
- // Initialize page actions (optional). |
+ // Initialize page action (optional). |
if (source.HasKey(keys::kPageActions)) { |
ListValue* list_value; |
if (!source.GetList(keys::kPageActions, &list_value)) { |
@@ -937,39 +926,52 @@ bool Extension::InitFromValue(const DictionaryValue& source, bool require_id, |
return false; |
} |
- for (size_t i = 0; i < list_value->GetSize(); ++i) { |
- DictionaryValue* page_action_value; |
- if (!list_value->GetDictionary(i, &page_action_value)) { |
- *error = ExtensionErrorUtils::FormatErrorMessage( |
- errors::kInvalidPageAction, IntToString(i)); |
- return false; |
- } |
+ if (list_value->GetSize() != 1u) { |
+ *error = errors::kInvalidPageActionsListSize; |
+ return false; |
+ } |
+ |
+ DictionaryValue* page_action_value; |
+ if (!list_value->GetDictionary(0, &page_action_value)) { |
+ *error = errors::kInvalidPageAction; |
+ return false; |
+ } |
- ExtensionAction* contextual_action = |
- LoadExtensionActionHelper(page_action_value, i, error, |
- ExtensionAction::PAGE_ACTION); |
- if (!contextual_action) |
- return false; // Failed to parse page action definition. |
- page_actions_[contextual_action->id()] = contextual_action; |
+ page_action_.reset( |
+ LoadExtensionActionHelper(page_action_value, error, |
+ ExtensionAction::PAGE_ACTION)); |
+ if (!page_action_.get()) |
+ return false; // Failed to parse page action definition. |
+ } else if (source.HasKey(keys::kPageAction)) { |
+ DictionaryValue* page_action_value; |
+ if (!source.GetDictionary(keys::kPageAction, &page_action_value)) { |
+ *error = errors::kInvalidPageAction; |
+ return false; |
} |
+ |
+ page_action_.reset( |
+ LoadExtensionActionHelper(page_action_value, error, |
+ ExtensionAction::PAGE_ACTION)); |
+ if (!page_action_.get()) |
+ return false; // Failed to parse page action definition. |
} |
+ // Initialize browser action (optional). |
if (source.HasKey(keys::kBrowserAction)) { |
DictionaryValue* browser_action_value; |
if (!source.GetDictionary(keys::kBrowserAction, &browser_action_value)) { |
- *error = ExtensionErrorUtils::FormatErrorMessage( |
- errors::kInvalidBrowserAction, ""); |
+ *error = errors::kInvalidBrowserAction; |
return false; |
} |
browser_action_.reset( |
- LoadExtensionActionHelper(browser_action_value, 0, error, |
+ LoadExtensionActionHelper(browser_action_value, error, |
ExtensionAction::BROWSER_ACTION)); |
if (!browser_action_.get()) |
return false; // Failed to parse browser action definition. |
browser_action_state_.reset( |
- new ExtensionActionState(browser_action_->name(), 0)); |
+ new ExtensionActionState(browser_action_->title(), 0)); |
} |
// Initialize the permissions (optional). |
@@ -1075,9 +1077,17 @@ std::set<FilePath> Extension::GetBrowserImages() { |
} |
// page action icons |
- for (ExtensionActionMap::const_iterator it = page_actions().begin(); |
- it != page_actions().end(); ++it) { |
- const std::vector<std::string>& icon_paths = it->second->icon_paths(); |
+ if (page_action_.get()) { |
+ const std::vector<std::string>& icon_paths = page_action_->icon_paths(); |
+ for (std::vector<std::string>::const_iterator iter = icon_paths.begin(); |
+ iter != icon_paths.end(); ++iter) { |
+ image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(*iter))); |
+ } |
+ } |
+ |
+ // browser action icons |
+ if (browser_action_.get()) { |
+ const std::vector<std::string>& icon_paths = browser_action_->icon_paths(); |
for (std::vector<std::string>::const_iterator iter = icon_paths.begin(); |
iter != icon_paths.end(); ++iter) { |
image_paths.insert(FilePath::FromWStringHack(UTF8ToWide(*iter))); |