blob: 3569eb0c7a964e4a5bf26c008515149f0f32ed16 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/dark_mode_handler.h"
#include "base/bind.h"
#include "base/feature_list.h"
#include "base/logging.h"
#include "base/memory/ptr_util.h"
#include "base/values.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/ui_features.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "ui/native_theme/native_theme.h"
DarkModeHandler::~DarkModeHandler() {}
// static
void DarkModeHandler::Initialize(content::WebUI* web_ui,
content::WebUIDataSource* source) {
InitializeInternal(web_ui, source, ui::NativeTheme::GetInstanceForNativeUi(),
Profile::FromWebUI(web_ui));
}
// static
void DarkModeHandler::InitializeInternal(content::WebUI* web_ui,
content::WebUIDataSource* source,
ui::NativeTheme* theme,
Profile* profile) {
auto handler = base::WrapUnique(new DarkModeHandler(theme, profile));
source->AddLocalizedStrings(*handler->GetDataSourceUpdate());
handler->source_name_ = source->GetSource();
web_ui->AddMessageHandler(std::move(handler));
}
DarkModeHandler::DarkModeHandler(ui::NativeTheme* theme, Profile* profile)
: profile_(profile),
dark_mode_observer_(
theme,
base::BindRepeating(&DarkModeHandler::OnDarkModeChanged,
base::Unretained(this))) {
dark_mode_observer_.Start();
}
void DarkModeHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"observeDarkMode",
base::BindRepeating(&DarkModeHandler::HandleObserveDarkMode,
base::Unretained(this)));
}
void DarkModeHandler::HandleObserveDarkMode(const base::ListValue* /*args*/) {
AllowJavascript();
}
bool DarkModeHandler::UseDarkMode() const {
return base::FeatureList::IsEnabled(features::kWebUIDarkMode) &&
dark_mode_observer_.InDarkMode();
}
std::unique_ptr<base::DictionaryValue> DarkModeHandler::GetDataSourceUpdate()
const {
auto update = std::make_unique<base::DictionaryValue>();
bool use_dark_mode = UseDarkMode();
update->SetKey("dark", base::Value(use_dark_mode ? "dark" : ""));
return update;
}
void DarkModeHandler::OnDarkModeChanged(bool /*dark_mode*/) {
content::WebUIDataSource::Update(profile_, source_name_,
GetDataSourceUpdate());
if (IsJavascriptAllowed())
FireWebUIListener("dark-mode-changed", base::Value(UseDarkMode()));
}