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
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/chrome_resource_bundle_helper.h"
#include "base/command_line.h"
#include "base/files/file_util.h"
#include "base/path_service.h"
#include "base/strings/utf_string_conversions.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "chrome/browser/metrics/chrome_feature_list_creator.h"
#include "chrome/browser/prefs/chrome_command_line_pref_store.h"
#include "chrome/browser/prefs/chrome_pref_service_factory.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/installer/util/google_update_settings.h"
#include "components/language/core/browser/pref_names.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "extensions/buildflags/buildflags.h"
#include "ui/base/resource/resource_bundle.h"
#if BUILDFLAG(IS_ANDROID)
#include "ui/base/resource/resource_bundle_android.h"
#endif
#if BUILDFLAG(IS_CHROMEOS)
#include "ash/constants/ash_switches.h"
#include "chrome/common/pref_names.h"
#endif
#if BUILDFLAG(ENABLE_EXTENSIONS)
#include "extensions/common/extension_l10n_util.h"
#endif
namespace {
extern void InitializeLocalState(
ChromeFeatureListCreator* chrome_feature_list_creator) {
TRACE_EVENT0("startup", "ChromeBrowserMainParts::InitializeLocalState");
#if BUILDFLAG(IS_CHROMEOS)
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (command_line->HasSwitch(ash::switches::kLoginManager)) {
PrefService* local_state = chrome_feature_list_creator->local_state();
DCHECK(local_state);
std::string owner_locale = local_state->GetString(prefs::kOwnerLocale);
// Ensure that we start with owner's locale.
if (!owner_locale.empty() &&
local_state->GetString(language::prefs::kApplicationLocale) !=
owner_locale &&
!local_state->IsManagedPreference(
language::prefs::kApplicationLocale)) {
local_state->SetString(language::prefs::kApplicationLocale, owner_locale);
}
}
#endif // BUILDFLAG(IS_CHROMEOS)
}
// Initializes the shared instance of ResourceBundle and returns the application
// locale. An empty |actual_locale| value indicates failure.
std::string InitResourceBundleAndDetermineLocale(PrefService* local_state,
bool is_running_tests) {
#if BUILDFLAG(IS_ANDROID)
// In order for DetectAndSetLoadSecondaryLocalePaks() to work ResourceBundle
// must not have been created yet.
DCHECK(!ui::ResourceBundle::HasSharedInstance());
ui::DetectAndSetLoadSecondaryLocalePaks();
#endif
std::string preferred_locale;
#if BUILDFLAG(IS_MAC)
// TODO(markusheintz): Read preference pref::kApplicationLocale in order
// to enforce the application locale.
// Tests always get en-US.
preferred_locale = is_running_tests ? "en-US" : std::string();
#else
preferred_locale =
local_state->GetString(language::prefs::kApplicationLocale);
#endif
TRACE_EVENT0("startup",
"ChromeBrowserMainParts::InitResourceBundleAndDetermineLocale");
// On a POSIX OS other than ChromeOS, the parameter that is passed to the
// method InitSharedInstance is ignored.
std::string actual_locale = ui::ResourceBundle::InitSharedInstanceWithLocale(
preferred_locale, nullptr, ui::ResourceBundle::LOAD_COMMON_RESOURCES);
CHECK(!actual_locale.empty())
<< "Locale could not be found for " << preferred_locale;
// First run prefs needs data from the ResourceBundle, so load it now.
{
TRACE_EVENT0("startup",
"ChromeBrowserMainParts::InitResourceBundleAndDetermineLocale:"
":AddDataPack");
base::FilePath resources_pack_path;
base::PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
#if BUILDFLAG(IS_ANDROID)
ui::LoadMainAndroidPackFile("assets/resources.pak", resources_pack_path);
// Avoid loading DFM native resources here, to keep startup lean. These
// resources are loaded on-use, when an already-installed DFM loads.
#else
ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath(
resources_pack_path, ui::kScaleFactorNone);
#endif // BUILDFLAG(IS_ANDROID)
}
#if BUILDFLAG(ENABLE_EXTENSIONS)
extension_l10n_util::SetProcessLocale(actual_locale);
extension_l10n_util::SetPreferredLocale(preferred_locale);
#endif
return actual_locale;
}
} // namespace
std::string LoadLocalState(
ChromeFeatureListCreator* chrome_feature_list_creator,
bool is_running_tests) {
base::FilePath user_data_dir;
if (!base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir))
return std::string();
InitializeLocalState(chrome_feature_list_creator);
chrome_feature_list_creator->local_state()->UpdateCommandLinePrefStore(
new ChromeCommandLinePrefStore(base::CommandLine::ForCurrentProcess()));
return InitResourceBundleAndDetermineLocale(
chrome_feature_list_creator->local_state(), is_running_tests);
}
|