| Index: chrome/browser/extensions/extension_page_actions_module.cc
|
| diff --git a/chrome/browser/extensions/extension_page_actions_module.cc b/chrome/browser/extensions/extension_page_actions_module.cc
|
| index 51866e3d1bf780c30c7dd94acb4b8a405e6b4231..60eb86abf875c96279f83dbd758b404dbbd63d08 100644
|
| --- a/chrome/browser/extensions/extension_page_actions_module.cc
|
| +++ b/chrome/browser/extensions/extension_page_actions_module.cc
|
| @@ -15,9 +15,21 @@
|
| #include "chrome/browser/tab_contents/tab_contents.h"
|
| #include "chrome/common/extensions/extension.h"
|
| #include "chrome/common/extensions/extension_error_utils.h"
|
| +#include "chrome/common/render_messages.h"
|
|
|
| namespace keys = extension_page_actions_module_constants;
|
|
|
| +namespace {
|
| +// Errors.
|
| +const char kNoExtensionError[] = "No extension with id: *.";
|
| +const char kNoTabError[] = "No tab with id: *.";
|
| +const char kNoPageActionError[] =
|
| + "This extension has no page action specified.";
|
| +const char kUrlNotActiveError[] = "This url is no longer active: *.";
|
| +const char kIconIndexOutOfBounds[] = "Page action icon index out of bounds.";
|
| +}
|
| +
|
| +// TODO(EXTENSIONS_DEPRECATED): obsolete API.
|
| bool PageActionFunction::SetPageActionEnabled(bool enable) {
|
| EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_LIST));
|
| const ListValue* args = static_cast<const ListValue*>(args_);
|
| @@ -48,7 +60,7 @@ bool PageActionFunction::SetPageActionEnabled(bool enable) {
|
| TabContents* contents = NULL;
|
| ExtensionTabUtil::GetTabById(tab_id, profile(), NULL, NULL, &contents, NULL);
|
| if (!contents) {
|
| - error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoTabError,
|
| + error_ = ExtensionErrorUtils::FormatErrorMessage(kNoTabError,
|
| IntToString(tab_id));
|
| return false;
|
| }
|
| @@ -56,8 +68,7 @@ bool PageActionFunction::SetPageActionEnabled(bool enable) {
|
| // Make sure the URL hasn't changed.
|
| NavigationEntry* entry = contents->controller().GetActiveEntry();
|
| if (!entry || url != entry->url().spec()) {
|
| - error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kUrlNotActiveError,
|
| - url);
|
| + error_ = ExtensionErrorUtils::FormatErrorMessage(kUrlNotActiveError, url);
|
| return false;
|
| }
|
|
|
| @@ -66,22 +77,52 @@ bool PageActionFunction::SetPageActionEnabled(bool enable) {
|
| ExtensionsService* service = profile()->GetExtensionsService();
|
| extension = service->GetExtensionById(extension_id());
|
| if (!extension) {
|
| - error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoExtensionError,
|
| + error_ = ExtensionErrorUtils::FormatErrorMessage(kNoExtensionError,
|
| extension_id());
|
| return false;
|
| }
|
|
|
| const ExtensionAction* page_action = extension->page_action();
|
| if (!page_action) {
|
| - error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kNoPageActionError,
|
| - page_action_id);
|
| + error_ = kNoPageActionError;
|
| return false;
|
| }
|
|
|
| // Set visibility and broadcast notifications that the UI should be updated.
|
| contents->SetPageActionEnabled(page_action, enable, title, icon_id);
|
| - contents->NotifyNavigationStateChanged(TabContents::INVALIDATE_PAGE_ACTIONS);
|
| + contents->PageActionStateChanged();
|
| +
|
| + return true;
|
| +}
|
| +
|
| +bool PageActionFunction::InitCommon(int tab_id) {
|
| + page_action_ = dispatcher()->GetExtension()->page_action();
|
| + if (!page_action_) {
|
| + error_ = kNoPageActionError;
|
| + return false;
|
| + }
|
| +
|
| + // Find the TabContents that contains this tab id.
|
| + contents_ = NULL;
|
| + ExtensionTabUtil::GetTabById(tab_id, profile(), NULL, NULL, &contents_, NULL);
|
| + if (!contents_) {
|
| + error_ = ExtensionErrorUtils::FormatErrorMessage(kNoTabError,
|
| + IntToString(tab_id));
|
| + return false;
|
| + }
|
| +
|
| + state_ = contents_->GetOrCreatePageActionState(page_action_);
|
| + return true;
|
| +}
|
| +
|
| +bool PageActionFunction::SetHidden(bool hidden) {
|
| + int tab_id;
|
| + EXTENSION_FUNCTION_VALIDATE(args_->GetAsInteger(&tab_id));
|
| + if (!InitCommon(tab_id))
|
| + return false;
|
|
|
| + state_->set_hidden(hidden);
|
| + contents_->PageActionStateChanged();
|
| return true;
|
| }
|
|
|
| @@ -92,3 +133,126 @@ bool EnablePageActionFunction::RunImpl() {
|
| bool DisablePageActionFunction::RunImpl() {
|
| return SetPageActionEnabled(false);
|
| }
|
| +
|
| +bool PageActionShowFunction::RunImpl() {
|
| + return SetHidden(false);
|
| +}
|
| +
|
| +bool PageActionHideFunction::RunImpl() {
|
| + return SetHidden(true);
|
| +}
|
| +
|
| +bool PageActionSetIconFunction::RunImpl() {
|
| + EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY));
|
| + const DictionaryValue* args = static_cast<const DictionaryValue*>(args_);
|
| +
|
| + int tab_id;
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id));
|
| + if (!InitCommon(tab_id))
|
| + return false;
|
| +
|
| + // setIcon can take a variant argument: either a canvas ImageData, or an
|
| + // icon index.
|
| + BinaryValue* binary;
|
| + int icon_index;
|
| + if (args->GetBinary(L"imageData", &binary)) {
|
| + IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize());
|
| + void* iter = NULL;
|
| + scoped_ptr<SkBitmap> bitmap(new SkBitmap);
|
| + EXTENSION_FUNCTION_VALIDATE(
|
| + IPC::ReadParam(&bitmap_pickle, &iter, bitmap.get()));
|
| + state_->set_icon(bitmap.release());
|
| + } else if (args->GetInteger(L"iconIndex", &icon_index)) {
|
| + if (icon_index < 0 ||
|
| + static_cast<size_t>(icon_index) >= page_action_->icon_paths().size()) {
|
| + error_ = kIconIndexOutOfBounds;
|
| + return false;
|
| + }
|
| + state_->set_icon(NULL);
|
| + state_->set_icon_index(icon_index);
|
| + } else {
|
| + EXTENSION_FUNCTION_VALIDATE(false);
|
| + }
|
| +
|
| + contents_->PageActionStateChanged();
|
| + return true;
|
| +}
|
| +
|
| +bool PageActionSetTitleFunction::RunImpl() {
|
| + EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY));
|
| + const DictionaryValue* args = static_cast<const DictionaryValue*>(args_);
|
| +
|
| + int tab_id;
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id));
|
| + if (!InitCommon(tab_id))
|
| + return false;
|
| +
|
| + std::string title;
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetString(L"title", &title));
|
| +
|
| + state_->set_title(title);
|
| + contents_->PageActionStateChanged();
|
| + return true;
|
| +}
|
| +
|
| +bool PageActionSetBadgeBackgroundColorFunction::RunImpl() {
|
| + EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY));
|
| + const DictionaryValue* args = static_cast<const DictionaryValue*>(args_);
|
| +
|
| + int tab_id;
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id));
|
| + if (!InitCommon(tab_id))
|
| + return false;
|
| +
|
| + ListValue* color_value;
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetList(L"color", &color_value));
|
| + EXTENSION_FUNCTION_VALIDATE(color_value->GetSize() == 4);
|
| +
|
| + int color_array[4] = {0};
|
| + for (size_t i = 0; i < arraysize(color_array); ++i)
|
| + EXTENSION_FUNCTION_VALIDATE(color_value->GetInteger(i, &color_array[i]));
|
| +
|
| + SkColor color = SkColorSetARGB(color_array[0], color_array[1], color_array[2],
|
| + color_array[3]);
|
| + state_->set_badge_background_color(color);
|
| + contents_->PageActionStateChanged();
|
| + return true;
|
| +}
|
| +
|
| +bool PageActionSetBadgeTextColorFunction::RunImpl() {
|
| + EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY));
|
| + const DictionaryValue* args = static_cast<const DictionaryValue*>(args_);
|
| +
|
| + int tab_id;
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id));
|
| + if (!InitCommon(tab_id))
|
| + return false;
|
| +
|
| + ListValue* color_value;
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetList(L"color", &color_value));
|
| + EXTENSION_FUNCTION_VALIDATE(color_value->GetSize() == 4);
|
| +
|
| + int color_array[4] = {0};
|
| + for (size_t i = 0; i < arraysize(color_array); ++i)
|
| + EXTENSION_FUNCTION_VALIDATE(color_value->GetInteger(i, &color_array[i]));
|
| +
|
| + // TODO(mpcomplete): implement text coloring.
|
| + return true;
|
| +}
|
| +
|
| +bool PageActionSetBadgeTextFunction::RunImpl() {
|
| + EXTENSION_FUNCTION_VALIDATE(args_->IsType(Value::TYPE_DICTIONARY));
|
| + const DictionaryValue* args = static_cast<const DictionaryValue*>(args_);
|
| +
|
| + int tab_id;
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetInteger(L"tabId", &tab_id));
|
| + if (!InitCommon(tab_id))
|
| + return false;
|
| +
|
| + std::string text;
|
| + EXTENSION_FUNCTION_VALIDATE(args->GetString(L"text", &text));
|
| +
|
| + state_->set_badge_text(text);
|
| + contents_->PageActionStateChanged();
|
| + return true;
|
| +}
|
|
|