diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp index 4cd3355fd4487b..32b87231e68ef1 100644 --- a/chrome/app/os_settings_strings.grdp +++ b/chrome/app/os_settings_strings.grdp @@ -3126,12 +3126,30 @@ Press an assigned switch to remove assignment. A restart is required before your device can be reset with Powerwash. <a>Learn more</a> + + Remove eSIM profiles before Powerwash + + + Powerwashing your device won't remove your eSIM profiles. Go to <a>Mobile Settings</a> to manually remove these profiles. + + + Active profiles + + + $1My Verizon eSIM - <span id="providerName">$2Verizon Wireless</span> + + + I understand that installed eSIM profiles will not be removed by Powerwash + Reset Reset Button + + Continue + diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_CONTINUE_BUTTON_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_CONTINUE_BUTTON_LABEL.png.sha1 new file mode 100644 index 00000000000000..1a6d28f137b3ec --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_CONTINUE_BUTTON_LABEL.png.sha1 @@ -0,0 +1 @@ +058df431bbd66f8555111b31273a30386c05910c \ No newline at end of file diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_LIST_ITEM_TITLE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_LIST_ITEM_TITLE.png.sha1 new file mode 100644 index 00000000000000..1a6d28f137b3ec --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_LIST_ITEM_TITLE.png.sha1 @@ -0,0 +1 @@ +058df431bbd66f8555111b31273a30386c05910c \ No newline at end of file diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_LIST_TITLE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_LIST_TITLE.png.sha1 new file mode 100644 index 00000000000000..1a6d28f137b3ec --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_LIST_TITLE.png.sha1 @@ -0,0 +1 @@ +058df431bbd66f8555111b31273a30386c05910c \ No newline at end of file diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING.png.sha1 new file mode 100644 index 00000000000000..1a6d28f137b3ec --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING.png.sha1 @@ -0,0 +1 @@ +058df431bbd66f8555111b31273a30386c05910c \ No newline at end of file diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING_CHECKBOX_LABEL.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING_CHECKBOX_LABEL.png.sha1 new file mode 100644 index 00000000000000..1a6d28f137b3ec --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING_CHECKBOX_LABEL.png.sha1 @@ -0,0 +1 @@ +058df431bbd66f8555111b31273a30386c05910c \ No newline at end of file diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING_TITLE.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING_TITLE.png.sha1 new file mode 100644 index 00000000000000..1a6d28f137b3ec --- /dev/null +++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING_TITLE.png.sha1 @@ -0,0 +1 @@ +058df431bbd66f8555111b31273a30386c05910c \ No newline at end of file diff --git a/chrome/browser/resources/settings/chromeos/BUILD.gn b/chrome/browser/resources/settings/chromeos/BUILD.gn index e58a3c7c8f6bfd..e6ce7f74c7295e 100644 --- a/chrome/browser/resources/settings/chromeos/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/BUILD.gn @@ -446,6 +446,7 @@ preprocess_if_expr("preprocess_gen_v3") { "chromeos/os_privacy_page/peripheral_data_access_browser_proxy.m.js", "chromeos/os_privacy_page/peripheral_data_access_protection_dialog.m.js", "chromeos/os_reset_page/os_powerwash_dialog.js", + "chromeos/os_reset_page/os_powerwash_dialog_esim_item.js", "chromeos/os_reset_page/os_reset_page.js", "chromeos/os_route.m.js", "chromeos/os_search_page/os_search_page.m.js", diff --git a/chrome/browser/resources/settings/chromeos/lazy_load.js b/chrome/browser/resources/settings/chromeos/lazy_load.js index 94e68b2044227e..aeaa5d1cd738f4 100644 --- a/chrome/browser/resources/settings/chromeos/lazy_load.js +++ b/chrome/browser/resources/settings/chromeos/lazy_load.js @@ -48,6 +48,7 @@ import './os_printing_page/os_printing_page.js'; import './os_privacy_page/os_privacy_page.m.js'; import './os_privacy_page/peripheral_data_access_protection_dialog.m.js'; import './os_reset_page/os_powerwash_dialog.js'; +import './os_reset_page/os_powerwash_dialog_esim_item.js'; import './os_reset_page/os_reset_page.js'; import './os_files_page/smb_shares_page.m.js'; diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn index 493a58f66f40c0..5d06ff84d2a2c1 100644 --- a/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn +++ b/chrome/browser/resources/settings/chromeos/os_reset_page/BUILD.gn @@ -11,6 +11,7 @@ js_type_check("closure_compile_module") { is_polymer3 = true deps = [ ":os_powerwash_dialog", + ":os_powerwash_dialog_esim_item", ":os_reset_browser_proxy", ":os_reset_page", ] @@ -18,14 +19,23 @@ js_type_check("closure_compile_module") { js_library("os_powerwash_dialog") { deps = [ + ":os_powerwash_dialog_esim_item", ":os_reset_browser_proxy", "..:metrics_recorder.m", "../..:lifetime_browser_proxy", "../localized_link:localized_link.m", + "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", ] } +js_library("os_powerwash_dialog_esim_item") { + deps = [ + "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/js:i18n_behavior.m", + ] +} + js_library("os_reset_browser_proxy") { deps = [ "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", @@ -48,6 +58,7 @@ js_library("os_reset_page") { html_to_js("web_components") { js_files = [ "os_powerwash_dialog.js", + "os_powerwash_dialog_esim_item.js", "os_reset_page.js", ] } diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.html b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.html index 9448202db6a2c6..63a59270c159d9 100644 --- a/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.html +++ b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.html @@ -1,27 +1,99 @@ - + -
$i18n{powerwashDialogTitle}
-
- - -
$i18n{cancel} - $i18n{powerwashDialogButton} + +
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js index 46ca582cb08e41..1624dd1db59b6a 100644 --- a/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.js @@ -8,9 +8,12 @@ * from the user for a device reset (aka powerwash). */ import '//resources/cr_elements/cr_button/cr_button.m.js'; +import '//resources/cr_elements/cr_checkbox/cr_checkbox.m.js'; import '//resources/cr_elements/cr_dialog/cr_dialog.m.js'; +import '//resources/polymer/v3_0/iron-list/iron-list.js'; import '../localized_link/localized_link.m.js'; import '../../settings_shared_css.js'; +import './os_powerwash_dialog_esim_item.js'; import {afterNextRender, flush, html, Polymer, TemplateInstanceBase, Templatizer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -39,6 +42,13 @@ Polymer({ return []; }, }, + + /** @private */ + shouldShowESimWarning_: { + type: Boolean, + value: false, + computed: 'computeShouldShowESimWarning_(installedESimProfiles)', + }, }, /** @override */ @@ -63,7 +73,7 @@ Polymer({ * @return {boolean} * @private */ - shouldShowESimWarning_() { + computeShouldShowESimWarning_() { return !!this.installedESimProfiles.length; }, }); diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog_esim_item.html b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog_esim_item.html new file mode 100644 index 00000000000000..c6ec242fd2a0ef --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog_esim_item.html @@ -0,0 +1,13 @@ + +
+
diff --git a/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog_esim_item.js b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog_esim_item.js new file mode 100644 index 00000000000000..d852715ac717b9 --- /dev/null +++ b/chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog_esim_item.js @@ -0,0 +1,99 @@ +// Copyright 2021 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. + +/** + * @fileoverview + * 'os-settings-powerwash-dialog-esim-item' is an item showing details of an + * installed eSIM profile shown in a list in the device reset dialog. + */ +import '../../settings_shared_css.js'; + +import {I18nBehavior} from '//resources/js/i18n_behavior.m.js'; +import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +Polymer({ + _template: html`{__html_template__}`, + is: 'os-settings-powerwash-dialog-esim-item', + + behaviors: [ + I18nBehavior, + ], + + properties: { + /** @type {?chromeos.cellularSetup.mojom.ESimProfileRemote} */ + profile: { + type: Object, + value: null, + observer: 'onProfileChanged_', + }, + + /** + * @type {?chromeos.cellularSetup.mojom.ESimProfileProperties} + * @private + */ + profileProperties_: { + type: Object, + value: null, + }, + }, + + /** @private */ + onProfileChanged_() { + if (!this.profile) { + this.profileProperties_ = null; + return; + } + this.profile.getProperties().then(response => { + this.profileProperties_ = response.properties; + }); + }, + + /** + * @return {string} + * @private + */ + getItemInnerHtml_() { + if (!this.profileProperties_) { + return ''; + } + const profileName = this.getProfileName_(this.profileProperties_); + const providerName = this.escapeHtml_( + String.fromCharCode(...this.profileProperties_.serviceProvider.data)); + if (!providerName) { + return profileName; + } + return this.i18nAdvanced( + 'powerwashDialogESimListItemTitle', + {attrs: ['id'], substitutions: [profileName, providerName]}); + }, + + /** + * @param {chromeos.cellularSetup.mojom.ESimProfileProperties} + * profileProperties + * @return {string} + * @private + */ + getProfileName_(profileProperties) { + if (!profileProperties.nickname.data || + !profileProperties.nickname.data.length) { + return this.escapeHtml_( + String.fromCharCode(...profileProperties.name.data)); + } + return this.escapeHtml_( + String.fromCharCode(...profileProperties.nickname.data)); + }, + + /** + * @param {string} string + * @return {string} + * @private + */ + escapeHtml_(string) { + return string.replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + }, +}); diff --git a/chrome/browser/resources/settings/chromeos/os_settings.gni b/chrome/browser/resources/settings/chromeos/os_settings.gni index 67f9c13db673ef..5827c5df6f1c73 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings.gni +++ b/chrome/browser/resources/settings/chromeos/os_settings.gni @@ -308,6 +308,7 @@ os_settings_migrated_imports = [ "chrome/browser/resources/settings/chromeos/os_printing_page/cups_settings_add_printer_dialog.html", "chrome/browser/resources/settings/chromeos/os_printing_page/os_printing_page.html", "chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog.html", + "chrome/browser/resources/settings/chromeos/os_reset_page/os_powerwash_dialog_esim_item.html", "chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_browser_proxy.html", "chrome/browser/resources/settings/chromeos/os_reset_page/os_reset_page.html", "chrome/browser/resources/settings/chromeos/personalization_page/change_picture_browser_proxy.html", diff --git a/chrome/browser/ui/webui/settings/chromeos/reset_section.cc b/chrome/browser/ui/webui/settings/chromeos/reset_section.cc index 6800b720eaf41a..3f146060065a33 100644 --- a/chrome/browser/ui/webui/settings/chromeos/reset_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/reset_section.cc @@ -69,6 +69,16 @@ void ResetSection::AddLoadTimeData(content::WebUIDataSource* html_source) { {"powerwashLearnMoreUrl", IDS_FACTORY_RESET_HELP_URL}, {"powerwashButtonRoleDescription", IDS_SETTINGS_FACTORY_RESET_BUTTON_ROLE}, + {"powerwashDialogESimWarningTitle", + IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING_TITLE}, + {"powerwashDialogESimWarning", IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING}, + {"powerwashDialogESimListTitle", + IDS_SETTINGS_FACTORY_RESET_ESIM_LIST_TITLE}, + {"powerwashDialogESimListItemTitle", + IDS_SETTINGS_FACTORY_RESET_ESIM_LIST_ITEM_TITLE}, + {"powerwashDialogESimWarningCheckbox", + IDS_SETTINGS_FACTORY_RESET_ESIM_WARNING_CHECKBOX_LABEL}, + {"powerwashContinue", IDS_SETTINGS_FACTORY_CONTINUE_BUTTON_LABEL}, }; html_source->AddLocalizedStrings(kLocalizedStrings); diff --git a/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js b/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js index ad57b97e4e1e40..f5f10305293511 100644 --- a/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js +++ b/chrome/test/data/webui/settings/chromeos/os_reset_page_test.js @@ -84,12 +84,10 @@ cr.define('settings_reset_page', function() { // Open powerwash dialog. assertTrue(!!resetPage); - resetPage.$.powerwash.click(); + resetPage.$$('#powerwash').click(); Polymer.dom.flush(); const dialog = resetPage.$$('os-settings-powerwash-dialog'); - assertTrue(!!dialog); - assertTrue(dialog.$.dialog.open); - assertTrue(!!dialog.$$('#powerwashContainer')); + assertOpenDialogUIState(/*shouldBeShowingESimWarning=*/ false); const onDialogClosed = new Promise(function(resolve, reject) { dialog.addEventListener('close', function() { assertFalse(dialog.$.dialog.open); @@ -104,6 +102,25 @@ cr.define('settings_reset_page', function() { ]); } + /** + * @param {boolean} shouldBeShowingESimWarning + */ + function assertOpenDialogUIState(shouldBeShowingESimWarning) { + const dialog = resetPage.$$('os-settings-powerwash-dialog'); + assertTrue(!!dialog); + assertTrue(dialog.$.dialog.open); + + assertEquals( + !!dialog.$$('#powerwashContainer'), !shouldBeShowingESimWarning); + assertEquals( + !!dialog.$$('#powerwashContainer'), !shouldBeShowingESimWarning); + assertEquals(!!dialog.$$('#powerwash'), !shouldBeShowingESimWarning); + + assertEquals( + !!dialog.$$('#profilesListContainer'), shouldBeShowingESimWarning); + assertEquals(!!dialog.$$('#continue'), shouldBeShowingESimWarning); + } + /** * Navigates to the deep link provided by |settingId| and returns true if * the focused element is |deepLinkElement|. @@ -136,12 +153,11 @@ cr.define('settings_reset_page', function() { init(/*updatedCellularActivationUi=*/ false); // Open powerwash dialog. - resetPage.$.powerwash.click(); + resetPage.$$('#powerwash').click(); Polymer.dom.flush(); const dialog = resetPage.$$('os-settings-powerwash-dialog'); - assertTrue(!!dialog); - assertTrue(!!dialog.$$('#powerwashContainer')); - dialog.$.powerwash.click(); + assertOpenDialogUIState(/*shouldBeShowingESimWarning=*/ false); + dialog.$$('#powerwash').click(); const requestTpmFirmwareUpdate = await lifetimeBrowserProxy.whenCalled('factoryReset'); assertFalse(requestTpmFirmwareUpdate); @@ -155,7 +171,8 @@ cr.define('settings_reset_page', function() { loadTimeData.overrideValues({isDeepLinkingEnabled: true}); assertTrue(loadTimeData.getBoolean('isDeepLinkingEnabled')); assertTrue( - await isDeepLinkFocusedForSettingId(resetPage.$.powerwash, '1600'), + await isDeepLinkFocusedForSettingId( + resetPage.$$('#powerwash'), '1600'), 'Powerwash should be focused for settingId=1600.'); }); @@ -167,7 +184,8 @@ cr.define('settings_reset_page', function() { loadTimeData.overrideValues({isDeepLinkingEnabled: false}); assertFalse(loadTimeData.getBoolean('isDeepLinkingEnabled')); assertFalse( - await isDeepLinkFocusedForSettingId(resetPage.$.powerwash, '1600'), + await isDeepLinkFocusedForSettingId( + resetPage.$$('#powerwash'), '1600'), 'Powerwash should not be focused with flag disabled.'); }); @@ -179,7 +197,8 @@ cr.define('settings_reset_page', function() { loadTimeData.overrideValues({isDeepLinkingEnabled: true}); assertTrue(loadTimeData.getBoolean('isDeepLinkingEnabled')); assertFalse( - await isDeepLinkFocusedForSettingId(resetPage.$.powerwash, '1234'), + await isDeepLinkFocusedForSettingId( + resetPage.$$('#powerwash'), '1234'), 'Powerwash should not be focused for settingId=1234.'); }); @@ -215,14 +234,13 @@ cr.define('settings_reset_page', function() { chromeos.cellularSetup.mojom.ProfileState.kActive; // Click the powerwash button. - resetPage.$.powerwash.click(); + resetPage.$$('#powerwash').click(); await flushAsync(); // The eSIM warning should be showing. + assertOpenDialogUIState(/*shouldBeShowingESimWarning=*/ true); const dialog = resetPage.$$('os-settings-powerwash-dialog'); - assertTrue(!!dialog); - assertTrue(dialog.$.dialog.open); - assertFalse(!!dialog.$$('#powerwashContainer')); + assertEquals(dialog.$$('iron-list').items.length, 1); }); });