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

Unified Diff: chrome/browser/extensions/api/extension_action/extension_actions_api.cc

Issue 10231002: Fully merge the implementations of the browserAction and pageAction APIs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: youskc Created 8 years, 8 months 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/browser/extensions/api/extension_action/extension_actions_api.cc
diff --git a/chrome/browser/extensions/api/extension_action/extension_actions_api.cc b/chrome/browser/extensions/api/extension_action/extension_actions_api.cc
index aa18536f2de0bfc98266260356baf0b22fa183fe..68769cffd99fc000d2ca02b029efaea6adb5143f 100644
--- a/chrome/browser/extensions/api/extension_action/extension_actions_api.cc
+++ b/chrome/browser/extensions/api/extension_action/extension_actions_api.cc
@@ -6,14 +6,36 @@
#include <string>
-#include "base/values.h"
#include "base/string_number_conversions.h"
+#include "base/values.h"
+#include "chrome/browser/extensions/api/extension_action/extension_page_actions_api_constants.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_tab_helper.h"
+#include "chrome/browser/extensions/extension_tab_util.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h"
+#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_action.h"
+#include "chrome/common/extensions/extension_error_utils.h"
#include "chrome/common/render_messages.h"
+#include "content/public/browser/navigation_entry.h"
+#include "content/public/browser/notification_service.h"
+
+namespace {
+
+// Errors.
+const char kNoExtensionActionError[] =
+ "This extension has no action specified.";
+const char kNoTabError[] = "No tab with id: *.";
+const char kIconIndexOutOfBounds[] = "Page action icon index out of bounds.";
+
+}
ExtensionActionFunction::ExtensionActionFunction()
: details_(NULL),
tab_id_(ExtensionAction::kDefaultTabId),
+ contents_(NULL),
extension_action_(NULL) {
}
@@ -21,55 +43,71 @@ ExtensionActionFunction::~ExtensionActionFunction() {
}
bool ExtensionActionFunction::RunImpl() {
- base::Value* arg;
- args_->Get(0, &arg);
- if (arg->IsType(base::Value::TYPE_DICTIONARY)) {
- EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details_));
- EXTENSION_FUNCTION_VALIDATE(details_ != NULL);
- if (details_->HasKey("tabId"))
- EXTENSION_FUNCTION_VALIDATE(details_->GetInteger("tabId", &tab_id_));
+ extension_action_ = GetExtension()->browser_action();
+ if (!extension_action_)
+ extension_action_ = GetExtension()->page_action();
+ EXTENSION_FUNCTION_VALIDATE(extension_action_);
+
+ // There may or may not be details (depends on the function).
+ // The tabId might appear in details (if it exists) or as the first
+ // argument besides the action type (depends on the function).
+ {
+ base::Value* first_arg = NULL;
+ EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &first_arg));
+
+ switch (first_arg->GetType()) {
+ case Value::TYPE_INTEGER:
+ CHECK(first_arg->GetAsInteger(&tab_id_));
+ break;
+
+ case Value::TYPE_DICTIONARY:
+ details_ = static_cast<base::DictionaryValue*>(first_arg);
+ if (details_->HasKey("tabId"))
+ EXTENSION_FUNCTION_VALIDATE(details_->GetInteger("tabId", &tab_id_));
+ break;
+
+ default:
+ EXTENSION_FUNCTION_VALIDATE(false);
+ }
}
- return true;
-}
-bool ExtensionActionFunction::SetIcon() {
- base::BinaryValue* binary = NULL;
- EXTENSION_FUNCTION_VALIDATE(details_->GetBinary("imageData", &binary));
- IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize());
- PickleIterator iter(bitmap_pickle);
- SkBitmap bitmap;
- EXTENSION_FUNCTION_VALIDATE(
- IPC::ReadParam(&bitmap_pickle, &iter, &bitmap));
- extension_action_->SetIcon(tab_id_, bitmap);
- return true;
-}
+ // Find the TabContentsWrapper that contains this tab id if one is required.
+ if (tab_id_ == ExtensionAction::kDefaultTabId) {
+ EXTENSION_FUNCTION_VALIDATE(GetExtension()->browser_action());
+ } else {
+ ExtensionTabUtil::GetTabById(
+ tab_id_, profile(), include_incognito(), NULL, NULL, &contents_, NULL);
+ if (!contents_) {
+ error_ = ExtensionErrorUtils::FormatErrorMessage(
+ kNoTabError, base::IntToString(tab_id_));
+ return false;
+ }
+ }
-bool ExtensionActionFunction::SetTitle() {
- std::string title;
- EXTENSION_FUNCTION_VALIDATE(details_->GetString("title", &title));
- extension_action_->SetTitle(tab_id_, title);
- return true;
+ return RunExtensionAction();
}
-bool ExtensionActionFunction::SetPopup() {
- std::string popup_string;
- EXTENSION_FUNCTION_VALIDATE(details_->GetString("popup", &popup_string));
-
- GURL popup_url;
- if (!popup_string.empty())
- popup_url = GetExtension()->GetResourceURL(popup_string);
+void ExtensionActionFunction::NotifyChange() {
+ if (GetExtension()->browser_action())
+ NotifyBrowserActionChange();
+ else if (GetExtension()->page_action())
+ NotifyPageActionChange();
+ else
+ NOTREACHED();
+}
- extension_action_->SetPopupUrl(tab_id_, popup_url);
- return true;
+void ExtensionActionFunction::NotifyBrowserActionChange() {
+ content::NotificationService::current()->Notify(
+ chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_UPDATED,
+ content::Source<ExtensionAction>(extension_action_),
+ content::NotificationService::NoDetails());
}
-bool ExtensionActionFunction::SetBadgeText() {
- std::string badge_text;
- EXTENSION_FUNCTION_VALIDATE(details_->GetString("text", &badge_text));
- extension_action_->SetBadgeText(tab_id_, badge_text);
- return true;
+void ExtensionActionFunction::NotifyPageActionChange() {
+ contents_->extension_tab_helper()->PageActionStateChanged();
}
+// static
bool ExtensionActionFunction::ParseCSSColorString(
const std::string& color_string,
SkColor* result) {
@@ -106,7 +144,79 @@ bool ExtensionActionFunction::ParseCSSColorString(
return true;
}
-bool ExtensionActionFunction::SetBadgeBackgroundColor() {
+bool ExtensionActionFunction::SetVisible(bool visible) {
+ extension_action_->SetIsVisible(tab_id_, visible);
+ NotifyChange();
+ return true;
+}
+
+bool ExtensionActionShowFunction::RunExtensionAction() {
+ return SetVisible(true);
+}
+
+bool ExtensionActionHideFunction::RunExtensionAction() {
+ return SetVisible(false);
+}
+
+bool ExtensionActionSetIconFunction::RunExtensionAction() {
+ // setIcon can take a variant argument: either a canvas ImageData, or an
+ // icon index.
+ base::BinaryValue* binary = NULL;
+ int icon_index;
+ if (details_->GetBinary("imageData", &binary)) {
+ IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize());
+ PickleIterator iter(bitmap_pickle);
+ SkBitmap bitmap;
+ EXTENSION_FUNCTION_VALIDATE(
+ IPC::ReadParam(&bitmap_pickle, &iter, &bitmap));
+ extension_action_->SetIcon(tab_id_, bitmap);
+ } else if (details_->GetInteger("iconIndex", &icon_index)) {
+ EXTENSION_FUNCTION_VALIDATE(GetExtension()->page_action());
+ if (icon_index < 0 ||
+ static_cast<size_t>(icon_index) >=
+ extension_action_->icon_paths()->size()) {
+ error_ = kIconIndexOutOfBounds;
+ return false;
+ }
+ extension_action_->SetIcon(tab_id_, SkBitmap());
+ extension_action_->SetIconIndex(tab_id_, icon_index);
+ } else {
+ EXTENSION_FUNCTION_VALIDATE(false);
+ }
+ NotifyChange();
+ return true;
+}
+
+bool ExtensionActionSetTitleFunction::RunExtensionAction() {
+ std::string title;
+ EXTENSION_FUNCTION_VALIDATE(details_->GetString("title", &title));
+ extension_action_->SetTitle(tab_id_, title);
+ NotifyChange();
+ return true;
+}
+
+bool ExtensionActionSetPopupFunction::RunExtensionAction() {
+ std::string popup_string;
+ EXTENSION_FUNCTION_VALIDATE(details_->GetString("popup", &popup_string));
+
+ GURL popup_url;
+ if (!popup_string.empty())
+ popup_url = GetExtension()->GetResourceURL(popup_string);
+
+ extension_action_->SetPopupUrl(tab_id_, popup_url);
+ NotifyChange();
+ return true;
+}
+
+bool ExtensionActionSetBadgeTextFunction::RunExtensionAction() {
+ std::string badge_text;
+ EXTENSION_FUNCTION_VALIDATE(details_->GetString("text", &badge_text));
+ extension_action_->SetBadgeText(tab_id_, badge_text);
+ NotifyChange();
+ return true;
+}
+
+bool ExtensionActionSetBadgeBackgroundColorFunction::RunExtensionAction() {
Value* color_value = NULL;
details_->Get("color", &color_value);
SkColor color = 0;
@@ -122,7 +232,6 @@ bool ExtensionActionFunction::SetBadgeBackgroundColor() {
color = SkColorSetARGB(color_array[3], color_array[0],
color_array[1], color_array[2]);
-
} else if (color_value->IsType(Value::TYPE_STRING)) {
std::string color_string;
EXTENSION_FUNCTION_VALIDATE(details_->GetString("color", &color_string));
@@ -131,28 +240,28 @@ bool ExtensionActionFunction::SetBadgeBackgroundColor() {
}
extension_action_->SetBadgeBackgroundColor(tab_id_, color);
-
+ NotifyChange();
return true;
}
-bool ExtensionActionFunction::GetTitle() {
+bool ExtensionActionGetTitleFunction::RunExtensionAction() {
result_.reset(Value::CreateStringValue(extension_action_->GetTitle(tab_id_)));
return true;
}
-bool ExtensionActionFunction::GetPopup() {
+bool ExtensionActionGetPopupFunction::RunExtensionAction() {
result_.reset(Value::CreateStringValue(
extension_action_->GetPopupUrl(tab_id_).spec()));
return true;
}
-bool ExtensionActionFunction::GetBadgeText() {
+bool ExtensionActionGetBadgeTextFunction::RunExtensionAction() {
result_.reset(Value::CreateStringValue(
extension_action_->GetBadgeText(tab_id_)));
return true;
}
-bool ExtensionActionFunction::GetBadgeBackgroundColor() {
+bool ExtensionActionGetBadgeBackgroundColorFunction::RunExtensionAction() {
ListValue* list = new ListValue();
SkColor color = extension_action_->GetBadgeBackgroundColor(tab_id_);
list->Append(Value::CreateIntegerValue(SkColorGetR(color)));

Powered by Google App Engine
This is Rietveld 408576698