extension_action_api.h 15 KB

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