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.
5 #ifndef CHROME_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_
6 #define CHROME_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_
10 #include "base/memory/weak_ptr.h"
11 #include "chrome/browser/extensions/api/profile_keyed_api_factory.h"
12 #include "chrome/browser/extensions/chrome_extension_function.h"
13 #include "chrome/browser/extensions/extension_action.h"
14 #include "content/public/browser/notification_observer.h"
15 #include "content/public/browser/notification_registrar.h"
18 class DictionaryValue;
25 namespace extensions {
29 class ExtensionActionAPI : public ProfileKeyedAPI {
31 explicit ExtensionActionAPI(Profile* profile);
32 virtual ~ExtensionActionAPI();
34 // Convenience method to get the instance for a profile.
35 static ExtensionActionAPI* Get(Profile* profile);
37 static bool GetBrowserActionVisibility(const ExtensionPrefs* prefs,
38 const std::string& extension_id);
39 static void SetBrowserActionVisibility(ExtensionPrefs* prefs,
40 const std::string& extension_id,
43 // Fires the onClicked event for page_action.
44 static void PageActionExecuted(Profile* profile,
45 const ExtensionAction& page_action,
47 const std::string& url,
50 // Fires the onClicked event for script_badge.
51 static void ScriptBadgeExecuted(Profile* profile,
52 const ExtensionAction& script_badge,
55 // Fires the onClicked event for browser_action.
56 static void BrowserActionExecuted(Profile* profile,
57 const ExtensionAction& browser_action,
58 content::WebContents* web_contents);
60 // ProfileKeyedAPI implementation.
61 static ProfileKeyedAPIFactory<ExtensionActionAPI>* GetFactoryInstance();
64 friend class ProfileKeyedAPIFactory<ExtensionActionAPI>;
66 // The DispatchEvent methods forward events to the |profile|'s event router.
67 static void DispatchEventToExtension(Profile* profile,
68 const std::string& extension_id,
69 const std::string& event_name,
70 scoped_ptr<base::ListValue> event_args);
72 // Called to dispatch a deprecated style page action click event that was
74 // chrome.pageActions["name"].addListener(function(actionId, info){})
75 static void DispatchOldPageActionEvent(Profile* profile,
76 const std::string& extension_id,
77 const std::string& page_action_id,
79 const std::string& url,
82 // Called when either a browser or page action is executed. Figures out which
83 // event to send based on what the extension wants.
84 static void ExtensionActionExecuted(Profile* profile,
85 const ExtensionAction& extension_action,
86 content::WebContents* web_contents);
88 // ProfileKeyedAPI implementation.
89 static const char* service_name() { return "ExtensionActionAPI"; }
91 DISALLOW_COPY_AND_ASSIGN(ExtensionActionAPI);
94 // This class manages reading and writing browser action values from storage.
95 class ExtensionActionStorageManager
96 : public content::NotificationObserver,
97 public base::SupportsWeakPtr<ExtensionActionStorageManager> {
99 explicit ExtensionActionStorageManager(Profile* profile);
100 virtual ~ExtensionActionStorageManager();
103 // NotificationObserver:
104 virtual void Observe(int type,
105 const content::NotificationSource& source,
106 const content::NotificationDetails& details) OVERRIDE;
108 // Reads/Writes the ExtensionAction's default values to/from storage.
109 void WriteToStorage(ExtensionAction* extension_action);
110 void ReadFromStorage(
111 const std::string& extension_id, scoped_ptr<base::Value> value);
114 content::NotificationRegistrar registrar_;
117 // Implementation of the browserAction, pageAction, and scriptBadge APIs.
119 // Divergent behaviour between the three is minimal (pageAction and scriptBadge
120 // have required tabIds while browserAction's are optional, they have different
121 // internal browser notification requirements, and not all functions are defined
123 class ExtensionActionFunction : public ChromeSyncExtensionFunction {
125 static bool ParseCSSColorString(const std::string& color_string,
129 ExtensionActionFunction();
130 virtual ~ExtensionActionFunction();
131 virtual bool RunImpl() OVERRIDE;
132 virtual bool RunExtensionAction() = 0;
134 bool ExtractDataFromArguments();
136 void NotifyBrowserActionChange();
137 void NotifyLocationBarChange();
138 void NotifySystemIndicatorChange();
139 bool SetVisible(bool visible);
141 // Extension-related information for |tab_id_|.
142 // CHECK-fails if there is no tab.
143 extensions::TabHelper& tab_helper() const;
145 // All the extension action APIs take a single argument called details that
147 base::DictionaryValue* details_;
149 // The tab id the extension action function should apply to, if any, or
150 // kDefaultTabId if none was specified.
153 // WebContents for |tab_id_| if one exists.
154 content::WebContents* contents_;
156 // The extension action for the current extension.
157 ExtensionAction* extension_action_;
161 // Implementations of each extension action API.
163 // pageAction and browserAction bindings are created for these by extending them
164 // then declaring an EXTENSION_FUNCTION_NAME.
168 class ExtensionActionShowFunction : public ExtensionActionFunction {
170 virtual ~ExtensionActionShowFunction() {}
171 virtual bool RunExtensionAction() OVERRIDE;
175 class ExtensionActionHideFunction : public ExtensionActionFunction {
177 virtual ~ExtensionActionHideFunction() {}
178 virtual bool RunExtensionAction() OVERRIDE;
182 class ExtensionActionSetIconFunction : public ExtensionActionFunction {
184 virtual ~ExtensionActionSetIconFunction() {}
185 virtual bool RunExtensionAction() OVERRIDE;
189 class ExtensionActionSetTitleFunction : public ExtensionActionFunction {
191 virtual ~ExtensionActionSetTitleFunction() {}
192 virtual bool RunExtensionAction() OVERRIDE;
196 class ExtensionActionSetPopupFunction : public ExtensionActionFunction {
198 virtual ~ExtensionActionSetPopupFunction() {}
199 virtual bool RunExtensionAction() OVERRIDE;
203 class ExtensionActionSetBadgeTextFunction : public ExtensionActionFunction {
205 virtual ~ExtensionActionSetBadgeTextFunction() {}
206 virtual bool RunExtensionAction() OVERRIDE;
209 // setBadgeBackgroundColor
210 class ExtensionActionSetBadgeBackgroundColorFunction
211 : public ExtensionActionFunction {
213 virtual ~ExtensionActionSetBadgeBackgroundColorFunction() {}
214 virtual bool RunExtensionAction() OVERRIDE;
218 class ExtensionActionGetTitleFunction : public ExtensionActionFunction {
220 virtual ~ExtensionActionGetTitleFunction() {}
221 virtual bool RunExtensionAction() OVERRIDE;
225 class ExtensionActionGetPopupFunction : public ExtensionActionFunction {
227 virtual ~ExtensionActionGetPopupFunction() {}
228 virtual bool RunExtensionAction() OVERRIDE;
232 class ExtensionActionGetBadgeTextFunction : public ExtensionActionFunction {
234 virtual ~ExtensionActionGetBadgeTextFunction() {}
235 virtual bool RunExtensionAction() OVERRIDE;
238 // getBadgeBackgroundColor
239 class ExtensionActionGetBadgeBackgroundColorFunction
240 : public ExtensionActionFunction {
242 virtual ~ExtensionActionGetBadgeBackgroundColorFunction() {}
243 virtual bool RunExtensionAction() OVERRIDE;
247 // browserAction.* aliases for supported browserAction APIs.
250 class BrowserActionSetIconFunction : public ExtensionActionSetIconFunction {
252 DECLARE_EXTENSION_FUNCTION("browserAction.setIcon", BROWSERACTION_SETICON)
255 virtual ~BrowserActionSetIconFunction() {}
258 class BrowserActionSetTitleFunction : public ExtensionActionSetTitleFunction {
260 DECLARE_EXTENSION_FUNCTION("browserAction.setTitle", BROWSERACTION_SETTITLE)
263 virtual ~BrowserActionSetTitleFunction() {}
266 class BrowserActionSetPopupFunction : public ExtensionActionSetPopupFunction {
268 DECLARE_EXTENSION_FUNCTION("browserAction.setPopup", BROWSERACTION_SETPOPUP)
271 virtual ~BrowserActionSetPopupFunction() {}
274 class BrowserActionGetTitleFunction : public ExtensionActionGetTitleFunction {
276 DECLARE_EXTENSION_FUNCTION("browserAction.getTitle", BROWSERACTION_GETTITLE)
279 virtual ~BrowserActionGetTitleFunction() {}
282 class BrowserActionGetPopupFunction : public ExtensionActionGetPopupFunction {
284 DECLARE_EXTENSION_FUNCTION("browserAction.getPopup", BROWSERACTION_GETPOPUP)
287 virtual ~BrowserActionGetPopupFunction() {}
290 class BrowserActionSetBadgeTextFunction
291 : public ExtensionActionSetBadgeTextFunction {
293 DECLARE_EXTENSION_FUNCTION("browserAction.setBadgeText",
294 BROWSERACTION_SETBADGETEXT)
297 virtual ~BrowserActionSetBadgeTextFunction() {}
300 class BrowserActionSetBadgeBackgroundColorFunction
301 : public ExtensionActionSetBadgeBackgroundColorFunction {
303 DECLARE_EXTENSION_FUNCTION("browserAction.setBadgeBackgroundColor",
304 BROWSERACTION_SETBADGEBACKGROUNDCOLOR)
307 virtual ~BrowserActionSetBadgeBackgroundColorFunction() {}
310 class BrowserActionGetBadgeTextFunction
311 : public ExtensionActionGetBadgeTextFunction {
313 DECLARE_EXTENSION_FUNCTION("browserAction.getBadgeText",
314 BROWSERACTION_GETBADGETEXT)
317 virtual ~BrowserActionGetBadgeTextFunction() {}
320 class BrowserActionGetBadgeBackgroundColorFunction
321 : public ExtensionActionGetBadgeBackgroundColorFunction {
323 DECLARE_EXTENSION_FUNCTION("browserAction.getBadgeBackgroundColor",
324 BROWSERACTION_GETBADGEBACKGROUNDCOLOR)
327 virtual ~BrowserActionGetBadgeBackgroundColorFunction() {}
330 class BrowserActionEnableFunction : public ExtensionActionShowFunction {
332 DECLARE_EXTENSION_FUNCTION("browserAction.enable", BROWSERACTION_ENABLE)
335 virtual ~BrowserActionEnableFunction() {}
338 class BrowserActionDisableFunction : public ExtensionActionHideFunction {
340 DECLARE_EXTENSION_FUNCTION("browserAction.disable", BROWSERACTION_DISABLE)
343 virtual ~BrowserActionDisableFunction() {}
346 class BrowserActionOpenPopupFunction : public ChromeAsyncExtensionFunction,
347 public content::NotificationObserver {
349 DECLARE_EXTENSION_FUNCTION("browserAction.openPopup",
350 BROWSERACTION_OPEN_POPUP)
351 BrowserActionOpenPopupFunction();
354 virtual ~BrowserActionOpenPopupFunction() {}
356 // ExtensionFunction:
357 virtual bool RunImpl() OVERRIDE;
359 virtual void Observe(int type,
360 const content::NotificationSource& source,
361 const content::NotificationDetails& details) OVERRIDE;
362 void OpenPopupTimedOut();
364 content::NotificationRegistrar registrar_;
367 DISALLOW_COPY_AND_ASSIGN(BrowserActionOpenPopupFunction);
371 // scriptBadge.* aliases for supported scriptBadge APIs.
374 class ScriptBadgeSetPopupFunction : public ExtensionActionSetPopupFunction {
376 DECLARE_EXTENSION_FUNCTION("scriptBadge.setPopup", SCRIPTBADGE_SETPOPUP)
379 virtual ~ScriptBadgeSetPopupFunction() {}
382 class ScriptBadgeGetPopupFunction : public ExtensionActionGetPopupFunction {
384 DECLARE_EXTENSION_FUNCTION("scriptBadge.getPopup", SCRIPTBADGE_GETPOPUP)
387 virtual ~ScriptBadgeGetPopupFunction() {}
390 // scriptBadge.getAttention(tabId)
391 class ScriptBadgeGetAttentionFunction : public ExtensionActionFunction {
393 DECLARE_EXTENSION_FUNCTION("scriptBadge.getAttention",
394 SCRIPTBADGE_GETATTENTION)
396 virtual bool RunExtensionAction() OVERRIDE;
399 virtual ~ScriptBadgeGetAttentionFunction();
402 } // namespace extensions
405 // pageAction.* aliases for supported pageAction APIs.
408 class PageActionShowFunction : public extensions::ExtensionActionShowFunction {
410 DECLARE_EXTENSION_FUNCTION("pageAction.show", PAGEACTION_SHOW)
413 virtual ~PageActionShowFunction() {}
416 class PageActionHideFunction : public extensions::ExtensionActionHideFunction {
418 DECLARE_EXTENSION_FUNCTION("pageAction.hide", PAGEACTION_HIDE)
421 virtual ~PageActionHideFunction() {}
424 class PageActionSetIconFunction
425 : public extensions::ExtensionActionSetIconFunction {
427 DECLARE_EXTENSION_FUNCTION("pageAction.setIcon", PAGEACTION_SETICON)
430 virtual ~PageActionSetIconFunction() {}
433 class PageActionSetTitleFunction
434 : public extensions::ExtensionActionSetTitleFunction {
436 DECLARE_EXTENSION_FUNCTION("pageAction.setTitle", PAGEACTION_SETTITLE)
439 virtual ~PageActionSetTitleFunction() {}
442 class PageActionSetPopupFunction
443 : public extensions::ExtensionActionSetPopupFunction {
445 DECLARE_EXTENSION_FUNCTION("pageAction.setPopup", PAGEACTION_SETPOPUP)
448 virtual ~PageActionSetPopupFunction() {}
451 class PageActionGetTitleFunction
452 : public extensions::ExtensionActionGetTitleFunction {
454 DECLARE_EXTENSION_FUNCTION("pageAction.getTitle", PAGEACTION_GETTITLE)
457 virtual ~PageActionGetTitleFunction() {}
460 class PageActionGetPopupFunction
461 : public extensions::ExtensionActionGetPopupFunction {
463 DECLARE_EXTENSION_FUNCTION("pageAction.getPopup", PAGEACTION_GETPOPUP)
466 virtual ~PageActionGetPopupFunction() {}
469 // Base class for deprecated page actions APIs
470 class PageActionsFunction : public ChromeSyncExtensionFunction {
472 PageActionsFunction();
473 virtual ~PageActionsFunction();
474 bool SetPageActionEnabled(bool enable);
477 // Implement chrome.pageActions.enableForTab().
478 class EnablePageActionsFunction : public PageActionsFunction {
480 DECLARE_EXTENSION_FUNCTION("pageActions.enableForTab",
481 PAGEACTIONS_ENABLEFORTAB)
484 virtual ~EnablePageActionsFunction() {}
486 // ExtensionFunction:
487 virtual bool RunImpl() OVERRIDE;
490 // Implement chrome.pageActions.disableForTab().
491 class DisablePageActionsFunction : public PageActionsFunction {
493 DECLARE_EXTENSION_FUNCTION("pageActions.disableForTab",
494 PAGEACTIONS_DISABLEFORTAB)
497 virtual ~DisablePageActionsFunction() {}
499 // ExtensionFunction:
500 virtual bool RunImpl() OVERRIDE;
503 #endif // CHROME_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_