summaryrefslogtreecommitdiffstats
path: root/layout/style/PreferenceSheet.h
blob: 707a32a7089cce8c36a41f088cbdad198753eeff (plain)
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
128
129
130
131
132
133
134
135
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/* Some prefable colors for style system use */

#ifndef mozilla_ColorPreferences_h
#define mozilla_ColorPreferences_h

#include "nsColor.h"
#include "mozilla/ColorScheme.h"

namespace mozilla {

namespace dom {
class Document;
}

struct PreferenceSheet {
  struct Prefs {
    struct Colors {
      nscolor mLink = NS_RGB(0x00, 0x00, 0xEE);
      nscolor mActiveLink = NS_RGB(0xEE, 0x00, 0x00);
      nscolor mVisitedLink = NS_RGB(0x55, 0x1A, 0x8B);

      nscolor mDefault = NS_RGB(0, 0, 0);
      nscolor mDefaultBackground = NS_RGB(0xFF, 0xFF, 0xFF);
    } mLightColors, mDarkColors;

    const Colors& ColorsFor(ColorScheme aScheme) const {
      return mMustUseLightColorSet || aScheme == ColorScheme::Light
                 ? mLightColors
                 : mDarkColors;
    }

    bool mIsChrome = false;
    bool mUseAccessibilityTheme = false;
    bool mUseDocumentColors = true;
    bool mUsePrefColors = false;
    bool mUseStandins = false;
    bool mMustUseLightColorSet = false;
    bool mMustUseLightSystemColors = false;

    ColorScheme mColorScheme = ColorScheme::Light;

    // Whether the non-native theme should use real system colors for widgets.
    bool NonNativeThemeShouldBeHighContrast() const;

    void Load(bool aIsChrome);
    void LoadColors(bool aIsLight);
  };

  static void EnsureInitialized() {
    if (sInitialized) {
      return;
    }
    Initialize();
  }

  static void Refresh() {
    sInitialized = false;
    Initialize();
  }

  static bool AffectedByPref(const nsACString&);

  enum class ChromeColorSchemeSetting { Light, Dark, System };
  static ChromeColorSchemeSetting ColorSchemeSettingForChrome();

  static ColorScheme ColorSchemeForChrome() {
    MOZ_ASSERT(sInitialized);
    return ChromePrefs().mColorScheme;
  }

  static ColorScheme PreferredColorSchemeForContent() {
    MOZ_ASSERT(sInitialized);
    return ContentPrefs().mColorScheme;
  }
  static ColorScheme ThemeDerivedColorSchemeForContent();

  static Prefs& ContentPrefs() {
    MOZ_ASSERT(sInitialized);
    return sContentPrefs;
  }

  static Prefs& ChromePrefs() {
    MOZ_ASSERT(sInitialized);
    return sChromePrefs;
  }

  static Prefs& PrintPrefs() {
    MOZ_ASSERT(sInitialized);
    return sPrintPrefs;
  }

  enum class PrefsKind {
    Chrome,
    Print,
    Content,
  };

  static PrefsKind PrefsKindFor(const dom::Document&);

  static bool ShouldUseChromePrefs(const dom::Document& aDocument) {
    return PrefsKindFor(aDocument) == PrefsKind::Chrome;
  }

  static bool MayForceColors() { return !ContentPrefs().mUseDocumentColors; }

  static const Prefs& PrefsFor(const dom::Document& aDocument) {
    switch (PrefsKindFor(aDocument)) {
      case PrefsKind::Chrome:
        return ChromePrefs();
      case PrefsKind::Print:
        return PrintPrefs();
      case PrefsKind::Content:
        break;
    }
    return ContentPrefs();
  }

 private:
  static bool sInitialized;
  static Prefs sChromePrefs;
  static Prefs sPrintPrefs;
  static Prefs sContentPrefs;

  static void Initialize();
};

}  // namespace mozilla

#endif