blob: e3e4d808bc7fe7f0167ad92453211f15dd21c39a [file] [log] [blame]
// Copyright 2015 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 "ui/views/mus/aura_init.h"
#include "base/lazy_instance.h"
#include "base/path_service.h"
#include "components/resource_provider/public/cpp/resource_loader.h"
#include "mojo/application/public/cpp/application_impl.h"
#include "ui/aura/env.h"
#include "ui/base/ime/input_method_initializer.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/base/ui_base_paths.h"
#include "ui/views/views_delegate.h"
#if defined(OS_LINUX) && !defined(OS_ANDROID)
#include "components/font_service/public/cpp/font_loader.h"
#endif
namespace views {
namespace {
std::set<std::string> GetResourcePaths(const std::string& resource_file) {
std::set<std::string> paths;
paths.insert(resource_file);
return paths;
}
class MusViewsDelegate : public ViewsDelegate {
public:
MusViewsDelegate() {}
~MusViewsDelegate() override {}
private:
#if defined(OS_WIN)
HICON GetSmallWindowIcon() const override { return nullptr; }
#endif
void OnBeforeWidgetInit(
Widget::InitParams* params,
internal::NativeWidgetDelegate* delegate) override {}
DISALLOW_COPY_AND_ASSIGN(MusViewsDelegate);
};
} // namespace
AuraInit::AuraInit(mojo::ApplicationImpl* app, const std::string& resource_file)
: resource_file_(resource_file),
views_delegate_(new MusViewsDelegate) {
aura::Env::CreateInstance(false);
InitializeResources(app);
ui::InitializeInputMethodForTesting();
}
AuraInit::~AuraInit() {
#if defined(OS_LINUX) && !defined(OS_ANDROID)
if (font_loader_.get()) {
SkFontConfigInterface::SetGlobal(nullptr);
// FontLoader is ref counted. We need to explicitly shutdown the background
// thread, otherwise the background thread may be shutdown after the app is
// torn down, when we're in a bad state.
font_loader_->Shutdown();
}
#endif
}
void AuraInit::InitializeResources(mojo::ApplicationImpl* app) {
if (ui::ResourceBundle::HasSharedInstance())
return;
resource_provider::ResourceLoader resource_loader(
app, GetResourcePaths(resource_file_));
if (!resource_loader.BlockUntilLoaded())
return;
CHECK(resource_loader.loaded());
ui::RegisterPathProvider();
base::File pak_file = resource_loader.ReleaseFile(resource_file_);
base::File pak_file_2 = pak_file.Duplicate();
ui::ResourceBundle::InitSharedInstanceWithPakFileRegion(
pak_file.Pass(), base::MemoryMappedFile::Region::kWholeFile);
ui::ResourceBundle::GetSharedInstance().AddDataPackFromFile(
pak_file_2.Pass(), ui::SCALE_FACTOR_100P);
// Initialize the skia font code to go ask fontconfig underneath.
#if defined(OS_LINUX) && !defined(OS_ANDROID)
font_loader_ = skia::AdoptRef(new font_service::FontLoader(app->shell()));
SkFontConfigInterface::SetGlobal(font_loader_.get());
#endif
// There is a bunch of static state in gfx::Font, by running this now,
// before any other apps load, we ensure all the state is set up.
gfx::Font();
}
} // namespace views