blob: 195fc548748eabe3bdc72f04b337050d89afb463 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/logging.h"
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "base/stl_util.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/browser/subresource_filter/subresource_filter_content_settings_manager.h"
#include "chrome/browser/subresource_filter/subresource_filter_test_harness.h"
#include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h"
#include "chrome/browser/ui/blocked_content/safe_browsing_triggered_popup_blocker.h"
#include "components/safe_browsing/db/util.h"
#include "components/subresource_filter/content/browser/fake_safe_browsing_database_manager.h"
#include "components/subresource_filter/core/browser/subresource_filter_constants.h"
#include "components/subresource_filter/core/browser/subresource_filter_features.h"
#include "components/subresource_filter/core/browser/subresource_filter_features_test_support.h"
#include "content/public/test/test_renderer_host.h"
#include "testing/gtest/include/gtest/gtest.h"
using safe_browsing::SubresourceFilterLevel;
namespace {
enum MetadataLevel {
METADATA_WARN = 0,
METADATA_ENFORCE = 1,
METADATA_NONE = 2
};
safe_browsing::SubresourceFilterMatch GetMatch(MetadataLevel abusive_level,
MetadataLevel bas_level) {
auto to_sb_level = [](MetadataLevel l) {
DCHECK_NE(METADATA_NONE, l);
return l == METADATA_WARN ? SubresourceFilterLevel::WARN
: SubresourceFilterLevel::ENFORCE;
};
safe_browsing::SubresourceFilterMatch match;
if (abusive_level != METADATA_NONE) {
match[safe_browsing::SubresourceFilterType::ABUSIVE] =
to_sb_level(abusive_level);
}
if (bas_level != METADATA_NONE) {
match[safe_browsing::SubresourceFilterType::BETTER_ADS] =
to_sb_level(bas_level);
}
return match;
}
} // namespace
// (Abusive level, BAS level, Enable AdBlock on abusive sites)
using MetadataInfo = std::tuple<MetadataLevel, MetadataLevel, bool>;
// This class tests the interaction between subresource_filter enforcement and
// abusive enforcement.
class SubresourceFilterAbusiveTest
: public SubresourceFilterTestHarness,
public ::testing::WithParamInterface<MetadataInfo> {
public:
SubresourceFilterAbusiveTest() {
std::tie(abusive_level_, bas_level_, enable_adblock_on_abusive_sites_) =
GetParam();
std::vector<base::Feature> enabled_features{kAbusiveExperienceEnforce};
std::vector<base::Feature> disabled_features;
(enable_adblock_on_abusive_sites_ ? enabled_features : disabled_features)
.push_back(subresource_filter::kFilterAdsOnAbusiveSites);
scoped_features_.InitWithFeatures(enabled_features, disabled_features);
}
~SubresourceFilterAbusiveTest() override {}
// SubresourceFilterTestHarness:
void SetUp() override {
SubresourceFilterTestHarness::SetUp();
std::vector<subresource_filter::Configuration> configs{
subresource_filter::Configuration::
MakePresetForLiveRunOnPhishingSites(),
subresource_filter::Configuration::MakePresetForLiveRunForBetterAds()};
scoped_configuration().ResetConfiguration(configs);
popup_blocker_ =
SafeBrowsingTriggeredPopupBlocker::MaybeCreate(web_contents());
}
void ConfigureUrl(const GURL& url) {
safe_browsing::ThreatMetadata metadata;
metadata.subresource_filter_match = GetMatch(abusive_level_, bas_level_);
auto threat_type =
safe_browsing::SBThreatType::SB_THREAT_TYPE_SUBRESOURCE_FILTER;
fake_safe_browsing_database()->AddBlacklistedUrl(url, threat_type,
metadata);
}
bool DidSendConsoleMessage(const std::string& message) {
const auto& messages =
content::RenderFrameHostTester::For(main_rfh())->GetConsoleMessages();
return base::ContainsValue(messages, message);
}
protected:
MetadataLevel abusive_level_ = METADATA_NONE;
MetadataLevel bas_level_ = METADATA_NONE;
bool enable_adblock_on_abusive_sites_ = false;
std::unique_ptr<SafeBrowsingTriggeredPopupBlocker> popup_blocker_;
private:
base::test::ScopedFeatureList scoped_features_;
DISALLOW_COPY_AND_ASSIGN(SubresourceFilterAbusiveTest);
};
TEST_P(SubresourceFilterAbusiveTest, ConfigCombination) {
SCOPED_TRACE(testing::Message() << "Abusive Level: " << abusive_level_
<< ", BAS Level: " << bas_level_
<< ", Enable AdBlock on Abusive Sites: "
<< enable_adblock_on_abusive_sites_);
const GURL url("https://example.test/");
ConfigureUrl(url);
SimulateNavigateAndCommit(url, main_rfh());
bool disallow_requests = !CreateAndNavigateDisallowedSubframe(main_rfh());
bool disallow_popups = popup_blocker_->ShouldApplyStrongPopupBlocker(nullptr);
bool any_activation_enforce =
bas_level_ == METADATA_ENFORCE ||
(enable_adblock_on_abusive_sites_ && abusive_level_ == METADATA_ENFORCE);
bool any_activation_warn =
bas_level_ == METADATA_WARN ||
(enable_adblock_on_abusive_sites_ && abusive_level_ == METADATA_WARN);
// Enforcement.
EXPECT_EQ(any_activation_enforce, disallow_requests);
EXPECT_EQ(any_activation_enforce,
!!GetSettingsManager()->GetSiteMetadata(url));
EXPECT_EQ(abusive_level_ == METADATA_ENFORCE, disallow_popups);
// Activation / enforce messages.
EXPECT_EQ(
any_activation_enforce,
DidSendConsoleMessage(subresource_filter::kActivationConsoleMessage));
EXPECT_EQ(abusive_level_ == METADATA_ENFORCE,
DidSendConsoleMessage(kAbusiveEnforceMessage));
// Warn messages.
EXPECT_EQ(!any_activation_enforce && any_activation_warn,
DidSendConsoleMessage(
subresource_filter::kActivationWarningConsoleMessage));
EXPECT_EQ(abusive_level_ == METADATA_WARN,
DidSendConsoleMessage(kAbusiveWarnMessage));
}
INSTANTIATE_TEST_CASE_P(
/* no prefix */,
SubresourceFilterAbusiveTest,
::testing::Combine(
::testing::Values(METADATA_WARN, METADATA_ENFORCE, METADATA_NONE),
::testing::Values(METADATA_WARN, METADATA_ENFORCE, METADATA_NONE),
::testing::Values(false, true)));