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 "chrome/browser/startup_data.h"
6 
7 #include "base/files/file_path.h"
8 #include "base/task/thread_pool.h"
9 #include "chrome/browser/metrics/chrome_feature_list_creator.h"
10 #include "chrome/browser/prefs/profile_pref_store_manager.h"
11 #include "chrome/common/channel_info.h"
12 #include "components/metrics/delegating_provider.h"
13 #include "components/metrics/entropy_state_provider.h"
14 #include "components/metrics/field_trials_provider.h"
15 #include "components/metrics/metrics_log.h"
16 #include "components/metrics/persistent_system_profile.h"
17 #include "components/metrics/version_utils.h"
18 #include "third_party/metrics_proto/system_profile.pb.h"
19 
20 #if defined(OS_ANDROID)
21 #include "base/files/file_util.h"
22 #include "base/no_destructor.h"
23 #include "base/path_service.h"
24 #include "base/task/post_task.h"
25 #include "chrome/browser/android/profile_key_startup_accessor.h"
26 #include "chrome/browser/policy/cloud/user_cloud_policy_manager_builder.h"
27 #include "chrome/browser/policy/profile_policy_connector.h"
28 #include "chrome/browser/policy/profile_policy_connector_builder.h"
29 #include "chrome/browser/policy/schema_registry_service.h"
30 #include "chrome/browser/policy/schema_registry_service_builder.h"
31 #include "chrome/browser/prefs/browser_prefs.h"
32 #include "chrome/browser/prefs/chrome_pref_service_factory.h"
33 #include "chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.h"
34 #include "chrome/browser/profiles/pref_service_builder_utils.h"
35 #include "chrome/browser/profiles/profile_key.h"
36 #include "chrome/browser/supervised_user/supervised_user_pref_store.h"
37 #include "chrome/browser/supervised_user/supervised_user_settings_service.h"
38 #include "chrome/browser/supervised_user/supervised_user_settings_service_factory.h"
39 #include "chrome/common/chrome_constants.h"
40 #include "chrome/common/chrome_paths.h"
41 #include "components/keyed_service/content/browser_context_dependency_manager.h"
42 #include "components/keyed_service/core/simple_dependency_manager.h"
43 #include "components/keyed_service/core/simple_factory_key.h"
44 #include "components/policy/core/common/cloud/cloud_external_data_manager.h"
45 #include "components/policy/core/common/cloud/user_cloud_policy_manager.h"
46 #include "components/policy/core/common/cloud/user_cloud_policy_store.h"
47 #include "components/pref_registry/pref_registry_syncable.h"
48 #include "components/sync_preferences/pref_service_syncable.h"
49 #include "content/public/browser/network_service_instance.h"
50 #include "mojo/public/cpp/bindings/pending_remote.h"
51 #include "services/preferences/public/mojom/tracked_preference_validation_delegate.mojom.h"
52 
53 namespace {
54 
GetProfilePath()55 base::FilePath GetProfilePath() {
56   base::FilePath user_data_dir;
57   base::PathService::Get(chrome::DIR_USER_DATA, &user_data_dir);
58   return user_data_dir.AppendASCII(chrome::kInitialProfile);
59 }
60 
61 }  // namespace
62 
63 #endif
64 
StartupData()65 StartupData::StartupData()
66     : chrome_feature_list_creator_(
67           std::make_unique<ChromeFeatureListCreator>()) {}
68 
69 StartupData::~StartupData() = default;
70 
RecordCoreSystemProfile()71 void StartupData::RecordCoreSystemProfile() {
72   metrics::SystemProfileProto system_profile;
73   metrics::MetricsLog::RecordCoreSystemProfile(
74       metrics::GetVersionString(),
75       metrics::AsProtobufChannel(chrome::GetChannel()),
76       chrome_feature_list_creator_->actual_locale(),
77       metrics::GetAppPackageName(), &system_profile);
78 
79   metrics::DelegatingProvider delegating_provider;
80 
81   // TODO(hanxi): Create SyntheticTrialRegistry and pass it to
82   // |field_trial_provider|.
83   delegating_provider.RegisterMetricsProvider(
84       std::make_unique<variations::FieldTrialsProvider>(nullptr,
85                                                         base::StringPiece()));
86 
87   // Persists low entropy source values.
88   delegating_provider.RegisterMetricsProvider(
89       std::make_unique<metrics::EntropyStateProvider>(
90           chrome_feature_list_creator_->local_state()));
91 
92   delegating_provider.ProvideSystemProfileMetricsWithLogCreationTime(
93       base::TimeTicks(), &system_profile);
94 
95   // TODO(crbug.com/965482): Records information from other providers.
96   metrics::GlobalPersistentSystemProfile::GetInstance()->SetSystemProfile(
97       system_profile, /* complete */ false);
98 }
99 
100 #if defined(OS_ANDROID)
CreateProfilePrefService()101 void StartupData::CreateProfilePrefService() {
102   key_ = std::make_unique<ProfileKey>(GetProfilePath());
103   PreProfilePrefServiceInit();
104   CreateServicesInternal();
105   key_->SetPrefs(prefs_.get());
106 
107   ProfileKeyStartupAccessor::GetInstance()->SetProfileKey(key_.get());
108 }
109 
HasBuiltProfilePrefService()110 bool StartupData::HasBuiltProfilePrefService() {
111   return !!prefs_.get();
112 }
113 
GetProfileKey()114 ProfileKey* StartupData::GetProfileKey() {
115   return key_.get();
116 }
117 
TakeProfileKey()118 std::unique_ptr<ProfileKey> StartupData::TakeProfileKey() {
119   return std::move(key_);
120 }
121 
122 std::unique_ptr<policy::SchemaRegistryService>
TakeSchemaRegistryService()123 StartupData::TakeSchemaRegistryService() {
124   return std::move(schema_registry_service_);
125 }
126 
127 std::unique_ptr<policy::UserCloudPolicyManager>
TakeUserCloudPolicyManager()128 StartupData::TakeUserCloudPolicyManager() {
129   return std::move(user_cloud_policy_manager_);
130 }
131 
132 std::unique_ptr<policy::ProfilePolicyConnector>
TakeProfilePolicyConnector()133 StartupData::TakeProfilePolicyConnector() {
134   return std::move(profile_policy_connector_);
135 }
136 
137 scoped_refptr<user_prefs::PrefRegistrySyncable>
TakePrefRegistrySyncable()138 StartupData::TakePrefRegistrySyncable() {
139   return std::move(pref_registry_);
140 }
141 
142 std::unique_ptr<sync_preferences::PrefServiceSyncable>
TakeProfilePrefService()143 StartupData::TakeProfilePrefService() {
144   return std::move(prefs_);
145 }
146 
147 std::unique_ptr<leveldb_proto::ProtoDatabaseProvider>
TakeProtoDatabaseProvider()148 StartupData::TakeProtoDatabaseProvider() {
149   return std::move(proto_db_provider_);
150 }
151 
PreProfilePrefServiceInit()152 void StartupData::PreProfilePrefServiceInit() {
153   pref_registry_ = base::MakeRefCounted<user_prefs::PrefRegistrySyncable>();
154   ChromeBrowserMainExtraPartsProfiles::
155       EnsureBrowserContextKeyedServiceFactoriesBuilt();
156 }
157 
CreateServicesInternal()158 void StartupData::CreateServicesInternal() {
159   const base::FilePath& path = key_->GetPath();
160   if (!base::PathExists(path)) {
161     // TODO(rogerta): http://crbug/160553 - Bad things happen if we can't
162     // write to the profile directory.  We should eventually be able to run in
163     // this situation.
164     if (!base::CreateDirectory(path))
165       return;
166 
167     CreateProfileReadme(path);
168   }
169 
170   scoped_refptr<base::SequencedTaskRunner> io_task_runner =
171       base::ThreadPool::CreateSequencedTaskRunner(
172           {base::TaskShutdownBehavior::BLOCK_SHUTDOWN, base::MayBlock()});
173 
174   policy::ChromeBrowserPolicyConnector* browser_policy_connector =
175       chrome_feature_list_creator_->browser_policy_connector();
176   std::unique_ptr<policy::SchemaRegistry> schema_registry =
177       std::make_unique<policy::SchemaRegistry>();
178   schema_registry_service_ = BuildSchemaRegistryService(
179       std::move(schema_registry), browser_policy_connector->GetChromeSchema(),
180       browser_policy_connector->GetSchemaRegistry());
181 
182   user_cloud_policy_manager_ = CreateUserCloudPolicyManager(
183       path, schema_registry_service_->registry(),
184       true /* force_immediate_policy_load */, io_task_runner);
185 
186   profile_policy_connector_ = policy::CreateAndInitProfilePolicyConnector(
187       schema_registry_service_->registry(),
188       static_cast<policy::ChromeBrowserPolicyConnector*>(
189           browser_policy_connector),
190       user_cloud_policy_manager_.get(),
191       user_cloud_policy_manager_->core()->store(),
192       true /* force_immediate_policy_load*/, nullptr /* user */);
193 
194   // StoragePartitionImplMap uses profile directory as default storage
195   // partition, see StoragePartitionImplMap::GetStoragePartitionPath().
196   proto_db_provider_ = std::make_unique<leveldb_proto::ProtoDatabaseProvider>(
197       path, /*is_in_memory=*/false);
198   key_->SetProtoDatabaseProvider(proto_db_provider_.get());
199 
200   RegisterProfilePrefs(false /* is_signin_profile */,
201                        chrome_feature_list_creator_->actual_locale(),
202                        pref_registry_.get());
203 
204   mojo::PendingRemote<prefs::mojom::TrackedPreferenceValidationDelegate>
205       pref_validation_delegate;
206   // The preference tracking and protection is not required on Android.
207   DCHECK(!ProfilePrefStoreManager::kPlatformSupportsPreferenceTracking);
208 
209   prefs_ = CreatePrefService(
210       pref_registry_, nullptr /* extension_pref_store */,
211       profile_policy_connector_->policy_service(), browser_policy_connector,
212       std::move(pref_validation_delegate), io_task_runner, key_.get(), path,
213       false /* async_prefs*/);
214 }
215 #endif
216