910e62b5创建于 1月15日历史提交
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.


#include "ash/webui/shimless_rma/shimless_rma.h"

#include <memory>
#include <string>
#include <utility>

#include "ash/constants/ash_features.h"
#include "ash/constants/ash_switches.h"
#include "ash/public/cpp/network_config_service.h"
#include "ash/webui/common/trusted_types_util.h"
#include "ash/webui/grit/ash_shimless_rma_resources.h"
#include "ash/webui/grit/ash_shimless_rma_resources_map.h"
#include "ash/webui/shimless_rma/backend/shimless_rma_delegate.h"
#include "ash/webui/shimless_rma/url_constants.h"
#include "base/command_line.h"
#include "base/containers/span.h"
#include "build/branding_buildflags.h"
#include "chromeos/strings/grit/chromeos_strings.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
#include "content/public/browser/web_ui_data_source.h"
#include "services/network/public/mojom/content_security_policy.mojom.h"
#include "ui/chromeos/devicetype_utils.h"
#include "ui/chromeos/strings/network/network_element_localized_strings_provider.h"
#include "ui/webui/resources/grit/webui_resources.h"

namespace ash {

namespace {

// TODO(crbug.com/40673941): Replace with webui::SetUpWebUIDataSource() once it
// no longer requires a dependency on //chrome/browser.
void SetUpWebUIDataSource(content::WebUIDataSource* source,
                          base::span<const webui::ResourcePath> resources,
                          int default_resource) {
  source->AddResourcePaths(resources);
  source->AddResourcePath("", default_resource);
  source->AddResourcePath("test_loader.html", IDR_WEBUI_TEST_LOADER_HTML);
  source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
  source->AddResourcePath("test_loader_util.js",
                          IDR_WEBUI_JS_TEST_LOADER_UTIL_JS);
}

void AddShimlessRmaStrings(content::WebUIDataSource* html_source) {
  static constexpr webui::LocalizedString kLocalizedStrings[] = {
      // Component names. Used by select components and calibration pages.
      {"componentAudio", IDS_SHIMLESS_RMA_COMPONENT_AUDIO},
      {"componentBattery", IDS_SHIMLESS_RMA_COMPONENT_BATTERY},
      {"componentStorage", IDS_SHIMLESS_RMA_COMPONENT_STORAGE},
      {"componentVpdCached", IDS_SHIMLESS_RMA_COMPONENT_VPD_CACHE},
      {"componentNetwork", IDS_SHIMLESS_RMA_COMPONENT_NETWORK},
      {"componentCamera", IDS_SHIMLESS_RMA_COMPONENT_CAMERA},
      {"componentStylus", IDS_SHIMLESS_RMA_COMPONENT_STYLUS},
      {"componentTouchpad", IDS_SHIMLESS_RMA_COMPONENT_TOUCHPAD},
      {"componentTouchscreen", IDS_SHIMLESS_RMA_COMPONENT_TOUCHSCREEN},
      {"componentDram", IDS_SHIMLESS_RMA_COMPONENT_MEMORY},
      {"componentDisplayPanel", IDS_SHIMLESS_RMA_COMPONENT_DISPLAY_PANEL},
      {"componentCellular", IDS_SHIMLESS_RMA_COMPONENT_CELLULAR},
      {"componentEthernet", IDS_SHIMLESS_RMA_COMPONENT_ETHERNET},
      {"componentWireless", IDS_SHIMLESS_RMA_COMPONENT_WIRELESS},
      {"componentBaseAccelerometer",
       IDS_SHIMLESS_RMA_COMPONENT_BASE_ACCELEROMETER},
      {"componentLidAccelerometer",
       IDS_SHIMLESS_RMA_COMPONENT_LID_ACCELEROMETER},
      {"componentBaseGyroscope", IDS_SHIMLESS_RMA_COMPONENT_BASE_GYROSCOPE},
      {"componentLidGyroscope", IDS_SHIMLESS_RMA_COMPONENT_LID_GYROSCOPE},
      {"componentScreen", IDS_SHIMLESS_RMA_COMPONENT_SCREEN},
      {"componentKeyboard", IDS_SHIMLESS_RMA_COMPONENT_KEYBOARD},
      {"componentPowerButton", IDS_SHIMLESS_RMA_COMPONENT_POWER_BUTTON},
      // Splash screen
      {"shimlessSplashRemembering", IDS_SHIMLESS_RMA_SPLASH_REMEMBERING},
      // Common buttons
      {"exitButtonLabel", IDS_SHIMLESS_RMA_EXIT_BUTTON},
      {"backButtonLabel", IDS_SHIMLESS_RMA_BACK_BUTTON},
      {"nextButtonLabel", IDS_SHIMLESS_RMA_NEXT_BUTTON},
      {"skipButtonLabel", IDS_SHIMLESS_RMA_SKIP_BUTTON},
      {"okButtonLabel", IDS_SHIMLESS_RMA_OK_BUTTON},
      {"cancelButtonLabel", IDS_SHIMLESS_RMA_CANCEL_BUTTON},
      {"retryButtonLabel", IDS_SHIMLESS_RMA_RETRY_BUTTON},
      {"tryAgainButtonLabel", IDS_SHIMLESS_RMA_TRY_AGAIN_BUTTON},
      {"doneButtonLabel", IDS_SHIMLESS_RMA_DONE_BUTTON},
      {"installButtonLabel", IDS_SHIMLESS_RMA_INSTALL_BUTTON},
      {"acceptButtonLabel", IDS_SHIMLESS_RMA_ACCEPT_BUTTON},
      // Exit dialog
      {"exitDialogTitleText", IDS_SHIMLESS_RMA_EXIT_DIALOG_TITLE},
      {"exitDialogCancelButtonLabel",
       IDS_SHIMLESS_RMA_EXIT_DIALOG_CANCEL_BUTTON_LABEL},
      // Landing page
      {"beginRmaWarningText", IDS_SHIMLESS_RMA_AUTHORIZED_TECH_ONLY_WARNING},
      {"validatingComponentsText", IDS_SHIMLESS_RMA_VALIDATING_COMPONENTS},
      {"validatedComponentsSuccessText",
       IDS_SHIMLESS_RMA_VALIDATED_COMPONENTS_SUCCESS},
      {"validatedComponentsFailText",
       IDS_SHIMLESS_RMA_VALIDATED_COMPONENTS_FAIL},
      {"validatedComponentsSkipText",
       IDS_SHIMLESS_RMA_VALIDATED_COMPONENTS_SKIP},
      {"getStartedButtonLabel", IDS_SHIMLESS_RMA_GET_STARTED_BUTTON_LABEL},
      {"unqualifiedComponentsTitle",
       IDS_SHIMLESS_RMA_UNQUALIFIED_COMPONENTS_TITLE},
      // Network connect page
      {"connectNetworkTitleText", IDS_SHIMLESS_RMA_CONNECT_PAGE_TITLE},
      {"connectNetworkDescriptionText",
       IDS_SHIMLESS_RMA_CONNECT_PAGE_DESCRIPTION},
      {"connectNetworkDialogConnectButtonText",
       IDS_SHIMLESS_RMA_CONNECT_DIALOG_CONNECT},
      {"connectNetworkDialogDisconnectButtonText",
       IDS_SHIMLESS_RMA_CONNECT_DIALOG_DISCONNECT},
      {"connectNetworkDialogCancelButtonText",
       IDS_SHIMLESS_RMA_CONNECT_DIALOG_CANCEL},
      {"internetConfigName", IDS_SHIMLESS_RMA_CONNECT_DIALOG_CONFIG_NAME},
      {"internetJoinType", IDS_SHIMLESS_RMA_CONNECT_DIALOG_JOIN_TYPE},
      // Select components page
      {"selectComponentsTitleText",
       IDS_SHIMLESS_RMA_SELECT_COMPONENTS_PAGE_TITLE},
      {"undetectedComponentText", IDS_SHIMLESS_RMA_UNDETECTED_COMPONENT_LABEL},
      {"reworkFlowLinkText", IDS_SHIMLESS_RMA_REWORK_FLOW_LINK},
      // Choose destination page
      {"chooseDestinationTitleText", IDS_SHIMLESS_RMA_CHOOSE_DESTINATION},
      {"sameOwnerText", IDS_SHIMLESS_RMA_SAME_OWNER},
      {"newOwnerText", IDS_SHIMLESS_RMA_NEW_OWNER},
      {"newOwnerDescriptionText", IDS_SHIMLESS_RMA_NEW_OWNER_DESCRIPTION},
      {"notSureOwnerText", IDS_SHIMLESS_RMA_NOT_SURE_OWNER},
      // OS update page
      {"osUpdateTitleText", IDS_SHIMLESS_RMA_UPDATE_OS_PAGE_TITLE},
      {"osUpdateUnqualifiedComponentsTopText",
       IDS_SHIMLESS_RMA_UPDATE_OS_UNQUALIFIED_COMPONENTS_TOP},
      {"osUpdateUnqualifiedComponentsBottomText",
       IDS_SHIMLESS_RMA_UPDATE_OS_UNQUALIFIED_COMPONENTS_BOTTOM},
      {"osUpdateOutOfDateDescriptionText",
       IDS_SHIMLESS_RMA_UPDATE_OS_OUT_OF_DATE},
      {"currentVersionOutOfDateText",
       IDS_SHIMLESS_RMA_CURRENT_VERSION_OUT_OF_DATE},
      {"updateVersionRestartLabel",
       IDS_SHIMLESS_RMA_UPDATE_VERSION_AND_RESTART},
      {"updatingOsVersionText", IDS_SHIMLESS_RMA_UPDATING_OS_VERSION},
      {"updatingOsErrorMessage", IDS_SHIMLESS_RMA_UPDATE_OS_ERROR_MESSAGE},
      // Choose WP disable method page
      {"chooseWpDisableMethodPageTitleText",
       IDS_SHIMLESS_RMA_CHOOSE_WP_DISABLE_METHOD_PAGE_TITLE},
      {"manualWpDisableMethodDescriptionText",
       IDS_SHIMLESS_RMA_MANUAL_WP_DISABLE_METHOD_DESCRIPTION},
      {"manualWpDisableMethodOptionText",
       IDS_SHIMLESS_RMA_MANUAL_WP_DISABLE_METHOD_OPTION},
      {"rsuWpDisableMethodOptionText",
       IDS_SHIMLESS_RMA_RSU_WP_DISABLE_METHOD_OPTION},
      {"rsuWpDisableMethodDescriptionText",
       IDS_SHIMLESS_RMA_RSU_WP_DISABLE_METHOD_DESCRIPTION},
      // RSU code page
      {"rsuCodePageTitleText", IDS_SHIMLESS_RMA_RSU_CODE_PAGE_TITLE},
      {"rsuCodeInstructionsText", IDS_SHIMLESS_RMA_RSU_CODE_INSTRUCTIONS},
      {"rsuCodeInstructionsAriaText",
       IDS_SHIMLESS_RMA_RSU_CODE_INSTRUCTIONS_ARIA},
      {"rsuChallengeDialogTitleText",
       IDS_SHIMLESS_RMA_RSU_CHALLENGE_DIALOG_TITLE},
      {"rsuCodeLabelText", IDS_SHIMLESS_RMA_RSU_CODE_LABEL},
      {"rsuCodeErrorLabelText", IDS_SHIMLESS_RMA_RSU_CODE_ERROR_LABEL},
      {"rsuChallengeDialogDoneButtonLabel",
       IDS_SHIMLESS_RMA_RSU_CHALLENGE_DIALOG_DONE_BUTTON},
      // Manual WP disable complete
      {"wpDisableCompletePageTitleText",
       IDS_SHIMLESS_RMA_WP_DISABLE_COMPLETE_PAGE_TITLE},
      {"wpDisableReassembleNowText",
       IDS_SHIMLESS_RMA_WP_DISABLE_REASSEMBLE_NOW_MESSAGE},
      {"wpDisableLeaveDisassembledText",
       IDS_SHIMLESS_RMA_WP_DISABLE_LEAVE_DISASSEMBLED_MESSAGE},
      // Check calibration page
      {"calibrationFailedTitleText",
       IDS_SHIMLESS_RMA_CALIBRATION_FAILED_PAGE_TITLE},
      {"calibrationFailedInstructionsText",
       IDS_SHIMLESS_RMA_CALIBRATION_FAILED_INSTRUCTIONS},
      {"calibrationFailedDialogTitle",
       IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TITLE},
      {"calibrationFailedDialogText",
       IDS_SHIMLESS_RMA_CALIBRATION_FAILED_DIALOG_TEXT},
      {"calibrationFailedSkipCalibrationButtonLabel",
       IDS_SHIMLESS_RMA_CALIBRATION_FAILED_SKIP_CALIBRATION_LABEL},
      // Setup calibration page
      {"setupCalibrationTitleText",
       IDS_SHIMLESS_RMA_SETUP_CALIBRATION_PAGE_TITLE},
      {"calibrateBaseInstructionsText",
       IDS_SHIMLESS_RMA_BASE_CALIBRATION_INSTRUCTIONS},
      {"calibrateLidInstructionsText",
       IDS_SHIMLESS_RMA_LID_CALIBRATION_INSTRUCTIONS},
      // Finalize device  page
      {"finalizePageTitleText", IDS_SHIMLESS_RMA_FINALIZE_PAGE_TITLE},
      {"finalizePageProgressText", IDS_SHIMLESS_RMA_FINALIZE_PROGRESS},
      {"finalizePageCompleteText", IDS_SHIMLESS_RMA_FINALIZE_COMPLETE},
      // Run calibration page
      {"runCalibrationTitleText", IDS_SHIMLESS_RMA_RUN_CALIBRATION_PAGE_TITLE},
      {"runCalibrationCompleteTitleText",
       IDS_SHIMLESS_RMA_RUN_CALIBRATION_COMPLETE_TITLE},
      // Device provisioning page
      {"provisioningPageTitleText", IDS_SHIMLESS_RMA_PROVISIONING_TITLE},
      {"provisioningPageWpEnabledDialogTitle",
       IDS_SHIMLESS_RMA_PROVISIONING_WP_ENABLED_DIALOG_TITLE},
      {"provisioningPageWpEnabledDialogBody",
       IDS_SHIMLESS_RMA_PROVISIONING_WP_ENABLED_DIALOG_BODY},
      // Repair complete page
      {"repairCompletedTitleText", IDS_SHIMLESS_RMA_REPAIR_COMPLETED},
      {"repairCompletedDescriptionText",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_DESCRIPTION},
      {"repairCompletedDiagnosticsButtonText",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_DIAGNOSTICS_BUTTON},
      {"repairCompletedDiagnosticsDescriptionText",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_DIAGNOSTICS_DESCRIPTION},
      {"repairCompleteShutDownButtonText",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_SHUT_DOWN_BUTTON_LABEL},
      {"repairCompleteRebootButtonText",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_REBOOT_BUTTON_LABEL},
      {"repairCompletedLogsButtonText",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_LOGS_BUTTON},
      {"repairCompletedLogsDescriptionText",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_LOGS_DESCRIPTION},
      {"repairCompletedShutoffButtonText",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_BATTERY_CUTOFF_BUTTON},
      {"repairCompletedShutoffDescriptionText",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_BATTERY_CUTOFF_DESCRIPTION},
      {"repairCompletedShutoffInstructionsText",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_BATTERY_CUTOFF_INSTRUCTIONS},
      {"rmaLogsTitleText", IDS_SHIMLESS_RMA_LOGS_TITLE},
      {"rmaLogsCancelButtonText", IDS_SHIMLESS_RMA_LOGS_CANCEL_BUTTON},
      {"rmaLogsSaveToUsbButtonText", IDS_SHIMLESS_RMA_LOGS_SAVE_BUTTON},
      {"rmaLogsMissingUsbMessageText",
       IDS_SHIMLESS_RMA_LOGS_MISSING_USB_MESSAGE_TEXT},
      {"repairCompletedPowerwashTitle",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_POWERWASH_TITLE},
      {"repairCompletedPowerwashShutdownDescription",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_POWERWASH_SHUTDOWN_DESCRIPTION},
      {"repairCompletedPowerwashRebootDescription",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_POWERWASH_REBOOT_DESCRIPTION},
      {"repairCompletedPowerwashButton",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_POWERWASH_BUTTON},
      {"repairCompletedBatteryCutoffCountdownDescription",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_CUTOFF_COUNTDOWN_DESCRIPTION},
      {"repairCompletedBatteryCutoffShutdownButton",
       IDS_SHIMLESS_RMA_REPAIR_COMPLETED_BATTERY_CUTOFF_SHUTDOWN_BUTTON},
      {"rmaLogsSaveSuccessText", IDS_SHIMLESS_RMA_LOGS_SAVE_SUCCESS},
      {"rmaLogsSaveFailText", IDS_SHIMLESS_RMA_LOGS_SAVE_FAIL},
      {"rmaLogsSaveUsbNotFound", IDS_SHIMLESS_RMA_LOGS_SAVE_USB_NOT_FOUND},
      // Powerwash dialog
      {"powerwashDialogTitle", IDS_SHIMLESS_RMA_POWERWASH_DIALOG_TITLE},
      {"powerwashDialogShutdownDescription",
       IDS_SHIMLESS_RMA_POWERWASH_DIALOG_SHUTDOWN_DESCRIPTION},
      {"powerwashDialogRebootDescription",
       IDS_SHIMLESS_RMA_POWERWASH_DIALOG_REBOOT_DESCRIPTION},
      {"powerwashDialogPowerwashButton",
       IDS_SHIMLESS_RMA_POWERWASH_DIALOG_POWERWASH_BUTTON},
      // Manual disable wp page
      {"manuallyDisableWpTitleText",
       IDS_SHIMLESS_RMA_MANUALLY_DISABLE_WP_TITLE},
      {"manuallyDisableWpInstructionsText",
       IDS_SHIMLESS_RMA_MANUALLY_DISABLE_WP_INSTRUCTIONS},
      {"manuallyDisableWpTitleTextReboot",
       IDS_SHIMLESS_RMA_MANUALLY_DISABLE_WP_TITLE_REBOOT},
      {"manuallyDisableWpInstructionsTextReboot",
       IDS_SHIMLESS_RMA_MANUALLY_DISABLE_WP_INSTRUCTIONS_REBOOT},
      // Restock mainboard page
      {"restockInstructionsText", IDS_SHIMLESS_RMA_RESTOCK_INSTRUCTIONS},
      {"restockShutdownButtonText", IDS_SHIMLESS_RMA_RESTOCK_SHUTDOWN_BUTTON},
      {"restockContinueButtonText", IDS_SHIMLESS_RMA_RESTOCK_CONTINUE_BUTTON},
      {"restockTitleText", IDS_SHIMLESS_RMA_RESTOCK_PAGE_TITLE},
      // Manual enable wp page
      {"manuallyEnableWpTitleText", IDS_SHIMLESS_RMA_MANUALLY_ENABLE_WP_TITLE},
      {"manuallyEnableWpInstructionsText",
       IDS_SHIMLESS_RMA_MANUALLY_ENABLE_WP_INSTRUCTIONS},
      // Confirm device information page
      {"confirmDeviceInfoTitle", IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_TITLE},
      {"confirmDeviceInfoInstructions",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_INSTRUCTIONS},
      {"confirmDeviceInfoSerialNumberLabel",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_SERIAL_NUMBER_LABEL},
      {"confirmDeviceInfoRegionLabel",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_REGION_LABEL},
      {"confirmDeviceInfoCustomLabelLabel",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_WHITE_LABEL_LABEL},
      {"confirmDeviceInfoEmptyCustomLabelLabel",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_EMPTY_WHITE_LABEL_LABEL},
      {"confirmDeviceInfoDramPartNumberLabel",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_DRAM_PART_NUMBER_LABEL},
      {"confirmDeviceInfoSkuLabel",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_SKU_LABEL},
      {"confirmDeviceInfoResetButtonLabel",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_REVERT_BUTTON_LABEL},
      {"confirmDeviceInfoSkuWarning",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_SKU_WARNING},
// Project Simon strings should not be displayed until the feature has been
// launched, so we use a BUILDFLAG to enable the internal-only strings when
// in a chrome-branded build, and enable the public strings when we're in a
// public build.
// The launch bug for this feature is http://launch/4259546.
#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
      {"confirmDeviceInfoDeviceNotCompliant",
       IDR_ASH_SHIMLESS_RMA_PROJECT_SIMON_STRINGS_DEVICE_NOT_COMPLIANT_TXT},
      {"confirmDeviceInfoDeviceCompliant",
       IDR_ASH_SHIMLESS_RMA_PROJECT_SIMON_STRINGS_DEVICE_COMPLIANT_TXT},
      {"confirmDeviceInfoDeviceComplianceWarning",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_DEVICE_COMPLIANCE_WARNING},
      {"confirmDeviceInfoDeviceQuestionIsBranded",
       IDR_ASH_SHIMLESS_RMA_PROJECT_SIMON_STRINGS_QUESTION_IS_BRANDED_TXT},
      {"confirmDeviceInfoDeviceQuestionDoesMeetRequirements",
       IDR_ASH_SHIMLESS_RMA_PROJECT_SIMON_STRINGS_QUESTION_DOES_MEET_REQUIREMENTS_TXT},
#else
      {"confirmDeviceInfoDeviceNotCompliant",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_DEVICE_NOT_COMPLIANT},
      {"confirmDeviceInfoDeviceCompliant",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_DEVICE_COMPLIANT},
      {"confirmDeviceInfoDeviceComplianceWarning",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_DEVICE_COMPLIANCE_WARNING},
      {"confirmDeviceInfoDeviceQuestionIsBranded",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_DEVICE_QUESTION_IS_BRANDED},
      {"confirmDeviceInfoDeviceQuestionDoesMeetRequirements",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_DEVICE_QUESTION_DOES_MEET_REQUIREMENTS},
#endif  // BUILDFLAG(GOOGLE_CHROME_BRANDING);
      {"confirmDeviceInfoDeviceQuestionDoesMeetRequirementsTooltip",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_DEVICE_QUESTION_DOES_MEET_REQUIREMENTS_TOOLTIP},
      {"confirmDeviceInfoDeviceAnswerDefault",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_ANSWER_DEFAULT},
      {"confirmDeviceInfoDeviceAnswerNo",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_ANSWER_NO},
      {"confirmDeviceInfoDeviceAnswerYes",
       IDS_SHIMLESS_RMA_CONFIRM_DEVICE_INFO_ANSWER_YES},
      // Firmware reimaging page
      {"firmwareUpdateInstallImageTitleText",
       IDS_SHIMLESS_RMA_FIRMWARE_UPDATE_INSTALL_IMAGE_TITLE},
      {"firmwareUpdateInstallCompleteTitleText",
       IDS_SHIMLESS_RMA_FIRMWARE_UPDATE_INSTALL_COMPLETE_TITLE},
      {"firmwareUpdateWaitForUsbText", IDS_SHIMLESS_RMA_FIRMWARE_WAIT_FOR_USB},
      {"firmwareUpdateFileNotFoundText",
       IDS_SHIMLESS_RMA_FIRMWARE_FILE_NOT_FOUND},
      {"firmwareUpdatingText", IDS_SHIMLESS_RMA_FIRMWARE_UPDATING},
      {"firmwareUpdateRebootText", IDS_SHIMLESS_RMA_FIRMWARE_REBOOT},
      {"firmwareUpdateCompleteText", IDS_SHIMLESS_RMA_FIRMWARE_UPDATE_COMPLETE},
      // Onboarding update page
      {"onboardingUpdateProgress", IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_PROGRESS},
      {"onboardingUpdateIdle", IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_IDLE},
      {"onboardingUpdateChecking", IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_CHECKING},
      {"onboardingUpdateAvailable",
       IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_AVAILABLE},
      {"onboardingUpdateDownloading",
       IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_DOWNLOADING},
      {"onboardingUpdateVerifying",
       IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_VERIFYING},
      {"onboardingUpdateFinalizing",
       IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_FINALIZING},
      {"onboardingUpdateReboot", IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_REBOOT},
      {"onboardingUpdateError", IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_ERROR},
      {"onboardingUpdateRollback", IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_ROLLBACK},
      {"onboardingUpdateDisabled", IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_DISABLED},
      {"onboardingUpdatePermission",
       IDS_SHIMLESS_RMA_ONBOARDING_UPDATE_PERMISSION},
      // Critical error
      {"criticalErrorMessageText", IDS_SHIMLESS_RMA_CRITICAL_ERROR_MESSAGE},
      {"criticalErrorRebootText", IDS_SHIMLESS_RMA_CRITICAL_REBOOT_BUTTON},
      // Hardware error
      {"hardwareErrorTitle", IDS_SHIMLESS_RMA_HARDWARE_ERROR_TITLE},
      {"hardwareErrorMessage", IDS_SHIMLESS_RMA_HARDWARE_ERROR_MESSAGE},
      {"hardwareErrorShutDownButton",
       IDS_SHIMLESS_RMA_HARDWARE_SHUTDOWN_BUTTON},
      {"hardwareErrorCode", IDS_SHIMLESS_RMA_HARDWARE_ERROR_CODE_MESSAGE},
      // Reboot page
      {"rebootPageTitle", IDS_SHIMLESS_RMA_REBOOT_PAGE_TITLE},
      {"rebootPageMessage", IDS_SHIMLESS_RMA_REBOOT_PAGE_MESSAGE},
      {"shutdownPageTitle", IDS_SHIMLESS_RMA_REBOOT_PAGE_SHUTDOWN_TITLE},
      {"shutdownPageMessage", IDS_SHIMLESS_RMA_REBOOT_PAGE_SHUTDOWN_MESSAGE},
      // Wipe device page
      {"wipeDeviceTitleText", IDS_SHIMLESS_RMA_WIPE_DEVICE_TITLE},
      {"wipeDeviceRemoveDataLabel",
       IDS_SHIMLESS_RMA_WIPE_DEVICE_REMOVE_DATA_OPTION},
      {"wipeDeviceRemoveDataDescription",
       IDS_SHIMLESS_RMA_WIPE_DEVICE_REMOVE_DATA_OPTION_DESCRIPTION},
      {"wipeDevicePreserveDataLabel",
       IDS_SHIMLESS_RMA_WIPE_DEVICE_PRESERVE_DATA_OPTION},
      // Illustrations
      {"baseOnFlatSurfaceAltText",
       IDS_SHIMLESS_RMA_BASE_ON_FLAT_SURFACE_ALT_TEXT},
      {"downloadingAltText", IDS_SHIMLESS_RMA_DOWNLOADING_ALT_TEXT},
      {"errorAltText", IDS_SHIMLESS_RMA_ERROR_ALT_TEXT},
      {"insertUsbAltText", IDS_SHIMLESS_RMA_INSERT_USB_ALT_TEXT},
      {"lidOnFlatSurfaceAltText",
       IDS_SHIMLESS_RMA_LID_ON_FLAT_SURFACE_ALT_TEXT},
      {"repairStartAltText", IDS_SHIMLESS_RMA_REPAIR_START_ALT_TEXT},
      {"successAltText", IDS_SHIMLESS_RMA_SUCCESS_ALT_TEXT},
      {"updateOsAltText", IDS_SHIMLESS_RMA_UPDATE_OS_ALT_TEXT},
      // 3p diagnostics
      {"3pFindInstallalbeDialogTitle",
       IDS_SHIMLESS_RMA_3P_FIND_INSTALLABLE_DIALOG_TITLE},
      {"3pFindInstallalbeDialogMessage",
       IDS_SHIMLESS_RMA_3P_FIND_INSTALLABLE_DIALOG_MESSAGE},
      {"3pReviewPermissionDialogTitle",
       IDS_SHIMLESS_RMA_3P_REVIEW_PERMISSION_DIALOG_TITLE},
      {"3pReviewPermissionDialogMessagePrefix",
       IDS_SHIMLESS_RMA_3P_REVIEW_PERMISSION_DIALOG_MESSAGE_PREFIX},
      {"3pFailedToInstallDialogTitle",
       IDS_SHIMLESS_RMA_3P_FAILED_TO_INSTALL_DIALOG_TITLE},
      {"3pCheckWithOemDialogMessage",
       IDS_SHIMLESS_RMA_3P_CHECK_WITH_OEM_DIALOG_MESSAGE},
      {"3pNotInstalledDialogTitle",
       IDS_SHIMLESS_RMA_3P_NOT_INSTALLED_DIALOG_TITLE},
      {"3pFailedToLoadDialogTitle",
       IDS_SHIMLESS_RMA_3P_FAILED_TO_LOAD_DIALOG_TITLE},
      {"3pFailedToLoadDialogMessage",
       IDS_SHIMLESS_RMA_3P_FAILED_TO_LOAD_DIALOG_MESSAGE},
  };

  html_source->AddLocalizedStrings(kLocalizedStrings);
  html_source->UseStringsJs();
}

void AddDevicePlaceholderStrings(content::WebUIDataSource* html_source) {
  html_source->AddString(
      "shimlessSplashTitle",
      ui::SubstituteChromeOSDeviceType(IDS_SHIMLESS_RMA_SPLASH_TITLE));
  html_source->AddString(
      "welcomeTitleText",
      ui::SubstituteChromeOSDeviceType(IDS_SHIMLESS_RMA_LANDING_PAGE_TITLE));
  html_source->AddString(
      "criticalErrorExitText",
      ui::SubstituteChromeOSDeviceType(IDS_SHIMLESS_RMA_CRITICAL_EXIT_BUTTON));
  html_source->AddString(
      "criticalErrorTitleText",
      ui::SubstituteChromeOSDeviceType(IDS_SHIMLESS_RMA_CRITICAL_ERROR_TITLE));
  html_source->AddString("exitDialogDescriptionText",
                         ui::SubstituteChromeOSDeviceType(
                             IDS_SHIMLESS_RMA_EXIT_DIALOG_DESCRIPTION));
}

void AddFeatureFlags(content::WebUIDataSource* html_source) {
  html_source->AddBoolean(
      "osUpdateEnabled",
      base::FeatureList::IsEnabled(features::kShimlessRMAOsUpdate));
  html_source->AddBoolean("3pDiagnosticsEnabled",
                          features::IsShimlessRMA3pDiagnosticsEnabled());
  html_source->AddBoolean(
      "hardwareValidationSkipEnabled",
      features::IsShimlessRMAHardwareValidationSkipEnabled());
  html_source->AddBoolean(
      "dynamicDeviceInfoInputsEnabled",
      features::IsShimlessRMADynamicDeviceInfoInputsEnabled());
}

}  // namespace

namespace shimless_rma {

/* static */
bool IsShimlessRmaAllowed() {
  const base::CommandLine& command_line =
      *base::CommandLine::ForCurrentProcess();
  // Do not attempt to launch RMA in safe mode as RMA will prevent login, and
  // any option to attempt repairs.
  return !command_line.HasSwitch(switches::kRmaNotAllowed) &&
         !command_line.HasSwitch(switches::kSafeMode);
}

/* static */
bool HasLaunchRmaSwitchAndIsAllowed() {
  const base::CommandLine& command_line =
      *base::CommandLine::ForCurrentProcess();

  // Do not attempt to launch RMA in safe mode as RMA will prevent login, and
  // any option to attempt repairs.
  const bool launch_rma_switch_detected =
      command_line.HasSwitch(switches::kLaunchRma);

  // Call IsShimlessRmaAllowed() to safe guard from launching Shimless RMA in
  // in the wrong state.
  return launch_rma_switch_detected && IsShimlessRmaAllowed();
}

}  // namespace shimless_rma

ShimlessRMADialogUIConfig::ShimlessRMADialogUIConfig(
    CreateWebUIControllerFunc create_controller_func)
    : ChromeOSWebUIConfig(content::kChromeUIScheme,
                          ash::kChromeUIShimlessRMAHost,
                          create_controller_func) {}

bool ShimlessRMADialogUIConfig::IsWebUIEnabled(
    content::BrowserContext* browser_context) {
  return shimless_rma::HasLaunchRmaSwitchAndIsAllowed();
}

ShimlessRMADialogUI::ShimlessRMADialogUI(
    content::WebUI* web_ui,
    std::unique_ptr<shimless_rma::ShimlessRmaDelegate> shimless_rma_delegate)
    : ui::MojoWebDialogUI(web_ui),
      shimless_rma_manager_(std::make_unique<shimless_rma::ShimlessRmaService>(
          std::move(shimless_rma_delegate))) {
  content::WebUIDataSource* html_source =
      content::WebUIDataSource::CreateAndAdd(
          web_ui->GetWebContents()->GetBrowserContext(),
          kChromeUIShimlessRMAHost);
  html_source->OverrideContentSecurityPolicy(
      network::mojom::CSPDirectiveName::ScriptSrc,
      "script-src chrome://resources chrome://webui-test 'self';");
  ash::EnableTrustedTypesCSP(html_source);

  SetUpWebUIDataSource(html_source, kAshShimlessRmaResources,
                       IDR_ASH_SHIMLESS_RMA_INDEX_HTML);

  AddShimlessRmaStrings(html_source);
  AddDevicePlaceholderStrings(html_source);
  AddFeatureFlags(html_source);

  ui::network_element::AddLocalizedStrings(html_source);
  ui::network_element::AddOncLocalizedStrings(html_source);
  ui::network_element::AddDetailsLocalizedStrings(html_source);
  ui::network_element::AddConfigLocalizedStrings(html_source);
  ui::network_element::AddErrorLocalizedStrings(html_source);
  html_source->UseStringsJs();
}

ShimlessRMADialogUI::~ShimlessRMADialogUI() = default;

void ShimlessRMADialogUI::BindInterface(
    mojo::PendingReceiver<chromeos::network_config::mojom::CrosNetworkConfig>
        receiver) {
  ash::GetNetworkConfigService(std::move(receiver));
}

void ShimlessRMADialogUI::BindInterface(
    mojo::PendingReceiver<shimless_rma::mojom::ShimlessRmaService> receiver) {
  DCHECK(shimless_rma_manager_);
  shimless_rma_manager_->BindInterface(std::move(receiver));
}

WEB_UI_CONTROLLER_TYPE_IMPL(ShimlessRMADialogUI)

}  // namespace ash