blob: 606fa59788c49908a320a907d083f3f45e171680 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ACCESSIBILITY_PAGE_COLORS_H_
#define CHROME_BROWSER_ACCESSIBILITY_PAGE_COLORS_H_
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_observation.h"
#include "build/build_config.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/prefs/pref_change_registrar.h"
#include "ui/native_theme/native_theme.h"
namespace user_prefs {
class PrefRegistrySyncable;
}
// Manages the page colors feature, which simulates forced colors mode at the
// browser level. This tracks the per-profile preference and OS preferred
// contrast state from NativeTheme to update the WebContents Page Colors state
// based on any changes.
class PageColors : public KeyedService, public ui::NativeThemeObserver {
public:
explicit PageColors(PrefService* profile_prefs);
PageColors(const PageColors&) = delete;
PageColors& operator=(const PageColors&) = delete;
~PageColors() override;
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
void Init();
private:
friend class PageColorsFactory;
// Handles when page colors preferences change.
void OnPageColorsChanged();
// This function makes use of different states such as the kPageColors,
// kApplyPageColorsOnlyOnIncreasedContrast and OS increased contrast state to
// calculate the used page colors.
ui::NativeTheme::PageColors CalculatePageColors();
// ui::NativeThemeObserver
void OnPreferredContrastChanged() override;
base::ScopedObservation<ui::NativeTheme, ui::NativeThemeObserver>
theme_observation_{this};
PrefChangeRegistrar pref_change_registrar_;
raw_ptr<PrefService> profile_prefs_;
base::WeakPtrFactory<PageColors> weak_factory_{this};
};
#endif // CHROME_BROWSER_ACCESSIBILITY_PAGE_COLORS_H_