diff --git a/DEPS b/DEPS index 0467636c697f..70f8ed86f9b2 100644 --- a/DEPS +++ b/DEPS @@ -1,7 +1,7 @@ use_relative_paths = True deps = { - "vendor/ad-block": "https://github.com/brave/ad-block.git@504ae10e475005c559253846fba1c06e5a0186b4", + "vendor/ad-block": "https://github.com/brave/ad-block.git@11a4617c8bf3f52668e76cd4d165629294d9cc18", "vendor/tracking-protection": "https://github.com/brave/tracking-protection.git@051177425a14121a22087d754ad8eb1c0ce8fb24", "vendor/hashset-cpp": "https://github.com/brave/hashset-cpp.git@67ffffa69b56e330bab9d08f050727f891c916a1", "vendor/bloom-filter-cpp": "https://github.com/brave/bloom-filter-cpp.git@d511cf872ea1d650ab8dc4662f6036dac012d197", diff --git a/browser/brave_browser_process_impl.cc b/browser/brave_browser_process_impl.cc index 8a1d46315563..734ae8b59605 100644 --- a/browser/brave_browser_process_impl.cc +++ b/browser/brave_browser_process_impl.cc @@ -6,6 +6,7 @@ #include "brave/browser/component_updater/brave_component_updater_configurator.h" #include "brave/components/brave_shields/browser/ad_block_service.h" +#include "brave/components/brave_shields/browser/ad_block_regional_service.h" #include "brave/components/brave_shields/browser/https_everywhere_service.h" #include "brave/components/brave_shields/browser/tracking_protection_service.h" #include "chrome/browser/io_thread.h" @@ -51,6 +52,15 @@ BraveBrowserProcessImpl::ad_block_service() { return ad_block_service_.get(); } +brave_shields::AdBlockRegionalService* +BraveBrowserProcessImpl::ad_block_regional_service() { + if (ad_block_regional_service_) + return ad_block_regional_service_.get(); + + ad_block_regional_service_ = brave_shields::AdBlockRegionalServiceFactory(); + return ad_block_regional_service_.get(); +} + brave_shields::TrackingProtectionService* BraveBrowserProcessImpl::tracking_protection_service() { if (tracking_protection_service_) diff --git a/browser/brave_browser_process_impl.h b/browser/brave_browser_process_impl.h index 46b0815b0c55..a0748a680db2 100644 --- a/browser/brave_browser_process_impl.h +++ b/browser/brave_browser_process_impl.h @@ -9,6 +9,7 @@ namespace brave_shields { class AdBlockService; +class AdBlockRegionalService; class HTTPSEverywhereService; class TrackingProtectionService; } @@ -22,11 +23,14 @@ class BraveBrowserProcessImpl : public BrowserProcessImpl { component_updater::ComponentUpdateService* component_updater() override; brave_shields::AdBlockService* ad_block_service(); + brave_shields::AdBlockRegionalService* ad_block_regional_service(); brave_shields::TrackingProtectionService* tracking_protection_service(); brave_shields::HTTPSEverywhereService* https_everywhere_service(); private: std::unique_ptr ad_block_service_; + std::unique_ptr + ad_block_regional_service_; std::unique_ptr tracking_protection_service_; std::unique_ptr diff --git a/common/pref_names.cc b/common/pref_names.cc index 854efd846f4f..13a1f117378b 100644 --- a/common/pref_names.cc +++ b/common/pref_names.cc @@ -9,3 +9,4 @@ const char kTrackersBlocked[] = "brave.stats.trackers_blocked"; const char kJavascriptBlocked[] = "brave.stats.javascript_blocked"; const char kHttpsUpgrades[] = "brave.stats.https_upgrades"; const char kFingerprintingBlocked[] = "brave.stats.fingerprinting_blocked"; +const char kAdBlockCurrentRegion[] = "brave.ad_block.current_region"; diff --git a/common/pref_names.h b/common/pref_names.h index 7b47f046bd4f..02091f72eb2f 100644 --- a/common/pref_names.h +++ b/common/pref_names.h @@ -10,5 +10,6 @@ extern const char kTrackersBlocked[]; extern const char kJavascriptBlocked[]; extern const char kHttpsUpgrades[]; extern const char kFingerprintingBlocked[]; +extern const char kAdBlockCurrentRegion[]; #endif diff --git a/components/brave_shields/browser/BUILD.gn b/components/brave_shields/browser/BUILD.gn index 876eb37dd8a5..e6397d039744 100644 --- a/components/brave_shields/browser/BUILD.gn +++ b/components/brave_shields/browser/BUILD.gn @@ -1,5 +1,9 @@ source_set("brave_shields") { sources = [ + "ad_block_base_service.cc", + "ad_block_base_service.h", + "ad_block_regional_service.cc", + "ad_block_regional_service.h", "ad_block_service.cc", "ad_block_service.h", "base_brave_shields_service.cc", diff --git a/components/brave_shields/browser/ad_block_base_service.cc b/components/brave_shields/browser/ad_block_base_service.cc new file mode 100644 index 000000000000..9d270dff2f92 --- /dev/null +++ b/components/brave_shields/browser/ad_block_base_service.cc @@ -0,0 +1,92 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "brave/components/brave_shields/browser/ad_block_base_service.h" + +#include +#include +#include +#include + +#include "base/base_paths.h" +#include "base/bind.h" +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/macros.h" +#include "base/memory/ptr_util.h" +#include "base/strings/utf_string_conversions.h" +#include "base/threading/thread_restrictions.h" +#include "brave/components/brave_shields/browser/dat_file_util.h" +#include "brave/vendor/ad-block/ad_block_client.h" + +namespace brave_shields { + +AdBlockBaseService::AdBlockBaseService() + : BaseBraveShieldsService(), + ad_block_client_(new AdBlockClient()), + weak_factory_(this) { +} + +AdBlockBaseService::~AdBlockBaseService() { + Cleanup(); +} + +void AdBlockBaseService::Cleanup() { + ad_block_client_.reset(); +} + +bool AdBlockBaseService::ShouldStartRequest(const GURL& url, + content::ResourceType resource_type, + const std::string& tab_host) { + + FilterOption current_option = FONoFilterOption; + content::ResourceType internalResource = (content::ResourceType)resource_type; + if (content::RESOURCE_TYPE_STYLESHEET == internalResource) { + current_option = FOStylesheet; + } else if (content::RESOURCE_TYPE_IMAGE == internalResource) { + current_option = FOImage; + } else if (content::RESOURCE_TYPE_SCRIPT == internalResource) { + current_option = FOScript; + } + + if (ad_block_client_->matches(url.spec().c_str(), + current_option, + tab_host.c_str())) { + // LOG(ERROR) << "AdBlockBaseService::ShouldStartRequest(), host: " << tab_host + // << ", resource type: " << resource_type + // << ", url.spec(): " << url.spec(); + return false; + } + + return true; +} + +void AdBlockBaseService::GetDATFileData(const base::FilePath& dat_file_path) { + GetTaskRunner()->PostTaskAndReply( + FROM_HERE, + base::Bind(&brave_shields::GetDATFileData, dat_file_path, &buffer_), + base::Bind(&AdBlockBaseService::OnDATFileDataReady, + weak_factory_.GetWeakPtr())); +} + +void AdBlockBaseService::OnDATFileDataReady() { + if (buffer_.empty()) { + LOG(ERROR) << "Could not obtain ad block data"; + return; + } + ad_block_client_.reset(new AdBlockClient()); + if (!ad_block_client_->deserialize((char*)&buffer_.front())) { + ad_block_client_.reset(); + LOG(ERROR) << "Failed to deserialize ad block data"; + return; + } +} + +bool AdBlockBaseService::Init() { + return true; +} + +/////////////////////////////////////////////////////////////////////////////// + +} // namespace brave_shields diff --git a/components/brave_shields/browser/ad_block_base_service.h b/components/brave_shields/browser/ad_block_base_service.h new file mode 100644 index 000000000000..7cf6109612f8 --- /dev/null +++ b/components/brave_shields/browser/ad_block_base_service.h @@ -0,0 +1,54 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_COMPONENTS_BRAVE_SHIELDS_BROWSER_AD_BLOCK_BASE_SERVICE_H_ +#define BRAVE_COMPONENTS_BRAVE_SHIELDS_BROWSER_AD_BLOCK_BASE_SERVICE_H_ + +#include + +#include +#include +#include + +#include "base/files/file_path.h" +#include "base/memory/weak_ptr.h" +#include "brave/components/brave_shields/browser/base_brave_shields_service.h" +#include "brave/components/brave_shields/browser/dat_file_util.h" +#include "content/public/common/resource_type.h" + +class AdBlockClient; + +namespace brave_shields { + +// The base class of the brave shields service in charge of ad-block +// checking and init. +class AdBlockBaseService : public BaseBraveShieldsService { + public: + AdBlockBaseService(); + ~AdBlockBaseService() override; + + bool ShouldStartRequest(const GURL &url, + content::ResourceType resource_type, + const std::string& tab_host) override; + + protected: + bool Init() override; + void Cleanup() override; + + void GetDATFileData(const base::FilePath& dat_file_path); + + std::unique_ptr ad_block_client_; + DATFileDataBuffer buffer_; + + private: + void OnDATFileDataReady(); + + base::WeakPtrFactory weak_factory_; + + DISALLOW_COPY_AND_ASSIGN(AdBlockBaseService); +}; + +} // namespace brave_shields + +#endif // BRAVE_COMPONENTS_BRAVE_SHIELDS_BROWSER_AD_BLOCK_BASE_SERVICE_H_ diff --git a/components/brave_shields/browser/ad_block_regional_service.cc b/components/brave_shields/browser/ad_block_regional_service.cc new file mode 100644 index 000000000000..4961714dfaa4 --- /dev/null +++ b/components/brave_shields/browser/ad_block_regional_service.cc @@ -0,0 +1,125 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "brave/components/brave_shields/browser/ad_block_regional_service.h" + +#include +#include +#include +#include + +#include "base/base_paths.h" +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/macros.h" +#include "base/memory/ptr_util.h" +#include "base/strings/utf_string_conversions.h" +#include "base/threading/thread_restrictions.h" +#include "brave/browser/brave_browser_process_impl.h" +#include "brave/common/pref_names.h" +#include "brave/vendor/ad-block/ad_block_client.h" +#include "brave/vendor/ad-block/lists/regions.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "components/prefs/pref_service.h" + +namespace { + +std::vector::const_iterator FindFilterListByLocale(const std::string& locale) { + return std::find_if(region_lists.begin(), region_lists.end(), + [&locale](const FilterList& filter_list) { + return std::find_if(filter_list.langs.begin(), + filter_list.langs.end(), + [locale](const std::string& lang) { + return lang == locale; + }) != filter_list.langs.end(); + }); +} + +} // namespace + +namespace brave_shields { + +std::string AdBlockRegionalService::g_ad_block_regional_component_id_; +std::string AdBlockRegionalService::g_ad_block_regional_component_base64_public_key_; + +AdBlockRegionalService::AdBlockRegionalService() { +} + +AdBlockRegionalService::~AdBlockRegionalService() { +} + +bool AdBlockRegionalService::ShouldStartRequest(const GURL& url, + content::ResourceType resource_type, + const std::string& tab_host) { + return AdBlockBaseService::ShouldStartRequest(url, resource_type, tab_host); +} + +bool AdBlockRegionalService::UnregisterComponentByLocale(const std::string& locale) { + auto it = FindFilterListByLocale(locale); + if (it == region_lists.end()) + return false; + return Unregister(it->component_id); + +} + +bool AdBlockRegionalService::Init() { + auto it = + FindFilterListByLocale(g_brave_browser_process->GetApplicationLocale()); + if (it == region_lists.end()) + return false; + + uuid_ = it->uuid; + + Register(it->title, + !g_ad_block_regional_component_id_.empty() + ? g_ad_block_regional_component_id_ + : it->component_id, + !g_ad_block_regional_component_base64_public_key_.empty() + ? g_ad_block_regional_component_base64_public_key_ + : it->base64_public_key); + + return true; +} + +void AdBlockRegionalService::OnComponentRegistered( + const std::string& component_id) { + PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs(); + std::string ad_block_current_region = prefs->GetString(kAdBlockCurrentRegion); + std::string locale = g_brave_browser_process->GetApplicationLocale(); + if (!ad_block_current_region.empty() && ad_block_current_region != locale) + UnregisterComponentByLocale(ad_block_current_region); + prefs->SetString(kAdBlockCurrentRegion, locale); + AdBlockBaseService::OnComponentRegistered(component_id); +} + +void AdBlockRegionalService::OnComponentReady( + const std::string& component_id, + const base::FilePath& install_dir) { + base::FilePath dat_file_path = + install_dir.AppendASCII(uuid_).AddExtension(FILE_PATH_LITERAL(".dat")); + AdBlockBaseService::GetDATFileData(dat_file_path); +} + +// static +bool AdBlockRegionalService::IsSupportedLocale(const std::string& locale) { + return (FindFilterListByLocale(locale) != region_lists.end()); +} + +// static +void AdBlockRegionalService::SetComponentIdAndBase64PublicKeyForTest( + const std::string& component_id, + const std::string& component_base64_public_key) { + g_ad_block_regional_component_id_ = component_id; + g_ad_block_regional_component_base64_public_key_ = component_base64_public_key; +} + +/////////////////////////////////////////////////////////////////////////////// + +// The brave shields factory. Using the Brave Shields as a singleton +// is the job of the browser process. +std::unique_ptr AdBlockRegionalServiceFactory() { + return base::MakeUnique(); +} + +} // namespace brave_shields diff --git a/components/brave_shields/browser/ad_block_regional_service.h b/components/brave_shields/browser/ad_block_regional_service.h new file mode 100644 index 000000000000..4a358ec05faa --- /dev/null +++ b/components/brave_shields/browser/ad_block_regional_service.h @@ -0,0 +1,61 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef BRAVE_COMPONENTS_BRAVE_SHIELDS_BROWSER_AD_BLOCK_REGIONAL_SERVICE_H_ +#define BRAVE_COMPONENTS_BRAVE_SHIELDS_BROWSER_AD_BLOCK_REGIONAL_SERVICE_H_ + +#include + +#include +#include +#include + +#include "base/files/file_path.h" +#include "brave/components/brave_shields/browser/ad_block_base_service.h" +#include "content/public/common/resource_type.h" + +class AdBlockServiceTest; + +namespace brave_shields { + +// The brave shields service in charge of regional ad-block checking +// and init. +class AdBlockRegionalService : public AdBlockBaseService { + public: + AdBlockRegionalService(); + ~AdBlockRegionalService() override; + + bool ShouldStartRequest(const GURL &url, + content::ResourceType resource_type, + const std::string& tab_host) override; + + static bool IsSupportedLocale(const std::string& locale); + + protected: + bool Init() override; + void OnComponentRegistered(const std::string& component_id) override; + void OnComponentReady(const std::string& component_id, + const base::FilePath& install_dir) override; + + private: + friend class ::AdBlockServiceTest; + static std::string g_ad_block_regional_component_id_; + static std::string g_ad_block_regional_component_base64_public_key_; + static void SetComponentIdAndBase64PublicKeyForTest( + const std::string& component_id, + const std::string& component_base64_public_key); + + bool UnregisterComponentByLocale(const std::string& locale); + + std::string uuid_; + + DISALLOW_COPY_AND_ASSIGN(AdBlockRegionalService); +}; + +// Creates the AdBlockRegionalService +std::unique_ptr AdBlockRegionalServiceFactory(); + +} // namespace brave_shields + +#endif // BRAVE_COMPONENTS_BRAVE_SHIELDS_BROWSER_AD_BLOCK_REGIONAL_SERVICE_H_ diff --git a/components/brave_shields/browser/ad_block_service.cc b/components/brave_shields/browser/ad_block_service.cc index 7bd0eb1d2920..f5106b0c1ae6 100644 --- a/components/brave_shields/browser/ad_block_service.cc +++ b/components/brave_shields/browser/ad_block_service.cc @@ -26,75 +26,28 @@ std::string AdBlockService::g_ad_block_component_id_( std::string AdBlockService::g_ad_block_component_base64_public_key_( kAdBlockComponentBase64PublicKey); -AdBlockService::AdBlockService() - : BaseBraveShieldsService(kAdBlockComponentName, - g_ad_block_component_id_, - g_ad_block_component_base64_public_key_), - ad_block_client_(new AdBlockClient()), - weak_factory_(this) { +AdBlockService::AdBlockService() { } AdBlockService::~AdBlockService() { - Cleanup(); -} - -void AdBlockService::Cleanup() { - ad_block_client_.reset(); } bool AdBlockService::ShouldStartRequest(const GURL& url, content::ResourceType resource_type, const std::string& tab_host) { - - FilterOption current_option = FONoFilterOption; - content::ResourceType internalResource = (content::ResourceType)resource_type; - if (content::RESOURCE_TYPE_STYLESHEET == internalResource) { - current_option = FOStylesheet; - } else if (content::RESOURCE_TYPE_IMAGE == internalResource) { - current_option = FOImage; - } else if (content::RESOURCE_TYPE_SCRIPT == internalResource) { - current_option = FOScript; - } - - if (ad_block_client_->matches(url.spec().c_str(), - current_option, - tab_host.c_str())) { - // LOG(ERROR) << "AdBlockService::Check(), host: " << tab_host - // << ", resource type: " << resource_type - // << ", url.spec(): " << url.spec(); - return false; - } - - return true; + return AdBlockBaseService::ShouldStartRequest(url, resource_type, tab_host); } bool AdBlockService::Init() { + Register(kAdBlockComponentName, g_ad_block_component_id_, + g_ad_block_component_base64_public_key_); return true; } -void AdBlockService::OnDATFileDataReady() { - if (buffer_.empty()) { - LOG(ERROR) << "Could not obtain ad block data"; - return; - } - - ad_block_client_.reset(new AdBlockClient()); - if (!ad_block_client_->deserialize((char*)&buffer_.front())) { - ad_block_client_.reset(); - LOG(ERROR) << "Failed to deserialize ad block data"; - return; - } -} - void AdBlockService::OnComponentReady(const std::string& component_id, const base::FilePath& install_dir) { base::FilePath dat_file_path = install_dir.AppendASCII(DAT_FILE); - - GetTaskRunner()->PostTaskAndReply( - FROM_HERE, - base::Bind(&GetDATFileData, dat_file_path, &buffer_), - base::Bind(&AdBlockService::OnDATFileDataReady, - weak_factory_.GetWeakPtr())); + AdBlockBaseService::GetDATFileData(dat_file_path); } // static diff --git a/components/brave_shields/browser/ad_block_service.h b/components/brave_shields/browser/ad_block_service.h index 6abfc681cc9f..3ed406431895 100644 --- a/components/brave_shields/browser/ad_block_service.h +++ b/components/brave_shields/browser/ad_block_service.h @@ -11,9 +11,7 @@ #include #include -#include "base/memory/weak_ptr.h" -#include "brave/components/brave_shields/browser/base_brave_shields_service.h" -#include "brave/components/brave_shields/browser/dat_file_util.h" +#include "brave/components/brave_shields/browser/ad_block_base_service.h" #include "content/public/common/resource_type.h" class AdBlockClient; @@ -34,7 +32,7 @@ const std::string kAdBlockComponentBase64PublicKey = "VwIDAQAB"; // The brave shields service in charge of ad-block checking and init. -class AdBlockService : public BaseBraveShieldsService { +class AdBlockService : public AdBlockBaseService { public: AdBlockService(); ~AdBlockService() override; @@ -45,7 +43,6 @@ class AdBlockService : public BaseBraveShieldsService { protected: bool Init() override; - void Cleanup() override; void OnComponentReady(const std::string& component_id, const base::FilePath& install_dir) override; @@ -57,13 +54,6 @@ class AdBlockService : public BaseBraveShieldsService { const std::string& component_id, const std::string& component_base64_public_key); - void OnDATFileDataReady(); - - brave_shields::DATFileDataBuffer buffer_; - std::unique_ptr ad_block_client_; - - base::WeakPtrFactory weak_factory_; - DISALLOW_COPY_AND_ASSIGN(AdBlockService); }; diff --git a/components/brave_shields/browser/ad_block_service_browsertest.cc b/components/brave_shields/browser/ad_block_service_browsertest.cc index 2d0761d6e9f7..fd5067d17b76 100644 --- a/components/brave_shields/browser/ad_block_service_browsertest.cc +++ b/components/brave_shields/browser/ad_block_service_browsertest.cc @@ -7,17 +7,20 @@ #include "brave/browser/brave_browser_process_impl.h" #include "brave/common/brave_paths.h" #include "brave/components/brave_shields/browser/ad_block_service.h" +#include "brave/components/brave_shields/browser/ad_block_regional_service.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/test/browser_test_utils.h" const char kAdsPage[] = "/blocking.html"; +const char kAdsPageRegional[] = "/blocking_regional.html"; const char kNoAdsPage[] = "/no_blocking.html"; -const std::string kAdBlockComponentTestId("naccapggpomhlhoifnlebfoocegenbol"); +const std::string kAdBlockEasyListFranceUUID("9852EFC4-99E4-4F2D-A915-9C3196C7A1DE"); -const std::string kAdBlockComponentTestBase64PublicKey = +const std::string kDefaultAdBlockComponentTestId("naccapggpomhlhoifnlebfoocegenbol"); +const std::string kDefaultAdBlockComponentTestBase64PublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtV7Vr69kkvSvu2lhcMDh" "j4Jm3FKU1zpUkALaum5719/cccVvGpMKKFyy4WYXsmAfcIONmGO4ThK/q6jkgC5v" "8HrkjPOf7HHebKEnsJJucz/Z1t6dq0CE+UA2IWfbGfFM4nJ8AKIv2gqiw2d4ydAs" @@ -26,19 +29,28 @@ const std::string kAdBlockComponentTestBase64PublicKey = "Ikylk7cYRxqkRGS/AayvfipJ/HOkoBd0yKu1MRk4YcKGd/EahDAhUtd9t4+v33Qv" "uwIDAQAB"; +const std::string kRegionalAdBlockComponentTestId("dlpmaigjliompnelofkljgcmlenklieh"); +const std::string kRegionalAdBlockComponentTestBase64PublicKey = + "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoKYkdDM8vWZXBbDJXTP6" + "1m9yLuH9iL/TvqAqu1zOd91VJu4bpcCMZjfGPC1g+O+pZrCaFVv5NJeZxGqT6DUB" + "RZUdXPkGGUC1ebS4LLJbggNQb152LFk8maR0/ItvMOW8eTcV8VFKHk4UrVhPTggf" + "dU/teuAesUUJnhFchijBtAqO+nJ0wEcksY8ktrIyoNPzMj43a1OVJVXrPFDc+WT/" + "G8XBq/Y8FbBt+u+7skWQy3lVyRwFjeFu6cXVF4tcc06PNx5yLsbHQtSv8R+h1bWw" + "ieMF3JB9CZPr+qDKIap+RZUfsraV47QebRi/JA17nbDMlXOmK7mILfFU7Jhjx04F" + "LwIDAQAB"; + class AdBlockServiceTest : public ExtensionBrowserTest { public: AdBlockServiceTest() {} void SetUp() override { InitEmbeddedTestServer(); - InitService(); ExtensionBrowserTest::SetUp(); } void PreRunTestOnMainThread() override { ExtensionBrowserTest::PreRunTestOnMainThread(); - WaitForAdBlockServiceThread(); + WaitForDefaultAdBlockServiceThread(); ASSERT_TRUE(g_brave_browser_process->ad_block_service()->IsInitialized()); } @@ -50,37 +62,64 @@ class AdBlockServiceTest : public ExtensionBrowserTest { ASSERT_TRUE(embedded_test_server()->Start()); } - void InitService() { + void SetComponentIdAndBase64PublicKeyForTest( + const std::string& component_id, + const std::string& component_base64_public_key) { brave_shields::AdBlockService::SetComponentIdAndBase64PublicKeyForTest( - kAdBlockComponentTestId, kAdBlockComponentTestBase64PublicKey); + component_id, component_base64_public_key); } bool InstallAdBlockExtension() { base::FilePath test_data_dir; PathService::Get(brave::DIR_TEST_DATA, &test_data_dir); - const extensions::Extension* ad_block_extension = - InstallExtension(test_data_dir.AppendASCII("adblock-data"), 1); + const extensions::Extension* ad_block_extension = InstallExtension( + test_data_dir.AppendASCII("adblock-data"), 1); if (!ad_block_extension) return false; g_brave_browser_process->ad_block_service()->OnComponentReady( ad_block_extension->id(), ad_block_extension->path()); - WaitForAdBlockServiceThread(); + WaitForDefaultAdBlockServiceThread(); return true; } - void WaitForAdBlockServiceThread() { + bool InstallRegionalAdBlockExtension(const std::string& uuid) { + base::FilePath test_data_dir; + PathService::Get(brave::DIR_TEST_DATA, &test_data_dir); + + const extensions::Extension* ad_block_extension = InstallExtension( + test_data_dir.AppendASCII("adblock-regional-data").AppendASCII(uuid), 1); + if (!ad_block_extension) + return false; + + g_brave_browser_process->ad_block_regional_service()->OnComponentReady( + ad_block_extension->id(), ad_block_extension->path()); + WaitForRegionalAdBlockServiceThread(); + + return true; + } + + void WaitForDefaultAdBlockServiceThread() { scoped_refptr io_helper( new base::ThreadTestHelper( g_brave_browser_process->ad_block_service()->GetTaskRunner())); ASSERT_TRUE(io_helper->Run()); } + + void WaitForRegionalAdBlockServiceThread() { + scoped_refptr io_helper( + new base::ThreadTestHelper( + g_brave_browser_process->ad_block_regional_service()->GetTaskRunner())); + ASSERT_TRUE(io_helper->Run()); + } }; // Load a page with an ad image, and make sure it is blocked. -IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, AdsGetBlocked) { +IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, AdsGetBlockedByDefaultBlocker) { + SetComponentIdAndBase64PublicKeyForTest(kDefaultAdBlockComponentTestId, + kDefaultAdBlockComponentTestBase64PublicKey); ASSERT_TRUE(InstallAdBlockExtension()); GURL url = embedded_test_server()->GetURL(kAdsPage); @@ -98,7 +137,9 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, AdsGetBlocked) { } // Load a page with an image which is not an ad, and make sure it is NOT blocked. -IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, NotAdsDoNotGetBlocked) { +IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, NotAdsDoNotGetBlockedByDefaultBlocker) { + SetComponentIdAndBase64PublicKeyForTest(kDefaultAdBlockComponentTestId, + kDefaultAdBlockComponentTestBase64PublicKey); ASSERT_TRUE(InstallAdBlockExtension()); GURL url = embedded_test_server()->GetURL(kNoAdsPage); @@ -114,3 +155,54 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, NotAdsDoNotGetBlocked) { &img_loaded)); EXPECT_TRUE(img_loaded); } + +// Load a page with an ad image, and make sure it is blocked by the +// regional blocker. +IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, AdsGetBlockedByRegionalBlocker) { + g_browser_process->SetApplicationLocale("fr"); + ASSERT_EQ(g_browser_process->GetApplicationLocale(), "fr"); + + g_brave_browser_process->ad_block_regional_service()->Start(); + ASSERT_TRUE(g_brave_browser_process->ad_block_regional_service()->IsInitialized()); + + SetComponentIdAndBase64PublicKeyForTest(kRegionalAdBlockComponentTestId, + kRegionalAdBlockComponentTestBase64PublicKey); + ASSERT_TRUE(InstallRegionalAdBlockExtension(kAdBlockEasyListFranceUUID)); + + GURL url = embedded_test_server()->GetURL(kAdsPageRegional); + ui_test_utils::NavigateToURL(browser(), url); + content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_TRUE(content::WaitForLoadStop(contents)); + EXPECT_EQ(url, contents->GetURL()); + + bool img_loaded; + ASSERT_TRUE(ExecuteScriptAndExtractBool( + contents, + "window.domAutomationController.send(imgLoaded())", + &img_loaded)); + EXPECT_FALSE(img_loaded); +} + +// Load a page with an image which is not an ad, and make sure it is +// NOT blocked by the regional blocker. +IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, NotAdsDoNotGetBlockedByRegionalBlocker) { + g_browser_process->SetApplicationLocale("fr"); + ASSERT_EQ(g_browser_process->GetApplicationLocale(), "fr"); + + SetComponentIdAndBase64PublicKeyForTest(kRegionalAdBlockComponentTestId, + kRegionalAdBlockComponentTestBase64PublicKey); + ASSERT_TRUE(InstallRegionalAdBlockExtension(kAdBlockEasyListFranceUUID)); + + GURL url = embedded_test_server()->GetURL(kNoAdsPage); + ui_test_utils::NavigateToURL(browser(), url); + content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); + ASSERT_TRUE(content::WaitForLoadStop(contents)); + EXPECT_EQ(url, contents->GetURL()); + + bool img_loaded; + ASSERT_TRUE(ExecuteScriptAndExtractBool( + contents, + "window.domAutomationController.send(imgLoaded())", + &img_loaded)); + EXPECT_TRUE(img_loaded); +} diff --git a/components/brave_shields/browser/base_brave_shields_service.cc b/components/brave_shields/browser/base_brave_shields_service.cc index d489f5939d51..84332e3663aa 100644 --- a/components/brave_shields/browser/base_brave_shields_service.cc +++ b/components/brave_shields/browser/base_brave_shields_service.cc @@ -32,16 +32,22 @@ void ComponentsUI::OnDemandUpdate( namespace brave_shields { -BaseBraveShieldsService::BaseBraveShieldsService( - const std::string& component_name, - const std::string& component_id, - const std::string& component_base64_public_key) +BaseBraveShieldsService::BaseBraveShieldsService() : initialized_(false), task_runner_( - base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()})), - component_name_(component_name), - component_id_(component_id), - component_base64_public_key_(component_base64_public_key) { + base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()})) { +} + +BaseBraveShieldsService::~BaseBraveShieldsService() { +} + +void BaseBraveShieldsService::Register(const std::string& component_name, + const std::string& component_id, + const std::string& component_base64_public_key) { + component_name_ = component_name; + component_id_ = component_id; + component_base64_public_key_ = component_base64_public_key; + base::Closure registered_callback = base::Bind(&BaseBraveShieldsService::OnComponentRegistered, base::Unretained(this), component_id_); @@ -49,11 +55,13 @@ BaseBraveShieldsService::BaseBraveShieldsService( base::Bind(&BaseBraveShieldsService::OnComponentReady, base::Unretained(this), component_id_); brave::RegisterComponent(g_browser_process->component_updater(), - component_name_, component_base64_public_key_, - registered_callback, ready_callback); + component_name_, component_base64_public_key_, + registered_callback, ready_callback); } -BaseBraveShieldsService::~BaseBraveShieldsService() { +bool BaseBraveShieldsService::Unregister(const std::string& component_id) { + return g_browser_process->component_updater()->UnregisterComponent( + component_id); } bool BaseBraveShieldsService::IsInitialized() const { diff --git a/components/brave_shields/browser/base_brave_shields_service.h b/components/brave_shields/browser/base_brave_shields_service.h index e22e9ac0dab6..0639b28dfdb8 100644 --- a/components/brave_shields/browser/base_brave_shields_service.h +++ b/components/brave_shields/browser/base_brave_shields_service.h @@ -34,9 +34,7 @@ namespace brave_shields { // tracking protection, etc. class BaseBraveShieldsService : public ComponentsUI { public: - BaseBraveShieldsService(const std::string& component_name, - const std::string& component_id, - const std::string& component_base64_public_key); + BaseBraveShieldsService(); virtual ~BaseBraveShieldsService(); bool Start(); void Stop(); @@ -54,6 +52,10 @@ class BaseBraveShieldsService : public ComponentsUI { virtual void OnComponentRegistered(const std::string& component_id); virtual void OnComponentReady(const std::string& component_id, const base::FilePath& install_dir); + void Register(const std::string& component_name, + const std::string& component_id, + const std::string& component_base64_public_key); + bool Unregister(const std::string& component_id); private: void InitShields(); diff --git a/components/brave_shields/browser/brave_resource_dispatcher_host_delegate.cc b/components/brave_shields/browser/brave_resource_dispatcher_host_delegate.cc index 57492a140e44..02fb4678bfbe 100644 --- a/components/brave_shields/browser/brave_resource_dispatcher_host_delegate.cc +++ b/components/brave_shields/browser/brave_resource_dispatcher_host_delegate.cc @@ -6,6 +6,7 @@ #include "brave/browser/brave_browser_process_impl.h" #include "brave/components/brave_shields/browser/ad_block_service.h" +#include "brave/components/brave_shields/browser/ad_block_regional_service.h" #include "brave/components/brave_shields/browser/brave_shields_resource_throttle.h" #include "brave/components/brave_shields/browser/https_everywhere_service.h" #include "brave/components/brave_shields/browser/tracking_protection_service.h" @@ -13,9 +14,12 @@ using content::ResourceType; BraveResourceDispatcherHostDelegate::BraveResourceDispatcherHostDelegate() { - g_brave_browser_process->tracking_protection_service()->Start(); g_brave_browser_process->ad_block_service()->Start(); + if (brave_shields::AdBlockRegionalService::IsSupportedLocale( + g_brave_browser_process->GetApplicationLocale())) + g_brave_browser_process->ad_block_regional_service()->Start(); g_brave_browser_process->https_everywhere_service()->Start(); + g_brave_browser_process->tracking_protection_service()->Start(); } BraveResourceDispatcherHostDelegate::~BraveResourceDispatcherHostDelegate() { diff --git a/components/brave_shields/browser/brave_shields_resource_throttle.cc b/components/brave_shields/browser/brave_shields_resource_throttle.cc index dc18ffcd1f3e..bc45fb1d00ae 100644 --- a/components/brave_shields/browser/brave_shields_resource_throttle.cc +++ b/components/brave_shields/browser/brave_shields_resource_throttle.cc @@ -6,6 +6,7 @@ #include "brave/browser/brave_browser_process_impl.h" #include "brave/components/brave_shields/browser/ad_block_service.h" +#include "brave/components/brave_shields/browser/ad_block_regional_service.h" #include "brave/components/brave_shields/browser/brave_shields_util.h" #include "brave/components/brave_shields/common/brave_shield_constants.h" #include "brave/components/brave_shields/browser/tracking_protection_service.h" @@ -57,10 +58,12 @@ void BraveShieldsResourceThrottle::WillStartRequest(bool* defer) { brave_shields::DispatchBlockedEventFromIO(request_, brave_shields::kTrackers); } - if (allow_brave_shields && - !allow_ads && - !g_brave_browser_process->ad_block_service()-> - ShouldStartRequest(request_->url(), resource_type_, tab_origin.host())) { + if (allow_brave_shields && !allow_ads && + (!g_brave_browser_process->ad_block_service()->ShouldStartRequest( + request_->url(), resource_type_, tab_origin.host()) || + !g_brave_browser_process->ad_block_regional_service() + ->ShouldStartRequest(request_->url(), resource_type_, + tab_origin.host()))) { Cancel(); brave_shields::DispatchBlockedEventFromIO(request_, brave_shields::kAds); diff --git a/components/brave_shields/browser/brave_shields_web_contents_observer.cc b/components/brave_shields/browser/brave_shields_web_contents_observer.cc index 099f4f15959f..60652ad4eed5 100644 --- a/components/brave_shields/browser/brave_shields_web_contents_observer.cc +++ b/components/brave_shields/browser/brave_shields_web_contents_observer.cc @@ -258,6 +258,7 @@ void BraveShieldsWebContentsObserver::RegisterProfilePrefs( registry->RegisterUint64Pref(kJavascriptBlocked, 0); registry->RegisterUint64Pref(kHttpsUpgrades, 0); registry->RegisterUint64Pref(kFingerprintingBlocked, 0); + registry->RegisterStringPref(kAdBlockCurrentRegion, ""); } void BraveShieldsWebContentsObserver::ReadyToCommitNavigation( diff --git a/components/brave_shields/browser/https_everywhere_service.cc b/components/brave_shields/browser/https_everywhere_service.cc index bc85bf56dac7..c92bd4afef5d 100644 --- a/components/brave_shields/browser/https_everywhere_service.cc +++ b/components/brave_shields/browser/https_everywhere_service.cc @@ -80,11 +80,7 @@ std::string HTTPSEverywhereService::g_https_everywhere_component_id_( std::string HTTPSEverywhereService::g_https_everywhere_component_base64_public_key_( kHTTPSEverywhereComponentBase64PublicKey); -HTTPSEverywhereService::HTTPSEverywhereService() - : BaseBraveShieldsService(kHTTPSEverywhereComponentName, - g_https_everywhere_component_id_, - g_https_everywhere_component_base64_public_key_), - level_db_(nullptr) { +HTTPSEverywhereService::HTTPSEverywhereService() : level_db_(nullptr) { } HTTPSEverywhereService::~HTTPSEverywhereService() { @@ -99,6 +95,8 @@ void HTTPSEverywhereService::Cleanup() { } bool HTTPSEverywhereService::Init() { + Register(kHTTPSEverywhereComponentName, g_https_everywhere_component_id_, + g_https_everywhere_component_base64_public_key_); return true; } diff --git a/components/brave_shields/browser/tracking_protection_service.cc b/components/brave_shields/browser/tracking_protection_service.cc index 853642459897..cb4237f73399 100644 --- a/components/brave_shields/browser/tracking_protection_service.cc +++ b/components/brave_shields/browser/tracking_protection_service.cc @@ -28,10 +28,7 @@ std::string TrackingProtectionService::g_tracking_protection_component_base64_pu kTrackingProtectionComponentBase64PublicKey); TrackingProtectionService::TrackingProtectionService() - : BaseBraveShieldsService(kTrackingProtectionComponentName, - g_tracking_protection_component_id_, - g_tracking_protection_component_base64_public_key_), - tracking_protection_client_(new CTPParser()), + : tracking_protection_client_(new CTPParser()), // See comment in tracking_protection_service.h for white_list_ white_list_({ "connect.facebook.net", @@ -89,6 +86,9 @@ bool TrackingProtectionService::ShouldStartRequest(const GURL& url, } bool TrackingProtectionService::Init() { + Register(kTrackingProtectionComponentName, + g_tracking_protection_component_id_, + g_tracking_protection_component_base64_public_key_); return true; } diff --git a/extensions/browser/brave_extension_provider.cc b/extensions/browser/brave_extension_provider.cc index 67a3f3d01bce..a335a4d8f755 100644 --- a/extensions/browser/brave_extension_provider.cc +++ b/extensions/browser/brave_extension_provider.cc @@ -57,8 +57,10 @@ bool IsWhitelisted(const std::string& id) { "kbmfpngjjgdllneeigpgjifpgocmfgmb", // Web Store "ahfgeienlihckogmohjhadlkjgocpleb", - // Test ID: Brave Ad Block Updater + // Test ID: Brave Default Ad Block Updater "naccapggpomhlhoifnlebfoocegenbol", + // Test ID: Brave Regional Ad Block Updater (9852EFC4-99E4-4F2D-A915-9C3196C7A1DE) + "dlpmaigjliompnelofkljgcmlenklieh", // Test ID: Brave Tracking Protection Updater "eclbkhjphkhalklhipiicaldjbnhdfkc", // Test ID: PDFJS diff --git a/test/data/adblock-regional-data/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE.pem b/test/data/adblock-regional-data/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE.pem new file mode 100644 index 000000000000..561521b71e7b --- /dev/null +++ b/test/data/adblock-regional-data/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCgpiR0Mzy9ZlcF +sMldM/rWb3Iu4f2Iv9O+oCq7XM533VUm7hulwIxmN8Y8LWD476lmsJoVW/k0l5nE +apPoNQFFlR1c+QYZQLV5tLgssluCA1BvXnYsWTyZpHT8i28w5bx5NxXxUUoeThSt +WE9OCB91T+164B6xRQmeEVyGKMG0Co76cnTARySxjyS2sjKg0/MyPjdrU5UlVes8 +UNz5ZP8bxcGr9jwVsG3677uyRZDLeVXJHAWN4W7pxdUXi1xzTo83HnIuxsdC1K/x +H6HVtbCJ4wXckH0Jk+v6oMohqn5FlR+ytpXjtB5tGL8kDXudsMyVc6YruYgt8VTs +mGPHTgUvAgMBAAECggEABa87VP1HJfCMHcBur6SaOKJC6RPIE+GtzW3/dRfImocz +byg3xDq2/Rr2IcT9THG2jdKr8RuLCuheYYvf5fSSMfMf0d1h8NzQTxks9y/sewJB +A1/VUKZrtYgTN6h7a8CFVci0NxDITaA3rRaV3837xvvoDFQH4f/uYjB9FKY2jHdQ +07YU/F3ZYvWQEz68uickQ464belbdKZiCaCK4FdOf6M4RIv/K5ZEEOr9h2EW9gB5 +b4vv2LalkkvT08UuPuWIW7Vougcs9hqf+n2GdDj1gyzdhKCrzVWX3meIF03paw0g +oiIpvobW7e4PJK1uo0eoPt9P9f61GvmUtZyVE77XEQKBgQDMAvd19QHtyI9XqWsc +elxs+lz7j1uVS9sYdsJL0IBiAxrrcfzNIHe6EqYIevw4abFTG5fYPo5Vu8Y2tmpr +Th1m/dQ5BxegPJ7Rt70mSQhU+efuFIAJ1JFOCOLNtQO+3Yoy7RkD7BCFSy0Fmo7j +MTk1b82MrY5Wh31TvX9+vSGz6QKBgQDJllhdklN7fChr7YFgdNwn+fOPd4kDtmSO +/Vn29FN3IKWMZlKpZsRjMLL3EQW/XjNfvH0Rh5H9ln7/dXCkvsW3mM4YGXRQgD1d +mrH4puesk1x+K9aOlXMVnCTRKzA3hHaz5Bs10uygqiVzsBF+Lp1lof/d9RkUGaCH +EZcbiZM5VwKBgB1e0/d0ZWmxNQm+xz/bUdESni5NLjcpK4qzFjfJ9aGmpsp8p5N0 +eCgepS6VXhhVBwVa9JpaLy2ikd+wlVOLdGouYs4u+jTEZWz10dJgM0XgkIZTBzfj +FWQxnU1WIQrqZAn+3loVMy+tafbjkGye2oiZ5vK4zcQhT2at4lwBqId5AoGAJmTO +G7Q81i4FfNjVZUucirieXNrFa8GXUWyLb++E3hGHtj/eyojaKpIh49CIKbSFUFyT +7XzGn2fEdF8nvxjei2M9DXX7o0FpbqSB9PvE8Cd43Eb5LFrmel0s3fG90zUVbpmp +XQz5KHh/fZMxIbk7HRpHozyFNEDVRCRjhUkkky0CgYEAlzN+6EQmXDQlz13M1i9b +p25QxrdpiRNYAaIq4hnu+2IEO6b51RneWPXmCs0jaboAnbCZjqrot0RIWl4Iu8eO ++bCHs+mDHsdqdqtwM1of6P1qDp6E09kLI4nONEWe37cMXdFKo+++us40SGx49y1d +V9gx1ORRH5Hn5RsPwsDuX3U= +-----END PRIVATE KEY----- diff --git a/test/data/adblock-regional-data/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE.dat b/test/data/adblock-regional-data/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE.dat new file mode 100644 index 000000000000..09f32b6e8cac Binary files /dev/null and b/test/data/adblock-regional-data/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE.dat differ diff --git a/test/data/adblock-regional-data/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE/manifest.json b/test/data/adblock-regional-data/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE/manifest.json new file mode 100644 index 000000000000..5da0346bdd1a --- /dev/null +++ b/test/data/adblock-regional-data/9852EFC4-99E4-4F2D-A915-9C3196C7A1DE/manifest.json @@ -0,0 +1,7 @@ +{ + "description": "Brave Ad Block Updater extension", + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoKYkdDM8vWZXBbDJXTP61m9yLuH9iL/TvqAqu1zOd91VJu4bpcCMZjfGPC1g+O+pZrCaFVv5NJeZxGqT6DUBRZUdXPkGGUC1ebS4LLJbggNQb152LFk8maR0/ItvMOW8eTcV8VFKHk4UrVhPTggfdU/teuAesUUJnhFchijBtAqO+nJ0wEcksY8ktrIyoNPzMj43a1OVJVXrPFDc+WT/G8XBq/Y8FbBt+u+7skWQy3lVyRwFjeFu6cXVF4tcc06PNx5yLsbHQtSv8R+h1bWwieMF3JB9CZPr+qDKIap+RZUfsraV47QebRi/JA17nbDMlXOmK7mILfFU7Jhjx04FLwIDAQAB", + "manifest_version": 2, + "name": "Brave Ad Block Updater (FRA: EasyList Liste FR)", + "version": "1.0.0" +} diff --git a/test/data/blocking_regional.html b/test/data/blocking_regional.html new file mode 100644 index 000000000000..6799feb11410 --- /dev/null +++ b/test/data/blocking_regional.html @@ -0,0 +1,9 @@ + + +Ad banner: +