// 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; }