910e62b5创建于 1月15日历史提交
// 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.

#ifndef UI_NATIVE_THEME_MOCK_OS_SETTINGS_PROVIDER_H_
#define UI_NATIVE_THEME_MOCK_OS_SETTINGS_PROVIDER_H_

#include <optional>

#include "base/component_export.h"
#include "base/containers/flat_map.h"
#include "base/time/time.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/color/color_provider_key.h"
#include "ui/native_theme/native_theme.h"
#include "ui/native_theme/os_settings_provider.h"

namespace ui {

// Mock object to allow tests to control OS-level theme settings. Instantiate
// this in your test fixture to have it override the real provider; it will
// automatically notify the NativeTheme of changes made via the setters.
class COMPONENT_EXPORT(NATIVE_THEME) MockOsSettingsProvider
    : public OsSettingsProvider {
 public:
  MockOsSettingsProvider();
  ~MockOsSettingsProvider() override;

  // OsSettingsProvider:
  bool DarkColorSchemeAvailable() const override;
  NativeTheme::PreferredColorScheme PreferredColorScheme() const override;
  ColorProviderKey::UserColorSource PreferredColorSource() const override;
  NativeTheme::PreferredContrast PreferredContrast() const override;
  bool PrefersReducedTransparency() const override;
  bool PrefersInvertedColors() const override;
  bool ForcedColorsActive() const override;
  std::optional<SkColor> AccentColor() const override;
  std::optional<SkColor> Color(ColorId color_id) const override;
  std::optional<ColorProviderKey::SchemeVariant> SchemeVariant() const override;
  base::TimeDelta CaretBlinkInterval() const override;

  // Setters for all the above settings.
  void SetDarkColorSchemeAvailable(bool dark_color_scheme_available);
  void SetPreferredColorScheme(
      NativeTheme::PreferredColorScheme preferred_color_scheme);
  void SetPreferredColorSource(
      ColorProviderKey::UserColorSource preferred_color_source);
  void SetPreferredContrast(NativeTheme::PreferredContrast preferred_contrast);
  void SetPrefersReducedTransparency(bool prefers_reduced_transparency);
  void SetPrefersInvertedColors(bool prefers_inverted_colors);
  void SetForcedColorsActive(bool forced_colors_active);
  void SetAccentColor(SkColor accent_color);
  void SetColor(ColorId color_id, SkColor color);
  void SetSchemeVariant(ColorProviderKey::SchemeVariant scheme_variant);
  void SetCaretBlinkInterval(base::TimeDelta caret_blink_interval);

 private:
  bool dark_color_scheme_available_ = true;
  NativeTheme::PreferredColorScheme preferred_color_scheme_ =
      NativeTheme::PreferredColorScheme::kLight;
  ColorProviderKey::UserColorSource preferred_color_source_ =
      ColorProviderKey::UserColorSource::kBaseline;
  NativeTheme::PreferredContrast preferred_contrast_ =
      NativeTheme::PreferredContrast::kNoPreference;
  bool prefers_reduced_transparency_ = false;
  bool prefers_inverted_colors_ = false;
  bool forced_colors_active_ = false;
  std::optional<SkColor> accent_color_;
  base::flat_map<ColorId, SkColor> colors_;
  std::optional<ColorProviderKey::SchemeVariant> scheme_variant_;
  base::TimeDelta caret_blink_interval_ = kDefaultCaretBlinkInterval;
};

}  // namespace ui

#endif  // UI_NATIVE_THEME_MOCK_OS_SETTINGS_PROVIDER_H_