blob: 74a086b7d84cd530fed64e2bb1961a291ade073d [file] [log] [blame]
// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/webapps/browser/banners/app_banner_settings_helper.h"
#include "base/auto_reset.h"
#include "base/test/scoped_feature_list.h"
#include "base/time/time.h"
#include "components/permissions/test/test_permissions_client.h"
#include "components/prefs/testing_pref_service.h"
#include "components/user_prefs/user_prefs.h"
#include "components/webapps/browser/banners/app_banner_metrics.h"
#include "components/webapps/browser/features.h"
#include "content/public/browser/browser_context.h"
#include "content/public/test/test_renderer_host.h"
namespace webapps {
namespace {
const char kTestURL[] = "https://www.google.com";
const char kSameOriginTestURL[] = "https://www.google.com/foo.html";
const char kSameOriginTestURL1[] = "https://www.google.com/foo1.html";
const char kSameOriginTestURL2[] = "https://www.google.com/foo2.html";
const char kTestPackageName[] = "test.package";
base::Time GetReferenceTime() {
static constexpr base::Time::Exploded kReferenceTime = {.year = 2015,
.month = 1,
.day_of_week = 5,
.day_of_month = 30,
.hour = 11};
base::Time out_time;
EXPECT_TRUE(base::Time::FromLocalExploded(kReferenceTime, &out_time));
return out_time;
}
class AppBannerSettingsHelperTest : public content::RenderViewHostTestHarness {
void SetUp() override {
content::RenderViewHostTestHarness::SetUp();
user_prefs::UserPrefs::Set(browser_context(), &prefs_);
}
void TearDown() override {
content::RenderViewHostTestHarness::TearDown();
}
private:
TestingPrefServiceSimple prefs_;
permissions::TestPermissionsClient permissions_client_;
};
} // namespace
TEST_F(AppBannerSettingsHelperTest, SingleEvents) {
GURL url(kTestURL);
NavigateAndCommit(url);
base::Time reference_time = GetReferenceTime();
base::Time other_time = reference_time - base::Days(3);
for (int event = AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW;
event < AppBannerSettingsHelper::APP_BANNER_EVENT_NUM_EVENTS; ++event) {
// Check that by default, there is no event.
std::optional<base::Time> event_time =
AppBannerSettingsHelper::GetSingleBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::AppBannerEvent(event));
EXPECT_TRUE(event_time && event_time->is_null());
// Check that a time can be recorded.
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::AppBannerEvent(event), reference_time);
event_time = AppBannerSettingsHelper::GetSingleBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::AppBannerEvent(event));
EXPECT_EQ(reference_time, *event_time);
// Check that another time can be recorded.
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::AppBannerEvent(event), other_time);
event_time = AppBannerSettingsHelper::GetSingleBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::AppBannerEvent(event));
// COULD_SHOW events are not overwritten, but other events are.
if (event == AppBannerSettingsHelper::APP_BANNER_EVENT_COULD_SHOW)
EXPECT_EQ(reference_time, *event_time);
else
EXPECT_EQ(other_time, *event_time);
}
}
TEST_F(AppBannerSettingsHelperTest, ReportsWhetherBannerWasRecentlyBlocked) {
GURL url(kTestURL);
NavigateAndCommit(url);
base::Time reference_time = GetReferenceTime();
base::Time two_months_ago = reference_time - base::Days(60);
base::Time one_year_ago = reference_time - base::Days(366);
EXPECT_FALSE(AppBannerSettingsHelper::WasBannerRecentlyBlocked(
web_contents(), url, kTestPackageName, reference_time));
// Block the site a long time ago. This should not be considered "recent".
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_BLOCK, one_year_ago);
EXPECT_FALSE(AppBannerSettingsHelper::WasBannerRecentlyBlocked(
web_contents(), url, kTestPackageName, reference_time));
// Block the site more recently.
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_BLOCK, two_months_ago);
EXPECT_TRUE(AppBannerSettingsHelper::WasBannerRecentlyBlocked(
web_contents(), url, kTestPackageName, reference_time));
// Change the number of days enforced.
AppBannerSettingsHelper::ScopedTriggerSettings trigger_settings(59, 14);
EXPECT_FALSE(AppBannerSettingsHelper::WasBannerRecentlyBlocked(
web_contents(), url, kTestPackageName, reference_time));
}
TEST_F(AppBannerSettingsHelperTest, ReportsWhetherBannerWasRecentlyIgnored) {
GURL url(kTestURL);
NavigateAndCommit(url);
base::Time reference_time = GetReferenceTime();
base::Time one_week_ago = reference_time - base::Days(6);
base::Time one_year_ago = reference_time - base::Days(366);
EXPECT_FALSE(AppBannerSettingsHelper::WasBannerRecentlyIgnored(
web_contents(), url, kTestPackageName, reference_time));
// Show the banner a long time ago. This should not be considered "recent".
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, one_year_ago);
EXPECT_FALSE(AppBannerSettingsHelper::WasBannerRecentlyIgnored(
web_contents(), url, kTestPackageName, reference_time));
// Show the site more recently.
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, one_week_ago);
EXPECT_TRUE(AppBannerSettingsHelper::WasBannerRecentlyIgnored(
web_contents(), url, kTestPackageName, reference_time));
// Change the number of days enforced.
AppBannerSettingsHelper::ScopedTriggerSettings trigger_settings(90, 5);
EXPECT_FALSE(AppBannerSettingsHelper::WasBannerRecentlyIgnored(
web_contents(), url, kTestPackageName, reference_time));
}
TEST_F(AppBannerSettingsHelperTest, OperatesOnOrigins) {
GURL url(kTestURL);
GURL otherURL(kSameOriginTestURL);
base::Time reference_time = GetReferenceTime();
base::Time one_week_ago = reference_time - base::Days(5);
// If url is blocked, otherURL will also be reported as blocked.
EXPECT_FALSE(AppBannerSettingsHelper::WasBannerRecentlyBlocked(
web_contents(), otherURL, kTestPackageName, reference_time));
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_BLOCK, one_week_ago);
EXPECT_TRUE(AppBannerSettingsHelper::WasBannerRecentlyBlocked(
web_contents(), otherURL, kTestPackageName, reference_time));
// If url is ignored, otherURL will also be reported as ignored.
EXPECT_FALSE(AppBannerSettingsHelper::WasBannerRecentlyIgnored(
web_contents(), otherURL, kTestPackageName, reference_time));
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, kTestPackageName,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, one_week_ago);
EXPECT_TRUE(AppBannerSettingsHelper::WasBannerRecentlyIgnored(
web_contents(), otherURL, kTestPackageName, reference_time));
}
TEST_F(AppBannerSettingsHelperTest, NulloptSingleBannerEvent) {
GURL url(kTestURL);
std::string url_same_origin1(kSameOriginTestURL);
std::string url_same_origin2(kSameOriginTestURL1);
std::string url_same_origin3(kSameOriginTestURL2);
NavigateAndCommit(url);
base::Time reference_time = GetReferenceTime();
base::Time one_day_ago = reference_time - base::Days(1);
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, url.spec(),
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, one_day_ago);
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, url_same_origin1,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, one_day_ago);
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, url_same_origin2,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, one_day_ago);
std::optional<base::Time> event_time =
AppBannerSettingsHelper::GetSingleBannerEvent(
web_contents(), url, url_same_origin2,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW);
EXPECT_TRUE(event_time.has_value());
EXPECT_FALSE(AppBannerSettingsHelper::WasBannerRecentlyBlocked(
web_contents(), url, url_same_origin2, reference_time));
AppBannerSettingsHelper::RecordBannerEvent(
web_contents(), url, url_same_origin3,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW, one_day_ago);
event_time = AppBannerSettingsHelper::GetSingleBannerEvent(
web_contents(), url, url_same_origin3,
AppBannerSettingsHelper::APP_BANNER_EVENT_DID_SHOW);
// if exceed kMaxAppsPerSite 3, we will ge nullopt
EXPECT_FALSE(event_time.has_value());
EXPECT_TRUE(AppBannerSettingsHelper::WasBannerRecentlyBlocked(
web_contents(), url, url_same_origin3, reference_time));
}
} // namespace webapps