// Copyright (c) 2011 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/browser/extensions/extension_browser_actions_api.h"
#include <string>
#include "base/values.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/common/extensions/extension.h"
#include "chrome/common/render_messages.h"
#include "content/common/notification_service.h"
namespace {
// Errors.
const char kNoBrowserActionError[] =
"This extension has no browser action specified.";
const char kIconIndexOutOfBounds[] =
"Browser action icon index out of bounds.";
}
bool BrowserActionFunction::RunImpl() {
EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details_));
EXTENSION_FUNCTION_VALIDATE(details_ != NULL);
if (details_->HasKey("tabId"))
EXTENSION_FUNCTION_VALIDATE(details_->GetInteger("tabId", &tab_id_));
const Extension* extension = GetExtension();
browser_action_ = extension->browser_action();
if (!browser_action_) {
error_ = kNoBrowserActionError;
return false;
}
if (!RunBrowserAction())
return false;
NotificationService::current()->Notify(
NotificationType::EXTENSION_BROWSER_ACTION_UPDATED,
Source<ExtensionAction>(browser_action_),
NotificationService::NoDetails());
return true;
}
bool BrowserActionSetIconFunction::RunBrowserAction() {
BinaryValue* binary = NULL;
EXTENSION_FUNCTION_VALIDATE(details_->GetBinary("imageData", &binary));
IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize());
void* iter = NULL;
SkBitmap bitmap;
EXTENSION_FUNCTION_VALIDATE(
IPC::ReadParam(&bitmap_pickle, &iter, &bitmap));
browser_action_->SetIcon(tab_id_, bitmap);
return true;
}
bool BrowserActionSetTitleFunction::RunBrowserAction() {
std::string title;
EXTENSION_FUNCTION_VALIDATE(details_->GetString("title", &title));
browser_action_->SetTitle(tab_id_, title);
return true;
}
bool BrowserActionSetPopupFunction::RunBrowserAction() {
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);
browser_action_->SetPopupUrl(tab_id_, popup_url);
return true;
}
bool BrowserActionSetBadgeTextFunction::RunBrowserAction() {
std::string badge_text;
EXTENSION_FUNCTION_VALIDATE(details_->GetString("text", &badge_text));
browser_action_->SetBadgeText(tab_id_, badge_text);
return true;
}
bool BrowserActionSetBadgeBackgroundColorFunction::RunBrowserAction() {
ListValue* list = NULL;
EXTENSION_FUNCTION_VALIDATE(details_->GetList("color", &list));
EXTENSION_FUNCTION_VALIDATE(list->GetSize() == 4);
int color_array[4] = {0};
for (size_t i = 0; i < arraysize(color_array); ++i) {
EXTENSION_FUNCTION_VALIDATE(list->GetInteger(i, &color_array[i]));
}
SkColor color = SkColorSetARGB(color_array[3], color_array[0], color_array[1],
color_array[2]);
browser_action_->SetBadgeBackgroundColor(tab_id_, color);
return true;
}