extension_action_api.h 15 KB

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