/extensions/api/content_blocking/content_blocking_api.h

https://github.com/ric2b/Vivaldi-browser · C Header · 446 lines · 319 code · 93 blank · 34 comment · 0 complexity · a4aa2f74a3b5ea295dee986207829955 MD5 · raw file

  1. // Copyright (c) 2019 Vivaldi Technologies AS. All rights reserved
  2. #ifndef EXTENSIONS_API_CONTENT_BLOCKING_CONTENT_BLOCKING_API_H_
  3. #define EXTENSIONS_API_CONTENT_BLOCKING_CONTENT_BLOCKING_API_H_
  4. #include <memory>
  5. #include <string>
  6. #include "base/memory/weak_ptr.h"
  7. #include "components/request_filter/adblock_filter/adblock_known_sources_handler.h"
  8. #include "components/request_filter/adblock_filter/adblock_rule_service.h"
  9. #include "components/request_filter/adblock_filter/blocked_urls_reporter.h"
  10. #include "extensions/browser/browser_context_keyed_api_factory.h"
  11. #include "extensions/browser/event_router.h"
  12. #include "extensions/browser/extension_function.h"
  13. namespace extensions {
  14. // Observes the adblock rules service and then routes the notifications as
  15. // events to the extension system.
  16. class ContentBlockingEventRouter
  17. : public adblock_filter::RuleService::Observer,
  18. public adblock_filter::KnownRuleSourcesHandler::Observer,
  19. public adblock_filter::BlockedUrlsReporter::Observer {
  20. public:
  21. explicit ContentBlockingEventRouter(content::BrowserContext* browser_context);
  22. ~ContentBlockingEventRouter() override;
  23. // adblock_filter::RuleService::Observer implementation.
  24. void OnRuleServiceStateLoaded(
  25. adblock_filter::RuleService* rule_service) override;
  26. void OnRulesSourceUpdated(
  27. const adblock_filter::RuleSource& rule_source) override;
  28. void OnGroupStateChanged(adblock_filter::RuleGroup group) override;
  29. void OnExceptionListChanged(
  30. adblock_filter::RuleGroup group,
  31. adblock_filter::RuleService::ExceptionsList list) override;
  32. // adblock_filter::KnownRuleSourcesHandler::Observer implementation.
  33. void OnKnownSourceAdded(
  34. const adblock_filter::KnownRuleSource& rule_source) override;
  35. void OnKnownSourceRemoved(adblock_filter::RuleGroup group,
  36. uint32_t source_id) override;
  37. void OnKnownSourceEnabled(adblock_filter::RuleGroup group,
  38. uint32_t source_id) override;
  39. void OnKnownSourceDisabled(adblock_filter::RuleGroup group,
  40. uint32_t source_id) override;
  41. // adblock_filter::BlockedUrlsReporter::Observer implementation.
  42. void OnNewBlockedUrlsReported(
  43. adblock_filter::RuleGroup group,
  44. std::set<content::WebContents*> tabs_with_new_blocks) override;
  45. private:
  46. content::BrowserContext* browser_context_;
  47. DISALLOW_COPY_AND_ASSIGN(ContentBlockingEventRouter);
  48. };
  49. class ContentBlockingAPI : public BrowserContextKeyedAPI,
  50. public EventRouter::Observer {
  51. public:
  52. explicit ContentBlockingAPI(content::BrowserContext* context);
  53. ~ContentBlockingAPI() override;
  54. // KeyedService implementation.
  55. void Shutdown() override;
  56. // BrowserContextKeyedAPI implementation.
  57. static BrowserContextKeyedAPIFactory<ContentBlockingAPI>*
  58. GetFactoryInstance();
  59. // EventRouter::Observer implementation.
  60. void OnListenerAdded(const EventListenerInfo& details) override;
  61. private:
  62. friend class BrowserContextKeyedAPIFactory<ContentBlockingAPI>;
  63. content::BrowserContext* browser_context_;
  64. // BrowserContextKeyedAPI implementation.
  65. static const char* service_name() { return "contentBlockingAPI"; }
  66. static const bool kServiceIsNULLWhileTesting = true;
  67. static const bool kServiceRedirectedInIncognito = true;
  68. // Created lazily upon OnListenerAdded.
  69. std::unique_ptr<ContentBlockingEventRouter> content_blocking_event_router_;
  70. };
  71. class AdBlockFunction : public ExtensionFunction,
  72. public adblock_filter::RuleService::Observer {
  73. public:
  74. AdBlockFunction() = default;
  75. // adblock_filter::RuleService::Observer implementation.
  76. void OnRuleServiceStateLoaded(
  77. adblock_filter::RuleService* rule_service) override;
  78. protected:
  79. ~AdBlockFunction() override = default;
  80. virtual ResponseValue RunWithService(
  81. adblock_filter::RuleService* rules_service) = 0;
  82. static ResponseValue ValidationFailure(AdBlockFunction* function);
  83. private:
  84. ResponseAction Run() override;
  85. DISALLOW_COPY_AND_ASSIGN(AdBlockFunction);
  86. };
  87. class ContentBlockingSetRuleGroupEnabledFunction : public AdBlockFunction {
  88. public:
  89. DECLARE_EXTENSION_FUNCTION("contentBlocking.setRuleGroupEnabled",
  90. CONTENT_BLOCKING_SET_RULE_GROUP_ENABLED)
  91. ContentBlockingSetRuleGroupEnabledFunction() = default;
  92. private:
  93. ~ContentBlockingSetRuleGroupEnabledFunction() override = default;
  94. // AdBlockFunction:
  95. ResponseValue RunWithService(
  96. adblock_filter::RuleService* rules_service) override;
  97. DISALLOW_COPY_AND_ASSIGN(ContentBlockingSetRuleGroupEnabledFunction);
  98. };
  99. class ContentBlockingIsRuleGroupEnabledFunction : public AdBlockFunction {
  100. public:
  101. DECLARE_EXTENSION_FUNCTION("contentBlocking.isRuleGroupEnabled",
  102. CONTENT_BLOCKING_IS_RULE_GROUP_ENABLED)
  103. ContentBlockingIsRuleGroupEnabledFunction() = default;
  104. private:
  105. ~ContentBlockingIsRuleGroupEnabledFunction() override = default;
  106. // AdBlockFunction:
  107. ResponseValue RunWithService(
  108. adblock_filter::RuleService* rules_service) override;
  109. DISALLOW_COPY_AND_ASSIGN(ContentBlockingIsRuleGroupEnabledFunction);
  110. };
  111. class ContentBlockingAddKnownSourceFromURLFunction : public AdBlockFunction {
  112. public:
  113. DECLARE_EXTENSION_FUNCTION("contentBlocking.addKnownSourceFromURL",
  114. CONTENT_BLOCKING_ADD_KNOWN_SOURCE_FROM_URL)
  115. ContentBlockingAddKnownSourceFromURLFunction() = default;
  116. private:
  117. ~ContentBlockingAddKnownSourceFromURLFunction() override = default;
  118. // AdBlockFunction:
  119. ResponseValue RunWithService(
  120. adblock_filter::RuleService* rules_service) override;
  121. DISALLOW_COPY_AND_ASSIGN(ContentBlockingAddKnownSourceFromURLFunction);
  122. };
  123. class ContentBlockingAddKnownSourceFromFileFunction : public AdBlockFunction {
  124. public:
  125. DECLARE_EXTENSION_FUNCTION("contentBlocking.addKnownSourceFromFile",
  126. CONTENT_BLOCKING_ADD_KNOWN_SOURCE_FROM_FILE)
  127. ContentBlockingAddKnownSourceFromFileFunction() = default;
  128. private:
  129. ~ContentBlockingAddKnownSourceFromFileFunction() override = default;
  130. // AdBlockFunction:
  131. ResponseValue RunWithService(
  132. adblock_filter::RuleService* rules_service) override;
  133. DISALLOW_COPY_AND_ASSIGN(ContentBlockingAddKnownSourceFromFileFunction);
  134. };
  135. class ContentBlockingEnableSourceFunction : public AdBlockFunction {
  136. public:
  137. DECLARE_EXTENSION_FUNCTION("contentBlocking.enableSource",
  138. CONTENT_BLOCKING_ENABLE_SOURCE)
  139. ContentBlockingEnableSourceFunction() = default;
  140. private:
  141. ~ContentBlockingEnableSourceFunction() override = default;
  142. // AdBlockFunction:
  143. ResponseValue RunWithService(
  144. adblock_filter::RuleService* rules_service) override;
  145. DISALLOW_COPY_AND_ASSIGN(ContentBlockingEnableSourceFunction);
  146. };
  147. class ContentBlockingDisableSourceFunction : public AdBlockFunction {
  148. public:
  149. DECLARE_EXTENSION_FUNCTION("contentBlocking.disableSource",
  150. CONTENT_BLOCKING_DISABLE_SOURCE)
  151. ContentBlockingDisableSourceFunction() = default;
  152. private:
  153. ~ContentBlockingDisableSourceFunction() override = default;
  154. // AdBlockFunction:
  155. ResponseValue RunWithService(
  156. adblock_filter::RuleService* rules_service) override;
  157. DISALLOW_COPY_AND_ASSIGN(ContentBlockingDisableSourceFunction);
  158. };
  159. class ContentBlockingFetchSourceNowFunction : public AdBlockFunction {
  160. public:
  161. DECLARE_EXTENSION_FUNCTION("contentBlocking.fetchSourceNow",
  162. CONTENT_BLOCKING_FETCH_SOURCE_NOW)
  163. ContentBlockingFetchSourceNowFunction() = default;
  164. private:
  165. ~ContentBlockingFetchSourceNowFunction() override = default;
  166. // AdBlockFunction:
  167. ResponseValue RunWithService(
  168. adblock_filter::RuleService* rules_service) override;
  169. DISALLOW_COPY_AND_ASSIGN(ContentBlockingFetchSourceNowFunction);
  170. };
  171. class ContentBlockingDeleteKnownSourceFunction : public AdBlockFunction {
  172. public:
  173. DECLARE_EXTENSION_FUNCTION("contentBlocking.deleteKnownSource",
  174. CONTENT_BLOCKING_DELETE_KNOWN_SOURCE)
  175. ContentBlockingDeleteKnownSourceFunction() = default;
  176. private:
  177. ~ContentBlockingDeleteKnownSourceFunction() override = default;
  178. // AdBlockFunction:
  179. ResponseValue RunWithService(
  180. adblock_filter::RuleService* rules_service) override;
  181. DISALLOW_COPY_AND_ASSIGN(ContentBlockingDeleteKnownSourceFunction);
  182. };
  183. class ContentBlockingResetPresetSourcesFunction : public AdBlockFunction {
  184. public:
  185. DECLARE_EXTENSION_FUNCTION("contentBlocking.resetPresetSources",
  186. CONTENT_BLOCKING_RESET_PRESET_SOURCES)
  187. ContentBlockingResetPresetSourcesFunction() = default;
  188. private:
  189. ~ContentBlockingResetPresetSourcesFunction() override = default;
  190. // AdBlockFunction:
  191. ResponseValue RunWithService(
  192. adblock_filter::RuleService* rules_service) override;
  193. DISALLOW_COPY_AND_ASSIGN(ContentBlockingResetPresetSourcesFunction);
  194. };
  195. class ContentBlockingGetRuleSourceFunction : public AdBlockFunction {
  196. public:
  197. DECLARE_EXTENSION_FUNCTION("contentBlocking.getRuleSource",
  198. CONTENT_BLOCKING_GET_RULE_SOURCE)
  199. ContentBlockingGetRuleSourceFunction() = default;
  200. private:
  201. ~ContentBlockingGetRuleSourceFunction() override = default;
  202. // AdBlockFunction:
  203. ResponseValue RunWithService(
  204. adblock_filter::RuleService* rules_service) override;
  205. DISALLOW_COPY_AND_ASSIGN(ContentBlockingGetRuleSourceFunction);
  206. };
  207. class ContentBlockingGetRuleSourcesFunction : public AdBlockFunction {
  208. public:
  209. DECLARE_EXTENSION_FUNCTION("contentBlocking.getRuleSources",
  210. CONTENT_BLOCKING_GET_RULE_SOURCES)
  211. ContentBlockingGetRuleSourcesFunction() = default;
  212. private:
  213. ~ContentBlockingGetRuleSourcesFunction() override = default;
  214. // AdBlockFunction:
  215. ResponseValue RunWithService(
  216. adblock_filter::RuleService* rules_service) override;
  217. DISALLOW_COPY_AND_ASSIGN(ContentBlockingGetRuleSourcesFunction);
  218. };
  219. class ContentBlockingSetActiveExceptionsListFunction : public AdBlockFunction {
  220. public:
  221. DECLARE_EXTENSION_FUNCTION("contentBlocking.setActiveExceptionsList",
  222. CONTENT_BLOCKING_SET_ACTIVE_EXCEPTION_LIST)
  223. ContentBlockingSetActiveExceptionsListFunction() = default;
  224. private:
  225. ~ContentBlockingSetActiveExceptionsListFunction() override = default;
  226. // AdBlockFunction:
  227. ResponseValue RunWithService(
  228. adblock_filter::RuleService* rules_service) override;
  229. DISALLOW_COPY_AND_ASSIGN(ContentBlockingSetActiveExceptionsListFunction);
  230. };
  231. class ContentBlockingGetActiveExceptionsListFunction : public AdBlockFunction {
  232. public:
  233. DECLARE_EXTENSION_FUNCTION("contentBlocking.getActiveExceptionsList",
  234. CONTENT_BLOCKING_GET_ACTIVE_EXCEPTION_LIST)
  235. ContentBlockingGetActiveExceptionsListFunction() = default;
  236. private:
  237. ~ContentBlockingGetActiveExceptionsListFunction() override = default;
  238. // AdBlockFunction:
  239. ResponseValue RunWithService(
  240. adblock_filter::RuleService* rules_service) override;
  241. DISALLOW_COPY_AND_ASSIGN(ContentBlockingGetActiveExceptionsListFunction);
  242. };
  243. class ContentBlockingAddExceptionForDomainFunction : public AdBlockFunction {
  244. public:
  245. DECLARE_EXTENSION_FUNCTION("contentBlocking.addExceptionForDomain",
  246. CONTENT_BLOCKING_ADD_EXCEPTION_FOR_DOMAIN)
  247. ContentBlockingAddExceptionForDomainFunction() = default;
  248. private:
  249. ~ContentBlockingAddExceptionForDomainFunction() override = default;
  250. // AdBlockFunction:
  251. ResponseValue RunWithService(
  252. adblock_filter::RuleService* rules_service) override;
  253. DISALLOW_COPY_AND_ASSIGN(ContentBlockingAddExceptionForDomainFunction);
  254. };
  255. class ContentBlockingRemoveExceptionForDomainFunction : public AdBlockFunction {
  256. public:
  257. DECLARE_EXTENSION_FUNCTION("contentBlocking.removeExceptionForDomain",
  258. CONTENT_BLOCKING_REMOVE_EXCEPTION_FOR_DOMAIN)
  259. ContentBlockingRemoveExceptionForDomainFunction() = default;
  260. private:
  261. ~ContentBlockingRemoveExceptionForDomainFunction() override = default;
  262. // AdBlockFunction:
  263. ResponseValue RunWithService(
  264. adblock_filter::RuleService* rules_service) override;
  265. DISALLOW_COPY_AND_ASSIGN(ContentBlockingRemoveExceptionForDomainFunction);
  266. };
  267. class ContentBlockingRemoveAllExceptionsFunction : public AdBlockFunction {
  268. public:
  269. DECLARE_EXTENSION_FUNCTION("contentBlocking.removeAllExceptions",
  270. CONTENT_BLOCKING_REMOVE_ALL_EXCEPTIONS)
  271. ContentBlockingRemoveAllExceptionsFunction() = default;
  272. private:
  273. ~ContentBlockingRemoveAllExceptionsFunction() override = default;
  274. // AdBlockFunction:
  275. ResponseValue RunWithService(
  276. adblock_filter::RuleService* rules_service) override;
  277. DISALLOW_COPY_AND_ASSIGN(ContentBlockingRemoveAllExceptionsFunction);
  278. };
  279. class ContentBlockingGetExceptionsFunction : public AdBlockFunction {
  280. public:
  281. DECLARE_EXTENSION_FUNCTION("contentBlocking.getExceptions",
  282. CONTENT_BLOCKING_GET_EXCEPTIONS)
  283. ContentBlockingGetExceptionsFunction() = default;
  284. private:
  285. ~ContentBlockingGetExceptionsFunction() override = default;
  286. // AdBlockFunction:
  287. ResponseValue RunWithService(
  288. adblock_filter::RuleService* rules_service) override;
  289. DISALLOW_COPY_AND_ASSIGN(ContentBlockingGetExceptionsFunction);
  290. };
  291. class ContentBlockingGetAllExceptionListsFunction : public AdBlockFunction {
  292. public:
  293. DECLARE_EXTENSION_FUNCTION("contentBlocking.getAllExceptionLists",
  294. CONTENT_BLOCKING_GET_ALL_EXCEPTIONS_LISTS)
  295. ContentBlockingGetAllExceptionListsFunction() = default;
  296. private:
  297. ~ContentBlockingGetAllExceptionListsFunction() override = default;
  298. // AdBlockFunction:
  299. ResponseValue RunWithService(
  300. adblock_filter::RuleService* rules_service) override;
  301. DISALLOW_COPY_AND_ASSIGN(ContentBlockingGetAllExceptionListsFunction);
  302. };
  303. class ContentBlockingGetBlockedUrlsInfoFunction : public AdBlockFunction {
  304. public:
  305. DECLARE_EXTENSION_FUNCTION("contentBlocking.getBlockedUrlsInfo",
  306. CONTENT_BLOCKING_GET_BLOCKED_URLS_INFO)
  307. ContentBlockingGetBlockedUrlsInfoFunction() = default;
  308. private:
  309. ~ContentBlockingGetBlockedUrlsInfoFunction() override = default;
  310. // AdBlockFunction:
  311. ResponseValue RunWithService(
  312. adblock_filter::RuleService* rules_service) override;
  313. DISALLOW_COPY_AND_ASSIGN(ContentBlockingGetBlockedUrlsInfoFunction);
  314. };
  315. class ContentBlockingGetBlockedDomainCountersFunction : public AdBlockFunction {
  316. public:
  317. DECLARE_EXTENSION_FUNCTION("contentBlocking.getBlockedDomainCounters",
  318. CONTENT_BLOCKING_GET_BLOCKED_DOMAIN_COUNTERS)
  319. ContentBlockingGetBlockedDomainCountersFunction() = default;
  320. private:
  321. ~ContentBlockingGetBlockedDomainCountersFunction() override = default;
  322. // AdBlockFunction:
  323. ResponseValue RunWithService(
  324. adblock_filter::RuleService* rules_service) override;
  325. DISALLOW_COPY_AND_ASSIGN(ContentBlockingGetBlockedDomainCountersFunction);
  326. };
  327. class ContentBlockingClearBlockedDomainCountersFunction
  328. : public AdBlockFunction {
  329. public:
  330. DECLARE_EXTENSION_FUNCTION("contentBlocking.clearBlockedDomainCounters",
  331. CONTENT_BLOCKING_CLEAR_BLOCKED_DOMAIN_COUNTERS)
  332. ContentBlockingClearBlockedDomainCountersFunction() = default;
  333. private:
  334. ~ContentBlockingClearBlockedDomainCountersFunction() override = default;
  335. // AdBlockFunction:
  336. ResponseValue RunWithService(
  337. adblock_filter::RuleService* rules_service) override;
  338. DISALLOW_COPY_AND_ASSIGN(ContentBlockingClearBlockedDomainCountersFunction);
  339. };
  340. class ContentBlockingIsExemptOfFilteringFunction : public AdBlockFunction {
  341. public:
  342. DECLARE_EXTENSION_FUNCTION("contentBlocking.isExemptOfFiltering",
  343. CONTENT_BLOCKING_IS_EXEMPT_OF_FILTERING)
  344. ContentBlockingIsExemptOfFilteringFunction() = default;
  345. private:
  346. ~ContentBlockingIsExemptOfFilteringFunction() override = default;
  347. // AdBlockFunction:
  348. ResponseValue RunWithService(
  349. adblock_filter::RuleService* rules_service) override;
  350. DISALLOW_COPY_AND_ASSIGN(ContentBlockingIsExemptOfFilteringFunction);
  351. };
  352. } // namespace extensions
  353. #endif // EXTENSIONS_API_CONTENT_BLOCKING_CONTENT_BLOCKING_API_H_