Commit 0b9868f5 authored by Jon Mann's avatar Jon Mann Committed by Commit Bot

[a11y] Announce network connection status in network list.

When navigating a cr-network-list, announce the connection status
of the highlighted network when available.

Bug: 1011001
Change-Id: Id075e599f56f57f58a3f192e645ef268ec13b72e
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1873216
Commit-Queue: Jon Mann <jonmann@chromium.org>
Reviewed-by: default avatarSteven Bennetts <stevenjb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#709713}
parent 5c1381cb
...@@ -1264,6 +1264,9 @@ ...@@ -1264,6 +1264,9 @@
<message name="IDS_NETWORK_LIST_THIRD_PARTY_VPN_NAME_TEMPLATE" desc="Template for constructing the name of a VPN network that is handled by a third-party VPN provider from the provider name and the network name."> <message name="IDS_NETWORK_LIST_THIRD_PARTY_VPN_NAME_TEMPLATE" desc="Template for constructing the name of a VPN network that is handled by a third-party VPN provider from the provider name and the network name.">
<ph name="PROVIDER_NAME">$1<ex>OpenVPN</ex></ph>: <ph name="NETWORK_NAME">$2<ex>Work Network</ex></ph> <ph name="PROVIDER_NAME">$1<ex>OpenVPN</ex></ph>: <ph name="NETWORK_NAME">$2<ex>Work Network</ex></ph>
</message> </message>
<message name="IDS_NETWORK_LIST_ITEM_LABEL_TEMPLATE" desc="Template for constructing the label for a network, to be read outloud by a screenreader or braile console.">
<ph name="NETWORK_NAME">$1<ex>GuestNetwork</ex></ph> - <ph name="CONNECTION_STATUS">$2<ex>Connecting</ex></ph>
</message>
<!-- Other Network UI strings --> <!-- Other Network UI strings -->
<message name="IDS_NETWORK_CONNECTION_ERROR_TITLE" desc="Title for network connection error notification"> <message name="IDS_NETWORK_CONNECTION_ERROR_TITLE" desc="Title for network connection error notification">
......
...@@ -329,11 +329,10 @@ class DemoSetupTest : public LoginManagerTest { ...@@ -329,11 +329,10 @@ class DemoSetupTest : public LoginManagerTest {
// Simulates click on the network list item. |element| should specify // Simulates click on the network list item. |element| should specify
// the aria-label of the desired cr-network-list-item. // the aria-label of the desired cr-network-list-item.
void ClickNetworkListElement(const std::string& element) { void ClickNetworkListElement(const std::string& name) {
const std::string query = const std::string query = base::StrCat(
base::StrCat({ScreenToContentQuery(NetworkScreenView::kScreenId), {ScreenToContentQuery(NetworkScreenView::kScreenId),
".getNetworkListItemWithQueryForTest('[aria-label=\"", ".getNetworkListItemByNameForTest('", name, "').click()"});
element, "\"]').click()"});
test::ExecuteOobeJSAsync(query); test::ExecuteOobeJSAsync(query);
} }
......
...@@ -117,6 +117,8 @@ Polymer({ ...@@ -117,6 +117,8 @@ Polymer({
loadTimeData.getString('networkListItemConnectingTo'), loadTimeData.getString('networkListItemConnectingTo'),
networkListItemInitializing: networkListItemInitializing:
loadTimeData.getString('networkListItemInitializing'), loadTimeData.getString('networkListItemInitializing'),
networkListItemLabelTemplate:
loadTimeData.getString('networkListItemLabelTemplate'),
networkListItemNotAvailable: networkListItemNotAvailable:
loadTimeData.getString('networkListItemNotAvailable'), loadTimeData.getString('networkListItemNotAvailable'),
networkListItemScanning: networkListItemScanning:
......
...@@ -123,6 +123,8 @@ ...@@ -123,6 +123,8 @@
loadTimeData.getString('networkListItemConnectingTo'), loadTimeData.getString('networkListItemConnectingTo'),
networkListItemInitializing: networkListItemInitializing:
loadTimeData.getString('networkListItemInitializing'), loadTimeData.getString('networkListItemInitializing'),
networkListItemLabelTemplate:
loadTimeData.getString('networkListItemLabelTemplate'),
networkListItemNotAvailable: networkListItemNotAvailable:
loadTimeData.getString('networkListItemNotAvailable'), loadTimeData.getString('networkListItemNotAvailable'),
networkListItemScanning: networkListItemScanning:
......
...@@ -89,6 +89,25 @@ Polymer({ ...@@ -89,6 +89,25 @@ Polymer({
return networkList.querySelector(query); return networkList.querySelector(query);
}, },
/**
* Returns element of the network list with the given name.
* Used to simplify testing.
* @param {string} name
* @return {?CrNetworkList.CrNetworkListItemType}
*/
getNetworkListItemByNameForTest: function(name) {
let networkList =
this.$.networkSelectLogin.$$('#networkSelect').getNetworkListForTest();
assert(networkList);
for (const network of networkList.children) {
if (network.is === 'cr-network-list-item' &&
network.$$('#divText').children[0].innerText === name) {
return network;
}
}
return null;
},
/** /**
* Called after dialog is shown. Refreshes the list of the networks. * Called after dialog is shown. Refreshes the list of the networks.
* @private * @private
......
...@@ -38,6 +38,8 @@ const NetworkUI = (function() { ...@@ -38,6 +38,8 @@ const NetworkUI = (function() {
loadTimeData.getString('networkListItemConnectingTo'), loadTimeData.getString('networkListItemConnectingTo'),
networkListItemInitializing: networkListItemInitializing:
loadTimeData.getString('networkListItemInitializing'), loadTimeData.getString('networkListItemInitializing'),
networkListItemLabelTemplate:
loadTimeData.getString('networkListItemLabelTemplate'),
networkListItemNotAvailable: networkListItemNotAvailable:
loadTimeData.getString('networkListItemNotAvailable'), loadTimeData.getString('networkListItemNotAvailable'),
networkListItemScanning: loadTimeData.getString('networkListItemScanning'), networkListItemScanning: loadTimeData.getString('networkListItemScanning'),
......
...@@ -160,6 +160,8 @@ Polymer({ ...@@ -160,6 +160,8 @@ Polymer({
loadTimeData.getString('networkListItemConnectingTo'), loadTimeData.getString('networkListItemConnectingTo'),
networkListItemInitializing: networkListItemInitializing:
loadTimeData.getString('networkListItemInitializing'), loadTimeData.getString('networkListItemInitializing'),
networkListItemLabelTemplate:
loadTimeData.getString('networkListItemLabelTemplate'),
networkListItemNotAvailable: networkListItemNotAvailable:
loadTimeData.getString('networkListItemNotAvailable'), loadTimeData.getString('networkListItemNotAvailable'),
networkListItemScanning: networkListItemScanning:
......
...@@ -152,6 +152,8 @@ Polymer({ ...@@ -152,6 +152,8 @@ Polymer({
loadTimeData.getString('networkListItemConnectingTo'), loadTimeData.getString('networkListItemConnectingTo'),
networkListItemInitializing: networkListItemInitializing:
loadTimeData.getString('networkListItemInitializing'), loadTimeData.getString('networkListItemInitializing'),
networkListItemLabelTemplate:
loadTimeData.getString('networkListItemLabelTemplate'),
networkListItemNotAvailable: networkListItemNotAvailable:
loadTimeData.getString('networkListItemNotAvailable'), loadTimeData.getString('networkListItemNotAvailable'),
networkListItemScanning: networkListItemScanning:
......
...@@ -36,6 +36,7 @@ constexpr LocalizedString kElementLocalizedStrings[] = { ...@@ -36,6 +36,7 @@ constexpr LocalizedString kElementLocalizedStrings[] = {
{"networkListItemConnecting", IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING}, {"networkListItemConnecting", IDS_STATUSBAR_NETWORK_DEVICE_CONNECTING},
{"networkListItemConnectingTo", IDS_NETWORK_LIST_CONNECTING_TO}, {"networkListItemConnectingTo", IDS_NETWORK_LIST_CONNECTING_TO},
{"networkListItemInitializing", IDS_NETWORK_LIST_INITIALIZING}, {"networkListItemInitializing", IDS_NETWORK_LIST_INITIALIZING},
{"networkListItemLabelTemplate", IDS_NETWORK_LIST_ITEM_LABEL_TEMPLATE},
{"networkListItemNotAvailable", IDS_NETWORK_LIST_NOT_AVAILABLE}, {"networkListItemNotAvailable", IDS_NETWORK_LIST_NOT_AVAILABLE},
{"networkListItemScanning", IDS_SETTINGS_INTERNET_MOBILE_SEARCH}, {"networkListItemScanning", IDS_SETTINGS_INTERNET_MOBILE_SEARCH},
{"networkListItemSimCardLocked", IDS_NETWORK_LIST_SIM_CARD_LOCKED}, {"networkListItemSimCardLocked", IDS_NETWORK_LIST_SIM_CARD_LOCKED},
......
...@@ -50,6 +50,7 @@ suite('InternetDetailPage', function() { ...@@ -50,6 +50,7 @@ suite('InternetDetailPage', function() {
networkListItemConnected: 'networkListItemConnected', networkListItemConnected: 'networkListItemConnected',
networkListItemConnecting: 'networkListItemConnecting', networkListItemConnecting: 'networkListItemConnecting',
networkListItemConnectingTo: 'networkListItemConnectingTo', networkListItemConnectingTo: 'networkListItemConnectingTo',
networkListItemLabelTemplate: '%1 - %2',
networkListItemNotConnected: 'networkListItemNotConnected', networkListItemNotConnected: 'networkListItemNotConnected',
networkListItemNoNetwork: 'networkListItemNoNetwork', networkListItemNoNetwork: 'networkListItemNoNetwork',
vpnNameTemplate: 'vpnNameTemplate', vpnNameTemplate: 'vpnNameTemplate',
......
...@@ -35,6 +35,7 @@ suite('InternetPage', function() { ...@@ -35,6 +35,7 @@ suite('InternetPage', function() {
networkListItemConnected: 'networkListItemConnected', networkListItemConnected: 'networkListItemConnected',
networkListItemConnecting: 'networkListItemConnecting', networkListItemConnecting: 'networkListItemConnecting',
networkListItemConnectingTo: 'networkListItemConnectingTo', networkListItemConnectingTo: 'networkListItemConnectingTo',
networkListItemLabelTemplate: '%1 - %2',
networkListItemNotConnected: 'networkListItemNotConnected', networkListItemNotConnected: 'networkListItemNotConnected',
networkListItemNoNetwork: 'networkListItemNoNetwork', networkListItemNoNetwork: 'networkListItemNoNetwork',
vpnNameTemplate: 'vpnNameTemplate', vpnNameTemplate: 'vpnNameTemplate',
......
...@@ -32,6 +32,7 @@ suite('InternetSubpage', function() { ...@@ -32,6 +32,7 @@ suite('InternetSubpage', function() {
networkListItemConnected: 'networkListItemConnected', networkListItemConnected: 'networkListItemConnected',
networkListItemConnecting: 'networkListItemConnecting', networkListItemConnecting: 'networkListItemConnecting',
networkListItemConnectingTo: 'networkListItemConnectingTo', networkListItemConnectingTo: 'networkListItemConnectingTo',
networkListItemLabelTemplate: '%1 - %2',
networkListItemNotConnected: 'networkListItemNotConnected', networkListItemNotConnected: 'networkListItemNotConnected',
networkListItemNoNetwork: 'networkListItemNoNetwork', networkListItemNoNetwork: 'networkListItemNoNetwork',
vpnNameTemplate: 'vpnNameTemplate', vpnNameTemplate: 'vpnNameTemplate',
......
...@@ -56,7 +56,7 @@ Polymer({ ...@@ -56,7 +56,7 @@ Polymer({
type: String, type: String,
notify: true, notify: true,
reflectToAttribute: true, reflectToAttribute: true,
computed: 'getItemName_(item)', computed: 'getAriaLabel_(item, networkState)',
}, },
/** /**
...@@ -129,6 +129,21 @@ Polymer({ ...@@ -129,6 +129,21 @@ Polymer({
/** @type {!OncMojo.NetworkStateProperties} */ (this.item)); /** @type {!OncMojo.NetworkStateProperties} */ (this.item));
}, },
/**
* Label for the row, used for accessibility announcement.
* @return {string}
* @private
*/
getAriaLabel_: function() {
const status = this.getNetworkStateText_();
if (status) {
return CrOncStrings.networkListItemLabelTemplate
.replace('$1', this.getItemName_())
.replace('$2', status);
}
return this.getItemName_();
},
/** /**
* @return {boolean} * @return {boolean}
* @private * @private
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
* networkListItemConnecting: string, * networkListItemConnecting: string,
* networkListItemConnectingTo: string, * networkListItemConnectingTo: string,
* networkListItemInitializing: string, * networkListItemInitializing: string,
* networkListItemLabelTemplate: string,
* networkListItemNotAvailable: string, * networkListItemNotAvailable: string,
* networkListItemScanning: string, * networkListItemScanning: string,
* networkListItemSimCardLocked: string, * networkListItemSimCardLocked: string,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment