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