// Copyright (c) 2010 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. #ifndef CHROME_COMMON_EXTENSIONS_EXTENSION_ACTION_H_ #define CHROME_COMMON_EXTENSIONS_EXTENSION_ACTION_H_ #pragma once #include #include #include #include "base/basictypes.h" #include "third_party/skia/include/core/SkColor.h" namespace gfx { class Canvas; class Rect; } class GURL; class SkBitmap; // ExtensionAction encapsulates the state of a browser or page action. // Instances can have both global and per-tab state. If a property does not have // a per-tab value, the global value is used instead. class ExtensionAction { public: // Use this ID to indicate the default state for properties that take a tab_id // parameter. static const int kDefaultTabId; ExtensionAction(); ~ExtensionAction(); // extension id std::string extension_id() const { return extension_id_; } void set_extension_id(const std::string& extension_id) { extension_id_ = extension_id; } // action id -- only used with legacy page actions API std::string id() const { return id_; } void set_id(const std::string& id) { id_ = id; } // static icon paths from manifest -- only used with legacy page actions API. std::vector* icon_paths() { return &icon_paths_; } // Set the url which the popup will load when the user clicks this action's // icon. Setting an empty URL will disable the popup for a given tab. void SetPopupUrl(int tab_id, const GURL& url); // Use HasPopup() to see if a popup should be displayed. bool HasPopup(int tab_id); // Get the URL to display in a popup. GURL GetPopupUrl(int tab_id); // Set this action's title on a specific tab. void SetTitle(int tab_id, const std::string& title) { SetValue(&title_, tab_id, title); } // If tab |tab_id| has a set title, return it. Otherwise, return // the default title. std::string GetTitle(int tab_id) { return GetValue(&title_, tab_id); } // Icons are a bit different because the default value can be set to either a // bitmap or a path. However, conceptually, there is only one default icon. // Setting the default icon using a path clears the bitmap and vice-versa. // // To get the default icon, first check for the bitmap. If it is null, check // for the path. // Set this action's icon bitmap on a specific tab. void SetIcon(int tab_id, const SkBitmap& bitmap); // Get the icon for a tab, or the default if no icon was set. SkBitmap GetIcon(int tab_id); // Set this action's icon index for a specific tab. For use with // icon_paths(), only used in page actions. void SetIconIndex(int tab_id, int index); // Get this action's icon index for a tab, or the default if no icon index // was set. int GetIconIndex(int tab_id) { return GetValue(&icon_index_, tab_id); } // Non-tab-specific icon path. This is used to support the default_icon key of // page and browser actions. void set_default_icon_path(const std::string& path) { default_icon_path_ = path; } std::string default_icon_path() { return default_icon_path_; } // Set this action's badge text on a specific tab. void SetBadgeText(int tab_id, const std::string& text) { SetValue(&badge_text_, tab_id, text); } // Get the badge text for a tab, or the default if no badge text was set. std::string GetBadgeText(int tab_id) { return GetValue(&badge_text_, tab_id); } // Set this action's badge text color on a specific tab. void SetBadgeTextColor(int tab_id, const SkColor& text_color) { SetValue(&badge_text_color_, tab_id, text_color); } // Get the text color for a tab, or the default color if no text color // was set. SkColor GetBadgeTextColor(int tab_id) { return GetValue(&badge_text_color_, tab_id); } // Set this action's badge background color on a specific tab. void SetBadgeBackgroundColor(int tab_id, const SkColor& color) { SetValue(&badge_background_color_, tab_id, color); } // Get the badge background color for a tab, or the default if no color // was set. SkColor GetBadgeBackgroundColor(int tab_id) { return GetValue(&badge_background_color_, tab_id); } // Set this action's badge visibility on a specific tab. void SetIsVisible(int tab_id, bool value) { SetValue(&visible_, tab_id, value); } // Get the badge visibility for a tab, or the default badge visibility // if none was set. bool GetIsVisible(int tab_id) { return GetValue(&visible_, tab_id); } // Remove all tab-specific state. void ClearAllValuesForTab(int tab_id); // If the specified tab has a badge, paint it into the provided bounds. void PaintBadge(gfx::Canvas* canvas, const gfx::Rect& bounds, int tab_id); private: template struct ValueTraits { static T CreateEmpty() { return T(); } }; template void SetValue(std::map* map, int tab_id, const T& val) { (*map)[tab_id] = val; } template T GetValue(std::map* map, int tab_id) { typename std::map::iterator iter = map->find(tab_id); if (iter != map->end()) { return iter->second; } else { iter = map->find(kDefaultTabId); return iter != map->end() ? iter->second : ValueTraits::CreateEmpty(); } } // The id for the extension this action belongs to (as defined in the // extension manifest). std::string extension_id_; // Each of these data items can have both a global state (stored with the key // kDefaultTabId), or tab-specific state (stored with the tab_id as the key). std::map popup_url_; std::map title_; std::map icon_; std::map icon_index_; // index into icon_paths_ std::map badge_text_; std::map badge_background_color_; std::map badge_text_color_; std::map visible_; std::string default_icon_path_; // The id for the ExtensionAction, for example: "RssPageAction". This is // needed for compat with an older version of the page actions API. std::string id_; // A list of paths to icons this action might show. This is needed to support // the legacy setIcon({iconIndex:...} method of the page actions API. std::vector icon_paths_; }; template<> struct ExtensionAction::ValueTraits { static int CreateEmpty() { return -1; } }; #endif // CHROME_COMMON_EXTENSIONS_EXTENSION_ACTION_H_