From 348e2fc883bea2b15677c7c1d6e799ba4fbacf5b Mon Sep 17 00:00:00 2001 From: "Brian R. Bondy" Date: Tue, 9 Oct 2018 01:58:40 -0400 Subject: [PATCH 1/2] Change adblock and TP from resource throttle to network delegate This also makes it so empty data urls are used by default instead of blocking. Empty image data URLs for images. Fix brave/brave-browser#1430 Fix brave/brave-browser#1118 Fix brave/brave-browser#1428 Fix brave/brave-browser#1362 --- browser/net/BUILD.gn | 2 + ...ave_ad_block_tp_network_delegate_helper.cc | 180 ++++++++++++++++++ ...rave_ad_block_tp_network_delegate_helper.h | 29 +++ ...ock_tp_network_delegate_helper_unittest.cc | 156 +++++++++++++++ browser/net/brave_network_delegate_base.cc | 4 +- browser/net/brave_profile_network_delegate.cc | 5 + ...rave_site_hacks_network_delegate_helper.cc | 87 +-------- ...brave_site_hacks_network_delegate_helper.h | 4 - ..._hacks_network_delegate_helper_unittest.cc | 124 ------------ browser/net/url_context.h | 2 + common/network_constants.cc | 3 +- common/network_constants.h | 1 + components/brave_shields/browser/BUILD.gn | 2 - .../browser/ad_block_base_service.cc | 3 +- .../browser/ad_block_base_service.h | 3 +- .../browser/ad_block_regional_service.cc | 12 +- .../browser/ad_block_regional_service.h | 5 +- .../brave_shields/browser/ad_block_service.cc | 6 - .../brave_shields/browser/ad_block_service.h | 4 - .../browser/ad_block_service_browsertest.cc | 25 ++- .../browser/base_brave_shields_service.cc | 4 + .../browser/base_brave_shields_service.h | 4 +- ...brave_resource_dispatcher_host_delegate.cc | 5 - .../brave_shields_resource_throttle.cc | 71 ------- .../browser/brave_shields_resource_throttle.h | 48 ----- .../browser/tracking_protection_service.cc | 9 + .../browser/tracking_protection_service.h | 4 +- ...tracking_protection_service_browsertest.cc | 3 +- test/BUILD.gn | 1 + test/data/blocking.html | 22 ++- test/data/blocking_regional.html | 9 - test/data/blocking_v4.html | 9 - test/data/no_blocking.html | 9 - 33 files changed, 443 insertions(+), 412 deletions(-) create mode 100644 browser/net/brave_ad_block_tp_network_delegate_helper.cc create mode 100644 browser/net/brave_ad_block_tp_network_delegate_helper.h create mode 100644 browser/net/brave_ad_block_tp_network_delegate_helper_unittest.cc delete mode 100644 components/brave_shields/browser/brave_shields_resource_throttle.cc delete mode 100644 components/brave_shields/browser/brave_shields_resource_throttle.h delete mode 100644 test/data/blocking_regional.html delete mode 100644 test/data/blocking_v4.html delete mode 100644 test/data/no_blocking.html diff --git a/browser/net/BUILD.gn b/browser/net/BUILD.gn index e613ef8a48a2..80226808450e 100644 --- a/browser/net/BUILD.gn +++ b/browser/net/BUILD.gn @@ -3,6 +3,8 @@ import("//build/config/features.gni") source_set("net") { configs += [ "//brave/build/geolocation" ] sources = [ + "brave_ad_block_tp_network_delegate_helper.cc", + "brave_ad_block_tp_network_delegate_helper.h", "brave_common_static_redirect_network_delegate_helper.cc", "brave_common_static_redirect_network_delegate_helper.h", "brave_httpse_network_delegate_helper.cc", diff --git a/browser/net/brave_ad_block_tp_network_delegate_helper.cc b/browser/net/brave_ad_block_tp_network_delegate_helper.cc new file mode 100644 index 000000000000..96955ad8dd2a --- /dev/null +++ b/browser/net/brave_ad_block_tp_network_delegate_helper.cc @@ -0,0 +1,180 @@ +/* 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/browser/net/brave_ad_block_tp_network_delegate_helper.h" + +#include + +#include "base/base64url.h" +#include "base/strings/string_util.h" +#include "brave/browser/brave_browser_process_impl.h" +#include "brave/common/network_constants.h" +#include "brave/common/shield_exceptions.h" +#include "brave/components/brave_shields/browser/ad_block_regional_service.h" +#include "brave/components/brave_shields/browser/ad_block_service.h" +#include "brave/components/brave_shields/browser/brave_shields_util.h" +#include "brave/components/brave_shields/browser/brave_shields_web_contents_observer.h" +#include "brave/components/brave_shields/browser/tracking_protection_service.h" +#include "brave/components/brave_shields/common/brave_shield_constants.h" +#include "brave/grit/brave_generated_resources.h" +#include "content/public/browser/resource_request_info.h" +#include "extensions/common/url_pattern.h" +#include "net/url_request/url_request.h" +#include "ui/base/resource/resource_bundle.h" + +using content::ResourceType; + +namespace { + + bool IsImageResourceType(ResourceType resource_type) { + return resource_type == content::RESOURCE_TYPE_FAVICON || + resource_type == content::RESOURCE_TYPE_IMAGE; + } + GURL GetBlankDataURLForResourceType(ResourceType resource_type) { + return GURL(IsImageResourceType(resource_type) ? + kEmptyImageDataURI : kEmptyDataURI); + } + +} // namespace + +namespace brave { + +std::string GetGoogleTagManagerPolyfillJS() { + static std::string base64_output; + if (base64_output.length() != 0) { + return base64_output; + } + std::string str = ui::ResourceBundle::GetSharedInstance().GetRawDataResource( + IDR_BRAVE_TAG_MANAGER_POLYFILL).as_string(); + base64_output.reserve(180); + Base64UrlEncode(str, base::Base64UrlEncodePolicy::OMIT_PADDING, &base64_output); + base64_output = std::string(kJSDataURLPrefix) + base64_output; + return base64_output; +} + +std::string GetGoogleTagServicesPolyfillJS() { + static std::string base64_output; + if (base64_output.length() != 0) { + return base64_output; + } + std::string str = ui::ResourceBundle::GetSharedInstance().GetRawDataResource( + IDR_BRAVE_TAG_SERVICES_POLYFILL).as_string(); + base64_output.reserve(4668); + Base64UrlEncode(str, base::Base64UrlEncodePolicy::OMIT_PADDING, &base64_output); + base64_output = std::string(kJSDataURLPrefix) + base64_output; + return base64_output; +} + +bool GetPolyfillForAdBlock(bool allow_brave_shields, bool allow_ads, + const GURL& tab_origin, const GURL& gurl, GURL *new_url) { + // Polyfills which are related to adblock should only apply when shields are up + if (!allow_brave_shields || allow_ads) { + return false; + } + + static URLPattern tag_manager(URLPattern::SCHEME_ALL, kGoogleTagManagerPattern); + static URLPattern tag_services(URLPattern::SCHEME_ALL, kGoogleTagServicesPattern); + if (tag_manager.MatchesURL(gurl)) { + std::string&& data_url = GetGoogleTagManagerPolyfillJS(); + *new_url = GURL(data_url); + return true; + } + + if (tag_services.MatchesURL(gurl)) { + std::string&& data_url = GetGoogleTagServicesPolyfillJS(); + *new_url = GURL(data_url); + return true; + } + + return false; +} + +void OnBeforeURLRequest_AdBlockTPCheckWork( + net::URLRequest* request, + GURL* new_url, + std::shared_ptr ctx) { + // Proper content settings can't be looked up, so do nothing. + GURL tab_origin = request->site_for_cookies().GetOrigin(); + if (tab_origin.is_empty()) { + return; + } + DCHECK(ctx->request_identifier != 0); + if (!g_brave_browser_process->tracking_protection_service()-> + ShouldStartRequest(request->url(), ctx->resource_type, tab_origin.host())) { + ctx->new_url_spec = GetBlankDataURLForResourceType(ctx->resource_type).spec(); + } else if (!g_brave_browser_process->ad_block_service()->ShouldStartRequest( + request->url(), ctx->resource_type, tab_origin.host()) || + !g_brave_browser_process->ad_block_regional_service() + ->ShouldStartRequest(request->url(), ctx->resource_type, + tab_origin.host())) { + ctx->new_url_spec = GetBlankDataURLForResourceType(ctx->resource_type).spec(); + } +} + +void OnBeforeURLRequest_OnBeforeURLRequest_AdBlockTPPostCheckWork( + net::URLRequest* request, + GURL* new_url, + const ResponseCallback& next_callback, + std::shared_ptr ctx) { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + if (!ctx->new_url_spec.empty() && + ctx->new_url_spec != request->url().spec()) { + *new_url = GURL(ctx->new_url_spec); + // TODO: If we ever want to differentiate ads from tracking library + // counts, then use brave_shields::kTrackers below. + brave_shields::DispatchBlockedEventFromIO(request, + brave_shields::kAds); + } + + next_callback.Run(); +} + +int OnBeforeURLRequest_AdBlockTPWork( + net::URLRequest* request, + GURL* new_url, + const ResponseCallback& next_callback, + std::shared_ptr ctx) { + const GURL& url = request->url(); + GURL tab_origin = request->site_for_cookies().GetOrigin(); + + // Get global shields, adblock, and TP settings for the tab_origin + bool allow_brave_shields = brave_shields::IsAllowContentSettingFromIO( + request, tab_origin, tab_origin, CONTENT_SETTINGS_TYPE_PLUGINS, + brave_shields::kBraveShields); + bool allow_ads = brave_shields::IsAllowContentSettingFromIO( + request, tab_origin, tab_origin, CONTENT_SETTINGS_TYPE_PLUGINS, + brave_shields::kAds); + if (GetPolyfillForAdBlock(allow_brave_shields, allow_ads, + tab_origin, url, new_url)) { + return net::OK; + } + + // These should probably move to our ad block lists + if (IsEmptyDataURLRedirect(url) || IsBlockedResource(url)) { + *new_url = GURL(kEmptyDataURI); + return net::OK; + } + + // Proper content settings can't be looked up, so do nothing. + auto* request_info = content::ResourceRequestInfo::ForRequest(request); + if (tab_origin.is_empty() || !allow_brave_shields || allow_ads || !request_info) { + return net::OK; + } + + ctx->request_url = request->url(); + ctx->resource_type = request_info->GetResourceType(); + + g_brave_browser_process->ad_block_service()-> + GetTaskRunner()->PostTaskAndReply(FROM_HERE, + base::Bind(&OnBeforeURLRequest_AdBlockTPCheckWork, + base::Unretained(request), new_url, ctx), + base::Bind(base::IgnoreResult( + &OnBeforeURLRequest_OnBeforeURLRequest_AdBlockTPPostCheckWork), + base::Unretained(request), + new_url, next_callback, ctx)); + + return net::ERR_IO_PENDING; +} + +} // namespace brave diff --git a/browser/net/brave_ad_block_tp_network_delegate_helper.h b/browser/net/brave_ad_block_tp_network_delegate_helper.h new file mode 100644 index 000000000000..c475c143efd4 --- /dev/null +++ b/browser/net/brave_ad_block_tp_network_delegate_helper.h @@ -0,0 +1,29 @@ +/* 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_BROWSER_NET_BRAVE_AD_BLOCK_TP_NETWORK_DELEGATE_H_ +#define BRAVE_BROWSER_NET_BRAVE_AD_BLOCK_TP_NETWORK_DELEGATE_H_ + +#include "brave/browser/net/url_context.h" + +struct BraveRequestInfo; + +namespace net { +class URLRequest; +} + +namespace brave { + +int OnBeforeURLRequest_AdBlockTPWork( + net::URLRequest* request, + GURL* new_url, + const ResponseCallback& next_callback, + std::shared_ptr ctx); + +bool GetPolyfillForAdBlock(bool allow_brave_shields, bool allow_ads, + const GURL& tab_origin, const GURL& gurl, GURL *new_url); + +} // namespace brave + +#endif // BRAVE_BROWSER_NET_BRAVE_AD_BLOCK_TP_NETWORK_DELEGATE_H_ diff --git a/browser/net/brave_ad_block_tp_network_delegate_helper_unittest.cc b/browser/net/brave_ad_block_tp_network_delegate_helper_unittest.cc new file mode 100644 index 000000000000..ce94d847c287 --- /dev/null +++ b/browser/net/brave_ad_block_tp_network_delegate_helper_unittest.cc @@ -0,0 +1,156 @@ +/* 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/browser/net/brave_ad_block_tp_network_delegate_helper.h" + +#include "brave/browser/net/url_context.h" +#include "brave/common/network_constants.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "net/traffic_annotation/network_traffic_annotation_test_helper.h" +#include "net/url_request/url_request_test_util.h" + +using brave::GetPolyfillForAdBlock; + +namespace { + +class BraveAdBlockTPNetworkDelegateHelperTest: public testing::Test { + public: + BraveAdBlockTPNetworkDelegateHelperTest() + : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), + context_(new net::TestURLRequestContext(true)) { + } + ~BraveAdBlockTPNetworkDelegateHelperTest() override {} + void SetUp() override { + context_->Init(); + } + net::TestURLRequestContext* context() { return context_.get(); } + + private: + content::TestBrowserThreadBundle thread_bundle_; + std::unique_ptr context_; +}; + + +TEST_F(BraveAdBlockTPNetworkDelegateHelperTest, NoChangeURL) { + net::TestDelegate test_delegate; + GURL url("https://bradhatesprimes.brave.com/composite_numbers_ftw"); + std::unique_ptr request = + context()->CreateRequest(url, net::IDLE, &test_delegate, + TRAFFIC_ANNOTATION_FOR_TESTS); + std::shared_ptr + brave_request_info(new brave::BraveRequestInfo()); + brave::ResponseCallback callback; + GURL new_url; + int ret = + OnBeforeURLRequest_AdBlockTPWork(request.get(), &new_url, callback, + brave_request_info); + EXPECT_TRUE(new_url.is_empty()); + EXPECT_EQ(ret, net::OK); +} + +TEST_F(BraveAdBlockTPNetworkDelegateHelperTest, RedirectsToEmptyDataURLs) { + std::vector urls({ + GURL("https://sp1.nypost.com"), + GURL("https://sp.nasdaq.com") + }); + std::for_each(urls.begin(), urls.end(), + [this](GURL url){ + net::TestDelegate test_delegate; + std::unique_ptr request = + context()->CreateRequest(url, net::IDLE, &test_delegate, + TRAFFIC_ANNOTATION_FOR_TESTS); + std::shared_ptr + brave_request_info(new brave::BraveRequestInfo()); + brave::ResponseCallback callback; + GURL new_url; + int ret = + OnBeforeURLRequest_AdBlockTPWork(request.get(), &new_url, callback, + brave_request_info); + EXPECT_EQ(ret, net::OK); + EXPECT_STREQ(new_url.spec().c_str(), kEmptyDataURI); + }); +} + +TEST_F(BraveAdBlockTPNetworkDelegateHelperTest, RedirectsToStubs) { + std::vector urls({ + GURL(kGoogleTagManagerPattern), + GURL(kGoogleTagServicesPattern) + }); + std::for_each(urls.begin(), urls.end(), + [this](GURL url){ + net::TestDelegate test_delegate; + std::unique_ptr request = + context()->CreateRequest(url, net::IDLE, &test_delegate, + TRAFFIC_ANNOTATION_FOR_TESTS); + std::shared_ptr + brave_request_info(new brave::BraveRequestInfo()); + brave::ResponseCallback callback; + GURL new_url; + int ret = + OnBeforeURLRequest_AdBlockTPWork(request.get(), &new_url, callback, + brave_request_info); + EXPECT_EQ(ret, net::OK); + EXPECT_TRUE(new_url.SchemeIs("data")); + }); +} + +TEST_F(BraveAdBlockTPNetworkDelegateHelperTest, Blocking) { + std::vector urls({ + GURL("https://www.lesechos.fr/xtcore.js"), + GURL("https://bradhatesprimes.y8.com/js/sdkloader/outstream.js") + }); + std::for_each(urls.begin(), urls.end(), + [this](GURL url){ + net::TestDelegate test_delegate; + std::unique_ptr request = + context()->CreateRequest(url, net::IDLE, &test_delegate, + TRAFFIC_ANNOTATION_FOR_TESTS); + std::shared_ptr + brave_request_info(new brave::BraveRequestInfo()); + brave::ResponseCallback callback; + GURL new_url; + int ret = + OnBeforeURLRequest_AdBlockTPWork(request.get(), &new_url, callback, + brave_request_info); + EXPECT_STREQ(new_url.spec().c_str(), kEmptyDataURI); + EXPECT_EQ(ret, net::OK); + }); +} + +TEST_F(BraveAdBlockTPNetworkDelegateHelperTest, GetPolyfill) { + GURL tab_origin("https://test.com"); + GURL tag_manager_url(kGoogleTagManagerPattern); + GURL tag_services_url(kGoogleTagServicesPattern); + GURL normal_url("https://a.com"); + GURL out_url; + // Shields up, block ads, tag manager should get polyfill + ASSERT_TRUE(GetPolyfillForAdBlock(true, false, tab_origin, tag_manager_url, &out_url)); + // Shields up, block ads, tag services should get polyfill + ASSERT_TRUE(GetPolyfillForAdBlock(true, false, tab_origin, tag_services_url, &out_url)); + // Shields up, block ads, normal URL should NOT get polyfill + ASSERT_FALSE(GetPolyfillForAdBlock(true, false, tab_origin, normal_url, &out_url)); + + // Shields up, allow ads, tag manager should NOT get polyfill + ASSERT_FALSE(GetPolyfillForAdBlock(true, true, tab_origin, tag_manager_url, &out_url)); + // Shields up, allow ads, tag services should NOT get polyfill + ASSERT_FALSE(GetPolyfillForAdBlock(true, true, tab_origin, tag_services_url, &out_url)); + // Shields up, allow ads, normal URL should NOT get polyfill + ASSERT_FALSE(GetPolyfillForAdBlock(true, true, tab_origin, normal_url, &out_url)); + + // Shields down, allow ads, tag manager should NOT get polyfill + ASSERT_FALSE(GetPolyfillForAdBlock(false, true, tab_origin, tag_manager_url, &out_url)); + // Shields down, allow ads, tag services should NOT get polyfill + ASSERT_FALSE(GetPolyfillForAdBlock(false, true, tab_origin, tag_services_url, &out_url)); + // Shields down, allow ads, normal URL should NOT get polyfill + ASSERT_FALSE(GetPolyfillForAdBlock(false, true, tab_origin, normal_url, &out_url)); + + // Shields down, block ads, tag manager should NOT get polyfill + ASSERT_FALSE(GetPolyfillForAdBlock(false, false, tab_origin, tag_manager_url, &out_url)); + // Shields down, block ads, tag services should NOT get polyfill + ASSERT_FALSE(GetPolyfillForAdBlock(false, false, tab_origin, tag_services_url, &out_url)); + // Shields down, block ads, normal URL should NOT get polyfill + ASSERT_FALSE(GetPolyfillForAdBlock(false, false, tab_origin, normal_url, &out_url)); +} + +} // namespace diff --git a/browser/net/brave_network_delegate_base.cc b/browser/net/brave_network_delegate_base.cc index 16a64651302f..28a466db678e 100644 --- a/browser/net/brave_network_delegate_base.cc +++ b/browser/net/brave_network_delegate_base.cc @@ -169,10 +169,8 @@ void BraveNetworkDelegateBase::RunNextCallback( } } - std::map::iterator it = - callbacks_.find(ctx->request_identifier); if (rv == net::ERR_ABORTED) { - std::move(it->second).Run(rv); + RunCallbackForRequestIdentifier(ctx->request_identifier, rv); return; } diff --git a/browser/net/brave_profile_network_delegate.cc b/browser/net/brave_profile_network_delegate.cc index 145bf9497b5e..f3ad94e11761 100644 --- a/browser/net/brave_profile_network_delegate.cc +++ b/browser/net/brave_profile_network_delegate.cc @@ -4,6 +4,7 @@ #include "brave/browser/net/brave_profile_network_delegate.h" +#include "brave/browser/net/brave_ad_block_tp_network_delegate_helper.h" #include "brave/browser/net/brave_common_static_redirect_network_delegate_helper.h" #include "brave/browser/net/brave_httpse_network_delegate_helper.h" #include "brave/browser/net/brave_referrals_network_delegate_helper.h" @@ -23,6 +24,10 @@ BraveProfileNetworkDelegate::BraveProfileNetworkDelegate( base::Bind(brave::OnBeforeURLRequest_SiteHacksWork); before_url_request_callbacks_.push_back(callback); + callback = + base::Bind(brave::OnBeforeURLRequest_AdBlockTPWork); + before_url_request_callbacks_.push_back(callback); + callback = base::Bind(brave::OnBeforeURLRequest_HttpsePreFileWork); before_url_request_callbacks_.push_back(callback); diff --git a/browser/net/brave_site_hacks_network_delegate_helper.cc b/browser/net/brave_site_hacks_network_delegate_helper.cc index be2afefea2ae..aa4648401bed 100644 --- a/browser/net/brave_site_hacks_network_delegate_helper.cc +++ b/browser/net/brave_site_hacks_network_delegate_helper.cc @@ -6,80 +6,23 @@ #include -#include "base/base64url.h" #include "base/sequenced_task_runner.h" #include "base/strings/string_util.h" -#include "base/task/post_task.h" -#include "base/task/task_scheduler/task_scheduler.h" #include "brave/common/network_constants.h" #include "brave/common/shield_exceptions.h" #include "brave/components/brave_shields/browser/brave_shields_util.h" #include "brave/components/brave_shields/browser/brave_shields_web_contents_observer.h" #include "brave/components/brave_shields/common/brave_shield_constants.h" -#include "brave/grit/brave_generated_resources.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/resource_request_info.h" #include "content/public/common/referrer.h" #include "extensions/common/url_pattern.h" -#include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "net/url_request/url_request.h" -#include "ui/base/resource/resource_bundle.h" using content::BrowserThread; using content::Referrer; -using namespace net::registry_controlled_domains; -namespace brave { - -std::string GetGoogleTagManagerPolyfillJS() { - static std::string base64_output; - if (base64_output.length() != 0) { - return base64_output; - } - std::string str = ui::ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_BRAVE_TAG_MANAGER_POLYFILL).as_string(); - base64_output.reserve(180); - Base64UrlEncode(str, base::Base64UrlEncodePolicy::OMIT_PADDING, &base64_output); - base64_output = std::string(kJSDataURLPrefix) + base64_output; - return base64_output; -} - -std::string GetGoogleTagServicesPolyfillJS() { - static std::string base64_output; - if (base64_output.length() != 0) { - return base64_output; - } - std::string str = ui::ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_BRAVE_TAG_SERVICES_POLYFILL).as_string(); - base64_output.reserve(4668); - Base64UrlEncode(str, base::Base64UrlEncodePolicy::OMIT_PADDING, &base64_output); - base64_output = std::string(kJSDataURLPrefix) + base64_output; - return base64_output; -} - -bool GetPolyfillForAdBlock(bool allow_brave_shields, bool allow_ads, - const GURL& tab_origin, const GURL& gurl, GURL *new_url) { - // Polyfills which are related to adblock should only apply when shields are up - if (!allow_brave_shields || allow_ads) { - return false; - } - - static URLPattern tag_manager(URLPattern::SCHEME_ALL, kGoogleTagManagerPattern); - static URLPattern tag_services(URLPattern::SCHEME_ALL, kGoogleTagServicesPattern); - if (tag_manager.MatchesURL(gurl)) { - std::string&& data_url = GetGoogleTagManagerPolyfillJS(); - *new_url = GURL(data_url); - return true; - } - - if (tag_services.MatchesURL(gurl)) { - std::string&& data_url = GetGoogleTagServicesPolyfillJS(); - *new_url = GURL(data_url); - return true; - } - - return false; -} +namespace { bool ApplyPotentialReferrerBlock(net::URLRequest* request) { DCHECK_CURRENTLY_ON(BrowserThread::IO); @@ -103,39 +46,19 @@ bool ApplyPotentialReferrerBlock(net::URLRequest* request) { return false; } +} // namespace + +namespace brave { + int OnBeforeURLRequest_SiteHacksWork( net::URLRequest* request, GURL* new_url, const ResponseCallback& next_callback, std::shared_ptr ctx) { - const GURL& url = request->url(); - - if (IsEmptyDataURLRedirect(url)) { - *new_url = GURL(kEmptyDataURI); - return net::OK; - } - - if (IsBlockedResource(url)) { - request->Cancel(); - return net::ERR_ABORTED; - } - - GURL tab_origin = request->site_for_cookies().GetOrigin(); - bool allow_brave_shields = brave_shields::IsAllowContentSettingFromIO( - request, tab_origin, tab_origin, CONTENT_SETTINGS_TYPE_PLUGINS, - brave_shields::kBraveShields); - bool allow_ads = brave_shields::IsAllowContentSettingFromIO( - request, tab_origin, tab_origin, CONTENT_SETTINGS_TYPE_PLUGINS, - brave_shields::kAds); if (ApplyPotentialReferrerBlock(request)) *new_url = request->url(); - if (GetPolyfillForAdBlock(allow_brave_shields, allow_ads, - tab_origin, url, new_url)) { - return net::OK; - } - return net::OK; } diff --git a/browser/net/brave_site_hacks_network_delegate_helper.h b/browser/net/brave_site_hacks_network_delegate_helper.h index 5c32289d0125..eb44947b0f49 100644 --- a/browser/net/brave_site_hacks_network_delegate_helper.h +++ b/browser/net/brave_site_hacks_network_delegate_helper.h @@ -26,10 +26,6 @@ int OnBeforeStartTransaction_SiteHacksWork(net::URLRequest* request, const ResponseCallback& next_callback, std::shared_ptr ctx); - -bool GetPolyfillForAdBlock(bool allow_brave_shields, bool allow_ads, - const GURL& tab_origin, const GURL& gurl, GURL *new_url); - } // namespace brave #endif // BRAVE_BROWSER_NET_BRAVE_SITE_HACKS_NETWORK_DELEGATE_H_ diff --git a/browser/net/brave_site_hacks_network_delegate_helper_unittest.cc b/browser/net/brave_site_hacks_network_delegate_helper_unittest.cc index 10ee19bc8da9..b93780929a8d 100644 --- a/browser/net/brave_site_hacks_network_delegate_helper_unittest.cc +++ b/browser/net/brave_site_hacks_network_delegate_helper_unittest.cc @@ -10,8 +10,6 @@ #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" #include "net/url_request/url_request_test_util.h" -using brave::GetPolyfillForAdBlock; - namespace { class BraveSiteHacksNetworkDelegateHelperTest: public testing::Test { @@ -31,92 +29,6 @@ class BraveSiteHacksNetworkDelegateHelperTest: public testing::Test { std::unique_ptr context_; }; - -TEST_F(BraveSiteHacksNetworkDelegateHelperTest, NoChangeURL) { - net::TestDelegate test_delegate; - GURL url("https://bradhatesprimes.brave.com/composite_numbers_ftw"); - std::unique_ptr request = - context()->CreateRequest(url, net::IDLE, &test_delegate, - TRAFFIC_ANNOTATION_FOR_TESTS); - std::shared_ptr - brave_request_info(new brave::BraveRequestInfo()); - brave::ResponseCallback callback; - GURL new_url; - int ret = - OnBeforeURLRequest_SiteHacksWork(request.get(), &new_url, callback, - brave_request_info); - EXPECT_TRUE(new_url.is_empty()); - EXPECT_EQ(ret, net::OK); -} - -TEST_F(BraveSiteHacksNetworkDelegateHelperTest, RedirectsToEmptyDataURLs) { - std::vector urls({ - GURL("https://sp1.nypost.com"), - GURL("https://sp.nasdaq.com") - }); - std::for_each(urls.begin(), urls.end(), - [this](GURL url){ - net::TestDelegate test_delegate; - std::unique_ptr request = - context()->CreateRequest(url, net::IDLE, &test_delegate, - TRAFFIC_ANNOTATION_FOR_TESTS); - std::shared_ptr - brave_request_info(new brave::BraveRequestInfo()); - brave::ResponseCallback callback; - GURL new_url; - int ret = - OnBeforeURLRequest_SiteHacksWork(request.get(), &new_url, callback, - brave_request_info); - EXPECT_EQ(ret, net::OK); - EXPECT_STREQ(new_url.spec().c_str(), kEmptyDataURI); - }); -} - -TEST_F(BraveSiteHacksNetworkDelegateHelperTest, RedirectsToStubs) { - std::vector urls({ - GURL(kGoogleTagManagerPattern), - GURL(kGoogleTagServicesPattern) - }); - std::for_each(urls.begin(), urls.end(), - [this](GURL url){ - net::TestDelegate test_delegate; - std::unique_ptr request = - context()->CreateRequest(url, net::IDLE, &test_delegate, - TRAFFIC_ANNOTATION_FOR_TESTS); - std::shared_ptr - brave_request_info(new brave::BraveRequestInfo()); - brave::ResponseCallback callback; - GURL new_url; - int ret = - OnBeforeURLRequest_SiteHacksWork(request.get(), &new_url, callback, - brave_request_info); - EXPECT_EQ(ret, net::OK); - EXPECT_TRUE(new_url.SchemeIs("data")); - }); -} - -TEST_F(BraveSiteHacksNetworkDelegateHelperTest, Blocking) { - std::vector urls({ - GURL("https://www.lesechos.fr/xtcore.js"), - GURL("https://bradhatesprimes.y8.com/js/sdkloader/outstream.js") - }); - std::for_each(urls.begin(), urls.end(), - [this](GURL url){ - net::TestDelegate test_delegate; - std::unique_ptr request = - context()->CreateRequest(url, net::IDLE, &test_delegate, - TRAFFIC_ANNOTATION_FOR_TESTS); - std::shared_ptr - brave_request_info(new brave::BraveRequestInfo()); - brave::ResponseCallback callback; - GURL new_url; - int ret = - OnBeforeURLRequest_SiteHacksWork(request.get(), &new_url, callback, - brave_request_info); - EXPECT_EQ(ret, net::ERR_ABORTED); - }); -} - TEST_F(BraveSiteHacksNetworkDelegateHelperTest, ForbesWithCookieHeader) { GURL url("https://www.forbes.com"); net::TestDelegate test_delegate; @@ -353,40 +265,4 @@ TEST_F(BraveSiteHacksNetworkDelegateHelperTest, ReferrerCleared) { }); } - -TEST_F(BraveSiteHacksNetworkDelegateHelperTest, GetPolyfill) { - GURL tab_origin("https://test.com"); - GURL tag_manager_url(kGoogleTagManagerPattern); - GURL tag_services_url(kGoogleTagServicesPattern); - GURL normal_url("https://a.com"); - GURL out_url; - // Shields up, block ads, tag manager should get polyfill - ASSERT_TRUE(GetPolyfillForAdBlock(true, false, tab_origin, tag_manager_url, &out_url)); - // Shields up, block ads, tag services should get polyfill - ASSERT_TRUE(GetPolyfillForAdBlock(true, false, tab_origin, tag_services_url, &out_url)); - // Shields up, block ads, normal URL should NOT get polyfill - ASSERT_FALSE(GetPolyfillForAdBlock(true, false, tab_origin, normal_url, &out_url)); - - // Shields up, allow ads, tag manager should NOT get polyfill - ASSERT_FALSE(GetPolyfillForAdBlock(true, true, tab_origin, tag_manager_url, &out_url)); - // Shields up, allow ads, tag services should NOT get polyfill - ASSERT_FALSE(GetPolyfillForAdBlock(true, true, tab_origin, tag_services_url, &out_url)); - // Shields up, allow ads, normal URL should NOT get polyfill - ASSERT_FALSE(GetPolyfillForAdBlock(true, true, tab_origin, normal_url, &out_url)); - - // Shields down, allow ads, tag manager should NOT get polyfill - ASSERT_FALSE(GetPolyfillForAdBlock(false, true, tab_origin, tag_manager_url, &out_url)); - // Shields down, allow ads, tag services should NOT get polyfill - ASSERT_FALSE(GetPolyfillForAdBlock(false, true, tab_origin, tag_services_url, &out_url)); - // Shields down, allow ads, normal URL should NOT get polyfill - ASSERT_FALSE(GetPolyfillForAdBlock(false, true, tab_origin, normal_url, &out_url)); - - // Shields down, block ads, tag manager should NOT get polyfill - ASSERT_FALSE(GetPolyfillForAdBlock(false, false, tab_origin, tag_manager_url, &out_url)); - // Shields down, block ads, tag services should NOT get polyfill - ASSERT_FALSE(GetPolyfillForAdBlock(false, false, tab_origin, tag_services_url, &out_url)); - // Shields down, block ads, normal URL should NOT get polyfill - ASSERT_FALSE(GetPolyfillForAdBlock(false, false, tab_origin, normal_url, &out_url)); -} - } // namespace diff --git a/browser/net/url_context.h b/browser/net/url_context.h index 873fee9ea372..dc7ab33dca1c 100644 --- a/browser/net/url_context.h +++ b/browser/net/url_context.h @@ -9,6 +9,7 @@ #include #include "chrome/browser/net/chrome_network_delegate.h" +#include "content/public/common/resource_type.h" #include "url/gurl.h" namespace brave { @@ -33,6 +34,7 @@ struct BraveRequestInfo { GURL* allowed_unsafe_redirect_url = nullptr; BraveNetworkDelegateEventType event_type = kUnknownEventType; const base::ListValue* referral_headers_list = nullptr; + content::ResourceType resource_type; DISALLOW_COPY_AND_ASSIGN(BraveRequestInfo); }; diff --git a/common/network_constants.cc b/common/network_constants.cc index 1b5b1eee0e25..6d97ad7ee2e1 100644 --- a/common/network_constants.cc +++ b/common/network_constants.cc @@ -9,7 +9,8 @@ const char kBraveReferralsHeadersPath[] = "/promo/custom-headers"; const char kBraveReferralsInitPath[] = "/promo/initialize/nonua"; const char kBraveReferralsActivityPath[] = "/promo/activity"; -const char kEmptyDataURI[] = "data:application/javascript;base64,MA=="; +const char kEmptyDataURI[] = "data:text/plain,"; +const char kEmptyImageDataURI[] = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"; const char kJSDataURLPrefix[] = "data:application/javascript;base64,"; const char kGeoLocationsPattern[] = "https://www.googleapis.com/geolocation/v1/geolocate?key=*"; const char kSafeBrowsingPrefix[] = "https://safebrowsing.googleapis.com/"; diff --git a/common/network_constants.h b/common/network_constants.h index 6683fded4421..b3205f9fb43a 100644 --- a/common/network_constants.h +++ b/common/network_constants.h @@ -9,6 +9,7 @@ extern const char kBraveReferralsInitPath[]; extern const char kBraveReferralsActivityPath[]; extern const char kEmptyDataURI[]; +extern const char kEmptyImageDataURI[]; extern const char kJSDataURLPrefix[]; extern const char kGeoLocationsPattern[]; extern const char kGoogleTagManagerPattern[]; diff --git a/components/brave_shields/browser/BUILD.gn b/components/brave_shields/browser/BUILD.gn index 59ebe2170c86..f7d86d60e6d7 100644 --- a/components/brave_shields/browser/BUILD.gn +++ b/components/brave_shields/browser/BUILD.gn @@ -8,8 +8,6 @@ source_set("brave_shields") { "ad_block_service.h", "base_brave_shields_service.cc", "base_brave_shields_service.h", - "brave_shields_resource_throttle.cc", - "brave_shields_resource_throttle.h", "brave_shields_util.cc", "brave_shields_util.h", "brave_shields_web_contents_observer.cc", diff --git a/components/brave_shields/browser/ad_block_base_service.cc b/components/brave_shields/browser/ad_block_base_service.cc index 48222674140f..ff3fe1b56de6 100644 --- a/components/brave_shields/browser/ad_block_base_service.cc +++ b/components/brave_shields/browser/ad_block_base_service.cc @@ -98,6 +98,7 @@ AdBlockBaseService::AdBlockBaseService() : BaseBraveShieldsService(), ad_block_client_(new AdBlockClient()), weak_factory_(this) { + DETACH_FROM_SEQUENCE(sequence_checker_); } AdBlockBaseService::~AdBlockBaseService() { @@ -111,7 +112,7 @@ void AdBlockBaseService::Cleanup() { bool AdBlockBaseService::ShouldStartRequest(const GURL& url, content::ResourceType resource_type, const std::string& tab_host) { - + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); FilterOption current_option = ResourceTypeToFilterOption(resource_type); if (ad_block_client_->matches(url.spec().c_str(), current_option, diff --git a/components/brave_shields/browser/ad_block_base_service.h b/components/brave_shields/browser/ad_block_base_service.h index 7cf6109612f8..2349221a3801 100644 --- a/components/brave_shields/browser/ad_block_base_service.h +++ b/components/brave_shields/browser/ad_block_base_service.h @@ -13,6 +13,7 @@ #include "base/files/file_path.h" #include "base/memory/weak_ptr.h" +#include "base/sequence_checker.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" @@ -44,8 +45,8 @@ class AdBlockBaseService : public BaseBraveShieldsService { private: void OnDATFileDataReady(); + SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory weak_factory_; - DISALLOW_COPY_AND_ASSIGN(AdBlockBaseService); }; diff --git a/components/brave_shields/browser/ad_block_regional_service.cc b/components/brave_shields/browser/ad_block_regional_service.cc index 7ccc236d6d23..0a49f4c5bac6 100644 --- a/components/brave_shields/browser/ad_block_regional_service.cc +++ b/components/brave_shields/browser/ad_block_regional_service.cc @@ -19,6 +19,7 @@ #include "base/threading/thread_restrictions.h" #include "brave/browser/brave_browser_process_impl.h" #include "brave/common/pref_names.h" +#include "brave/components/brave_shields/browser/ad_block_service.h" #include "brave/vendor/ad-block/ad_block_client.h" #include "brave/vendor/ad-block/data_file_version.h" #include "brave/vendor/ad-block/lists/regions.h" @@ -61,12 +62,6 @@ 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()) @@ -135,6 +130,11 @@ void AdBlockRegionalService::SetDATFileVersionForTest( g_ad_block_regional_dat_file_version_ = dat_file_version; } +scoped_refptr AdBlockRegionalService::GetTaskRunner() { + // We share the same task runner for all ad-block and TP code + return g_brave_browser_process->ad_block_service()->GetTaskRunner(); +} + /////////////////////////////////////////////////////////////////////////////// // The brave shields factory. Using the Brave Shields as a singleton diff --git a/components/brave_shields/browser/ad_block_regional_service.h b/components/brave_shields/browser/ad_block_regional_service.h index 9324d4776c0b..40956a358cdb 100644 --- a/components/brave_shields/browser/ad_block_regional_service.h +++ b/components/brave_shields/browser/ad_block_regional_service.h @@ -26,13 +26,10 @@ class AdBlockRegionalService : public AdBlockBaseService { 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); std::string GetUUID() const { return uuid_; } std::string GetTitle() const { return title_; } + scoped_refptr GetTaskRunner() override; protected: bool Init() override; diff --git a/components/brave_shields/browser/ad_block_service.cc b/components/brave_shields/browser/ad_block_service.cc index 721539589d3c..67243f1f50a8 100644 --- a/components/brave_shields/browser/ad_block_service.cc +++ b/components/brave_shields/browser/ad_block_service.cc @@ -36,12 +36,6 @@ AdBlockService::AdBlockService() { AdBlockService::~AdBlockService() { } -bool AdBlockService::ShouldStartRequest(const GURL& url, - content::ResourceType resource_type, - const std::string& tab_host) { - 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_); diff --git a/components/brave_shields/browser/ad_block_service.h b/components/brave_shields/browser/ad_block_service.h index f33c80f38193..d6257b985e00 100644 --- a/components/brave_shields/browser/ad_block_service.h +++ b/components/brave_shields/browser/ad_block_service.h @@ -37,10 +37,6 @@ class AdBlockService : public AdBlockBaseService { AdBlockService(); ~AdBlockService() override; - bool ShouldStartRequest(const GURL &url, - content::ResourceType resource_type, - const std::string& tab_host) override; - protected: bool Init() override; void OnComponentReady(const std::string& component_id, diff --git a/components/brave_shields/browser/ad_block_service_browsertest.cc b/components/brave_shields/browser/ad_block_service_browsertest.cc index d26b5c954fc7..c67f0c361615 100644 --- a/components/brave_shields/browser/ad_block_service_browsertest.cc +++ b/components/brave_shields/browser/ad_block_service_browsertest.cc @@ -15,10 +15,7 @@ using extensions::ExtensionBrowserTest; -const char kAdsPage[] = "/blocking.html"; -const char kAdsPageV4[] = "/blocking_v4.html"; -const char kAdsPageRegional[] = "/blocking_regional.html"; -const char kNoAdsPage[] = "/no_blocking.html"; +const char kAdBlockTestPage[] = "/blocking.html"; const std::string kAdBlockEasyListFranceUUID("9852EFC4-99E4-4F2D-A915-9C3196C7A1DE"); @@ -154,7 +151,7 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, AdsGetBlockedByDefaultBlocker) { kDefaultAdBlockComponentTestBase64PublicKey); ASSERT_TRUE(InstallDefaultAdBlockExtension()); - GURL url = embedded_test_server()->GetURL(kAdsPage); + GURL url = embedded_test_server()->GetURL(kAdBlockTestPage); ui_test_utils::NavigateToURL(browser(), url); content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(content::WaitForLoadStop(contents)); @@ -163,7 +160,7 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, AdsGetBlockedByDefaultBlocker) { bool img_loaded; ASSERT_TRUE(ExecuteScriptAndExtractBool( contents, - "window.domAutomationController.send(imgLoaded())", + "addElement('ad_banner.png')", &img_loaded)); EXPECT_FALSE(img_loaded); } @@ -175,7 +172,7 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, NotAdsDoNotGetBlockedByDefaultBlocker kDefaultAdBlockComponentTestBase64PublicKey); ASSERT_TRUE(InstallDefaultAdBlockExtension()); - GURL url = embedded_test_server()->GetURL(kNoAdsPage); + GURL url = embedded_test_server()->GetURL(kAdBlockTestPage); ui_test_utils::NavigateToURL(browser(), url); content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(content::WaitForLoadStop(contents)); @@ -184,7 +181,7 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, NotAdsDoNotGetBlockedByDefaultBlocker bool img_loaded; ASSERT_TRUE(ExecuteScriptAndExtractBool( contents, - "window.domAutomationController.send(imgLoaded())", + "addElement('logo.png')", &img_loaded)); EXPECT_TRUE(img_loaded); } @@ -202,7 +199,7 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, AdsGetBlockedByRegionalBlocker) { kRegionalAdBlockComponentTestBase64PublicKey); ASSERT_TRUE(InstallRegionalAdBlockExtension(kAdBlockEasyListFranceUUID)); - GURL url = embedded_test_server()->GetURL(kAdsPageRegional); + GURL url = embedded_test_server()->GetURL(kAdBlockTestPage); ui_test_utils::NavigateToURL(browser(), url); content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(content::WaitForLoadStop(contents)); @@ -211,7 +208,7 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, AdsGetBlockedByRegionalBlocker) { bool img_loaded; ASSERT_TRUE(ExecuteScriptAndExtractBool( contents, - "window.domAutomationController.send(imgLoaded())", + "addElement('ad_fr.png')", &img_loaded)); EXPECT_FALSE(img_loaded); } @@ -229,7 +226,7 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, NotAdsDoNotGetBlockedByRegionalBlocke kRegionalAdBlockComponentTestBase64PublicKey); ASSERT_TRUE(InstallRegionalAdBlockExtension(kAdBlockEasyListFranceUUID)); - GURL url = embedded_test_server()->GetURL(kNoAdsPage); + GURL url = embedded_test_server()->GetURL(kAdBlockTestPage); ui_test_utils::NavigateToURL(browser(), url); content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(content::WaitForLoadStop(contents)); @@ -238,7 +235,7 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, NotAdsDoNotGetBlockedByRegionalBlocke bool img_loaded; ASSERT_TRUE(ExecuteScriptAndExtractBool( contents, - "window.domAutomationController.send(imgLoaded())", + "addElement('logo.png')", &img_loaded)); EXPECT_TRUE(img_loaded); } @@ -260,7 +257,7 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, AdsGetBlockedAfterDataFileVersionUpgr SetDATFileVersionForTest("4"); ASSERT_TRUE(InstallDefaultAdBlockExtension("adblock-v4", 0)); - GURL url = embedded_test_server()->GetURL(kAdsPageV4); + GURL url = embedded_test_server()->GetURL(kAdBlockTestPage); ui_test_utils::NavigateToURL(browser(), url); content::WebContents* contents = browser()->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(content::WaitForLoadStop(contents)); @@ -269,7 +266,7 @@ IN_PROC_BROWSER_TEST_F(AdBlockServiceTest, AdsGetBlockedAfterDataFileVersionUpgr bool img_loaded; ASSERT_TRUE(ExecuteScriptAndExtractBool( contents, - "window.domAutomationController.send(imgLoaded())", + "addElement('v4_specific_banner.png')", &img_loaded)); EXPECT_FALSE(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 9e191fbad563..149be5110018 100644 --- a/components/brave_shields/browser/base_brave_shields_service.cc +++ b/components/brave_shields/browser/base_brave_shields_service.cc @@ -61,4 +61,8 @@ bool BaseBraveShieldsService::ShouldStartRequest(const GURL& url, return true; } +scoped_refptr BaseBraveShieldsService::GetTaskRunner() { + return task_runner_; +} + } // namespace brave_shields diff --git a/components/brave_shields/browser/base_brave_shields_service.h b/components/brave_shields/browser/base_brave_shields_service.h index a05189c36f28..21f424defb1a 100644 --- a/components/brave_shields/browser/base_brave_shields_service.h +++ b/components/brave_shields/browser/base_brave_shields_service.h @@ -32,9 +32,7 @@ class BaseBraveShieldsService : public BraveComponentExtension { virtual bool ShouldStartRequest(const GURL& url, content::ResourceType resource_type, const std::string& tab_host); - scoped_refptr GetTaskRunner() { - return task_runner_; - } + virtual scoped_refptr GetTaskRunner(); protected: virtual bool Init() = 0; 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 02fb4678bfbe..268b03e74361 100644 --- a/components/brave_shields/browser/brave_resource_dispatcher_host_delegate.cc +++ b/components/brave_shields/browser/brave_resource_dispatcher_host_delegate.cc @@ -7,7 +7,6 @@ #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" @@ -32,8 +31,4 @@ void BraveResourceDispatcherHostDelegate::AppendStandardResourceThrottles( std::vector>* throttles) { ChromeResourceDispatcherHostDelegate::AppendStandardResourceThrottles( request, resource_context, resource_type, throttles); - - content::ResourceThrottle* throttle = MaybeCreateBraveShieldsResourceThrottle( - request, resource_type); - throttles->push_back(base::WrapUnique(throttle)); } diff --git a/components/brave_shields/browser/brave_shields_resource_throttle.cc b/components/brave_shields/browser/brave_shields_resource_throttle.cc deleted file mode 100644 index bc45fb1d00ae..000000000000 --- a/components/brave_shields/browser/brave_shields_resource_throttle.cc +++ /dev/null @@ -1,71 +0,0 @@ -/* 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/brave_shields_resource_throttle.h" - -#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" -#include "chrome/browser/profiles/profile_io_data.h" -#include "components/content_settings/core/common/content_settings_types.h" -#include "components/content_settings/core/common/content_settings_utils.h" -#include "net/url_request/url_request.h" - - -content::ResourceThrottle* MaybeCreateBraveShieldsResourceThrottle( - net::URLRequest* request, - content::ResourceType resource_type) { - return new BraveShieldsResourceThrottle(request, - resource_type); -} - -BraveShieldsResourceThrottle::BraveShieldsResourceThrottle( - net::URLRequest* request, - content::ResourceType resource_type) : - request_(request), - resource_type_(resource_type) { -} - -BraveShieldsResourceThrottle::~BraveShieldsResourceThrottle() = default; - -const char* BraveShieldsResourceThrottle::GetNameForLogging() const { - return "BraveShieldsResourceThrottle"; -} - -void BraveShieldsResourceThrottle::WillStartRequest(bool* defer) { - GURL tab_origin = request_->site_for_cookies().GetOrigin(); - // Proper content settings can't be looked up, so do nothing. - if (tab_origin.is_empty()) { - return; - } - bool allow_brave_shields = brave_shields::IsAllowContentSettingFromIO( - request_, tab_origin, tab_origin, CONTENT_SETTINGS_TYPE_PLUGINS, - brave_shields::kBraveShields); - bool allow_ads = brave_shields::IsAllowContentSettingFromIO( - request_, tab_origin, tab_origin, CONTENT_SETTINGS_TYPE_PLUGINS, brave_shields::kAds); - bool allow_trackers = brave_shields::IsAllowContentSettingFromIO( - request_, tab_origin, tab_origin, - CONTENT_SETTINGS_TYPE_PLUGINS, brave_shields::kTrackers); - if (allow_brave_shields && - !allow_trackers && - !g_brave_browser_process->tracking_protection_service()-> - ShouldStartRequest(request_->url(), resource_type_, tab_origin.host())) { - Cancel(); - 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()) || - !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_resource_throttle.h b/components/brave_shields/browser/brave_shields_resource_throttle.h deleted file mode 100644 index 4c169b5fc42a..000000000000 --- a/components/brave_shields/browser/brave_shields_resource_throttle.h +++ /dev/null @@ -1,48 +0,0 @@ -/* 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_BROWSER_LOADER_BRAVE_SHIELDS_RESOURCE_THROTTLE_H_ -#define BRAVE_BROWSER_LOADER_BRAVE_SHIELDS_RESOURCE_THROTTLE_H_ - -#include "base/macros.h" -#include "content/public/browser/resource_throttle.h" -#include "content/public/common/resource_type.h" - - -namespace net { -struct RedirectInfo; -class URLRequest; -} - -// Contructs a resource throttle for Brave shields like tracking protection -// and adblock. It returns a -content::ResourceThrottle* MaybeCreateBraveShieldsResourceThrottle( - net::URLRequest* request, - content::ResourceType resource_type); - -// This check is done before requesting the original URL, and additionally -// before following any subsequent redirect. -class BraveShieldsResourceThrottle - : public content::ResourceThrottle { - private: - friend content::ResourceThrottle* MaybeCreateBraveShieldsResourceThrottle( - net::URLRequest* request, - content::ResourceType resource_type); - - BraveShieldsResourceThrottle(net::URLRequest* request, - content::ResourceType resource_type); - - ~BraveShieldsResourceThrottle() override; - - // content::ResourceThrottle: - void WillStartRequest(bool* defer) override; - const char* GetNameForLogging() const override; - - net::URLRequest* request_; - content::ResourceType resource_type_; - - DISALLOW_COPY_AND_ASSIGN(BraveShieldsResourceThrottle); -}; - -#endif // BRAVE_BROWSER_LOADER_BRAVE_SHIELDS_RESOURCE_THROTTLE_H_ diff --git a/components/brave_shields/browser/tracking_protection_service.cc b/components/brave_shields/browser/tracking_protection_service.cc index ef8d3de20dd0..15542a76279b 100644 --- a/components/brave_shields/browser/tracking_protection_service.cc +++ b/components/brave_shields/browser/tracking_protection_service.cc @@ -14,6 +14,8 @@ #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/components/brave_shields/browser/ad_block_service.h" #include "brave/components/brave_shields/browser/dat_file_util.h" #include "brave/vendor/tracking-protection/TPParser.h" @@ -44,6 +46,7 @@ TrackingProtectionService::TrackingProtectionService() "cdn.syndication.twimg.com" }), weak_factory_(this) { + DETACH_FROM_SEQUENCE(sequence_checker_); } TrackingProtectionService::~TrackingProtectionService() { @@ -57,6 +60,7 @@ void TrackingProtectionService::Cleanup() { bool TrackingProtectionService::ShouldStartRequest(const GURL& url, content::ResourceType resource_type, const std::string &tab_host) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::string host = url.host(); if (!tracking_protection_client_->matchesTracker( tab_host.c_str(), host.c_str())) { @@ -182,6 +186,11 @@ void TrackingProtectionService::SetComponentIdAndBase64PublicKeyForTest( g_tracking_protection_component_base64_public_key_ = component_base64_public_key; } +scoped_refptr TrackingProtectionService::GetTaskRunner() { + // We share the same task runner for all ad-block and TP code + return g_brave_browser_process->ad_block_service()->GetTaskRunner(); +} + /////////////////////////////////////////////////////////////////////////////// // The brave shields factory. Using the Brave Shields as a singleton diff --git a/components/brave_shields/browser/tracking_protection_service.h b/components/brave_shields/browser/tracking_protection_service.h index 5b031594ac5b..1a68d45c6f3f 100644 --- a/components/brave_shields/browser/tracking_protection_service.h +++ b/components/brave_shields/browser/tracking_protection_service.h @@ -15,6 +15,7 @@ #include "base/files/file_path.h" #include "base/memory/weak_ptr.h" +#include "base/sequence_checker.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" @@ -45,6 +46,7 @@ class TrackingProtectionService : public BaseBraveShieldsService { bool ShouldStartRequest(const GURL& spec, content::ResourceType resource_type, const std::string& tab_host) override; + scoped_refptr GetTaskRunner() override; protected: bool Init() override; @@ -72,8 +74,8 @@ class TrackingProtectionService : public BaseBraveShieldsService { std::map> third_party_hosts_cache_; std::mutex third_party_hosts_mutex_; + SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory weak_factory_; - DISALLOW_COPY_AND_ASSIGN(TrackingProtectionService); }; diff --git a/components/brave_shields/browser/tracking_protection_service_browsertest.cc b/components/brave_shields/browser/tracking_protection_service_browsertest.cc index 6fc4e67ffc4b..c76c40e4e7a6 100644 --- a/components/brave_shields/browser/tracking_protection_service_browsertest.cc +++ b/components/brave_shields/browser/tracking_protection_service_browsertest.cc @@ -23,7 +23,8 @@ const char kTrackingScript[] = "const url = '%s';" "const img = document.createElement('img');" "img.src = url;" - "img.onload = function() { window.domAutomationController.send(true); };" + "img.onload = function() { window.domAutomationController.send(img.complete &&" + " (img.naturalHeight !== 1 || img.naturalWidth !== 1)); };" "img.onerror = function() { window.domAutomationController.send(false); };" "document.body.appendChild(img);"; diff --git a/test/BUILD.gn b/test/BUILD.gn index 72210bb76f35..c0cafeb448fc 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -35,6 +35,7 @@ test("brave_unit_tests") { "//brave/browser/tor/mock_tor_profile_service_impl.h", "//brave/browser/tor/mock_tor_profile_service_factory.cc", "//brave/browser/tor/mock_tor_profile_service_factory.h", + "//brave/browser/net/brave_ad_block_tp_network_delegate_helper_unittest.cc", "//brave/browser/net/brave_common_static_redirect_network_delegate_helper_unittest.cc", "//brave/browser/net/brave_referrals_network_delegate_helper_unittest.cc", "//brave/browser/net/brave_site_hacks_network_delegate_helper_unittest.cc", diff --git a/test/data/blocking.html b/test/data/blocking.html index 9e1103505afe..8e642ec47983 100644 --- a/test/data/blocking.html +++ b/test/data/blocking.html @@ -1,9 +1,23 @@ + + - -Ad banner: - + + + + diff --git a/test/data/blocking_regional.html b/test/data/blocking_regional.html deleted file mode 100644 index 6799feb11410..000000000000 --- a/test/data/blocking_regional.html +++ /dev/null @@ -1,9 +0,0 @@ - - -Ad banner: - diff --git a/test/data/blocking_v4.html b/test/data/blocking_v4.html deleted file mode 100644 index 57afbdb8c976..000000000000 --- a/test/data/blocking_v4.html +++ /dev/null @@ -1,9 +0,0 @@ - - -Ad banner: - diff --git a/test/data/no_blocking.html b/test/data/no_blocking.html deleted file mode 100644 index bcb367f1ad3e..000000000000 --- a/test/data/no_blocking.html +++ /dev/null @@ -1,9 +0,0 @@ - - -Not an ad: - From 208f615b45f1a02075e9bef215098c14c25783df Mon Sep 17 00:00:00 2001 From: Emerick Rogul Date: Tue, 9 Oct 2018 12:58:34 -0400 Subject: [PATCH 2/2] Fix compiler error on Windows related to missing browser_thread.h --- browser/net/brave_ad_block_tp_network_delegate_helper.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/browser/net/brave_ad_block_tp_network_delegate_helper.cc b/browser/net/brave_ad_block_tp_network_delegate_helper.cc index 96955ad8dd2a..749a9cc6cf7a 100644 --- a/browser/net/brave_ad_block_tp_network_delegate_helper.cc +++ b/browser/net/brave_ad_block_tp_network_delegate_helper.cc @@ -18,6 +18,7 @@ #include "brave/components/brave_shields/browser/tracking_protection_service.h" #include "brave/components/brave_shields/common/brave_shield_constants.h" #include "brave/grit/brave_generated_resources.h" +#include "content/public/browser/browser_thread.h" #include "content/public/browser/resource_request_info.h" #include "extensions/common/url_pattern.h" #include "net/url_request/url_request.h"