| // Copyright 2020 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 "chrome/browser/ui/webui/settings/chromeos/about_section.h" | 
 |  | 
 | #include "ash/constants/ash_features.h" | 
 | #include "base/command_line.h" | 
 | #include "base/feature_list.h" | 
 | #include "base/i18n/message_formatter.h" | 
 | #include "base/no_destructor.h" | 
 | #include "base/strings/string_split.h" | 
 | #include "base/strings/utf_string_conversions.h" | 
 | #include "base/system/sys_info.h" | 
 | #include "chrome/browser/ash/arc/arc_util.h" | 
 | #include "chrome/browser/obsolete_system/obsolete_system.h" | 
 | #include "chrome/browser/ui/webui/management/management_ui.h" | 
 | #include "chrome/browser/ui/webui/settings/about_handler.h" | 
 | #include "chrome/browser/ui/webui/settings/chromeos/device_name_handler.h" | 
 | #include "chrome/browser/ui/webui/settings/chromeos/search/search_tag_registry.h" | 
 | #include "chrome/browser/ui/webui/version/version_ui.h" | 
 | #include "chrome/browser/ui/webui/webui_util.h" | 
 | #include "chrome/common/channel_info.h" | 
 | #include "chrome/common/pref_names.h" | 
 | #include "chrome/common/url_constants.h" | 
 | #include "chrome/grit/chromium_strings.h" | 
 | #include "chrome/grit/generated_resources.h" | 
 | #include "chromeos/dbus/constants/dbus_switches.h" | 
 | #include "components/prefs/pref_service.h" | 
 | #include "components/strings/grit/components_chromium_strings.h" | 
 | #include "components/strings/grit/components_strings.h" | 
 | #include "components/user_manager/user_manager.h" | 
 | #include "components/version_info/version_info.h" | 
 | #include "components/version_ui/version_ui_constants.h" | 
 | #include "content/public/browser/web_ui_data_source.h" | 
 | #include "ui/base/l10n/l10n_util.h" | 
 | #include "ui/base/webui/web_ui_util.h" | 
 | #include "ui/chromeos/devicetype_utils.h" | 
 |  | 
 | namespace chromeos { | 
 | namespace settings { | 
 | namespace { | 
 |  | 
 | const std::vector<SearchConcept>& GetAboutSearchConcepts() { | 
 |   static const base::NoDestructor<std::vector<SearchConcept>> tags({ | 
 |       {IDS_OS_SETTINGS_TAG_ABOUT_CHROME_OS_DETAILED_BUILD, | 
 |        mojom::kDetailedBuildInfoSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSubpage, | 
 |        {.subpage = mojom::Subpage::kDetailedBuildInfo}}, | 
 |       {IDS_SETTINGS_ABOUT_OS, | 
 |        mojom::kAboutChromeOsDetailsSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSubpage, | 
 |        {.subpage = mojom::Subpage::kAboutChromeOsDetails}}, | 
 |       {IDS_OS_SETTINGS_TAG_OS_VERSION, | 
 |        mojom::kAboutChromeOsDetailsSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSubpage, | 
 |        {.subpage = mojom::Subpage::kAboutChromeOsDetails}}, | 
 |       {IDS_OS_SETTINGS_TAG_ABOUT_CHROME_OS_CHANNEL, | 
 |        mojom::kDetailedBuildInfoSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSetting, | 
 |        {.setting = mojom::Setting::kChangeChromeChannel}}, | 
 |       {IDS_OS_SETTINGS_TAG_ABOUT_CHROME_OS_COPY_DETAILED_BUILD, | 
 |        mojom::kDetailedBuildInfoSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSetting, | 
 |        {.setting = mojom::Setting::kCopyDetailedBuildInfo}}, | 
 |       {IDS_OS_SETTINGS_TAG_ABOUT_OS_UPDATE, | 
 |        mojom::kAboutChromeOsDetailsSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSetting, | 
 |        {.setting = mojom::Setting::kCheckForOsUpdate}}, | 
 |       {IDS_OS_SETTINGS_TAG_ABOUT_HELP, | 
 |        mojom::kAboutChromeOsDetailsSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSetting, | 
 |        {.setting = mojom::Setting::kGetHelpWithChromeOs}}, | 
 |       {IDS_OS_SETTINGS_TAG_ABOUT_RELEASE_NOTES, | 
 |        mojom::kAboutChromeOsDetailsSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSetting, | 
 |        {.setting = mojom::Setting::kSeeWhatsNew}, | 
 |        {IDS_OS_SETTINGS_TAG_ABOUT_RELEASE_NOTES_ALT1, | 
 |         SearchConcept::kAltTagEnd}}, | 
 |   }); | 
 |   return *tags; | 
 | } | 
 |  | 
 | const std::vector<SearchConcept>& GetDiagnosticsAppSearchConcepts() { | 
 |   static const base::NoDestructor<std::vector<SearchConcept>> tags({ | 
 |       {IDS_OS_SETTINGS_TAG_ABOUT_DIAGNOSTICS, | 
 |        mojom::kAboutChromeOsDetailsSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSetting, | 
 |        {.setting = mojom::Setting::kDiagnostics}, | 
 |        {IDS_OS_SETTINGS_TAG_ABOUT_DIAGNOSTICS_ALT1, | 
 |         IDS_OS_SETTINGS_TAG_ABOUT_DIAGNOSTICS_ALT2, | 
 |         IDS_OS_SETTINGS_TAG_ABOUT_DIAGNOSTICS_ALT3, | 
 |         IDS_OS_SETTINGS_TAG_ABOUT_DIAGNOSTICS_ALT4, SearchConcept::kAltTagEnd}}, | 
 |   }); | 
 |   return *tags; | 
 | } | 
 |  | 
 | #if BUILDFLAG(GOOGLE_CHROME_BRANDING) | 
 | const std::vector<SearchConcept>& GetAboutTermsOfServiceSearchConcepts() { | 
 |   static const base::NoDestructor<std::vector<SearchConcept>> tags({ | 
 |       {IDS_OS_SETTINGS_TAG_ABOUT_TERMS_OF_SERVICE, | 
 |        mojom::kAboutChromeOsDetailsSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSetting, | 
 |        {.setting = mojom::Setting::kTermsOfService}}, | 
 |   }); | 
 |   return *tags; | 
 | } | 
 |  | 
 | const std::vector<SearchConcept>& GetAboutReportIssueSearchConcepts() { | 
 |   static const base::NoDestructor<std::vector<SearchConcept>> tags({ | 
 |       {IDS_OS_SETTINGS_TAG_ABOUT_REPORT_ISSUE, | 
 |        mojom::kAboutChromeOsDetailsSubpagePath, | 
 |        mojom::SearchResultIcon::kChrome, | 
 |        mojom::SearchResultDefaultRank::kMedium, | 
 |        mojom::SearchResultType::kSetting, | 
 |        {.setting = mojom::Setting::kReportAnIssue}, | 
 |        {IDS_OS_SETTINGS_TAG_ABOUT_REPORT_ISSUE_ALT1, | 
 |         SearchConcept::kAltTagEnd}}, | 
 |   }); | 
 |   return *tags; | 
 | } | 
 | #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING) | 
 |  | 
 | // Returns the link to the safety info for the device (if it exists). | 
 | std::string GetSafetyInfoLink() { | 
 |   const std::vector<std::string> board = | 
 |       base::SplitString(base::SysInfo::GetLsbReleaseBoard(), "-", | 
 |                         base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); | 
 |   if (board[0] == "nocturne") { | 
 |     return chrome::kChromeUISafetyPixelSlateURL; | 
 |   } | 
 |   if (board[0] == "eve" || board[0] == "atlas") { | 
 |     return chrome::kChromeUISafetyPixelbookURL; | 
 |   } | 
 |  | 
 |   return std::string(); | 
 | } | 
 |  | 
 | }  // namespace | 
 |  | 
 | #if BUILDFLAG(GOOGLE_CHROME_BRANDING) | 
 | AboutSection::AboutSection(Profile* profile, | 
 |                            SearchTagRegistry* search_tag_registry, | 
 |                            PrefService* pref_service) | 
 |     : AboutSection(profile, search_tag_registry) { | 
 |   pref_service_ = pref_service; | 
 |  | 
 |   SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate(); | 
 |   updater.AddSearchTags(GetAboutTermsOfServiceSearchConcepts()); | 
 |  | 
 |   pref_change_registrar_.Init(pref_service_); | 
 |   pref_change_registrar_.Add( | 
 |       prefs::kUserFeedbackAllowed, | 
 |       base::BindRepeating(&AboutSection::UpdateReportIssueSearchTags, | 
 |                           base::Unretained(this))); | 
 |   UpdateReportIssueSearchTags(); | 
 | } | 
 | #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING) | 
 |  | 
 | AboutSection::AboutSection(Profile* profile, | 
 |                            SearchTagRegistry* search_tag_registry) | 
 |     : OsSettingsSection(profile, search_tag_registry) { | 
 |   SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate(); | 
 |   updater.AddSearchTags(GetAboutSearchConcepts()); | 
 |  | 
 |   if (base::FeatureList::IsEnabled(chromeos::features::kDiagnosticsApp)) { | 
 |     updater.AddSearchTags(GetDiagnosticsAppSearchConcepts()); | 
 |   } | 
 | } | 
 |  | 
 | AboutSection::~AboutSection() = default; | 
 |  | 
 | void AboutSection::AddLoadTimeData(content::WebUIDataSource* html_source) { | 
 |   // Top level About page strings. | 
 |   static constexpr webui::LocalizedString kLocalizedStrings[] = { | 
 |     {"aboutProductLogoAlt", IDS_SHORT_PRODUCT_LOGO_ALT_TEXT}, | 
 | #if BUILDFLAG(GOOGLE_CHROME_BRANDING) | 
 |     {"aboutReportAnIssue", IDS_SETTINGS_ABOUT_PAGE_REPORT_AN_ISSUE}, | 
 | #endif | 
 |     {"aboutDiagnostics", IDS_SETTINGS_ABOUT_PAGE_DIAGNOSTICS}, | 
 |     {"aboutRelaunch", IDS_SETTINGS_ABOUT_PAGE_RELAUNCH}, | 
 |     {"aboutUpgradeCheckStarted", IDS_SETTINGS_ABOUT_UPGRADE_CHECK_STARTED}, | 
 |     {"aboutUpgradeRelaunch", IDS_SETTINGS_UPGRADE_SUCCESSFUL_RELAUNCH}, | 
 |     {"aboutUpgradeUpdating", IDS_SETTINGS_UPGRADE_UPDATING}, | 
 |     {"aboutUpgradeUpdatingPercent", IDS_SETTINGS_UPGRADE_UPDATING_PERCENT}, | 
 |     {"aboutGetHelpUsingChrome", IDS_SETTINGS_GET_HELP_USING_CHROME}, | 
 |     {"aboutPageTitle", IDS_SETTINGS_ABOUT_PROGRAM}, | 
 |     {"aboutProductTitle", IDS_PRODUCT_NAME}, | 
 |  | 
 |     {"aboutEndOfLifeTitle", IDS_SETTINGS_ABOUT_PAGE_END_OF_LIFE_TITLE}, | 
 |     {"aboutDeviceName", IDS_SETTINGS_ABOUT_PAGE_DEVICE_NAME}, | 
 |     {"aboutRelaunchAndPowerwash", | 
 |      IDS_SETTINGS_ABOUT_PAGE_RELAUNCH_AND_POWERWASH}, | 
 |     {"aboutRollbackInProgress", IDS_SETTINGS_UPGRADE_ROLLBACK_IN_PROGRESS}, | 
 |     {"aboutRollbackSuccess", IDS_SETTINGS_UPGRADE_ROLLBACK_SUCCESS}, | 
 |     {"aboutUpgradeUpdatingChannelSwitch", | 
 |      IDS_SETTINGS_UPGRADE_UPDATING_CHANNEL_SWITCH}, | 
 |     {"aboutUpgradeSuccessChannelSwitch", | 
 |      IDS_SETTINGS_UPGRADE_SUCCESSFUL_CHANNEL_SWITCH}, | 
 |     {"aboutTPMFirmwareUpdateTitle", | 
 |      IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_TITLE}, | 
 |     {"aboutTPMFirmwareUpdateDescription", | 
 |      IDS_SETTINGS_ABOUT_TPM_FIRMWARE_UPDATE_DESCRIPTION}, | 
 |  | 
 |     // About page, channel switcher dialog. | 
 |     {"aboutChangeChannel", IDS_SETTINGS_ABOUT_PAGE_CHANGE_CHANNEL}, | 
 |     {"aboutChangeChannelAndPowerwash", | 
 |      IDS_SETTINGS_ABOUT_PAGE_CHANGE_CHANNEL_AND_POWERWASH}, | 
 |     {"aboutDelayedWarningMessage", | 
 |      IDS_SETTINGS_ABOUT_PAGE_DELAYED_WARNING_MESSAGE}, | 
 |     {"aboutDelayedWarningTitle", IDS_SETTINGS_ABOUT_PAGE_DELAYED_WARNING_TITLE}, | 
 |     {"aboutPowerwashWarningMessage", | 
 |      IDS_SETTINGS_ABOUT_PAGE_POWERWASH_WARNING_MESSAGE}, | 
 |     {"aboutPowerwashWarningTitle", | 
 |      IDS_SETTINGS_ABOUT_PAGE_POWERWASH_WARNING_TITLE}, | 
 |     {"aboutUnstableWarningMessage", | 
 |      IDS_SETTINGS_ABOUT_PAGE_UNSTABLE_WARNING_MESSAGE}, | 
 |     {"aboutUnstableWarningTitle", | 
 |      IDS_SETTINGS_ABOUT_PAGE_UNSTABLE_WARNING_TITLE}, | 
 |     {"aboutChannelDialogBeta", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_BETA}, | 
 |     {"aboutChannelDialogDev", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_DEV}, | 
 |     {"aboutChannelDialogStable", IDS_SETTINGS_ABOUT_PAGE_DIALOG_CHANNEL_STABLE}, | 
 |  | 
 |     // About page, edit device name dialog. | 
 |     {"aboutEditDeviceName", IDS_SETTINGS_ABOUT_PAGE_EDIT_DEVICE_NAME}, | 
 |     {"aboutDeviceNameInfo", IDS_SETTINGS_ABOUT_PAGE_DEVICE_NAME_INFO}, | 
 |     {"aboutDeviceNameConstraints", | 
 |      IDS_SETTINGS_ABOUT_PAGE_DEVICE_NAME_CONSTRAINTS}, | 
 |  | 
 |     // About page, update warning dialog. | 
 |     {"aboutUpdateWarningMessage", | 
 |      IDS_SETTINGS_ABOUT_PAGE_UPDATE_WARNING_MESSAGE}, | 
 |     {"aboutUpdateWarningTitle", IDS_SETTINGS_ABOUT_PAGE_UPDATE_WARNING_TITLE}, | 
 |  | 
 |     // Detailed build information | 
 |     {"aboutBuildDetailsTitle", IDS_OS_SETTINGS_ABOUT_PAGE_BUILD_DETAILS}, | 
 |     {"aboutChannelBeta", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_BETA}, | 
 |     {"aboutChannelCanary", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_CANARY}, | 
 |     {"aboutChannelDev", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_DEV}, | 
 |     {"aboutChannelLabel", IDS_SETTINGS_ABOUT_PAGE_CHANNEL}, | 
 |     {"aboutChannelStable", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_STABLE}, | 
 |     {"aboutChannelLongTermStable", | 
 |      IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL_STABLE_TT}, | 
 |     {"aboutCheckForUpdates", IDS_SETTINGS_ABOUT_PAGE_CHECK_FOR_UPDATES}, | 
 |     {"aboutCurrentlyOnChannel", IDS_SETTINGS_ABOUT_PAGE_CURRENT_CHANNEL}, | 
 |     {"aboutDetailedBuildInfo", IDS_SETTINGS_ABOUT_PAGE_DETAILED_BUILD_INFO}, | 
 |     {version_ui::kApplicationLabel, IDS_PRODUCT_NAME}, | 
 |     {version_ui::kPlatform, IDS_PLATFORM_LABEL}, | 
 |     {version_ui::kFirmwareVersion, IDS_VERSION_UI_FIRMWARE_VERSION}, | 
 |     {version_ui::kARC, IDS_ARC_LABEL}, | 
 |     {"aboutBuildDetailsCopyTooltipLabel", | 
 |      IDS_OS_SETTINGS_ABOUT_PAGE_BUILD_DETAILS_COPY_TOOLTIP_LABEL}, | 
 |     {"aboutIsArcStatusTitle", IDS_OS_SETTINGS_ABOUT_ARC_STATUS_TITLE}, | 
 |     {"aboutIsDeveloperModeTitle", IDS_OS_SETTINGS_ABOUT_DEVELOPER_MODE}, | 
 |     {"isEnterpriseManagedTitle", | 
 |      IDS_OS_SETTINGS_ABOUT_PAGE_ENTERPRISE_ENNROLLED_TITLE}, | 
 |     {"aboutOsPageTitle", IDS_SETTINGS_ABOUT_OS}, | 
 |     {"aboutGetHelpUsingChromeOs", IDS_SETTINGS_GET_HELP_USING_CHROME_OS}, | 
 |     {"aboutOsProductTitle", IDS_PRODUCT_OS_NAME}, | 
 |     {"aboutReleaseNotesOffline", IDS_SETTINGS_ABOUT_PAGE_RELEASE_NOTES}, | 
 |     {"aboutShowReleaseNotes", IDS_SETTINGS_ABOUT_PAGE_SHOW_RELEASE_NOTES}, | 
 |     {"aboutManagedEndOfLifeSubtitle", | 
 |      IDS_SETTINGS_ABOUT_PAGE_MANAGED_END_OF_LIFE_SUBTITLE}, | 
 |   }; | 
 |   html_source->AddLocalizedStrings(kLocalizedStrings); | 
 |  | 
 |   html_source->AddString("aboutTPMFirmwareUpdateLearnMoreURL", | 
 |                          chrome::kTPMFirmwareUpdateLearnMoreURL); | 
 |   html_source->AddString( | 
 |       "aboutUpgradeUpToDate", | 
 |       ui::SubstituteChromeOSDeviceType(IDS_SETTINGS_UPGRADE_UP_TO_DATE)); | 
 |   html_source->AddString("managementPage", | 
 |                          ManagementUI::GetManagementPageSubtitle(profile())); | 
 |  | 
 |   if (user_manager::UserManager::IsInitialized()) { | 
 |     user_manager::UserManager* user_manager = user_manager::UserManager::Get(); | 
 |     if (!webui::IsEnterpriseManaged() && !user_manager->IsCurrentUserOwner()) { | 
 |       html_source->AddString("ownerEmail", | 
 |                              user_manager->GetOwnerAccountId().GetUserEmail()); | 
 |     } | 
 |   } | 
 |  | 
 |   html_source->AddString( | 
 |       "aboutBrowserVersion", | 
 |       l10n_util::GetStringFUTF16( | 
 |           IDS_SETTINGS_ABOUT_PAGE_BROWSER_VERSION, | 
 |           base::UTF8ToUTF16(version_info::GetVersionNumber()), | 
 |           l10n_util::GetStringUTF16(version_info::IsOfficialBuild() | 
 |                                         ? IDS_VERSION_UI_OFFICIAL | 
 |                                         : IDS_VERSION_UI_UNOFFICIAL), | 
 |           // Extended stable channel is not supported on Chrome OS Ash. | 
 |           base::UTF8ToUTF16( | 
 |               chrome::GetChannelName(chrome::WithExtendedStable(false))), | 
 |           l10n_util::GetStringUTF16(VersionUI::VersionProcessorVariation()))); | 
 |   html_source->AddString( | 
 |       "aboutProductCopyright", | 
 |       base::i18n::MessageFormatter::FormatWithNumberedArgs( | 
 |           l10n_util::GetStringUTF16(IDS_ABOUT_VERSION_COPYRIGHT), | 
 |           base::Time::Now())); | 
 |  | 
 |   std::u16string license = l10n_util::GetStringFUTF16( | 
 |       IDS_VERSION_UI_LICENSE, base::ASCIIToUTF16(chrome::kChromiumProjectURL), | 
 |       base::ASCIIToUTF16(chrome::kChromeUICreditsURL)); | 
 |   html_source->AddString("aboutProductLicense", license); | 
 |  | 
 |   std::u16string os_license = l10n_util::GetStringFUTF16( | 
 |       IDS_ABOUT_CROS_VERSION_LICENSE, | 
 |       base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL)); | 
 |   html_source->AddString("aboutProductOsLicense", os_license); | 
 |   std::u16string os_with_linux_license = l10n_util::GetStringFUTF16( | 
 |       IDS_ABOUT_CROS_WITH_LINUX_VERSION_LICENSE, | 
 |       base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL), | 
 |       base::ASCIIToUTF16(chrome::kChromeUICrostiniCreditsURL)); | 
 |   html_source->AddString("aboutProductOsWithLinuxLicense", | 
 |                          os_with_linux_license); | 
 |   html_source->AddBoolean("aboutEnterpriseManaged", | 
 |                           webui::IsEnterpriseManaged()); | 
 |   html_source->AddBoolean("aboutIsArcEnabled", | 
 |                           arc::IsArcPlayStoreEnabledForProfile(profile())); | 
 |   html_source->AddBoolean("aboutIsDeveloperMode", | 
 |                           base::CommandLine::ForCurrentProcess()->HasSwitch( | 
 |                               chromeos::switches::kSystemDevMode)); | 
 |   html_source->AddBoolean("isHostnameSettingEnabled", | 
 |                           features::IsHostnameSettingEnabled()); | 
 |  | 
 |   html_source->AddString("endOfLifeMessage", | 
 |                          l10n_util::GetStringFUTF16( | 
 |                              IDS_SETTINGS_ABOUT_PAGE_LAST_UPDATE_MESSAGE, | 
 |                              ui::GetChromeOSDeviceName(), | 
 |                              base::ASCIIToUTF16(chrome::kEolNotificationURL))); | 
 |  | 
 |   std::string safetyInfoLink = GetSafetyInfoLink(); | 
 |   html_source->AddBoolean("shouldShowSafetyInfo", !safetyInfoLink.empty()); | 
 |  | 
 |   html_source->AddBoolean( | 
 |       "diagnosticsAppEnabled", | 
 |       base::FeatureList::IsEnabled(chromeos::features::kDiagnosticsApp)); | 
 |  | 
 | #if BUILDFLAG(GOOGLE_CHROME_BRANDING) | 
 |   html_source->AddString("aboutTermsURL", chrome::kChromeUITermsURL); | 
 |   html_source->AddLocalizedString("aboutProductTos", | 
 |                                   IDS_ABOUT_TERMS_OF_SERVICE); | 
 |   html_source->AddString( | 
 |       "aboutProductSafety", | 
 |       l10n_util::GetStringUTF16(IDS_ABOUT_SAFETY_INFORMATION)); | 
 |   html_source->AddString("aboutProductSafetyURL", | 
 |                          base::UTF8ToUTF16(safetyInfoLink)); | 
 | #endif | 
 | } | 
 |  | 
 | void AboutSection::AddHandlers(content::WebUI* web_ui) { | 
 |   web_ui->AddMessageHandler( | 
 |       std::make_unique<::settings::AboutHandler>(profile())); | 
 |   web_ui->AddMessageHandler(std::make_unique<DeviceNameHandler>()); | 
 | } | 
 |  | 
 | int AboutSection::GetSectionNameMessageId() const { | 
 |   return IDS_SETTINGS_ABOUT_OS; | 
 | } | 
 |  | 
 | mojom::Section AboutSection::GetSection() const { | 
 |   return mojom::Section::kAboutChromeOs; | 
 | } | 
 |  | 
 | mojom::SearchResultIcon AboutSection::GetSectionIcon() const { | 
 |   return mojom::SearchResultIcon::kChrome; | 
 | } | 
 |  | 
 | std::string AboutSection::GetSectionPath() const { | 
 |   return mojom::kAboutChromeOsSectionPath; | 
 | } | 
 |  | 
 | bool AboutSection::LogMetric(mojom::Setting setting, base::Value& value) const { | 
 |   // Unimplemented. | 
 |   return false; | 
 | } | 
 |  | 
 | void AboutSection::RegisterHierarchy(HierarchyGenerator* generator) const { | 
 |   // About Chrome OS. | 
 |   generator->RegisterTopLevelSubpage( | 
 |       IDS_SETTINGS_ABOUT_OS, mojom::Subpage::kAboutChromeOsDetails, | 
 |       mojom::SearchResultIcon::kChrome, mojom::SearchResultDefaultRank::kMedium, | 
 |       mojom::kAboutChromeOsDetailsSubpagePath); | 
 |   static constexpr mojom::Setting kAboutChromeOsDetailsSettings[] = { | 
 |       mojom::Setting::kCheckForOsUpdate,    mojom::Setting::kSeeWhatsNew, | 
 |       mojom::Setting::kGetHelpWithChromeOs, mojom::Setting::kReportAnIssue, | 
 |       mojom::Setting::kTermsOfService,      mojom::Setting::kDiagnostics}; | 
 |   RegisterNestedSettingBulk(mojom::Subpage::kAboutChromeOsDetails, | 
 |                             kAboutChromeOsDetailsSettings, generator); | 
 |  | 
 |   // Detailed build info. | 
 |   generator->RegisterNestedSubpage( | 
 |       IDS_SETTINGS_ABOUT_PAGE_DETAILED_BUILD_INFO, | 
 |       mojom::Subpage::kDetailedBuildInfo, mojom::Subpage::kAboutChromeOsDetails, | 
 |       mojom::SearchResultIcon::kChrome, mojom::SearchResultDefaultRank::kMedium, | 
 |       mojom::kDetailedBuildInfoSubpagePath); | 
 |   static constexpr mojom::Setting kDetailedBuildInfoSettings[] = { | 
 |       mojom::Setting::kChangeChromeChannel, | 
 |       mojom::Setting::kCopyDetailedBuildInfo}; | 
 |   RegisterNestedSettingBulk(mojom::Subpage::kDetailedBuildInfo, | 
 |                             kDetailedBuildInfoSettings, generator); | 
 | } | 
 |  | 
 | #if BUILDFLAG(GOOGLE_CHROME_BRANDING) | 
 | void AboutSection::UpdateReportIssueSearchTags() { | 
 |   SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate(); | 
 |  | 
 |   if (pref_service_->GetBoolean(prefs::kUserFeedbackAllowed)) | 
 |     updater.AddSearchTags(GetAboutReportIssueSearchConcepts()); | 
 |   else | 
 |     updater.RemoveSearchTags(GetAboutReportIssueSearchConcepts()); | 
 | } | 
 | #endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING) | 
 |  | 
 | }  // namespace settings | 
 | }  // namespace chromeos |