| // Copyright 2019 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 "android_webview/common/aw_resource_bundle.h" |
| |
| #include "android_webview/common/aw_descriptors.h" |
| #include "base/android/locale_utils.h" |
| #include "base/files/file.h" |
| #include "base/files/file_path.h" |
| #include "base/files/memory_mapped_file.h" |
| #include "base/i18n/rtl.h" |
| #include "base/logging.h" |
| #include "base/path_service.h" |
| #include "base/posix/global_descriptors.h" |
| #include "base/trace_event/trace_event.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/base/resource/resource_bundle_android.h" |
| #include "ui/base/ui_base_paths.h" |
| |
| namespace android_webview { |
| |
| void InitIcuAndResourceBundleBrowserSide() { |
| TRACE_EVENT0("startup", "InitIcuAndResourceBundleBrowserSide"); |
| ui::SetLocalePaksStoredInApk(true); |
| std::string locale = ui::ResourceBundle::InitSharedInstanceWithLocale( |
| base::android::GetDefaultLocaleString(), NULL, |
| ui::ResourceBundle::LOAD_COMMON_RESOURCES); |
| if (locale.empty()) { |
| LOG(WARNING) << "Failed to load locale .pak from apk."; |
| } |
| base::i18n::SetICUDefaultLocale(locale); |
| |
| // Try to directly mmap the resources.pak from the apk. Fall back to load |
| // from file, using PATH_SERVICE, otherwise. |
| base::FilePath pak_file_path; |
| base::PathService::Get(ui::DIR_RESOURCE_PAKS_ANDROID, &pak_file_path); |
| pak_file_path = pak_file_path.AppendASCII("resources.pak"); |
| ui::LoadMainAndroidPackFile("assets/resources.pak", pak_file_path); |
| } |
| |
| void InitResourceBundleRendererSide() { |
| auto* global_descriptors = base::GlobalDescriptors::GetInstance(); |
| int pak_fd = global_descriptors->Get(kAndroidWebViewLocalePakDescriptor); |
| base::MemoryMappedFile::Region pak_region = |
| global_descriptors->GetRegion(kAndroidWebViewLocalePakDescriptor); |
| ui::ResourceBundle::InitSharedInstanceWithPakFileRegion(base::File(pak_fd), |
| pak_region); |
| |
| std::pair<int, ui::ScaleFactor> extra_paks[] = { |
| {kAndroidWebViewMainPakDescriptor, ui::SCALE_FACTOR_NONE}, |
| {kAndroidWebView100PercentPakDescriptor, ui::SCALE_FACTOR_100P}}; |
| |
| for (const auto& pak_info : extra_paks) { |
| pak_fd = global_descriptors->Get(pak_info.first); |
| pak_region = global_descriptors->GetRegion(pak_info.first); |
| ui::ResourceBundle::GetSharedInstance().AddDataPackFromFileRegion( |
| base::File(pak_fd), pak_region, pak_info.second); |
| } |
| } |
| |
| } // namespace android_webview |