extension_action_api.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. // Copyright (c) 2023 Microsoft, GmbH
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef SHELL_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_
  5. #define SHELL_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_
  6. #include "base/memory/raw_ptr.h"
  7. #include "extensions/browser/browser_context_keyed_api_factory.h"
  8. #include "extensions/browser/extension_action.h"
  9. #include "extensions/browser/extension_function.h"
  10. #include "extensions/browser/extension_host_registry.h"
  11. namespace content {
  12. class BrowserContext;
  13. class WebContents;
  14. } // namespace content
  15. namespace extensions {
  16. class ExtensionHost;
  17. class ExtensionPrefs;
  18. class ExtensionActionAPI : public BrowserContextKeyedAPI {
  19. public:
  20. class Observer {
  21. public:
  22. virtual void OnExtensionActionUpdated(
  23. ExtensionAction* extension_action,
  24. content::WebContents* web_contents,
  25. content::BrowserContext* browser_context);
  26. virtual void OnExtensionActionAPIShuttingDown();
  27. protected:
  28. virtual ~Observer();
  29. };
  30. explicit ExtensionActionAPI(content::BrowserContext* context);
  31. ExtensionActionAPI(const ExtensionActionAPI&) = delete;
  32. ExtensionActionAPI& operator=(const ExtensionActionAPI&) = delete;
  33. ~ExtensionActionAPI() override;
  34. // Convenience method to get the instance for a profile.
  35. static ExtensionActionAPI* Get(content::BrowserContext* context);
  36. static BrowserContextKeyedAPIFactory<ExtensionActionAPI>*
  37. GetFactoryInstance();
  38. // Add or remove observers.
  39. void AddObserver(Observer* observer) {}
  40. void RemoveObserver(Observer* observer) {}
  41. // Notifies that there has been a change in the given |extension_action|.
  42. void NotifyChange(ExtensionAction* extension_action,
  43. content::WebContents* web_contents,
  44. content::BrowserContext* browser_context) {}
  45. // Dispatches the onClicked event for extension that owns the given action.
  46. void DispatchExtensionActionClicked(const ExtensionAction& extension_action,
  47. content::WebContents* web_contents,
  48. const Extension* extension) {}
  49. // Clears the values for all ExtensionActions for the tab associated with the
  50. // given |web_contents| (and signals that page actions changed).
  51. void ClearAllValuesForTab(content::WebContents* web_contents) {}
  52. private:
  53. friend class BrowserContextKeyedAPIFactory<ExtensionActionAPI>;
  54. ExtensionPrefs* GetExtensionPrefs();
  55. // BrowserContextKeyedAPI implementation.
  56. void Shutdown() override;
  57. static const char* service_name() { return "ExtensionActionAPI"; }
  58. static const bool kServiceRedirectedInIncognito = true;
  59. raw_ptr<content::BrowserContext> browser_context_;
  60. raw_ptr<ExtensionPrefs> extension_prefs_;
  61. };
  62. // Implementation of the browserAction and pageAction APIs.
  63. class ExtensionActionFunction : public ExtensionFunction {
  64. protected:
  65. ExtensionActionFunction();
  66. ~ExtensionActionFunction() override;
  67. // ExtensionFunction
  68. ResponseAction Run() override;
  69. virtual ResponseAction RunExtensionAction() = 0;
  70. };
  71. //
  72. // Implementations of each extension action API.
  73. //
  74. // pageAction and browserAction bindings are created for these by extending them
  75. // then declaring an EXTENSION_FUNCTION_NAME.
  76. //
  77. // show
  78. class ExtensionActionShowFunction : public ExtensionActionFunction {
  79. protected:
  80. ~ExtensionActionShowFunction() override = default;
  81. ResponseAction RunExtensionAction() override;
  82. };
  83. // hide
  84. class ExtensionActionHideFunction : public ExtensionActionFunction {
  85. protected:
  86. ~ExtensionActionHideFunction() override = default;
  87. ResponseAction RunExtensionAction() override;
  88. };
  89. // setIcon
  90. class ExtensionActionSetIconFunction : public ExtensionActionFunction {
  91. public:
  92. static void SetReportErrorForInvisibleIconForTesting(bool value);
  93. protected:
  94. ~ExtensionActionSetIconFunction() override = default;
  95. ResponseAction RunExtensionAction() override;
  96. };
  97. // setTitle
  98. class ExtensionActionSetTitleFunction : public ExtensionActionFunction {
  99. protected:
  100. ~ExtensionActionSetTitleFunction() override = default;
  101. ResponseAction RunExtensionAction() override;
  102. };
  103. // setPopup
  104. class ExtensionActionSetPopupFunction : public ExtensionActionFunction {
  105. protected:
  106. ~ExtensionActionSetPopupFunction() override = default;
  107. ResponseAction RunExtensionAction() override;
  108. };
  109. // setBadgeText
  110. class ExtensionActionSetBadgeTextFunction : public ExtensionActionFunction {
  111. protected:
  112. ~ExtensionActionSetBadgeTextFunction() override = default;
  113. ResponseAction RunExtensionAction() override;
  114. };
  115. // setBadgeBackgroundColor
  116. class ExtensionActionSetBadgeBackgroundColorFunction
  117. : public ExtensionActionFunction {
  118. protected:
  119. ~ExtensionActionSetBadgeBackgroundColorFunction() override = default;
  120. ResponseAction RunExtensionAction() override;
  121. };
  122. // getTitle
  123. class ExtensionActionGetTitleFunction : public ExtensionActionFunction {
  124. protected:
  125. ~ExtensionActionGetTitleFunction() override = default;
  126. ResponseAction RunExtensionAction() override;
  127. };
  128. // getPopup
  129. class ExtensionActionGetPopupFunction : public ExtensionActionFunction {
  130. protected:
  131. ~ExtensionActionGetPopupFunction() override = default;
  132. ResponseAction RunExtensionAction() override;
  133. };
  134. // openPopup
  135. class ExtensionActionOpenPopupFunction : public ExtensionActionFunction {
  136. protected:
  137. ~ExtensionActionOpenPopupFunction() override = default;
  138. ResponseAction RunExtensionAction() override;
  139. };
  140. // getBadgeText
  141. class ExtensionActionGetBadgeTextFunction : public ExtensionActionFunction {
  142. protected:
  143. ~ExtensionActionGetBadgeTextFunction() override = default;
  144. ResponseAction RunExtensionAction() override;
  145. };
  146. // getBadgeBackgroundColor
  147. class ExtensionActionGetBadgeBackgroundColorFunction
  148. : public ExtensionActionFunction {
  149. protected:
  150. ~ExtensionActionGetBadgeBackgroundColorFunction() override = default;
  151. ResponseAction RunExtensionAction() override;
  152. };
  153. //
  154. // action.* aliases for supported action APIs.
  155. //
  156. class ActionSetIconFunction : public ExtensionActionSetIconFunction {
  157. public:
  158. DECLARE_EXTENSION_FUNCTION("action.setIcon", ACTION_SETICON)
  159. protected:
  160. ~ActionSetIconFunction() override = default;
  161. };
  162. class ActionGetPopupFunction : public ExtensionActionGetPopupFunction {
  163. public:
  164. DECLARE_EXTENSION_FUNCTION("action.getPopup", ACTION_GETPOPUP)
  165. protected:
  166. ~ActionGetPopupFunction() override = default;
  167. };
  168. class ActionSetPopupFunction : public ExtensionActionSetPopupFunction {
  169. public:
  170. DECLARE_EXTENSION_FUNCTION("action.setPopup", ACTION_SETPOPUP)
  171. protected:
  172. ~ActionSetPopupFunction() override = default;
  173. };
  174. class ActionGetTitleFunction : public ExtensionActionGetTitleFunction {
  175. public:
  176. DECLARE_EXTENSION_FUNCTION("action.getTitle", ACTION_GETTITLE)
  177. protected:
  178. ~ActionGetTitleFunction() override = default;
  179. };
  180. class ActionSetTitleFunction : public ExtensionActionSetTitleFunction {
  181. public:
  182. DECLARE_EXTENSION_FUNCTION("action.setTitle", ACTION_SETTITLE)
  183. protected:
  184. ~ActionSetTitleFunction() override = default;
  185. };
  186. class ActionGetBadgeTextFunction : public ExtensionActionGetBadgeTextFunction {
  187. public:
  188. DECLARE_EXTENSION_FUNCTION("action.getBadgeText", ACTION_GETBADGETEXT)
  189. protected:
  190. ~ActionGetBadgeTextFunction() override = default;
  191. };
  192. class ActionSetBadgeTextFunction : public ExtensionActionSetBadgeTextFunction {
  193. public:
  194. DECLARE_EXTENSION_FUNCTION("action.setBadgeText", ACTION_SETBADGETEXT)
  195. protected:
  196. ~ActionSetBadgeTextFunction() override = default;
  197. };
  198. class ActionGetBadgeBackgroundColorFunction
  199. : public ExtensionActionGetBadgeBackgroundColorFunction {
  200. public:
  201. DECLARE_EXTENSION_FUNCTION("action.getBadgeBackgroundColor",
  202. ACTION_GETBADGEBACKGROUNDCOLOR)
  203. protected:
  204. ~ActionGetBadgeBackgroundColorFunction() override = default;
  205. };
  206. class ActionSetBadgeBackgroundColorFunction
  207. : public ExtensionActionSetBadgeBackgroundColorFunction {
  208. public:
  209. DECLARE_EXTENSION_FUNCTION("action.setBadgeBackgroundColor",
  210. ACTION_SETBADGEBACKGROUNDCOLOR)
  211. protected:
  212. ~ActionSetBadgeBackgroundColorFunction() override = default;
  213. };
  214. class ActionGetBadgeTextColorFunction : public ExtensionActionFunction {
  215. public:
  216. DECLARE_EXTENSION_FUNCTION("action.getBadgeTextColor",
  217. ACTION_GETBADGETEXTCOLOR)
  218. protected:
  219. ~ActionGetBadgeTextColorFunction() override = default;
  220. ResponseAction RunExtensionAction() override;
  221. };
  222. class ActionSetBadgeTextColorFunction : public ExtensionActionFunction {
  223. public:
  224. DECLARE_EXTENSION_FUNCTION("action.setBadgeTextColor",
  225. ACTION_SETBADGETEXTCOLOR)
  226. protected:
  227. ~ActionSetBadgeTextColorFunction() override = default;
  228. ResponseAction RunExtensionAction() override;
  229. };
  230. class ActionEnableFunction : public ExtensionActionShowFunction {
  231. public:
  232. DECLARE_EXTENSION_FUNCTION("action.enable", ACTION_ENABLE)
  233. protected:
  234. ~ActionEnableFunction() override = default;
  235. };
  236. class ActionDisableFunction : public ExtensionActionHideFunction {
  237. public:
  238. DECLARE_EXTENSION_FUNCTION("action.disable", ACTION_DISABLE)
  239. protected:
  240. ~ActionDisableFunction() override = default;
  241. };
  242. class ActionIsEnabledFunction : public ExtensionActionFunction {
  243. public:
  244. DECLARE_EXTENSION_FUNCTION("action.isEnabled", ACTION_ISENABLED)
  245. protected:
  246. ~ActionIsEnabledFunction() override = default;
  247. ResponseAction RunExtensionAction() override;
  248. };
  249. class ActionGetUserSettingsFunction : public ExtensionFunction {
  250. public:
  251. DECLARE_EXTENSION_FUNCTION("action.getUserSettings", ACTION_GETUSERSETTINGS)
  252. ActionGetUserSettingsFunction();
  253. ActionGetUserSettingsFunction(const ActionGetUserSettingsFunction&) = delete;
  254. ActionGetUserSettingsFunction& operator=(
  255. const ActionGetUserSettingsFunction&) = delete;
  256. ResponseAction Run() override;
  257. protected:
  258. ~ActionGetUserSettingsFunction() override;
  259. };
  260. class ActionOpenPopupFunction : public ExtensionActionOpenPopupFunction {
  261. public:
  262. DECLARE_EXTENSION_FUNCTION("action.openPopup", ACTION_OPENPOPUP)
  263. protected:
  264. ~ActionOpenPopupFunction() override = default;
  265. ResponseAction RunExtensionAction() override;
  266. };
  267. //
  268. // browserAction.* aliases for supported browserAction APIs.
  269. //
  270. class BrowserActionSetIconFunction : public ExtensionActionSetIconFunction {
  271. public:
  272. DECLARE_EXTENSION_FUNCTION("browserAction.setIcon", BROWSERACTION_SETICON)
  273. protected:
  274. ~BrowserActionSetIconFunction() override = default;
  275. };
  276. class BrowserActionSetTitleFunction : public ExtensionActionSetTitleFunction {
  277. public:
  278. DECLARE_EXTENSION_FUNCTION("browserAction.setTitle", BROWSERACTION_SETTITLE)
  279. protected:
  280. ~BrowserActionSetTitleFunction() override = default;
  281. };
  282. class BrowserActionSetPopupFunction : public ExtensionActionSetPopupFunction {
  283. public:
  284. DECLARE_EXTENSION_FUNCTION("browserAction.setPopup", BROWSERACTION_SETPOPUP)
  285. protected:
  286. ~BrowserActionSetPopupFunction() override = default;
  287. };
  288. class BrowserActionGetTitleFunction : public ExtensionActionGetTitleFunction {
  289. public:
  290. DECLARE_EXTENSION_FUNCTION("browserAction.getTitle", BROWSERACTION_GETTITLE)
  291. protected:
  292. ~BrowserActionGetTitleFunction() override = default;
  293. };
  294. class BrowserActionGetPopupFunction : public ExtensionActionGetPopupFunction {
  295. public:
  296. DECLARE_EXTENSION_FUNCTION("browserAction.getPopup", BROWSERACTION_GETPOPUP)
  297. protected:
  298. ~BrowserActionGetPopupFunction() override = default;
  299. };
  300. class BrowserActionSetBadgeTextFunction
  301. : public ExtensionActionSetBadgeTextFunction {
  302. public:
  303. DECLARE_EXTENSION_FUNCTION("browserAction.setBadgeText",
  304. BROWSERACTION_SETBADGETEXT)
  305. protected:
  306. ~BrowserActionSetBadgeTextFunction() override = default;
  307. };
  308. class BrowserActionSetBadgeBackgroundColorFunction
  309. : public ExtensionActionSetBadgeBackgroundColorFunction {
  310. public:
  311. DECLARE_EXTENSION_FUNCTION("browserAction.setBadgeBackgroundColor",
  312. BROWSERACTION_SETBADGEBACKGROUNDCOLOR)
  313. protected:
  314. ~BrowserActionSetBadgeBackgroundColorFunction() override = default;
  315. };
  316. class BrowserActionGetBadgeTextFunction
  317. : public ExtensionActionGetBadgeTextFunction {
  318. public:
  319. DECLARE_EXTENSION_FUNCTION("browserAction.getBadgeText",
  320. BROWSERACTION_GETBADGETEXT)
  321. protected:
  322. ~BrowserActionGetBadgeTextFunction() override = default;
  323. };
  324. class BrowserActionGetBadgeBackgroundColorFunction
  325. : public ExtensionActionGetBadgeBackgroundColorFunction {
  326. public:
  327. DECLARE_EXTENSION_FUNCTION("browserAction.getBadgeBackgroundColor",
  328. BROWSERACTION_GETBADGEBACKGROUNDCOLOR)
  329. protected:
  330. ~BrowserActionGetBadgeBackgroundColorFunction() override = default;
  331. };
  332. class BrowserActionEnableFunction : public ExtensionActionShowFunction {
  333. public:
  334. DECLARE_EXTENSION_FUNCTION("browserAction.enable", BROWSERACTION_ENABLE)
  335. protected:
  336. ~BrowserActionEnableFunction() override = default;
  337. };
  338. class BrowserActionDisableFunction : public ExtensionActionHideFunction {
  339. public:
  340. DECLARE_EXTENSION_FUNCTION("browserAction.disable", BROWSERACTION_DISABLE)
  341. protected:
  342. ~BrowserActionDisableFunction() override = default;
  343. };
  344. class BrowserActionOpenPopupFunction : public ExtensionActionOpenPopupFunction {
  345. public:
  346. DECLARE_EXTENSION_FUNCTION("browserAction.openPopup",
  347. BROWSERACTION_OPEN_POPUP)
  348. protected:
  349. ~BrowserActionOpenPopupFunction() override = default;
  350. };
  351. } // namespace extensions
  352. //
  353. // pageAction.* aliases for supported pageAction APIs.
  354. //
  355. class PageActionShowFunction : public extensions::ExtensionActionShowFunction {
  356. public:
  357. DECLARE_EXTENSION_FUNCTION("pageAction.show", PAGEACTION_SHOW)
  358. protected:
  359. ~PageActionShowFunction() override = default;
  360. };
  361. class PageActionHideFunction : public extensions::ExtensionActionHideFunction {
  362. public:
  363. DECLARE_EXTENSION_FUNCTION("pageAction.hide", PAGEACTION_HIDE)
  364. protected:
  365. ~PageActionHideFunction() override = default;
  366. };
  367. class PageActionSetIconFunction
  368. : public extensions::ExtensionActionSetIconFunction {
  369. public:
  370. DECLARE_EXTENSION_FUNCTION("pageAction.setIcon", PAGEACTION_SETICON)
  371. protected:
  372. ~PageActionSetIconFunction() override = default;
  373. };
  374. class PageActionSetTitleFunction
  375. : public extensions::ExtensionActionSetTitleFunction {
  376. public:
  377. DECLARE_EXTENSION_FUNCTION("pageAction.setTitle", PAGEACTION_SETTITLE)
  378. protected:
  379. ~PageActionSetTitleFunction() override = default;
  380. };
  381. class PageActionSetPopupFunction
  382. : public extensions::ExtensionActionSetPopupFunction {
  383. public:
  384. DECLARE_EXTENSION_FUNCTION("pageAction.setPopup", PAGEACTION_SETPOPUP)
  385. protected:
  386. ~PageActionSetPopupFunction() override = default;
  387. };
  388. class PageActionGetTitleFunction
  389. : public extensions::ExtensionActionGetTitleFunction {
  390. public:
  391. DECLARE_EXTENSION_FUNCTION("pageAction.getTitle", PAGEACTION_GETTITLE)
  392. protected:
  393. ~PageActionGetTitleFunction() override = default;
  394. };
  395. class PageActionGetPopupFunction
  396. : public extensions::ExtensionActionGetPopupFunction {
  397. public:
  398. DECLARE_EXTENSION_FUNCTION("pageAction.getPopup", PAGEACTION_GETPOPUP)
  399. protected:
  400. ~PageActionGetPopupFunction() override = default;
  401. };
  402. #endif // SHELL_BROWSER_EXTENSIONS_API_EXTENSION_ACTION_EXTENSION_ACTION_API_H_