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

Unified Diff: chrome/common/extensions/api/extension_action/action_handler_helpers.cc

Issue 11588004: Move ScriptBadge, ActionInfo out of Extension; preparation for BrowserAction (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Yoyo's requested changes Created 8 years 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/common/extensions/api/extension_action/action_handler_helpers.cc
diff --git a/chrome/common/extensions/api/extension_action/action_handler_helpers.cc b/chrome/common/extensions/api/extension_action/action_handler_helpers.cc
new file mode 100644
index 0000000000000000000000000000000000000000..06a5c5600e936f670ea921c64fded4d6d88f83c0
--- /dev/null
+++ b/chrome/common/extensions/api/extension_action/action_handler_helpers.cc
@@ -0,0 +1,155 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/common/extensions/api/extension_action/action_handler_helpers.h"
+
+#include <string>
+
+#include "base/string16.h"
+#include "base/utf_string_conversions.h"
+#include "base/values.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 keys = extension_manifest_keys;
+namespace errors = extension_manifest_errors;
+
+namespace extensions {
+
+scoped_ptr<ActionInfo> LoadActionInfo(
+ const Extension* extension,
+ const base::DictionaryValue* extension_action,
+ 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 (extension_action->HasKey(keys::kPageActionIcons) &&
+ extension_action->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 (extension_action->HasKey(keys::kPageActionId)) {
+ if (!extension_action->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 (extension_action->HasKey(keys::kPageActionDefaultIcon)) {
+ const DictionaryValue* icons_value = NULL;
+ std::string default_icon;
+ if (extension_action->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 (extension_action->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 (extension_action->HasKey(keys::kPageActionDefaultTitle)) {
+ if (!extension_action->GetString(keys::kPageActionDefaultTitle,
+ &result->default_title)) {
+ *error = ASCIIToUTF16(errors::kInvalidPageActionDefaultTitle);
+ return scoped_ptr<ActionInfo>();
+ }
+ } else if (extension->manifest_version() == 1 &&
+ extension_action->HasKey(keys::kName)) {
+ if (!extension_action->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 (extension_action->HasKey(keys::kPageActionDefaultPopup))
+ popup_key = keys::kPageActionDefaultPopup;
+
+ if (extension->manifest_version() == 1 &&
+ extension_action->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 (extension_action->GetString(popup_key, &url_str)) {
+ // On success, |url_str| is set. Nothing else to do.
+ } else if (extension->manifest_version() == 1 &&
+ extension_action->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();
+}
+
+} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698