blob: e21a14de9a254e28591694e9d8a5252421ccd63b [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/native_theme/os_settings_provider.h"
#include <optional>
#include "base/containers/flat_map.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/native_theme/native_theme.h"
namespace ui {
namespace {
// A cut-down version of `MockOsSettingsProvider` that intentionally does not
// override the `PreferredColorScheme()`/`PreferredContrast()` methods, so the
// default implementations can be tested.
class SysColorsOsSettingsProvider : public OsSettingsProvider {
public:
SysColorsOsSettingsProvider() : OsSettingsProvider(PriorityLevel::kTesting) {}
~SysColorsOsSettingsProvider() override = default;
// OsSettingsProvider:
bool ForcedColorsActive() const override;
std::optional<SkColor> Color(ColorId color_id) const override;
// Setters for all the above settings.
void SetForcedColorsActive(bool forced_colors_active);
void SetColor(ColorId color_id, SkColor color);
private:
bool forced_colors_active_ = false;
base::flat_map<ColorId, SkColor> colors_;
};
bool SysColorsOsSettingsProvider::ForcedColorsActive() const {
return forced_colors_active_;
}
std::optional<SkColor> SysColorsOsSettingsProvider::Color(
ColorId color_id) const {
const auto it = colors_.find(color_id);
return (it == colors_.end()) ? std::nullopt : std::make_optional(it->second);
}
void SysColorsOsSettingsProvider::SetForcedColorsActive(
bool forced_colors_active) {
forced_colors_active_ = forced_colors_active;
NotifyOnSettingsChanged();
}
void SysColorsOsSettingsProvider::SetColor(ColorId color_id, SkColor color) {
colors_[color_id] = color;
NotifyOnSettingsChanged();
}
class OsSettingsProviderTest : public ::testing::Test {
protected:
OsSettingsProviderTest() = default;
~OsSettingsProviderTest() override = default;
SysColorsOsSettingsProvider& os_settings_provider() {
return os_settings_provider_;
}
private:
SysColorsOsSettingsProvider os_settings_provider_;
};
TEST_F(OsSettingsProviderTest, PreferredColorScheme) {
using enum NativeTheme::PreferredColorScheme;
using enum OsSettingsProvider::ColorId;
EXPECT_EQ(os_settings_provider().PreferredColorScheme(), kNoPreference);
os_settings_provider().SetForcedColorsActive(true);
os_settings_provider().SetColor(kWindow, SK_ColorBLACK);
EXPECT_EQ(os_settings_provider().PreferredColorScheme(), kDark);
os_settings_provider().SetColor(kWindow, SK_ColorWHITE);
EXPECT_EQ(os_settings_provider().PreferredColorScheme(), kLight);
os_settings_provider().SetColor(kWindow, SK_ColorBLUE);
EXPECT_EQ(os_settings_provider().PreferredColorScheme(), kDark);
os_settings_provider().SetColor(kWindow, SK_ColorYELLOW);
EXPECT_EQ(os_settings_provider().PreferredColorScheme(), kLight);
os_settings_provider().SetForcedColorsActive(false);
EXPECT_EQ(os_settings_provider().PreferredColorScheme(), kNoPreference);
}
TEST_F(OsSettingsProviderTest, PreferredContrast) {
using enum NativeTheme::PreferredContrast;
using enum OsSettingsProvider::ColorId;
EXPECT_EQ(os_settings_provider().PreferredContrast(), kNoPreference);
os_settings_provider().SetForcedColorsActive(true);
os_settings_provider().SetColor(kWindow, SK_ColorBLACK);
os_settings_provider().SetColor(kWindowText, SK_ColorWHITE);
EXPECT_EQ(os_settings_provider().PreferredContrast(), kMore);
os_settings_provider().SetColor(kWindow, SK_ColorWHITE);
os_settings_provider().SetColor(kWindowText, SK_ColorBLACK);
EXPECT_EQ(os_settings_provider().PreferredContrast(), kMore);
os_settings_provider().SetColor(kWindowText, SK_ColorRED);
EXPECT_EQ(os_settings_provider().PreferredContrast(), kCustom);
os_settings_provider().SetColor(kWindowText, SK_ColorYELLOW);
EXPECT_EQ(os_settings_provider().PreferredContrast(), kLess);
os_settings_provider().SetForcedColorsActive(false);
EXPECT_EQ(os_settings_provider().PreferredContrast(), kNoPreference);
}
} // namespace
} // namespace ui