#include "ash/webui/sanitize_ui/sanitize_ui.h"
#include "ash/constants/ash_features.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shell.h"
#include "ash/webui/common/trusted_types_util.h"
#include "ash/webui/grit/ash_sanitize_app_resources.h"
#include "ash/webui/grit/ash_sanitize_app_resources_map.h"
#include "ash/webui/sanitize_ui/sanitize_ui_delegate.h"
#include "ash/webui/sanitize_ui/sanitize_ui_uma.h"
#include "ash/webui/sanitize_ui/url_constants.h"
#include "base/metrics/histogram_functions.h"
#include "chromeos/ash/components/install_attributes/install_attributes.h"
#include "chromeos/strings/grit/chromeos_strings.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui_data_source.h"
#include "ui/webui/resources/grit/webui_resources.h"
namespace {
bool ShowDone(const GURL url) {
bool show_done = url.has_query() && url.GetQuery() == "done";
if (show_done) {
base::UmaHistogramEnumeration("Sanitize.SanitizeEvent",
ash::SanitizeEvent::kSanitizeDoneScreen);
} else {
base::UmaHistogramEnumeration("Sanitize.SanitizeEvent",
ash::SanitizeEvent::kSanitizeInitialScreen);
}
return show_done;
}
}
namespace ash {
bool SanitizeDialogUIConfig::IsWebUIEnabled(
content::BrowserContext* browser_context) {
auto* session_controller = Shell::Get()->session_controller();
bool is_managed_user = session_controller->IsActiveAccountManaged();
bool is_child_user = session_controller->IsUserChild();
bool is_guest_mode_active = session_controller->IsUserGuest();
bool is_managed_device = ash::InstallAttributes::Get()->IsEnterpriseManaged();
return ChromeOSWebUIConfig::IsWebUIEnabled(browser_context) &&
!is_managed_device && !is_managed_user && !is_guest_mode_active &&
!is_child_user &&
base::FeatureList::IsEnabled(ash::features::kSanitize);
}
class SanitizeSettingsResetter : public sanitize_ui::mojom::SettingsResetter {
public:
SanitizeSettingsResetter(std::unique_ptr<SanitizeUIDelegate> delegate) {
sanitize_ui_delegate_ = std::move(delegate);
}
void PerformSanitizeSettings() override {
if (sanitize_ui_delegate_) {
base::UmaHistogramEnumeration(
"Sanitize.SanitizeEvent",
ash::SanitizeEvent::kSanitizeProcessStarted);
sanitize_ui_delegate_->PerformSanitizeSettings();
}
}
void BindInterface(
mojo::PendingReceiver<sanitize_ui::mojom::SettingsResetter> receiver) {
receiver_.reset();
receiver_.Bind(std::move(receiver));
}
void SetAttemptRestartForTesting(
const base::RepeatingClosure& restart_attempt) {
sanitize_ui_delegate_->SetAttemptRestartForTesting(
restart_attempt);
}
private:
std::unique_ptr<SanitizeUIDelegate> sanitize_ui_delegate_;
mojo::Receiver<sanitize_ui::mojom::SettingsResetter> receiver_{this};
};
SanitizeDialogUI::SanitizeDialogUI(
content::WebUI* web_ui,
std::unique_ptr<SanitizeUIDelegate> sanitize_ui_delegate)
: ui::MojoWebDialogUI(web_ui) {
sanitize_settings_resetter_ = std::make_unique<SanitizeSettingsResetter>(
std::move(sanitize_ui_delegate));
content::WebUIDataSource* html_source =
content::WebUIDataSource::CreateAndAdd(
web_ui->GetWebContents()->GetBrowserContext(),
kChromeUISanitizeAppHost);
html_source->OverrideContentSecurityPolicy(
network::mojom::CSPDirectiveName::ScriptSrc,
"script-src chrome://resources chrome://webui-test 'self';");
ash::EnableTrustedTypesCSP(html_source);
html_source->UseStringsJs();
html_source->EnableReplaceI18nInJS();
html_source->AddResourcePaths(kAshSanitizeAppResources);
html_source->AddResourcePath("", IDR_ASH_SANITIZE_APP_INDEX_HTML);
html_source->AddResourcePath("test_loader.html", IDR_WEBUI_TEST_LOADER_HTML);
html_source->AddResourcePath("test_loader.js", IDR_WEBUI_JS_TEST_LOADER_JS);
html_source->AddResourcePath("test_loader_util.js",
IDR_WEBUI_JS_TEST_LOADER_UTIL_JS);
webui::LocalizedString kLocalizedStrings[] = {
{"sanitizeDoneTitle", IDS_SANITIZE_DONE_HEADING},
{"sanitizeDoneExplanation", IDS_SANITIZE_DONE_DESCRIPTION},
{"sanitizeDoneRollback", IDS_SANITIZE_DONE_ROLLBACK},
{"sanitizeDoneButton", IDS_SANITIZE_DONE},
{"sanitizeDoneAccordionExtensionsTitle",
IDS_SANITIZE_DONE_ACCORDION_EXTENSIONS_TITLE},
{"sanitizeDoneAccordionExtensionsReenableSubheader",
IDS_SANITIZE_DONE_ACCORDION_EXTENSIONS_REENABLE_SUBHEADER},
{"sanitizeDoneAccordionExtensionsReenable",
IDS_SANITIZE_DONE_ACCORDION_EXTENSIONS_REENABLE},
{"sanitizeDoneAccordionChromeOsTitle",
IDS_SANITIZE_DONE_ACCORDION_CHROMEOS_TITLE},
{"sanitizeDoneAccordionChromeOsInputSubheader",
IDS_SANITIZE_DONE_ACCORDION_CHROMEOS_INPUT_SUBHEADER},
{"sanitizeDoneAccordionChromeOsInput",
IDS_SANITIZE_DONE_ACCORDION_CHROMEOS_INPUT},
{"sanitizeDoneAccordionChromeOsNetworkSubheader",
IDS_SANITIZE_DONE_ACCORDION_CHROMEOS_NETWORK_SUBHEADER},
{"sanitizeDoneAccordionChromeOsNetwork",
IDS_SANITIZE_DONE_ACCORDION_CHROMEOS_NETWORK},
{"sanitizeDoneAccordionChromeTitle",
IDS_SANITIZE_DONE_ACCORDION_CHROME_TITLE},
{"sanitizeDoneAccordionChromeSiteContentSubheader",
IDS_SANITIZE_DONE_ACCORDION_CHROME_SITE_CONTENT_SUBHEADER},
{"sanitizeDoneAccordionChromeSiteContent",
IDS_SANITIZE_DONE_ACCORDION_CHROME_SITE_CONTENT},
{"sanitizeDoneAccordionChromeStartupSubheader",
IDS_SANITZIE_DONE_ACCORDION_CHROME_STARTUP_SUBHEADER},
{"sanitizeDoneAccordionChromeStartup",
IDS_SANITZIE_DONE_ACCORDION_CHROME_STARTUP},
{"sanitizeDoneAccordionChromeHomepageSubheader",
IDS_SANITIZE_DONE_ACCORDION_CHROME_HOMEPAGE_SUBHEADER},
{"sanitizeDoneAccordionChromeHomepage",
IDS_SANITIZE_DONE_ACCORDION_CHROME_HOMEPAGE},
{"sanitizeDoneAccordionChromeLanguagesSubheader",
IDS_SANITIZE_DONE_ACCORDION_CHROME_LANGUAGES_SUBHEADER},
{"sanitizeDoneAccordionChromeLanguages",
IDS_SANITIZE_DONE_ACCORDION_CHROME_LANGUAGES},
{"sanitizeDoneButtonExtensions", IDS_SANITIZE_DONE_BUTTON_EXTENSIONS},
{"sanitizeDoneButtonChromeOSInput",
IDS_SANITIZE_DONE_BUTTON_CHROMEOS_INPUT},
{"sanitizeDoneButtonChromeOSNetwork",
IDS_SANITIZE_DONE_BUTTON_CHROMEOS_NETWORK},
{"sanitizeDoneButtonChromeSiteContent",
IDS_SANITIZE_DONE_BUTTON_CHROME_SITE_CONTENT},
{"sanitizeDoneButtonChromeStartup",
IDS_SANITIZE_DONE_BUTTON_CHROME_STARTUP},
{"sanitizeDoneButtonChromeHomepage",
IDS_SANITIZE_DONE_BUTTON_CHROME_HOMEPAGE},
{"sanitizeDoneButtonChromeLanguages",
IDS_SANITIZE_DONE_BUTTON_CHROME_LANGUAGES},
{"sanitizeDescription", IDS_SANITIZE_DESCRIPTION},
{"sanitizeDialogTitle", IDS_SANITIZE_HEADING},
{"sanitizeDialogExplanation", IDS_SANITIZE_WARNING},
{"sanitizeDialogButton", IDS_SANITIZE},
{"sanitizeFeedback", IDS_SANITIZE_FEEDBACK},
{"sanitizeCancel", IDS_SANITIZE_CANCEL}};
html_source->AddLocalizedStrings(kLocalizedStrings);
html_source->AddBoolean("showDone",
ShowDone(web_ui->GetWebContents()->GetURL()));
}
SanitizeDialogUI::~SanitizeDialogUI() {}
void SanitizeDialogUI::BindInterface(
mojo::PendingReceiver<sanitize_ui::mojom::SettingsResetter> receiver) {
sanitize_settings_resetter_->BindInterface(std::move(receiver));
}
void SanitizeDialogUI::SetAttemptRestartForTesting(
const base::RepeatingClosure& restart_attempt) {
sanitize_settings_resetter_->SetAttemptRestartForTesting(
restart_attempt);
}
WEB_UI_CONTROLLER_TYPE_IMPL(SanitizeDialogUI)
}