subresource_filter_abusive_unittest.cc 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/check_op.h"
  5. #include "base/containers/contains.h"
  6. #include "base/memory/raw_ptr.h"
  7. #include "base/memory/scoped_refptr.h"
  8. #include "base/test/scoped_feature_list.h"
  9. #include "components/blocked_content/safe_browsing_triggered_popup_blocker.h"
  10. #include "components/safe_browsing/core/browser/db/util.h"
  11. #include "components/subresource_filter/content/browser/fake_safe_browsing_database_manager.h"
  12. #include "components/subresource_filter/content/browser/subresource_filter_content_settings_manager.h"
  13. #include "components/subresource_filter/content/browser/subresource_filter_test_harness.h"
  14. #include "components/subresource_filter/core/browser/subresource_filter_constants.h"
  15. #include "components/subresource_filter/core/browser/subresource_filter_features.h"
  16. #include "components/subresource_filter/core/browser/subresource_filter_features_test_support.h"
  17. #include "content/public/test/test_renderer_host.h"
  18. #include "testing/gtest/include/gtest/gtest.h"
  19. namespace blocked_content {
  20. using safe_browsing::SubresourceFilterLevel;
  21. namespace {
  22. enum MetadataLevel {
  23. METADATA_WARN = 0,
  24. METADATA_ENFORCE = 1,
  25. METADATA_NONE = 2
  26. };
  27. safe_browsing::SubresourceFilterMatch GetMatch(MetadataLevel abusive_level,
  28. MetadataLevel bas_level) {
  29. auto to_sb_level = [](MetadataLevel l) {
  30. DCHECK_NE(METADATA_NONE, l);
  31. return l == METADATA_WARN ? SubresourceFilterLevel::WARN
  32. : SubresourceFilterLevel::ENFORCE;
  33. };
  34. safe_browsing::SubresourceFilterMatch match;
  35. if (abusive_level != METADATA_NONE) {
  36. match[safe_browsing::SubresourceFilterType::ABUSIVE] =
  37. to_sb_level(abusive_level);
  38. }
  39. if (bas_level != METADATA_NONE) {
  40. match[safe_browsing::SubresourceFilterType::BETTER_ADS] =
  41. to_sb_level(bas_level);
  42. }
  43. return match;
  44. }
  45. } // namespace
  46. // (Abusive level, BAS level, Enable AdBlock on abusive sites)
  47. using MetadataInfo = std::tuple<MetadataLevel, MetadataLevel, bool>;
  48. // This class tests the interaction between subresource_filter enforcement and
  49. // abusive enforcement.
  50. class SubresourceFilterAbusiveTest
  51. : public subresource_filter::SubresourceFilterTestHarness,
  52. public ::testing::WithParamInterface<MetadataInfo> {
  53. public:
  54. SubresourceFilterAbusiveTest() {
  55. std::tie(abusive_level_, bas_level_, enable_adblock_on_abusive_sites_) =
  56. GetParam();
  57. std::vector<base::Feature> enabled_features{
  58. blocked_content::kAbusiveExperienceEnforce};
  59. std::vector<base::Feature> disabled_features;
  60. (enable_adblock_on_abusive_sites_ ? enabled_features : disabled_features)
  61. .push_back(subresource_filter::kFilterAdsOnAbusiveSites);
  62. scoped_features_.InitWithFeatures(enabled_features, disabled_features);
  63. }
  64. SubresourceFilterAbusiveTest(const SubresourceFilterAbusiveTest&) = delete;
  65. SubresourceFilterAbusiveTest& operator=(const SubresourceFilterAbusiveTest&) =
  66. delete;
  67. ~SubresourceFilterAbusiveTest() override {}
  68. // SubresourceFilterTestHarness:
  69. void SetUp() override {
  70. subresource_filter::SubresourceFilterTestHarness::SetUp();
  71. blocked_content::SafeBrowsingTriggeredPopupBlocker::RegisterProfilePrefs(
  72. pref_service()->registry());
  73. std::vector<subresource_filter::Configuration> configs{
  74. subresource_filter::Configuration::
  75. MakePresetForLiveRunOnPhishingSites(),
  76. subresource_filter::Configuration::MakePresetForLiveRunForBetterAds()};
  77. scoped_configuration().ResetConfiguration(configs);
  78. blocked_content::SafeBrowsingTriggeredPopupBlocker::MaybeCreate(
  79. web_contents());
  80. popup_blocker_ =
  81. blocked_content::SafeBrowsingTriggeredPopupBlocker::FromWebContents(
  82. web_contents());
  83. }
  84. void ConfigureUrl(const GURL& url) {
  85. safe_browsing::ThreatMetadata metadata;
  86. metadata.subresource_filter_match = GetMatch(abusive_level_, bas_level_);
  87. auto threat_type =
  88. safe_browsing::SBThreatType::SB_THREAT_TYPE_SUBRESOURCE_FILTER;
  89. fake_safe_browsing_database()->AddBlocklistedUrl(url, threat_type,
  90. metadata);
  91. }
  92. bool DidSendConsoleMessage(const std::string& message) {
  93. const auto& messages =
  94. content::RenderFrameHostTester::For(main_rfh())->GetConsoleMessages();
  95. return base::Contains(messages, message);
  96. }
  97. protected:
  98. MetadataLevel abusive_level_ = METADATA_NONE;
  99. MetadataLevel bas_level_ = METADATA_NONE;
  100. bool enable_adblock_on_abusive_sites_ = false;
  101. raw_ptr<blocked_content::SafeBrowsingTriggeredPopupBlocker> popup_blocker_ =
  102. nullptr;
  103. private:
  104. base::test::ScopedFeatureList scoped_features_;
  105. };
  106. TEST_P(SubresourceFilterAbusiveTest, ConfigCombination) {
  107. SCOPED_TRACE(::testing::Message() << "Abusive Level: " << abusive_level_
  108. << ", BAS Level: " << bas_level_
  109. << ", Enable AdBlock on Abusive Sites: "
  110. << enable_adblock_on_abusive_sites_);
  111. const GURL url("https://example.test/");
  112. ConfigureUrl(url);
  113. SimulateNavigateAndCommit(url, main_rfh());
  114. bool disallow_requests = !CreateAndNavigateDisallowedSubframe(main_rfh());
  115. bool disallow_popups =
  116. popup_blocker_->ShouldApplyAbusivePopupBlocker(main_rfh()->GetPage());
  117. bool any_activation_enforce =
  118. bas_level_ == METADATA_ENFORCE ||
  119. (enable_adblock_on_abusive_sites_ && abusive_level_ == METADATA_ENFORCE);
  120. bool any_activation_warn =
  121. bas_level_ == METADATA_WARN ||
  122. (enable_adblock_on_abusive_sites_ && abusive_level_ == METADATA_WARN);
  123. // Enforcement.
  124. EXPECT_EQ(any_activation_enforce, disallow_requests);
  125. EXPECT_EQ(any_activation_enforce,
  126. !!GetSettingsManager()->GetSiteActivationFromMetadata(url));
  127. EXPECT_EQ(abusive_level_ == METADATA_ENFORCE, disallow_popups);
  128. // Activation / enforce messages.
  129. EXPECT_EQ(
  130. any_activation_enforce,
  131. DidSendConsoleMessage(subresource_filter::kActivationConsoleMessage));
  132. EXPECT_EQ(abusive_level_ == METADATA_ENFORCE,
  133. DidSendConsoleMessage(blocked_content::kAbusiveEnforceMessage));
  134. // Warn messages.
  135. EXPECT_EQ(!any_activation_enforce && any_activation_warn,
  136. DidSendConsoleMessage(
  137. subresource_filter::kActivationWarningConsoleMessage));
  138. EXPECT_EQ(abusive_level_ == METADATA_WARN,
  139. DidSendConsoleMessage(blocked_content::kAbusiveWarnMessage));
  140. }
  141. INSTANTIATE_TEST_SUITE_P(
  142. All,
  143. SubresourceFilterAbusiveTest,
  144. ::testing::Combine(
  145. ::testing::Values(METADATA_WARN, METADATA_ENFORCE, METADATA_NONE),
  146. ::testing::Values(METADATA_WARN, METADATA_ENFORCE, METADATA_NONE),
  147. ::testing::Values(false, true)));
  148. } // namespace blocked_content