1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "content/browser/theme_helper.h"
6 
7 #include "content/browser/renderer_host/render_process_host_impl.h"
8 #include "content/common/renderer.mojom.h"
9 
10 namespace content {
11 
12 // static
GetInstance()13 ThemeHelper* ThemeHelper::GetInstance() {
14   static base::NoDestructor<ThemeHelper> s_theme_helper;
15   return s_theme_helper.get();
16 }
17 
ThemeHelper()18 ThemeHelper::ThemeHelper() : theme_observation_(this) {
19   theme_observation_.Observe(ui::NativeTheme::GetInstanceForWeb());
20 }
21 
~ThemeHelper()22 ThemeHelper::~ThemeHelper() {}
23 
MakeUpdateSystemColorInfoParams(ui::NativeTheme * native_theme)24 mojom::UpdateSystemColorInfoParamsPtr MakeUpdateSystemColorInfoParams(
25     ui::NativeTheme* native_theme) {
26   mojom::UpdateSystemColorInfoParamsPtr params =
27       mojom::UpdateSystemColorInfoParams::New();
28   params->is_dark_mode = native_theme->ShouldUseDarkColors();
29   params->is_high_contrast = native_theme->UsesHighContrastColors();
30   const auto& colors = native_theme->GetSystemColors();
31   params->colors.insert(colors.begin(), colors.end());
32 
33   return params;
34 }
35 
OnNativeThemeUpdated(ui::NativeTheme * observed_theme)36 void ThemeHelper::OnNativeThemeUpdated(ui::NativeTheme* observed_theme) {
37   DCHECK(theme_observation_.IsObservingSource(observed_theme));
38 
39   mojom::UpdateSystemColorInfoParamsPtr params =
40       MakeUpdateSystemColorInfoParams(observed_theme);
41   for (auto iter = RenderProcessHost::AllHostsIterator(); !iter.IsAtEnd();
42        iter.Advance()) {
43     if (iter.GetCurrentValue()->IsInitializedAndNotDead()) {
44       iter.GetCurrentValue()->GetRendererInterface()->UpdateSystemColorInfo(
45           params->Clone());
46     }
47   }
48 }
49 
SendSystemColorInfo(mojom::Renderer * renderer) const50 void ThemeHelper::SendSystemColorInfo(mojom::Renderer* renderer) const {
51   mojom::UpdateSystemColorInfoParamsPtr params =
52       MakeUpdateSystemColorInfoParams(ui::NativeTheme::GetInstanceForWeb());
53   renderer->UpdateSystemColorInfo(std::move(params));
54 }
55 
56 }  // namespace content
57