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/ui/webui/settings/chromeos/os_settings_ui.h"
6 
7 #include <stddef.h>
8 
9 #include <memory>
10 #include <string>
11 #include <utility>
12 #include <vector>
13 
14 #include "ash/public/cpp/ash_features.h"
15 #include "ash/public/cpp/network_config_service.h"
16 #include "ash/public/cpp/resources/grit/ash_public_unscaled_resources.h"
17 #include "ash/public/cpp/stylus_utils.h"
18 #include "base/bind.h"
19 #include "base/bind_helpers.h"
20 #include "base/feature_list.h"
21 #include "base/memory/ptr_util.h"
22 #include "base/metrics/histogram_functions.h"
23 #include "build/build_config.h"
24 #include "chrome/browser/browser_process.h"
25 #include "chrome/browser/browser_process_platform_part.h"
26 #include "chrome/browser/chromeos/account_manager/account_manager_util.h"
27 #include "chrome/browser/chromeos/arc/arc_util.h"
28 #include "chrome/browser/chromeos/crostini/crostini_features.h"
29 #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
30 #include "chrome/browser/chromeos/login/quick_unlock/quick_unlock_utils.h"
31 #include "chrome/browser/chromeos/multidevice_setup/multidevice_setup_client_factory.h"
32 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_pref_names.h"
33 #include "chrome/browser/chromeos/plugin_vm/plugin_vm_util.h"
34 #include "chrome/browser/chromeos/profiles/profile_helper.h"
35 #include "chrome/browser/signin/identity_manager_factory.h"
36 #include "chrome/browser/ui/ui_features.h"
37 #include "chrome/browser/ui/webui/app_management/app_management.mojom.h"
38 #include "chrome/browser/ui/webui/app_management/app_management_page_handler.h"
39 #include "chrome/browser/ui/webui/chromeos/smb_shares/smb_handler.h"
40 #include "chrome/browser/ui/webui/chromeos/sync/os_sync_handler.h"
41 #include "chrome/browser/ui/webui/managed_ui_handler.h"
42 #include "chrome/browser/ui/webui/metrics_handler.h"
43 #include "chrome/browser/ui/webui/plural_string_handler.h"
44 #include "chrome/browser/ui/webui/settings/about_handler.h"
45 #include "chrome/browser/ui/webui/settings/accessibility_main_handler.h"
46 #include "chrome/browser/ui/webui/settings/browser_lifetime_handler.h"
47 #include "chrome/browser/ui/webui/settings/chromeos/accessibility_handler.h"
48 #include "chrome/browser/ui/webui/settings/chromeos/account_manager_handler.h"
49 #include "chrome/browser/ui/webui/settings/chromeos/ambient_mode_handler.h"
50 #include "chrome/browser/ui/webui/settings/chromeos/android_apps_handler.h"
51 #include "chrome/browser/ui/webui/settings/chromeos/change_picture_handler.h"
52 #include "chrome/browser/ui/webui/settings/chromeos/crostini_handler.h"
53 #include "chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h"
54 #include "chrome/browser/ui/webui/settings/chromeos/date_time_handler.h"
55 #include "chrome/browser/ui/webui/settings/chromeos/device_keyboard_handler.h"
56 #include "chrome/browser/ui/webui/settings/chromeos/device_pointer_handler.h"
57 #include "chrome/browser/ui/webui/settings/chromeos/device_power_handler.h"
58 #include "chrome/browser/ui/webui/settings/chromeos/device_storage_handler.h"
59 #include "chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.h"
60 #include "chrome/browser/ui/webui/settings/chromeos/fingerprint_handler.h"
61 #include "chrome/browser/ui/webui/settings/chromeos/google_assistant_handler.h"
62 #include "chrome/browser/ui/webui/settings/chromeos/internet_handler.h"
63 #include "chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.h"
64 #include "chrome/browser/ui/webui/settings/chromeos/multidevice_handler.h"
65 #include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider.h"
66 #include "chrome/browser/ui/webui/settings/chromeos/os_settings_localized_strings_provider_factory.h"
67 #include "chrome/browser/ui/webui/settings/chromeos/parental_controls_handler.h"
68 #include "chrome/browser/ui/webui/settings/chromeos/plugin_vm_handler.h"
69 #include "chrome/browser/ui/webui/settings/chromeos/pref_names.h"
70 #include "chrome/browser/ui/webui/settings/chromeos/quick_unlock_handler.h"
71 #include "chrome/browser/ui/webui/settings/chromeos/search/search_handler.h"
72 #include "chrome/browser/ui/webui/settings/chromeos/search/search_handler_factory.h"
73 #include "chrome/browser/ui/webui/settings/chromeos/search/settings_user_action_tracker.h"
74 #include "chrome/browser/ui/webui/settings/chromeos/wallpaper_handler.h"
75 #include "chrome/browser/ui/webui/settings/downloads_handler.h"
76 #include "chrome/browser/ui/webui/settings/extension_control_handler.h"
77 #include "chrome/browser/ui/webui/settings/font_handler.h"
78 #include "chrome/browser/ui/webui/settings/languages_handler.h"
79 #include "chrome/browser/ui/webui/settings/people_handler.h"
80 #include "chrome/browser/ui/webui/settings/profile_info_handler.h"
81 #include "chrome/browser/ui/webui/settings/protocol_handlers_handler.h"
82 #include "chrome/browser/ui/webui/settings/reset_settings_handler.h"
83 #include "chrome/browser/ui/webui/settings/search_engines_handler.h"
84 #include "chrome/browser/ui/webui/settings/settings_cookies_view_handler.h"
85 #include "chrome/browser/ui/webui/settings/settings_localized_strings_provider.h"
86 #include "chrome/browser/ui/webui/settings/settings_media_devices_selection_handler.h"
87 #include "chrome/browser/ui/webui/settings/shared_settings_localized_strings_provider.h"
88 #include "chrome/browser/ui/webui/settings/tts_handler.h"
89 #include "chrome/browser/ui/webui/webui_util.h"
90 #include "chrome/browser/web_applications/system_web_app_manager.h"
91 #include "chrome/common/chrome_features.h"
92 #include "chrome/common/webui_url_constants.h"
93 #include "chrome/grit/browser_resources.h"
94 #include "chrome/grit/generated_resources.h"
95 #include "chrome/grit/os_settings_resources.h"
96 #include "chrome/grit/os_settings_resources_map.h"
97 #include "chromeos/components/account_manager/account_manager.h"
98 #include "chromeos/components/account_manager/account_manager_factory.h"
99 #include "chromeos/components/web_applications/manifest_request_filter.h"
100 #include "chromeos/constants/chromeos_features.h"
101 #include "chromeos/constants/chromeos_pref_names.h"
102 #include "chromeos/login/auth/password_visibility_utils.h"
103 #include "chromeos/services/multidevice_setup/public/cpp/prefs.h"
104 #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
105 #include "components/password_manager/core/common/password_manager_features.h"
106 #include "components/pref_registry/pref_registry_syncable.h"
107 #include "components/prefs/pref_service.h"
108 #include "content/public/browser/web_ui_data_source.h"
109 #include "media/base/media_switches.h"
110 #include "mojo/public/cpp/bindings/pending_receiver.h"
111 #include "ui/base/webui/web_ui_util.h"
112 #include "ui/chromeos/resources/grit/ui_chromeos_resources.h"
113 #include "ui/resources/grit/webui_resources.h"
114 
115 namespace chromeos {
116 namespace settings {
117 
118 // static
RegisterProfilePrefs(user_prefs::PrefRegistrySyncable * registry)119 void OSSettingsUI::RegisterProfilePrefs(
120     user_prefs::PrefRegistrySyncable* registry) {
121   registry->RegisterBooleanPref(prefs::kSyncOsWallpaper, false);
122 }
123 
OSSettingsUI(content::WebUI * web_ui)124 OSSettingsUI::OSSettingsUI(content::WebUI* web_ui)
125     : ui::MojoWebUIController(web_ui, /*enable_chrome_send=*/true),
126       time_when_opened_(base::TimeTicks::Now()),
127       webui_load_timer_(web_ui->GetWebContents(),
128                         "ChromeOS.Settings.LoadDocumentTime",
129                         "ChromeOS.Settings.LoadCompletedTime") {
130   Profile* profile = Profile::FromWebUI(web_ui);
131   content::WebUIDataSource* html_source =
132       content::WebUIDataSource::Create(chrome::kChromeUIOSSettingsHost);
133 
134   InitOSWebUIHandlers(html_source);
135 
136   // This handler is for chrome://os-settings.
137   html_source->AddBoolean("isOSSettings", true);
138 
139   // Needed for JS code shared between browser and OS settings (for example,
140   // page_visibility.js).
141   html_source->AddBoolean("showOSSettings", true);
142 
143   html_source->AddBoolean(
144       "showParentalControls",
145       chromeos::settings::ShouldShowParentalControls(profile));
146   html_source->AddBoolean(
147       "syncSetupFriendlySettings",
148       base::FeatureList::IsEnabled(::features::kSyncSetupFriendlySettings));
149 
150   AddSettingsPageUIHandler(
151       std::make_unique<::settings::AccessibilityMainHandler>());
152   AddSettingsPageUIHandler(
153       std::make_unique<::settings::BrowserLifetimeHandler>());
154   AddSettingsPageUIHandler(std::make_unique<::settings::CookiesViewHandler>());
155   AddSettingsPageUIHandler(
156       std::make_unique<::settings::DownloadsHandler>(profile));
157   AddSettingsPageUIHandler(
158       std::make_unique<::settings::ExtensionControlHandler>());
159   AddSettingsPageUIHandler(std::make_unique<::settings::FontHandler>(web_ui));
160   AddSettingsPageUIHandler(
161       std::make_unique<::settings::LanguagesHandler>(web_ui));
162   AddSettingsPageUIHandler(
163       std::make_unique<::settings::MediaDevicesSelectionHandler>(profile));
164   if (chromeos::features::IsSplitSettingsSyncEnabled())
165     AddSettingsPageUIHandler(std::make_unique<OSSyncHandler>(profile));
166   AddSettingsPageUIHandler(
167       std::make_unique<::settings::PeopleHandler>(profile));
168   AddSettingsPageUIHandler(
169       std::make_unique<::settings::ProfileInfoHandler>(profile));
170   AddSettingsPageUIHandler(
171       std::make_unique<::settings::ProtocolHandlersHandler>());
172   AddSettingsPageUIHandler(
173       std::make_unique<::settings::SearchEnginesHandler>(profile));
174 
175   html_source->AddBoolean("showAppManagement", base::FeatureList::IsEnabled(
176                                                    ::features::kAppManagement));
177   html_source->AddBoolean("splitSettingsSyncEnabled",
178                           chromeos::features::IsSplitSettingsSyncEnabled());
179   html_source->AddBoolean("splitSyncConsent",
180                           chromeos::features::IsSplitSyncConsentEnabled());
181 
182   html_source->AddBoolean(
183       "isSupportedArcVersion",
184       AppManagementPageHandler::IsCurrentArcVersionSupported(profile));
185 
186   AddSettingsPageUIHandler(
187       base::WrapUnique(::settings::AboutHandler::Create(html_source, profile)));
188   AddSettingsPageUIHandler(base::WrapUnique(
189       ::settings::ResetSettingsHandler::Create(html_source, profile)));
190 
191   // Add the metrics handler to write uma stats.
192   web_ui->AddMessageHandler(std::make_unique<MetricsHandler>());
193 
194   // Add the System Web App resources for Settings.
195   if (web_app::SystemWebAppManager::IsEnabled()) {
196     html_source->AddResourcePath("icon-192.png", IDR_SETTINGS_LOGO_192);
197     html_source->AddResourcePath("pwa.html", IDR_PWA_HTML);
198     web_app::SetManifestRequestFilter(html_source, IDR_OS_SETTINGS_MANIFEST,
199                                       IDS_SETTINGS_SETTINGS);
200   }
201 
202 #if BUILDFLAG(OPTIMIZE_WEBUI)
203   html_source->AddResourcePath("crisper.js", IDR_OS_SETTINGS_CRISPER_JS);
204   html_source->AddResourcePath("lazy_load.crisper.js",
205                                IDR_OS_SETTINGS_LAZY_LOAD_CRISPER_JS);
206   html_source->AddResourcePath("chromeos/lazy_load.html",
207                                IDR_OS_SETTINGS_LAZY_LOAD_VULCANIZED_HTML);
208   html_source->SetDefaultResource(IDR_OS_SETTINGS_VULCANIZED_HTML);
209 #else
210   // Add all settings resources.
211   for (size_t i = 0; i < kOsSettingsResourcesSize; ++i) {
212     html_source->AddResourcePath(kOsSettingsResources[i].name,
213                                  kOsSettingsResources[i].value);
214   }
215   html_source->SetDefaultResource(IDR_OS_SETTINGS_SETTINGS_HTML);
216 #endif
217 
218   html_source->AddResourcePath("app-management/app_management.mojom-lite.js",
219                                IDR_OS_SETTINGS_APP_MANAGEMENT_MOJO_LITE_JS);
220   html_source->AddResourcePath(
221       "app-management/types.mojom-lite.js",
222       IDR_OS_SETTINGS_APP_MANAGEMENT_TYPES_MOJO_LITE_JS);
223   html_source->AddResourcePath(
224       "app-management/bitmap.mojom-lite.js",
225       IDR_OS_SETTINGS_APP_MANAGEMENT_BITMAP_MOJO_LITE_JS);
226   html_source->AddResourcePath(
227       "app-management/file_path.mojom-lite.js",
228       IDR_OS_SETTINGS_APP_MANAGEMENT_FILE_PATH_MOJO_LITE_JS);
229   html_source->AddResourcePath(
230       "app-management/image.mojom-lite.js",
231       IDR_OS_SETTINGS_APP_MANAGEMENT_IMAGE_MOJO_LITE_JS);
232   html_source->AddResourcePath(
233       "app-management/image_info.mojom-lite.js",
234       IDR_OS_SETTINGS_APP_MANAGEMENT_IMAGE_INFO_MOJO_LITE_JS);
235 
236   html_source->AddResourcePath(
237       "search/user_action_recorder.mojom-lite.js",
238       IDR_OS_SETTINGS_USER_ACTION_RECORDER_MOJOM_LITE_JS);
239   html_source->AddResourcePath(
240       "search/search_result_icon.mojom-lite.js",
241       IDR_OS_SETTINGS_SEARCH_RESULT_ICON_MOJOM_LITE_JS);
242   html_source->AddResourcePath("search/search.mojom-lite.js",
243                                IDR_OS_SETTINGS_SEARCH_MOJOM_LITE_JS);
244 
245   // AddOsLocalizedStrings must be added after AddBrowserLocalizedStrings
246   // as repeated keys used by the OS strings should override the same keys
247   // that may be used in the Browser string provider.
248   OsSettingsLocalizedStringsProviderFactory::GetForProfile(profile)
249       ->AddOsLocalizedStrings(html_source, profile);
250 
251   auto plural_string_handler = std::make_unique<PluralStringHandler>();
252   plural_string_handler->AddLocalizedString("profileLabel",
253                                             IDS_OS_SETTINGS_PROFILE_LABEL);
254   web_ui->AddMessageHandler(std::move(plural_string_handler));
255 
256   ManagedUIHandler::Initialize(web_ui, html_source);
257 
258   content::WebUIDataSource::Add(web_ui->GetWebContents()->GetBrowserContext(),
259                                 html_source);
260 }
261 
~OSSettingsUI()262 OSSettingsUI::~OSSettingsUI() {
263   // Note: OSSettingsUI lifetime is tied to the lifetime of the browser window.
264   base::UmaHistogramCustomTimes("ChromeOS.Settings.WindowOpenDuration",
265                                 base::TimeTicks::Now() - time_when_opened_,
266                                 /*min=*/base::TimeDelta::FromMicroseconds(500),
267                                 /*max=*/base::TimeDelta::FromHours(1),
268                                 /*buckets=*/50);
269 }
270 
InitOSWebUIHandlers(content::WebUIDataSource * html_source)271 void OSSettingsUI::InitOSWebUIHandlers(content::WebUIDataSource* html_source) {
272   Profile* profile = Profile::FromWebUI(web_ui());
273 
274   // TODO(jamescook): Sort out how account management is split between Chrome OS
275   // and browser settings.
276   if (chromeos::IsAccountManagerAvailable(profile)) {
277     chromeos::AccountManagerFactory* factory =
278         g_browser_process->platform_part()->GetAccountManagerFactory();
279     chromeos::AccountManager* account_manager =
280         factory->GetAccountManager(profile->GetPath().value());
281     DCHECK(account_manager);
282 
283     web_ui()->AddMessageHandler(
284         std::make_unique<chromeos::settings::AccountManagerUIHandler>(
285             account_manager, IdentityManagerFactory::GetForProfile(profile)));
286     html_source->AddBoolean(
287         "secondaryGoogleAccountSigninAllowed",
288         profile->GetPrefs()->GetBoolean(
289             chromeos::prefs::kSecondaryGoogleAccountSigninAllowed));
290     html_source->AddBoolean("isEduCoexistenceEnabled",
291                             features::IsEduCoexistenceEnabled());
292   }
293 
294   web_ui()->AddMessageHandler(
295       std::make_unique<chromeos::settings::ChangePictureHandler>());
296 
297   web_ui()->AddMessageHandler(
298       std::make_unique<chromeos::settings::AccessibilityHandler>(profile));
299   web_ui()->AddMessageHandler(
300       std::make_unique<chromeos::settings::AndroidAppsHandler>(profile));
301   if (crostini::CrostiniFeatures::Get()->IsUIAllowed(profile,
302                                                      /*check_policy=*/false)) {
303     web_ui()->AddMessageHandler(
304         std::make_unique<chromeos::settings::CrostiniHandler>(profile));
305   }
306   web_ui()->AddMessageHandler(
307       chromeos::settings::CupsPrintersHandler::Create(web_ui()));
308   web_ui()->AddMessageHandler(base::WrapUnique(
309       chromeos::settings::DateTimeHandler::Create(html_source)));
310   web_ui()->AddMessageHandler(
311       std::make_unique<chromeos::settings::FingerprintHandler>(profile));
312   web_ui()->AddMessageHandler(
313       std::make_unique<chromeos::settings::GoogleAssistantHandler>(profile));
314 
315   std::unique_ptr<chromeos::settings::KerberosAccountsHandler>
316       kerberos_accounts_handler =
317           chromeos::settings::KerberosAccountsHandler::CreateIfKerberosEnabled(
318               profile);
319   if (kerberos_accounts_handler) {
320     // Note that the UI is enabled only if Kerberos is enabled.
321     web_ui()->AddMessageHandler(std::move(kerberos_accounts_handler));
322   }
323 
324   web_ui()->AddMessageHandler(
325       std::make_unique<chromeos::settings::KeyboardHandler>());
326 
327   web_ui()->AddMessageHandler(
328       std::make_unique<chromeos::settings::WallpaperHandler>(web_ui()));
329 
330   // If |!allow_plugin_vm| we still want to |show_plugin_vm| if the VM image is
331   // on disk, so that users are still able to delete the image at will.
332   const bool allow_plugin_vm = plugin_vm::IsPluginVmAllowedForProfile(profile);
333   const bool show_plugin_vm =
334       allow_plugin_vm ||
335       profile->GetPrefs()->GetBoolean(plugin_vm::prefs::kPluginVmImageExists);
336 
337   if (show_plugin_vm) {
338     web_ui()->AddMessageHandler(
339         std::make_unique<chromeos::settings::PluginVmHandler>(profile));
340   }
341   web_ui()->AddMessageHandler(
342       std::make_unique<chromeos::settings::PointerHandler>());
343   web_ui()->AddMessageHandler(
344       std::make_unique<chromeos::settings::QuickUnlockHandler>());
345   web_ui()->AddMessageHandler(
346       std::make_unique<chromeos::settings::StorageHandler>(profile,
347                                                            html_source));
348   web_ui()->AddMessageHandler(
349       std::make_unique<chromeos::settings::StylusHandler>());
350   web_ui()->AddMessageHandler(
351       std::make_unique<chromeos::settings::InternetHandler>(profile));
352   web_ui()->AddMessageHandler(std::make_unique<::settings::TtsHandler>());
353   web_ui()->AddMessageHandler(
354       std::make_unique<chromeos::smb_dialog::SmbHandler>(profile,
355                                                          base::DoNothing()));
356 
357   if (!profile->IsGuestSession()) {
358     chromeos::android_sms::AndroidSmsService* android_sms_service =
359         chromeos::android_sms::AndroidSmsServiceFactory::GetForBrowserContext(
360             profile);
361     web_ui()->AddMessageHandler(
362         std::make_unique<chromeos::settings::MultideviceHandler>(
363             profile->GetPrefs(),
364             chromeos::multidevice_setup::MultiDeviceSetupClientFactory::
365                 GetForProfile(profile),
366             android_sms_service
367                 ? android_sms_service->android_sms_pairing_state_tracker()
368                 : nullptr,
369             android_sms_service ? android_sms_service->android_sms_app_manager()
370                                 : nullptr));
371     if (chromeos::settings::ShouldShowParentalControls(profile)) {
372       web_ui()->AddMessageHandler(
373           std::make_unique<chromeos::settings::ParentalControlsHandler>(
374               profile));
375     }
376 
377     if (chromeos::features::IsAmbientModeEnabled()) {
378       web_ui()->AddMessageHandler(
379           std::make_unique<chromeos::settings::AmbientModeHandler>());
380     }
381   }
382 
383   html_source->AddBoolean(
384       "privacySettingsRedesignEnabled",
385       base::FeatureList::IsEnabled(::features::kPrivacySettingsRedesign));
386 
387   html_source->AddBoolean(
388       "multideviceAllowedByPolicy",
389       chromeos::multidevice_setup::AreAnyMultiDeviceFeaturesAllowed(
390           profile->GetPrefs()));
391   html_source->AddBoolean(
392       "quickUnlockEnabled",
393       chromeos::quick_unlock::IsPinEnabled(profile->GetPrefs()));
394   html_source->AddBoolean(
395       "quickUnlockDisabledByPolicy",
396       chromeos::quick_unlock::IsPinDisabledByPolicy(profile->GetPrefs()));
397   html_source->AddBoolean(
398       "userCannotManuallyEnterPassword",
399       !chromeos::password_visibility::AccountHasUserFacingPassword(
400           chromeos::ProfileHelper::Get()
401               ->GetUserByProfile(profile)
402               ->GetAccountId()));
403   const bool fingerprint_unlock_enabled =
404       chromeos::quick_unlock::IsFingerprintEnabled(profile);
405   html_source->AddBoolean("fingerprintUnlockEnabled",
406                           fingerprint_unlock_enabled);
407   if (fingerprint_unlock_enabled) {
408     html_source->AddInteger(
409         "fingerprintReaderLocation",
410         static_cast<int32_t>(chromeos::quick_unlock::GetFingerprintLocation()));
411 
412     // To use lottie, the worker-src CSP needs to be updated for the web ui that
413     // is using it. Since as of now there are only a couple of webuis using
414     // lottie animations, this update has to be performed manually. As the usage
415     // increases, set this as the default so manual override is no longer
416     // required.
417     html_source->OverrideContentSecurityPolicyWorkerSrc(
418         "worker-src blob: 'self';");
419     html_source->AddResourcePath("finger_print.json",
420                                  IDR_LOGIN_FINGER_PRINT_TABLET_ANIMATION);
421   }
422   html_source->AddBoolean("lockScreenNotificationsEnabled",
423                           ash::features::IsLockScreenNotificationsEnabled());
424   html_source->AddBoolean(
425       "lockScreenHideSensitiveNotificationsSupported",
426       ash::features::IsLockScreenHideSensitiveNotificationsSupported());
427   html_source->AddBoolean("showTechnologyBadge",
428                           !ash::features::IsSeparateNetworkIconsEnabled());
429   html_source->AddBoolean("hasInternalStylus",
430                           ash::stylus_utils::HasInternalStylus());
431 
432   html_source->AddBoolean("showCrostini",
433                           crostini::CrostiniFeatures::Get()->IsUIAllowed(
434                               profile, /*check_policy=*/false));
435 
436   html_source->AddBoolean(
437       "allowCrostini", crostini::CrostiniFeatures::Get()->IsUIAllowed(profile));
438 
439   html_source->AddBoolean("allowPluginVm", allow_plugin_vm);
440   html_source->AddBoolean("showPluginVm", show_plugin_vm);
441 
442   html_source->AddBoolean("isDemoSession",
443                           chromeos::DemoSession::IsDeviceInDemoMode());
444 
445   // We have 2 variants of Android apps settings. Default case, when the Play
446   // Store app exists we show expandable section that allows as to
447   // enable/disable the Play Store and link to Android settings which is
448   // available once settings app is registered in the system.
449   // For AOSP images we don't have the Play Store app. In last case we Android
450   // apps settings consists only from root link to Android settings and only
451   // visible once settings app is registered.
452   html_source->AddBoolean("androidAppsVisible",
453                           arc::IsArcAllowedForProfile(profile));
454   html_source->AddBoolean("havePlayStoreApp", arc::IsPlayStoreAvailable());
455 
456   html_source->AddBoolean("enablePowerSettings", true);
457   web_ui()->AddMessageHandler(
458       std::make_unique<chromeos::settings::PowerHandler>(profile->GetPrefs()));
459 
460   html_source->AddBoolean(
461       "showParentalControlsSettings",
462       chromeos::settings::ShouldShowParentalControls(profile));
463 }
464 
AddSettingsPageUIHandler(std::unique_ptr<content::WebUIMessageHandler> handler)465 void OSSettingsUI::AddSettingsPageUIHandler(
466     std::unique_ptr<content::WebUIMessageHandler> handler) {
467   DCHECK(handler);
468   web_ui()->AddMessageHandler(std::move(handler));
469 }
470 
BindInterface(mojo::PendingReceiver<network_config::mojom::CrosNetworkConfig> receiver)471 void OSSettingsUI::BindInterface(
472     mojo::PendingReceiver<network_config::mojom::CrosNetworkConfig> receiver) {
473   ash::GetNetworkConfigService(std::move(receiver));
474 }
475 
BindInterface(mojo::PendingReceiver<mojom::UserActionRecorder> receiver)476 void OSSettingsUI::BindInterface(
477     mojo::PendingReceiver<mojom::UserActionRecorder> receiver) {
478   user_action_recorder_ =
479       std::make_unique<SettingsUserActionTracker>(std::move(receiver));
480 }
481 
BindInterface(mojo::PendingReceiver<mojom::SearchHandler> receiver)482 void OSSettingsUI::BindInterface(
483     mojo::PendingReceiver<mojom::SearchHandler> receiver) {
484   SearchHandlerFactory::GetForProfile(Profile::FromWebUI(web_ui()))
485       ->BindInterface(std::move(receiver));
486 }
487 
BindInterface(mojo::PendingReceiver<app_management::mojom::PageHandlerFactory> receiver)488 void OSSettingsUI::BindInterface(
489     mojo::PendingReceiver<app_management::mojom::PageHandlerFactory> receiver) {
490   if (!app_management_page_handler_factory_) {
491     app_management_page_handler_factory_ =
492         std::make_unique<AppManagementPageHandlerFactory>(
493             Profile::FromWebUI(web_ui()));
494   }
495   app_management_page_handler_factory_->Bind(std::move(receiver));
496 }
497 
498 WEB_UI_CONTROLLER_TYPE_IMPL(OSSettingsUI)
499 
500 }  // namespace settings
501 }  // namespace chromeos
502