18ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 28ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Use of this source code is governed by a BSD-style license that can be 38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// found in the LICENSE file. 48ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_ACTION_H_ 68ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#define CHROME_COMMON_EXTENSIONS_EXTENSION_ACTION_H_ 78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#pragma once 88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include <map> 108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include <string> 118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include <vector> 128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "base/basictypes.h" 148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#include "third_party/skia/include/core/SkColor.h" 158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsennamespace gfx { 178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass Canvas; 188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass Rect; 198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen} 208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass GURL; 228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass SkBitmap; 238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// ExtensionAction encapsulates the state of a browser or page action. 258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// Instances can have both global and per-tab state. If a property does not have 268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen// a per-tab value, the global value is used instead. 278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass ExtensionAction { 288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen public: 298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Use this ID to indicate the default state for properties that take a tab_id 308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // parameter. 318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static const int kDefaultTabId; 328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ExtensionAction(); 348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen ~ExtensionAction(); 358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // extension id 378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string extension_id() const { return extension_id_; } 388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void set_extension_id(const std::string& extension_id) { 398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen extension_id_ = extension_id; 408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // action id -- only used with legacy page actions API 438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string id() const { return id_; } 448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void set_id(const std::string& id) { id_ = id; } 458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // static icon paths from manifest -- only used with legacy page actions API. 478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::vector<std::string>* icon_paths() { return &icon_paths_; } 488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Set the url which the popup will load when the user clicks this action's 508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // icon. Setting an empty URL will disable the popup for a given tab. 518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetPopupUrl(int tab_id, const GURL& url); 528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Use HasPopup() to see if a popup should be displayed. 548ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool HasPopup(int tab_id); 558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Get the URL to display in a popup. 578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen GURL GetPopupUrl(int tab_id); 588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Set this action's title on a specific tab. 608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetTitle(int tab_id, const std::string& title) { 618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetValue(&title_, tab_id, title); 628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // If tab |tab_id| has a set title, return it. Otherwise, return 658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // the default title. 668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string GetTitle(int tab_id) { return GetValue(&title_, tab_id); } 678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Icons are a bit different because the default value can be set to either a 698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // bitmap or a path. However, conceptually, there is only one default icon. 708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Setting the default icon using a path clears the bitmap and vice-versa. 718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // 728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // To get the default icon, first check for the bitmap. If it is null, check 738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // for the path. 748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Set this action's icon bitmap on a specific tab. 768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetIcon(int tab_id, const SkBitmap& bitmap); 778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Get the icon for a tab, or the default if no icon was set. 798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SkBitmap GetIcon(int tab_id); 808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Set this action's icon index for a specific tab. For use with 828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // icon_paths(), only used in page actions. 838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetIconIndex(int tab_id, int index); 848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Get this action's icon index for a tab, or the default if no icon index 868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // was set. 878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen int GetIconIndex(int tab_id) { 888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return GetValue(&icon_index_, tab_id); 898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Non-tab-specific icon path. This is used to support the default_icon key of 928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // page and browser actions. 938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void set_default_icon_path(const std::string& path) { 948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen default_icon_path_ = path; 958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string default_icon_path() { 978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return default_icon_path_; 988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Set this action's badge text on a specific tab. 1018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetBadgeText(int tab_id, const std::string& text) { 1028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetValue(&badge_text_, tab_id, text); 1038ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1048ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Get the badge text for a tab, or the default if no badge text was set. 1058ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string GetBadgeText(int tab_id) { 1068ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return GetValue(&badge_text_, tab_id); 1078ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1088ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1098ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Set this action's badge text color on a specific tab. 1108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetBadgeTextColor(int tab_id, const SkColor& text_color) { 1118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetValue(&badge_text_color_, tab_id, text_color); 1128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1138ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Get the text color for a tab, or the default color if no text color 1148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // was set. 1158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SkColor GetBadgeTextColor(int tab_id) { 1168ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return GetValue(&badge_text_color_, tab_id); 1178ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1188ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1198ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Set this action's badge background color on a specific tab. 1208ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetBadgeBackgroundColor(int tab_id, const SkColor& color) { 1218ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetValue(&badge_background_color_, tab_id, color); 1228ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Get the badge background color for a tab, or the default if no color 1248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // was set. 1258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SkColor GetBadgeBackgroundColor(int tab_id) { 1268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return GetValue(&badge_background_color_, tab_id); 1278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Set this action's badge visibility on a specific tab. 1308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void SetIsVisible(int tab_id, bool value) { 1318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen SetValue(&visible_, tab_id, value); 1328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Get the badge visibility for a tab, or the default badge visibility 1348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // if none was set. 1358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen bool GetIsVisible(int tab_id) { 1368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return GetValue(&visible_, tab_id); 1378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Remove all tab-specific state. 1408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void ClearAllValuesForTab(int tab_id); 1418ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1428ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // If the specified tab has a badge, paint it into the provided bounds. 1438ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen void PaintBadge(gfx::Canvas* canvas, const gfx::Rect& bounds, int tab_id); 1448ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1458ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen private: 1468ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen template <class T> 1478ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen struct ValueTraits { 1488ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static T CreateEmpty() { 1498ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return T(); 1508ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1518ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen }; 1528ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1538ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen template<class T> 154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch void SetValue(std::map<int, T>* map, int tab_id, const T& val) { 1558ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen (*map)[tab_id] = val; 1568ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1578ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1588ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen template<class T> 1598ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen T GetValue(std::map<int, T>* map, int tab_id) { 1608ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen typename std::map<int, T>::iterator iter = map->find(tab_id); 1618ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen if (iter != map->end()) { 1628ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return iter->second; 1638ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } else { 1648ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen iter = map->find(kDefaultTabId); 1658ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return iter != map->end() ? iter->second : ValueTraits<T>::CreateEmpty(); 1668ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1678ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 1688ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1698ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The id for the extension this action belongs to (as defined in the 1708ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // extension manifest). 1718ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string extension_id_; 1728ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1738ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // Each of these data items can have both a global state (stored with the key 1748ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // kDefaultTabId), or tab-specific state (stored with the tab_id as the key). 1758ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::map<int, GURL> popup_url_; 1768ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::map<int, std::string> title_; 1778ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::map<int, SkBitmap> icon_; 1788ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::map<int, int> icon_index_; // index into icon_paths_ 1798ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::map<int, std::string> badge_text_; 1808ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::map<int, SkColor> badge_background_color_; 1818ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::map<int, SkColor> badge_text_color_; 1828ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::map<int, bool> visible_; 1838ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1848ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string default_icon_path_; 1858ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1868ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // The id for the ExtensionAction, for example: "RssPageAction". This is 1878ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // needed for compat with an older version of the page actions API. 1888ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::string id_; 1898ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1908ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // A list of paths to icons this action might show. This is needed to support 1918ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen // the legacy setIcon({iconIndex:...} method of the page actions API. 1928ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen std::vector<std::string> icon_paths_; 1938ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}; 1948ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 1958ae428e0fb7feea16d79853f29447469a93bedffKristian Monsentemplate<> 1968ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenstruct ExtensionAction::ValueTraits<int> { 1978ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen static int CreateEmpty() { 1988ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen return -1; 1998ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen } 2008ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen}; 2018ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen 2028ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen#endif // CHROME_COMMON_EXTENSIONS_EXTENSION_ACTION_H_ 203