- RecordUserAction.record("MobileMenuRequestEnableJavascript");
- } else if (id == R.id.reader_mode_prefs_id) {
- DomDistillerUIUtils.openSettings(currentTab.getWebContents());
-+ } else if (id == R.id.enable_adblock_id || id == R.id.enable_adblock_check_id) {
-+ final boolean reloadOnChange = !currentTab.isNativePage();
-+ final boolean adblockEnabled = !PrefServiceBridge.getInstance().isCategoryEnabled(ContentSettingsType.CONTENT_SETTINGS_TYPE_ADS);
-+ PrefServiceBridge.getInstance().setCategoryEnabled(ContentSettingsType.CONTENT_SETTINGS_TYPE_ADS, adblockEnabled);
-+ if (reloadOnChange) {
-+ currentTab.reload();
-+ }
-+ RecordUserAction.record("MobileMenuRequestEnableAdBlock");
- } else {
- return false;
- }
-diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
---- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
-+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
-@@ -1762,6 +1762,14 @@ public class ChromeTabbedActivity
- reportNewTabShortcutUsed(true);
- getTabCreator(true).launchNTP();
- }
-+ } else if (id == R.id.enable_adblock_id || id == R.id.enable_adblock_check_id) {
-+ final boolean reloadOnChange = !currentTab.isNativePage();
-+ final boolean adblockEnabled = !PrefServiceBridge.getInstance().isCategoryEnabled(ContentSettingsType.CONTENT_SETTINGS_TYPE_ADS);
-+ PrefServiceBridge.getInstance().setCategoryEnabled(ContentSettingsType.CONTENT_SETTINGS_TYPE_ADS, adblockEnabled);
-+ if (reloadOnChange) {
-+ currentTab.reload();
-+ }
-+ RecordUserAction.record("MobileMenuRequestEnableAdBlock");
- } else if (id == R.id.all_bookmarks_menu_id) {
- if (currentTab != null) {
- getCompositorViewHolder().hideKeyboard(() -> {
-diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
---- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
-+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuPropertiesDelegateImpl.java
-@@ -27,6 +27,7 @@ import org.chromium.chrome.R;
- import org.chromium.chrome.browser.ActivityTabProvider;
- import org.chromium.chrome.browser.ChromeFeatureList;
- import org.chromium.chrome.browser.ChromeSwitches;
-+import org.chromium.chrome.browser.ContentSettingsType;
- import org.chromium.chrome.browser.ShortcutHelper;
- import org.chromium.chrome.browser.UrlConstants;
- import org.chromium.chrome.browser.banners.AppBannerManager;
-@@ -224,6 +225,8 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
- // Prepare translate menu button.
- prepareTranslateMenuItem(menu, currentTab);
-
-+ updateEnableAdBlockMenuItem(menu, currentTab);
-+
- // Hide 'Add to homescreen' for the following:
- // * chrome:// pages - Android doesn't know how to direct those URLs.
- // * incognito pages - To avoid problems where users create shortcuts in incognito
-@@ -296,6 +299,43 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
- PrefServiceBridge.getInstance().isIncognitoModeManaged());
- }
-
-+ /**
-+ * Updates the enable AdBlock item's state.
-+ *
-+ * @param menu {@link Menu} for enable adblock
-+ * @param currentTab Current tab being displayed.
-+ */
-+ protected void updateEnableAdBlockMenuItem(
-+ Menu menu, Tab currentTab) {
-+ MenuItem enableMenuRow = menu.findItem(R.id.enable_adblock_row_menu_id);
-+ MenuItem enableMenuLabel = menu.findItem(R.id.enable_adblock_id);
-+ MenuItem enableMenuCheck = menu.findItem(R.id.enable_adblock_check_id);
-+
-+
-+ // Hide enable adblock on all chrome:// pages except for the NTP.
-+ String url = currentTab.getUrl();
-+ boolean isChromeScheme = url.startsWith(UrlConstants.CHROME_URL_PREFIX)
-+ || url.startsWith(UrlConstants.CHROME_NATIVE_URL_PREFIX);
-+ // Also hide enable javascsript on Reader Mode.
-+ boolean isDistilledPage = DomDistillerUrlUtils.isDistilledPage(url);
-+
-+ boolean itemVisible = (!isChromeScheme || currentTab.isNativePage()) && !isDistilledPage;
-+ enableMenuRow.setVisible(itemVisible);
-+ if (!itemVisible) return;
-+
-+ boolean adBlockEnabled = !PrefServiceBridge.getInstance().isCategoryEnabled(ContentSettingsType.CONTENT_SETTINGS_TYPE_ADS);
-+
-+ // Mark the checkbox if adblock is globally activate.
-+ enableMenuCheck.setChecked(adBlockEnabled);
-+
-+ // This title doesn't seem to be displayed by Android, but it is used to set up
-+ // accessibility text in {@link AppMenuAdapter#setupMenuButton}.
-+ enableMenuLabel.setTitleCondensed(adBlockEnabled
-+ ? mContext.getString(R.string.menu_enable_adblock_on)
-+ : mContext.getString(R.string.menu_enable_adblock_off));
-+ }
-+
-+
- /**
- * Sets the visibility and labels of the "Add to Home screen" and "Open WebAPK" menu items.
- */
-@@ -475,8 +515,6 @@ public class AppMenuPropertiesDelegateImpl implements AppMenuPropertiesDelegate
- : mContext.getString(R.string.menu_enable_javascript_off));
- }
-
--
--
- /**
- * Updates the request desktop site item's state.
- *
-diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
---- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
-+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegate.java
-@@ -201,6 +201,8 @@ public class CustomTabAppMenuPropertiesDelegate extends AppMenuPropertiesDelegat
- }
- }
-
-+ updateEnableAdBlockMenuItem(menu, currentTab);
-+
- updateRequestDesktopSiteMenuItem(menu, currentTab, requestDesktopSiteVisible);
- updateEnableJavascriptMenuItem(menu, currentTab);
- prepareAddToHomescreenMenuItem(menu, currentTab, addToHomeScreenVisible);
-diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
---- a/chrome/android/java/strings/android_chrome_strings.grd
-+++ b/chrome/android/java/strings/android_chrome_strings.grd
-@@ -3078,6 +3078,17 @@ To change this setting, <resetlink>reset sync
- Turn on Request desktop site
-
-+
-+
-+ Enable AdBlock
-+
-+
-+ Turn off AdBlock
-+
-+
-+ Turn on AdBlock
-+
-+
-
- Appearance
-
-diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc
---- a/chrome/browser/net/chrome_network_delegate.cc
-+++ b/chrome/browser/net/chrome_network_delegate.cc
-@@ -25,6 +25,7 @@
- #include "build/build_config.h"
- #include "chrome/browser/browser_process.h"
- #include "chrome/browser/content_settings/cookie_settings_factory.h"
-+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
- #include "chrome/browser/content_settings/tab_specific_content_settings.h"
- #include "chrome/browser/custom_handlers/protocol_handler_registry.h"
- #include "chrome/browser/net/chrome_extensions_network_delegate.h"
-@@ -59,6 +60,7 @@
- #if defined(OS_ANDROID)
- #include "base/android/path_utils.h"
- #include "chrome/browser/io_thread.h"
-+#include "net/url_request/adblock_intercept.h"
- #endif
-
- #if defined(OS_CHROMEOS)
-@@ -193,10 +195,94 @@ void ChromeNetworkDelegate::set_cookie_settings(
- cookie_settings_ = cookie_settings;
- }
-
-+#define TRANSPARENT1PXGIF "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"
-+#define EMPTYJS "data:text/javascript;base64,Cg=="
-+#define EMPTYCSS "data:text/css;base64,Cg=="
-+
-+static bool requestIntercepted(net::URLRequest* request, GURL* new_url) {
-+ bool block = false, isValidUrl;
-+
-+ // skip invalid URLs and browser-initiated requests (which have no initiator)
-+ auto initiator = request->initiator();
-+ isValidUrl = request->url().is_valid() && initiator.has_value();
-+ std::string scheme = request->url().scheme();
-+ if (isValidUrl && scheme.length()) {
-+ std::transform(scheme.begin(), scheme.end(), scheme.begin(), ::tolower);
-+ if ("http" != scheme && "https" != scheme) {
-+ isValidUrl = false;
-+ }
-+ }
-+ ResourceRequestInfo* info;
-+ if (isValidUrl) {
-+ info = ResourceRequestInfo::ForRequest(request);
-+ }
-+
-+ bool adblock_enabled = false;
-+ if (isValidUrl && info) {
-+ const content::ResourceRequestInfo::WebContentsGetter& web_contents_getter = info->GetWebContentsGetterForRequest();
-+ content::WebContents* web_contents = web_contents_getter.Run();
-+ if (web_contents) {
-+ Profile* profile = Profile::FromBrowserContext(web_contents->GetBrowserContext());
-+ //FIXME: this should not be called from the IO thread
-+ const HostContentSettingsMap* content_settings = HostContentSettingsMapFactory::GetForProfile(profile);
-+
-+ if (content_settings) {
-+ // check global value first
-+ adblock_enabled = CONTENT_SETTING_BLOCK == content_settings->GetDefaultContentSetting(ContentSettingsType::CONTENT_SETTINGS_TYPE_ADS, NULL);
-+
-+ if (!adblock_enabled) {
-+ // check per-site value
-+ adblock_enabled = CONTENT_SETTING_BLOCK == content_settings->GetContentSetting(request->url(), GURL(), ContentSettingsType::CONTENT_SETTINGS_TYPE_ADS,
-+ std::string());
-+ }
-+ }
-+ }
-+
-+ auto resource_type = info->GetResourceType();
-+
-+ if (adblock_enabled
-+ && content::ResourceType::kMainFrame != resource_type
-+ && net::adblock_intercept(request->url(), initiator->host(), resource_type)) {
-+ block = true;
-+ }
-+
-+ if (block) {
-+ switch (resource_type) {
-+ case content::ResourceType::kImage:
-+ case content::ResourceType::kFavicon:
-+ *new_url = GURL(TRANSPARENT1PXGIF);
-+ break;
-+ case content::ResourceType::kScript:
-+ *new_url = GURL(EMPTYJS);
-+ break;
-+ case content::ResourceType::kStylesheet:
-+ *new_url = GURL(EMPTYCSS);
-+ break;
-+ default:
-+ *new_url = GURL("");
-+ return true;
-+ }
-+ }
-+ } // valid URL and info
-+ return false;
-+}
-+#undef TRANSPARENT1PXGIF
-+#undef EMPTYJS
-+#undef EMPTYCSS
-+
- int ChromeNetworkDelegate::OnBeforeURLRequest(
- net::URLRequest* request,
- net::CompletionOnceCallback callback,
- GURL* new_url) {
-+
-+#if defined(OS_ANDROID)
-+ if (request) {
-+ // most requests will be modified rather than intercepted
-+ if (requestIntercepted(request, new_url))
-+ return net::ERR_BLOCKED_BY_ADMINISTRATOR;
-+ } // request
-+#endif // OS_ANDROID
-+
- extensions_delegate_->ForwardStartRequestStatus(request);
-
- return extensions_delegate_->NotifyBeforeURLRequest(
diff --git a/net/BUILD.gn b/net/BUILD.gn
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
-@@ -1815,6 +1815,13 @@ component("net") {
+@@ -1842,6 +1842,13 @@ component("net") {
"url_request/websocket_handshake_userdata_key.h",
]
diff --git a/build/patches/Bromite-AdBlockUpdaterService.patch b/build/patches/Bromite-AdBlockUpdaterService.patch
new file mode 100644
index 0000000000000000000000000000000000000000..027952ba7c2dc25a39712a046db8c876af6b381b
--- /dev/null
+++ b/build/patches/Bromite-AdBlockUpdaterService.patch
@@ -0,0 +1,1348 @@
+From: csagan5 <32685696+csagan5@users.noreply.github.com>
+Date: Sat, 14 Sep 2019 10:20:08 +0200
+Subject: Bromite AdBlockUpdaterService
+
+Disable look-alike, metrics, ablation and navigation throttles
+Do not use experiments to enable/disable presets
+Always enable ad filtering
+Download filters by checking Last-Modified header first
+---
+ chrome/browser/after_startup_task_utils.cc | 5 +
+ chrome/browser/browser_process.h | 7 +
+ chrome/browser/browser_process_impl.cc | 28 +++
+ chrome/browser/browser_process_impl.h | 3 +
+ chrome/browser/chrome_browser_main.cc | 5 +-
+ chrome/browser/chrome_content_browser_client.cc | 18 --
+ components/component_updater/BUILD.gn | 6 +
+ .../component_updater/adblock_updater_service.cc | 249 +++++++++++++++++++++
+ .../component_updater/adblock_updater_service.h | 99 ++++++++
+ .../component_updater/download_filters_task.cc | 228 +++++++++++++++++++
+ .../component_updater/download_filters_task.h | 131 +++++++++++
+ .../content_subresource_filter_throttle_manager.cc | 11 +
+ .../content/browser/ruleset_service.cc | 33 ++-
+ .../content/browser/ruleset_service.h | 7 +-
+ .../content/browser/ruleset_version.cc | 1 +
+ .../content/browser/ruleset_version.h | 5 +
+ .../content/browser/verified_ruleset_dealer.cc | 2 +
+ .../core/browser/subresource_filter_features.cc | 113 +---------
+ .../core/common/common_features.cc | 2 +-
+ .../frame_host/navigation_throttle_runner.cc | 10 -
+ 20 files changed, 817 insertions(+), 146 deletions(-)
+ create mode 100644 components/component_updater/adblock_updater_service.cc
+ create mode 100644 components/component_updater/adblock_updater_service.h
+ create mode 100644 components/component_updater/download_filters_task.cc
+ create mode 100644 components/component_updater/download_filters_task.h
+
+diff --git a/chrome/browser/after_startup_task_utils.cc b/chrome/browser/after_startup_task_utils.cc
+--- a/chrome/browser/after_startup_task_utils.cc
++++ b/chrome/browser/after_startup_task_utils.cc
+@@ -36,6 +36,8 @@
+ #include "ui/views/linux_ui/linux_ui.h"
+ #endif
+
++#include "chrome/browser/browser_process.h"
++
+ using content::BrowserThread;
+ using content::WebContents;
+ using content::WebContentsObserver;
+@@ -135,6 +137,9 @@ void SetBrowserStartupIsComplete() {
+ g_after_startup_tasks.Get().clear();
+ g_after_startup_tasks.Get().shrink_to_fit();
+
++ // initialize scheduled updates for the AdBlock updater
++ g_browser_process->adblock_updater()->Start();
++
+ #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
+ // Make sure we complete the startup notification sequence, or launchers will
+ // get confused by not receiving the expected message from the main process.
+diff --git a/chrome/browser/browser_process.h b/chrome/browser/browser_process.h
+--- a/chrome/browser/browser_process.h
++++ b/chrome/browser/browser_process.h
+@@ -22,6 +22,7 @@
+ #include "chrome/browser/shell_integration.h"
+ #include "chrome/common/buildflags.h"
+ #include "media/media_buildflags.h"
++#include "components/component_updater/adblock_updater_service.h"
+
+ class BackgroundModeManager;
+ class DownloadRequestLimiter;
+@@ -58,6 +59,10 @@ class ComponentUpdateService;
+ class SupervisedUserWhitelistInstaller;
+ }
+
++namespace adblock_updater {
++class AdBlockUpdaterService;
++}
++
+ namespace extensions {
+ class EventRouterForwarder;
+ }
+@@ -233,6 +238,8 @@ class BrowserProcess {
+
+ virtual component_updater::ComponentUpdateService* component_updater() = 0;
+
++ virtual adblock_updater::AdBlockUpdaterService* adblock_updater() = 0;
++
+ #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ virtual component_updater::SupervisedUserWhitelistInstaller*
+ supervised_user_whitelist_installer() = 0;
+diff --git a/chrome/browser/browser_process_impl.cc b/chrome/browser/browser_process_impl.cc
+--- a/chrome/browser/browser_process_impl.cc
++++ b/chrome/browser/browser_process_impl.cc
+@@ -1017,6 +1017,34 @@ BrowserProcessImpl::component_updater() {
+ return component_updater_.get();
+ }
+
++adblock_updater::AdBlockUpdaterService*
++BrowserProcessImpl::adblock_updater() {
++ if (adblock_updater_)
++ return adblock_updater_.get();
++
++ if (!BrowserThread::CurrentlyOn(BrowserThread::UI))
++ return nullptr;
++
++ std::unique_ptr scheduler;
++#if defined(OS_ANDROID)
++ if (base::FeatureList::IsEnabled(
++ chrome::android::kBackgroundTaskComponentUpdate) &&
++ component_updater::BackgroundTaskUpdateScheduler::IsAvailable()) {
++ scheduler =
++ std::make_unique();
++ }
++#endif
++ if (!scheduler)
++ scheduler = std::make_unique();
++
++ adblock_updater_ = std::make_unique(
++ g_browser_process->system_network_context_manager()->GetSharedURLLoaderFactory(),
++ std::move(scheduler),
++ g_browser_process->subresource_filter_ruleset_service());
++
++ return adblock_updater_.get();
++}
++
+ #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ component_updater::SupervisedUserWhitelistInstaller*
+ BrowserProcessImpl::supervised_user_whitelist_installer() {
+diff --git a/chrome/browser/browser_process_impl.h b/chrome/browser/browser_process_impl.h
+--- a/chrome/browser/browser_process_impl.h
++++ b/chrome/browser/browser_process_impl.h
+@@ -177,6 +177,7 @@ class BrowserProcessImpl : public BrowserProcess,
+ #endif
+
+ component_updater::ComponentUpdateService* component_updater() override;
++ adblock_updater::AdBlockUpdaterService* adblock_updater() override;
+ #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ component_updater::SupervisedUserWhitelistInstaller*
+ supervised_user_whitelist_installer() override;
+@@ -362,6 +363,8 @@ class BrowserProcessImpl : public BrowserProcess,
+ // but some users of component updater only install per-user.
+ std::unique_ptr component_updater_;
+
++ std::unique_ptr adblock_updater_;
++
+ #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
+ std::unique_ptr
+ supervised_user_whitelist_installer_;
+diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
+--- a/chrome/browser/chrome_browser_main.cc
++++ b/chrome/browser/chrome_browser_main.cc
+@@ -1739,8 +1739,11 @@ int ChromeBrowserMainParts::PreMainMessageLoopRunImpl() {
+
+ PreBrowserStart();
+
+- if (!parsed_command_line().HasSwitch(switches::kDisableComponentUpdate))
++ if (!parsed_command_line().HasSwitch(switches::kDisableComponentUpdate)) {
+ RegisterComponentsForUpdate(profile_->GetPrefs());
++ // force initialisation
++ g_browser_process->adblock_updater();
++ }
+
+ variations::VariationsService* variations_service =
+ browser_process_->variations_service();
+diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
+--- a/chrome/browser/chrome_content_browser_client.cc
++++ b/chrome/browser/chrome_content_browser_client.cc
+@@ -64,7 +64,6 @@
+ #include "chrome/browser/hid/chrome_hid_delegate.h"
+ #include "chrome/browser/language/translate_frame_binder.h"
+ #include "chrome/browser/lifetime/browser_shutdown.h"
+-#include "chrome/browser/lookalikes/lookalike_url_navigation_throttle.h"
+ #include "chrome/browser/media/router/media_router_feature.h"
+ #include "chrome/browser/media/router/presentation/presentation_service_delegate_impl.h"
+ #include "chrome/browser/media/router/presentation/receiver_presentation_service_delegate_impl.h"
+@@ -80,7 +79,6 @@
+ #include "chrome/browser/net_benchmarking.h"
+ #include "chrome/browser/notifications/platform_notification_service_factory.h"
+ #include "chrome/browser/notifications/platform_notification_service_impl.h"
+-#include "chrome/browser/page_load_metrics/metrics_navigation_throttle.h"
+ #include "chrome/browser/page_load_metrics/metrics_web_contents_observer.h"
+ #include "chrome/browser/page_load_metrics/page_load_metrics_util.h"
+ #include "chrome/browser/password_manager/chrome_password_manager_client.h"
+@@ -4083,16 +4081,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
+ content::NavigationHandle* handle) {
+ std::vector> throttles;
+
+- // MetricsNavigationThrottle requires that it runs before NavigationThrottles
+- // that may delay or cancel navigations, so only NavigationThrottles that
+- // don't delay or cancel navigations (e.g. throttles that are only observing
+- // callbacks without affecting navigation behavior) should be added before
+- // MetricsNavigationThrottle.
+- if (handle->IsInMainFrame()) {
+- throttles.push_back(
+- page_load_metrics::MetricsNavigationThrottle::Create(handle));
+- }
+-
+ #if BUILDFLAG(ENABLE_PLUGINS)
+ std::unique_ptr flash_url_throttle =
+ FlashDownloadInterception::MaybeCreateThrottleFor(handle);
+@@ -4202,12 +4190,6 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
+ }
+ #endif
+
+- std::unique_ptr
+- lookalike_url_navigation_throttle = lookalikes::
+- LookalikeUrlNavigationThrottle::MaybeCreateNavigationThrottle(handle);
+- if (lookalike_url_navigation_throttle)
+- throttles.push_back(std::move(lookalike_url_navigation_throttle));
+-
+ std::unique_ptr pdf_iframe_throttle =
+ PDFIFrameNavigationThrottle::MaybeCreateThrottleFor(handle);
+ if (pdf_iframe_throttle)
+diff --git a/components/component_updater/BUILD.gn b/components/component_updater/BUILD.gn
+--- a/components/component_updater/BUILD.gn
++++ b/components/component_updater/BUILD.gn
+@@ -10,6 +10,12 @@ static_library("component_updater") {
+ "component_updater_command_line_config_policy.h",
+ "component_updater_paths.cc",
+ "component_updater_paths.h",
++
++ "adblock_updater_service.cc",
++ "adblock_updater_service.h",
++ "download_filters_task.cc",
++ "download_filters_task.h",
++
+ "component_updater_service.cc",
+ "component_updater_service.h",
+ "component_updater_service_internal.h",
+diff --git a/components/component_updater/adblock_updater_service.cc b/components/component_updater/adblock_updater_service.cc
+new file mode 100644
+--- /dev/null
++++ b/components/component_updater/adblock_updater_service.cc
+@@ -0,0 +1,249 @@
++/*
++ This file is part of Bromite.
++
++ Bromite is free software: you can redistribute it and/or modify
++ it under the terms of the GNU General Public License as published by
++ the Free Software Foundation, either version 3 of the License, or
++ (at your option) any later version.
++
++ Bromite is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ GNU General Public License for more details.
++
++ You should have received a copy of the GNU General Public License
++ along with Bromite. If not, see .
++*/
++
++#include "components/component_updater/adblock_updater_service.h"
++
++#include
++#include