Home | History | Annotate | Download | only in extension_action
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_
      6 #define CHROME_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_
      7 
      8 #include "base/memory/weak_ptr.h"
      9 #include "chrome/browser/extensions/api/profile_keyed_api_factory.h"
     10 #include "chrome/browser/extensions/extension_action.h"
     11 #include "chrome/browser/extensions/extension_function.h"
     12 #include "content/public/browser/notification_observer.h"
     13 #include "content/public/browser/notification_registrar.h"
     14 
     15 namespace base {
     16 class DictionaryValue;
     17 }
     18 
     19 namespace content {
     20 class WebContents;
     21 }
     22 
     23 namespace extensions {
     24 class ExtensionPrefs;
     25 class TabHelper;
     26 
     27 class ExtensionActionAPI : public ProfileKeyedAPI {
     28  public:
     29   explicit ExtensionActionAPI(Profile* profile);
     30   virtual ~ExtensionActionAPI();
     31 
     32   static bool GetBrowserActionVisibility(const ExtensionPrefs* prefs,
     33                                          const std::string& extension_id);
     34   static void SetBrowserActionVisibility(ExtensionPrefs* prefs,
     35                                          const std::string& extension_id,
     36                                          bool visible);
     37 
     38   // ProfileKeyedAPI implementation.
     39   static ProfileKeyedAPIFactory<ExtensionActionAPI>* GetFactoryInstance();
     40 
     41  private:
     42   friend class ProfileKeyedAPIFactory<ExtensionActionAPI>;
     43 
     44   // ProfileKeyedAPI implementation.
     45   static const char* service_name() { return "ExtensionActionAPI"; }
     46 
     47   DISALLOW_COPY_AND_ASSIGN(ExtensionActionAPI);
     48 };
     49 
     50 // This class manages reading and writing browser action values from storage.
     51 class ExtensionActionStorageManager
     52     : public content::NotificationObserver,
     53       public base::SupportsWeakPtr<ExtensionActionStorageManager> {
     54  public:
     55   explicit ExtensionActionStorageManager(Profile* profile);
     56   virtual ~ExtensionActionStorageManager();
     57 
     58  private:
     59   // NotificationObserver:
     60   virtual void Observe(int type,
     61                        const content::NotificationSource& source,
     62                        const content::NotificationDetails& details) OVERRIDE;
     63 
     64   // Reads/Writes the ExtensionAction's default values to/from storage.
     65   void WriteToStorage(ExtensionAction* extension_action);
     66   void ReadFromStorage(
     67       const std::string& extension_id, scoped_ptr<base::Value> value);
     68 
     69   Profile* profile_;
     70   content::NotificationRegistrar registrar_;
     71 };
     72 
     73 // Implementation of the browserAction, pageAction, and scriptBadge APIs.
     74 //
     75 // Divergent behaviour between the three is minimal (pageAction and scriptBadge
     76 // have required tabIds while browserAction's are optional, they have different
     77 // internal browser notification requirements, and not all functions are defined
     78 // for all APIs).
     79 class ExtensionActionFunction : public SyncExtensionFunction {
     80  public:
     81   static bool ParseCSSColorString(const std::string& color_string,
     82                                   SkColor* result);
     83 
     84  protected:
     85   ExtensionActionFunction();
     86   virtual ~ExtensionActionFunction();
     87   virtual bool RunImpl() OVERRIDE;
     88   virtual bool RunExtensionAction() = 0;
     89 
     90   bool ExtractDataFromArguments();
     91   void NotifyChange();
     92   void NotifyBrowserActionChange();
     93   void NotifyLocationBarChange();
     94   void NotifySystemIndicatorChange();
     95   bool SetVisible(bool visible);
     96 
     97   // Extension-related information for |tab_id_|.
     98   // CHECK-fails if there is no tab.
     99   extensions::TabHelper& tab_helper() const;
    100 
    101   // All the extension action APIs take a single argument called details that
    102   // is a dictionary.
    103   base::DictionaryValue* details_;
    104 
    105   // The tab id the extension action function should apply to, if any, or
    106   // kDefaultTabId if none was specified.
    107   int tab_id_;
    108 
    109   // WebContents for |tab_id_| if one exists.
    110   content::WebContents* contents_;
    111 
    112   // The extension action for the current extension.
    113   ExtensionAction* extension_action_;
    114 };
    115 
    116 //
    117 // Implementations of each extension action API.
    118 //
    119 // pageAction and browserAction bindings are created for these by extending them
    120 // then declaring an EXTENSION_FUNCTION_NAME.
    121 //
    122 
    123 // show
    124 class ExtensionActionShowFunction : public ExtensionActionFunction {
    125  protected:
    126   virtual ~ExtensionActionShowFunction() {}
    127   virtual bool RunExtensionAction() OVERRIDE;
    128 };
    129 
    130 // hide
    131 class ExtensionActionHideFunction : public ExtensionActionFunction {
    132  protected:
    133   virtual ~ExtensionActionHideFunction() {}
    134   virtual bool RunExtensionAction() OVERRIDE;
    135 };
    136 
    137 // setIcon
    138 class ExtensionActionSetIconFunction : public ExtensionActionFunction {
    139  protected:
    140   virtual ~ExtensionActionSetIconFunction() {}
    141   virtual bool RunExtensionAction() OVERRIDE;
    142 };
    143 
    144 // setTitle
    145 class ExtensionActionSetTitleFunction : public ExtensionActionFunction {
    146  protected:
    147   virtual ~ExtensionActionSetTitleFunction() {}
    148   virtual bool RunExtensionAction() OVERRIDE;
    149 };
    150 
    151 // setPopup
    152 class ExtensionActionSetPopupFunction : public ExtensionActionFunction {
    153  protected:
    154   virtual ~ExtensionActionSetPopupFunction() {}
    155   virtual bool RunExtensionAction() OVERRIDE;
    156 };
    157 
    158 // setBadgeText
    159 class ExtensionActionSetBadgeTextFunction : public ExtensionActionFunction {
    160  protected:
    161   virtual ~ExtensionActionSetBadgeTextFunction() {}
    162   virtual bool RunExtensionAction() OVERRIDE;
    163 };
    164 
    165 // setBadgeBackgroundColor
    166 class ExtensionActionSetBadgeBackgroundColorFunction
    167     : public ExtensionActionFunction {
    168  protected:
    169   virtual ~ExtensionActionSetBadgeBackgroundColorFunction() {}
    170   virtual bool RunExtensionAction() OVERRIDE;
    171 };
    172 
    173 // getTitle
    174 class ExtensionActionGetTitleFunction : public ExtensionActionFunction {
    175  protected:
    176   virtual ~ExtensionActionGetTitleFunction() {}
    177   virtual bool RunExtensionAction() OVERRIDE;
    178 };
    179 
    180 // getPopup
    181 class ExtensionActionGetPopupFunction : public ExtensionActionFunction {
    182  protected:
    183   virtual ~ExtensionActionGetPopupFunction() {}
    184   virtual bool RunExtensionAction() OVERRIDE;
    185 };
    186 
    187 // getBadgeText
    188 class ExtensionActionGetBadgeTextFunction : public ExtensionActionFunction {
    189  protected:
    190   virtual ~ExtensionActionGetBadgeTextFunction() {}
    191   virtual bool RunExtensionAction() OVERRIDE;
    192 };
    193 
    194 // getBadgeBackgroundColor
    195 class ExtensionActionGetBadgeBackgroundColorFunction
    196     : public ExtensionActionFunction {
    197  protected:
    198   virtual ~ExtensionActionGetBadgeBackgroundColorFunction() {}
    199   virtual bool RunExtensionAction() OVERRIDE;
    200 };
    201 
    202 //
    203 // browserAction.* aliases for supported browserAction APIs.
    204 //
    205 
    206 class BrowserActionSetIconFunction : public ExtensionActionSetIconFunction {
    207  public:
    208   DECLARE_EXTENSION_FUNCTION("browserAction.setIcon", BROWSERACTION_SETICON)
    209 
    210  protected:
    211   virtual ~BrowserActionSetIconFunction() {}
    212 };
    213 
    214 class BrowserActionSetTitleFunction : public ExtensionActionSetTitleFunction {
    215  public:
    216   DECLARE_EXTENSION_FUNCTION("browserAction.setTitle", BROWSERACTION_SETTITLE)
    217 
    218  protected:
    219   virtual ~BrowserActionSetTitleFunction() {}
    220 };
    221 
    222 class BrowserActionSetPopupFunction : public ExtensionActionSetPopupFunction {
    223  public:
    224   DECLARE_EXTENSION_FUNCTION("browserAction.setPopup", BROWSERACTION_SETPOPUP)
    225 
    226  protected:
    227   virtual ~BrowserActionSetPopupFunction() {}
    228 };
    229 
    230 class BrowserActionGetTitleFunction : public ExtensionActionGetTitleFunction {
    231  public:
    232   DECLARE_EXTENSION_FUNCTION("browserAction.getTitle", BROWSERACTION_GETTITLE)
    233 
    234  protected:
    235   virtual ~BrowserActionGetTitleFunction() {}
    236 };
    237 
    238 class BrowserActionGetPopupFunction : public ExtensionActionGetPopupFunction {
    239  public:
    240   DECLARE_EXTENSION_FUNCTION("browserAction.getPopup", BROWSERACTION_GETPOPUP)
    241 
    242  protected:
    243   virtual ~BrowserActionGetPopupFunction() {}
    244 };
    245 
    246 class BrowserActionSetBadgeTextFunction
    247     : public ExtensionActionSetBadgeTextFunction {
    248  public:
    249   DECLARE_EXTENSION_FUNCTION("browserAction.setBadgeText",
    250                              BROWSERACTION_SETBADGETEXT)
    251 
    252  protected:
    253   virtual ~BrowserActionSetBadgeTextFunction() {}
    254 };
    255 
    256 class BrowserActionSetBadgeBackgroundColorFunction
    257     : public ExtensionActionSetBadgeBackgroundColorFunction {
    258  public:
    259   DECLARE_EXTENSION_FUNCTION("browserAction.setBadgeBackgroundColor",
    260                              BROWSERACTION_SETBADGEBACKGROUNDCOLOR)
    261 
    262  protected:
    263   virtual ~BrowserActionSetBadgeBackgroundColorFunction() {}
    264 };
    265 
    266 class BrowserActionGetBadgeTextFunction
    267     : public ExtensionActionGetBadgeTextFunction {
    268  public:
    269   DECLARE_EXTENSION_FUNCTION("browserAction.getBadgeText",
    270                              BROWSERACTION_GETBADGETEXT)
    271 
    272  protected:
    273   virtual ~BrowserActionGetBadgeTextFunction() {}
    274 };
    275 
    276 class BrowserActionGetBadgeBackgroundColorFunction
    277     : public ExtensionActionGetBadgeBackgroundColorFunction {
    278  public:
    279   DECLARE_EXTENSION_FUNCTION("browserAction.getBadgeBackgroundColor",
    280                              BROWSERACTION_GETBADGEBACKGROUNDCOLOR)
    281 
    282  protected:
    283   virtual ~BrowserActionGetBadgeBackgroundColorFunction() {}
    284 };
    285 
    286 class BrowserActionEnableFunction : public ExtensionActionShowFunction {
    287  public:
    288   DECLARE_EXTENSION_FUNCTION("browserAction.enable", BROWSERACTION_ENABLE)
    289 
    290  protected:
    291   virtual ~BrowserActionEnableFunction() {}
    292 };
    293 
    294 class BrowserActionDisableFunction : public ExtensionActionHideFunction {
    295  public:
    296   DECLARE_EXTENSION_FUNCTION("browserAction.disable", BROWSERACTION_DISABLE)
    297 
    298  protected:
    299   virtual ~BrowserActionDisableFunction() {}
    300 };
    301 
    302 //
    303 // scriptBadge.* aliases for supported scriptBadge APIs.
    304 //
    305 
    306 class ScriptBadgeSetPopupFunction : public ExtensionActionSetPopupFunction {
    307  public:
    308   DECLARE_EXTENSION_FUNCTION("scriptBadge.setPopup", SCRIPTBADGE_SETPOPUP)
    309 
    310  protected:
    311   virtual ~ScriptBadgeSetPopupFunction() {}
    312 };
    313 
    314 class ScriptBadgeGetPopupFunction : public ExtensionActionGetPopupFunction {
    315  public:
    316   DECLARE_EXTENSION_FUNCTION("scriptBadge.getPopup", SCRIPTBADGE_GETPOPUP)
    317 
    318  protected:
    319   virtual ~ScriptBadgeGetPopupFunction() {}
    320 };
    321 
    322 // scriptBadge.getAttention(tabId)
    323 class ScriptBadgeGetAttentionFunction : public ExtensionActionFunction {
    324  public:
    325   DECLARE_EXTENSION_FUNCTION("scriptBadge.getAttention",
    326                              SCRIPTBADGE_GETATTENTION)
    327 
    328   virtual bool RunExtensionAction() OVERRIDE;
    329 
    330  protected:
    331   virtual ~ScriptBadgeGetAttentionFunction();
    332 };
    333 
    334 }  // namespace extensions
    335 
    336 //
    337 // pageAction.* aliases for supported pageAction APIs.
    338 //
    339 
    340 class PageActionShowFunction : public extensions::ExtensionActionShowFunction {
    341  public:
    342   DECLARE_EXTENSION_FUNCTION("pageAction.show", PAGEACTION_SHOW)
    343 
    344  protected:
    345   virtual ~PageActionShowFunction() {}
    346 };
    347 
    348 class PageActionHideFunction : public extensions::ExtensionActionHideFunction {
    349  public:
    350   DECLARE_EXTENSION_FUNCTION("pageAction.hide", PAGEACTION_HIDE)
    351 
    352  protected:
    353   virtual ~PageActionHideFunction() {}
    354 };
    355 
    356 class PageActionSetIconFunction
    357     : public extensions::ExtensionActionSetIconFunction {
    358  public:
    359   DECLARE_EXTENSION_FUNCTION("pageAction.setIcon", PAGEACTION_SETICON)
    360 
    361  protected:
    362   virtual ~PageActionSetIconFunction() {}
    363 };
    364 
    365 class PageActionSetTitleFunction
    366     : public extensions::ExtensionActionSetTitleFunction {
    367  public:
    368   DECLARE_EXTENSION_FUNCTION("pageAction.setTitle", PAGEACTION_SETTITLE)
    369 
    370  protected:
    371   virtual ~PageActionSetTitleFunction() {}
    372 };
    373 
    374 class PageActionSetPopupFunction
    375     : public extensions::ExtensionActionSetPopupFunction {
    376  public:
    377   DECLARE_EXTENSION_FUNCTION("pageAction.setPopup", PAGEACTION_SETPOPUP)
    378 
    379  protected:
    380   virtual ~PageActionSetPopupFunction() {}
    381 };
    382 
    383 class PageActionGetTitleFunction
    384     : public extensions::ExtensionActionGetTitleFunction {
    385  public:
    386   DECLARE_EXTENSION_FUNCTION("pageAction.getTitle", PAGEACTION_GETTITLE)
    387 
    388  protected:
    389   virtual ~PageActionGetTitleFunction() {}
    390 };
    391 
    392 class PageActionGetPopupFunction
    393     : public extensions::ExtensionActionGetPopupFunction {
    394  public:
    395   DECLARE_EXTENSION_FUNCTION("pageAction.getPopup", PAGEACTION_GETPOPUP)
    396 
    397  protected:
    398   virtual ~PageActionGetPopupFunction() {}
    399 };
    400 
    401 // Base class for deprecated page actions APIs
    402 class PageActionsFunction : public SyncExtensionFunction {
    403  protected:
    404   PageActionsFunction();
    405   virtual ~PageActionsFunction();
    406   bool SetPageActionEnabled(bool enable);
    407 };
    408 
    409 // Implement chrome.pageActions.enableForTab().
    410 class EnablePageActionsFunction : public PageActionsFunction {
    411  public:
    412   DECLARE_EXTENSION_FUNCTION("pageActions.enableForTab",
    413                              PAGEACTIONS_ENABLEFORTAB)
    414 
    415  protected:
    416   virtual ~EnablePageActionsFunction() {}
    417 
    418   // ExtensionFunction:
    419   virtual bool RunImpl() OVERRIDE;
    420 };
    421 
    422 // Implement chrome.pageActions.disableForTab().
    423 class DisablePageActionsFunction : public PageActionsFunction {
    424  public:
    425   DECLARE_EXTENSION_FUNCTION("pageActions.disableForTab",
    426                              PAGEACTIONS_DISABLEFORTAB)
    427 
    428  protected:
    429   virtual ~DisablePageActionsFunction() {}
    430 
    431   // ExtensionFunction:
    432   virtual bool RunImpl() OVERRIDE;
    433 };
    434 
    435 #endif  // CHROME_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_
    436