1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/extensions/extension_browser_actions_api.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <string> 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/values.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_list.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/render_messages.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Errors. 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kNoBrowserActionError[] = 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "This extension has no browser action specified."; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst char kIconIndexOutOfBounds[] = 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "Browser action icon index out of bounds."; 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionFunction::RunImpl() { 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details_)); 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(details_ != NULL); 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (details_->HasKey("tabId")) 283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(details_->GetInteger("tabId", &tab_id_)); 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch const Extension* extension = GetExtension(); 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_action_ = extension->browser_action(); 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!browser_action_) { 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch error_ = kNoBrowserActionError; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!RunBrowserAction()) 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return false; 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::EXTENSION_BROWSER_ACTION_UPDATED, 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source<ExtensionAction>(browser_action_), 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::NoDetails()); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionSetIconFunction::RunBrowserAction() { 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BinaryValue* binary = NULL; 493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(details_->GetBinary("imageData", &binary)); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize()); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* iter = NULL; 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkBitmap bitmap; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE( 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IPC::ReadParam(&bitmap_pickle, &iter, &bitmap)); 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_action_->SetIcon(tab_id_, bitmap); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionSetTitleFunction::RunBrowserAction() { 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string title; 613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(details_->GetString("title", &title)); 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_action_->SetTitle(tab_id_, title); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionSetPopupFunction::RunBrowserAction() { 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string popup_string; 683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(details_->GetString("popup", &popup_string)); 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GURL popup_url; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!popup_string.empty()) 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch popup_url = GetExtension()->GetResourceURL(popup_string); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_action_->SetPopupUrl(tab_id_, popup_url); 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionSetBadgeTextFunction::RunBrowserAction() { 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string badge_text; 803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(details_->GetString("text", &badge_text)); 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_action_->SetBadgeText(tab_id_, badge_text); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool BrowserActionSetBadgeBackgroundColorFunction::RunBrowserAction() { 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ListValue* list = NULL; 873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick EXTENSION_FUNCTION_VALIDATE(details_->GetList("color", &list)); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(list->GetSize() == 4); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int color_array[4] = {0}; 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (size_t i = 0; i < arraysize(color_array); ++i) { 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXTENSION_FUNCTION_VALIDATE(list->GetInteger(i, &color_array[i])); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SkColor color = SkColorSetARGB(color_array[3], color_array[0], color_array[1], 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch color_array[2]); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch browser_action_->SetBadgeBackgroundColor(tab_id_, color); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 101