Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6287)

Unified Diff: chrome/browser/ui/views/tabs/tab.cc

Issue 2497373003: Add tab status to accessibility labels (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/tabs/tab.cc
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc
index 4e894358c45078d50ad84550318e0cc457fed2ce..5fe60df96fef6cd870bc157b613f9e17abca5091 100644
--- a/chrome/browser/ui/views/tabs/tab.cc
+++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -313,6 +313,52 @@ gfx::Path GetBorderPath(float scale,
return path;
}
+// Creates an accessible tab label for screen readers describing the tab status.
+base::string16 GetAccessibleTabLabel(const TabRendererData& data) {
+ base::string16 tab_label = data.title;
+
+ VLOG(1) << "Tabcontents Error:" << data.network_state << "\n";
+ VLOG(1) << "Tabcontents incognito:" << data.incognito << "\n";
+
+ if (data.network_state == TabRendererData::NETWORK_STATE_ERROR) {
+ tab_label.append(l10n_util::GetStringUTF16(IDS_TAB_AX_LABEL_NETWORK_ERROR));
dmazzoni 2016/11/14 21:59:02 Maybe need whitesapce between the existing tab tit
edwardjung 2016/11/24 11:36:43 Switched to hyphen. Also on the advice of lpalmaro
+ } else if (data.incognito) {
+ // Incognito tab
+ tab_label.append(l10n_util::GetStringUTF16(IDS_TAB_AX_LABEL_INCOGNITO));
+ } else {
+ // Alert tab states.
+ switch (data.alert_state) {
+ case TabAlertState::AUDIO_PLAYING:
+ tab_label.append(
+ l10n_util::GetStringUTF16(IDS_TAB_AX_LABEL_AUDIO_PLAYING));
+ break;
+ case TabAlertState::USB_CONNECTED:
+ tab_label.append(
+ l10n_util::GetStringUTF16(IDS_TAB_AX_LABEL_USB_CONNECTED));
+ break;
+ case TabAlertState::BLUETOOTH_CONNECTED:
+ tab_label.append(
+ l10n_util::GetStringUTF16(IDS_TAB_AX_LABEL_BLUETOOTH_CONNECTED));
+ break;
+ case TabAlertState::MEDIA_RECORDING:
+ tab_label.append(
+ l10n_util::GetStringUTF16(IDS_TAB_AX_LABEL_MEDIA_RECORDING));
+ break;
+ case TabAlertState::AUDIO_MUTING:
+ tab_label.append(
+ l10n_util::GetStringUTF16(IDS_TAB_AX_LABEL_AUDIO_MUTING));
+ break;
+ case TabAlertState::TAB_CAPTURING:
+ tab_label.append(
+ l10n_util::GetStringUTF16(IDS_TAB_AX_LABEL_TAB_CAPTURING));
+ break;
+ default:
+ break;
+ }
+ }
+ return tab_label;
+}
+
} // namespace
////////////////////////////////////////////////////////////////////////////////
@@ -494,7 +540,8 @@ bool Tab::ThrobberView::CanProcessEventsWithinSubtree() const {
void Tab::ThrobberView::OnPaint(gfx::Canvas* canvas) {
const TabRendererData::NetworkState state = owner_->data().network_state;
- if (state == TabRendererData::NETWORK_STATE_NONE)
+ if (state == TabRendererData::NETWORK_STATE_NONE ||
+ state == TabRendererData::NETWORK_STATE_ERROR)
return;
const ui::ThemeProvider* tp = GetThemeProvider();
@@ -674,9 +721,10 @@ void Tab::SetData(const TabRendererData& data) {
void Tab::UpdateLoadingAnimation(TabRendererData::NetworkState state) {
if (state == data_.network_state &&
- state == TabRendererData::NETWORK_STATE_NONE) {
- // If the network state is none and hasn't changed, do nothing. Otherwise we
- // need to advance the animation frame.
+ (state == TabRendererData::NETWORK_STATE_NONE ||
+ state == TabRendererData::NETWORK_STATE_ERROR)) {
+ // If the network state is none or is a network error and hasn't changed,
+ // do nothing. Otherwise we need to advance the animation frame.
return;
}
@@ -951,7 +999,8 @@ const char* Tab::GetClassName() const {
bool Tab::GetTooltipText(const gfx::Point& p, base::string16* tooltip) const {
// Note: Anything that affects the tooltip text should be accounted for when
// calling TooltipTextChanged() from Tab::DataChanged().
- *tooltip = chrome::AssembleTabTooltipText(data_.title, data_.alert_state);
+ *tooltip = chrome::AssembleTabTooltipText(data_.title, data_.alert_state,
+ data_.network_state);
return !tooltip->empty();
}
@@ -1100,7 +1149,8 @@ void Tab::OnGestureEvent(ui::GestureEvent* event) {
void Tab::GetAccessibleNodeData(ui::AXNodeData* node_data) {
node_data->role = ui::AX_ROLE_TAB;
- node_data->SetName(data_.title);
+
+ node_data->SetName(GetAccessibleTabLabel(data_));
node_data->AddStateFlag(ui::AX_STATE_MULTISELECTABLE);
node_data->AddStateFlag(ui::AX_STATE_SELECTABLE);
controller_->UpdateTabAccessibilityState(this, node_data);
@@ -1185,7 +1235,8 @@ void Tab::PaintImmersiveTab(gfx::Canvas* canvas) {
// Paint network activity indicator.
// TODO(jamescook): Replace this placeholder animation with a real one.
// For now, let's go with a Cylon eye effect, but in blue.
- if (data().network_state != TabRendererData::NETWORK_STATE_NONE) {
+ if (data().network_state != TabRendererData::NETWORK_STATE_NONE &&
+ data().network_state != TabRendererData::NETWORK_STATE_ERROR) {
const SkColor kEyeColor = SkColorSetARGB(alpha, 71, 138, 217);
int eye_width = bar_rect.width() / 3;
int eye_offset = bar_rect.width() * immersive_loading_step_ /
@@ -1390,9 +1441,10 @@ void Tab::PaintIcon(gfx::Canvas* canvas) {
return;
// Throbber will do its own painting.
- if (data().network_state != TabRendererData::NETWORK_STATE_NONE)
+ if (data().network_state != TabRendererData::NETWORK_STATE_NONE &&
+ data().network_state != TabRendererData::NETWORK_STATE_ERROR) {
return;
-
+ }
// Ensure that |favicon_| is created.
if (favicon_.isNull()) {
ui::ResourceBundle* rb = &ui::ResourceBundle::GetSharedInstance();
@@ -1442,7 +1494,8 @@ void Tab::AdvanceLoadingAnimation() {
return;
}
- if (state == TabRendererData::NETWORK_STATE_NONE) {
+ if (state == TabRendererData::NETWORK_STATE_NONE ||
+ state == TabRendererData::NETWORK_STATE_ERROR) {
throbber_->ResetStartTimes();
throbber_->SetVisible(false);
ScheduleIconPaint();

Powered by Google App Engine
This is Rietveld 408576698