1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/notifications/web_page_notifier_controller.h"
#include <memory>
#include <utility>
#include "base/functional/bind.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/favicon/favicon_service_factory.h"
#include "chrome/test/base/testing_profile.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_pattern.h"
#include "components/content_settings/core/test/content_settings_mock_provider.h"
#include "components/content_settings/core/test/content_settings_test_utils.h"
#include "components/favicon/core/test/mock_favicon_service.h"
#include "components/permissions/test/permission_test_util.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace {
// Note that so far it is only working for full URLs with a scheme e.g. https.
// For every other pattern type it doesn't work (without a scheme or with
// wildcards).
// TODO(tomdobro): enable other test cases after the problem is fixed.
constexpr const char* kTestPatterns[] = {
"https://full.test.com",
// "no_scheme.test.com",
// "[*.]any.test.com",
// "*://any_scheme.test.com",
// "https://[*.]scheme_any.test.com",
// "*://[*.]any_any.test.com",
};
class MockObserver : public NotifierController::Observer {
public:
MockObserver() = default;
MOCK_METHOD2(OnIconImageUpdated,
void(const message_center::NotifierId& id,
const gfx::ImageSkia& image));
MOCK_METHOD2(OnNotifierEnabledChanged,
void(const message_center::NotifierId& id, bool enabled));
};
std::unique_ptr<KeyedService> BuildMockFaviconService(
content::BrowserContext* context) {
return std::make_unique<testing::NiceMock<favicon::MockFaviconService>>();
}
} // namespace
class WebPageNotifierControllerTest : public testing::Test {
protected:
void TestGetNotifiersList(ContentSetting content_setting,
content_settings::ProviderType provider_type,
bool expect_enabled,
bool expect_enforced);
content::BrowserTaskEnvironment task_environment_;
MockObserver mock_observer_;
};
void WebPageNotifierControllerTest::TestGetNotifiersList(
ContentSetting content_setting,
content_settings::ProviderType provider_type,
bool expect_enabled,
bool expect_enforced) {
WebPageNotifierController controller(&mock_observer_);
std::unique_ptr<TestingProfile> profile;
TestingProfile::Builder builder;
builder.AddTestingFactory(FaviconServiceFactory::GetInstance(),
base::BindRepeating(&BuildMockFaviconService));
profile = builder.Build();
profile->SetPermissionControllerDelegate(
permissions::GetPermissionControllerDelegate(profile.get()));
auto* host_content_settings_map =
HostContentSettingsMapFactory::GetForProfile(profile.get());
auto provider = std::make_unique<content_settings::MockProvider>();
for (const char* pattern : kTestPatterns) {
provider->SetWebsiteSetting(
ContentSettingsPattern::FromString(pattern),
ContentSettingsPattern::Wildcard(), ContentSettingsType::NOTIFICATIONS,
base::Value(content_setting), /*constraints=*/{},
content_settings::PartitionKey::GetDefaultForTesting());
}
content_settings::TestUtils::OverrideProvider(
host_content_settings_map, std::move(provider), provider_type);
const auto list = controller.GetNotifierList(profile.get());
for (const auto& el : list) {
SCOPED_TRACE(el.name);
EXPECT_EQ(expect_enabled, el.enabled);
EXPECT_EQ(expect_enforced, el.enforced);
}
}
TEST_F(WebPageNotifierControllerTest, TestGetNotifiersListPrefs) {
// Test URL patterns as they were given by kPrefProvider imitating
// notifications enabled by the user (as opposed to admin), thus not enforced.
TestGetNotifiersList(CONTENT_SETTING_ALLOW,
content_settings::ProviderType::kPrefProvider,
/*expect_enabled=*/true, /*expect_enforced=*/false);
}
TEST_F(WebPageNotifierControllerTest, TestGetNotifiersListEnforced) {
// Test URL patterns as they were given by kPolicyProvider imitating
// notifications enabled by the admin, thus enforced.
TestGetNotifiersList(CONTENT_SETTING_ALLOW,
content_settings::ProviderType::kPolicyProvider,
/*expect_enabled=*/true, /*expect_enforced=*/true);
}
|