| Index: ash/common/system/tray_accessibility.cc | 
| diff --git a/ash/common/system/tray_accessibility.cc b/ash/common/system/tray_accessibility.cc | 
| index 7523dfe21cebb871ab5d7fd12d0a83bfee5c7c90..0080f8acf37b4be27c907465a7baddd9b00c27da 100644 | 
| --- a/ash/common/system/tray_accessibility.cc | 
| +++ b/ash/common/system/tray_accessibility.cc | 
| @@ -32,6 +32,7 @@ | 
| #include "ui/views/controls/button/custom_button.h" | 
| #include "ui/views/controls/image_view.h" | 
| #include "ui/views/controls/label.h" | 
| +#include "ui/views/controls/separator.h" | 
| #include "ui/views/layout/box_layout.h" | 
| #include "ui/views/widget/widget.h" | 
|  | 
| @@ -47,6 +48,10 @@ enum AccessibilityState { | 
| A11Y_AUTOCLICK = 1 << 4, | 
| A11Y_VIRTUAL_KEYBOARD = 1 << 5, | 
| A11Y_BRAILLE_DISPLAY_CONNECTED = 1 << 6, | 
| +  A11Y_MONO_AUDIO = 1 << 7, | 
| +  A11Y_CARET_HIGHLIGHT = 1 << 8, | 
| +  A11Y_HIGHLIGHT_MOUSE_CURSOR = 1 << 9, | 
| +  A11Y_HIGHLIGHT_KEYBOARD_FOCUS = 1 << 10, | 
| }; | 
|  | 
| uint32_t GetAccessibilityState() { | 
| @@ -67,6 +72,14 @@ uint32_t GetAccessibilityState() { | 
| state |= A11Y_VIRTUAL_KEYBOARD; | 
| if (delegate->IsBrailleDisplayConnected()) | 
| state |= A11Y_BRAILLE_DISPLAY_CONNECTED; | 
| +  if (delegate->IsMonoAudioEnabled()) | 
| +    state |= A11Y_MONO_AUDIO; | 
| +  if (delegate->IsCaretHighlightEnabled()) | 
| +    state |= A11Y_CARET_HIGHLIGHT; | 
| +  if (delegate->IsCursorHighlightEnabled()) | 
| +    state |= A11Y_HIGHLIGHT_MOUSE_CURSOR; | 
| +  if (delegate->IsFocusHighlightEnabled()) | 
| +    state |= A11Y_HIGHLIGHT_KEYBOARD_FOCUS; | 
| return state; | 
| } | 
|  | 
| @@ -74,6 +87,20 @@ LoginStatus GetCurrentLoginStatus() { | 
| return Shell::Get()->system_tray_delegate()->GetUserLoginStatus(); | 
| } | 
|  | 
| +void UpdateCheckMark(HoverHighlightView* container, bool checked) { | 
| +  if (checked) { | 
| +    gfx::ImageSkia check_mark = | 
| +        CreateVectorIcon(kCheckCircleIcon, gfx::kGoogleGreen700); | 
| +    container->AddRightIcon(check_mark, check_mark.width()); | 
| +    container->SetRightViewVisible(true); | 
| +    container->SetAccessiblityState( | 
| +        HoverHighlightView::AccessibilityState::CHECKED_CHECKBOX); | 
| +  } else { | 
| +    container->SetAccessiblityState( | 
| +        HoverHighlightView::AccessibilityState::UNCHECKED_CHECKBOX); | 
| +  } | 
| +} | 
| + | 
| }  // namespace | 
|  | 
| namespace tray { | 
| @@ -139,20 +166,6 @@ views::Label* AccessibilityPopupView::CreateLabel(uint32_t enabled_state_bits) { | 
| AccessibilityDetailedView::AccessibilityDetailedView(SystemTrayItem* owner, | 
| LoginStatus login) | 
| : TrayDetailsView(owner), | 
| -      spoken_feedback_view_(nullptr), | 
| -      high_contrast_view_(nullptr), | 
| -      screen_magnifier_view_(nullptr), | 
| -      large_cursor_view_(nullptr), | 
| -      help_view_(nullptr), | 
| -      settings_view_(nullptr), | 
| -      autoclick_view_(nullptr), | 
| -      virtual_keyboard_view_(nullptr), | 
| -      spoken_feedback_enabled_(false), | 
| -      high_contrast_enabled_(false), | 
| -      screen_magnifier_enabled_(false), | 
| -      large_cursor_enabled_(false), | 
| -      autoclick_enabled_(false), | 
| -      virtual_keyboard_enabled_(false), | 
| login_(login) { | 
| Reset(); | 
| AppendAccessibilityList(); | 
| @@ -173,16 +186,6 @@ void AccessibilityDetailedView::AppendAccessibilityList() { | 
| spoken_feedback_enabled_, spoken_feedback_enabled_, | 
| kSystemMenuAccessibilityChromevoxIcon); | 
|  | 
| -  // Large Cursor item is shown only in Login screen. | 
| -  if (login_ == LoginStatus::NOT_LOGGED_IN) { | 
| -    large_cursor_enabled_ = delegate->IsLargeCursorEnabled(); | 
| -    large_cursor_view_ = | 
| -        AddScrollListItem(bundle.GetLocalizedString( | 
| -                              IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LARGE_CURSOR), | 
| -                          large_cursor_enabled_, large_cursor_enabled_, | 
| -                          kSystemMenuAccessibilityLargeCursorIcon); | 
| -  } | 
| - | 
| high_contrast_enabled_ = delegate->IsHighContrastEnabled(); | 
| high_contrast_view_ = AddScrollListItem( | 
| bundle.GetLocalizedString( | 
| @@ -196,14 +199,11 @@ void AccessibilityDetailedView::AppendAccessibilityList() { | 
| screen_magnifier_enabled_, screen_magnifier_enabled_, | 
| kSystemMenuAccessibilityScreenMagnifierIcon); | 
|  | 
| -  // Don't show autoclick option at login screen. | 
| -  if (login_ != LoginStatus::NOT_LOGGED_IN) { | 
| -    autoclick_enabled_ = delegate->IsAutoclickEnabled(); | 
| -    autoclick_view_ = AddScrollListItem( | 
| -        bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_AUTOCLICK), | 
| -        autoclick_enabled_, autoclick_enabled_, | 
| -        kSystemMenuAccessibilityAutoClickIcon); | 
| -  } | 
| +  autoclick_enabled_ = delegate->IsAutoclickEnabled(); | 
| +  autoclick_view_ = AddScrollListItem( | 
| +      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_AUTOCLICK), | 
| +      autoclick_enabled_, autoclick_enabled_, | 
| +      kSystemMenuAccessibilityAutoClickIcon); | 
|  | 
| virtual_keyboard_enabled_ = delegate->IsVirtualKeyboardEnabled(); | 
| virtual_keyboard_view_ = | 
| @@ -211,6 +211,44 @@ void AccessibilityDetailedView::AppendAccessibilityList() { | 
| IDS_ASH_STATUS_TRAY_ACCESSIBILITY_VIRTUAL_KEYBOARD), | 
| virtual_keyboard_enabled_, virtual_keyboard_enabled_, | 
| kSystemMenuKeyboardIcon); | 
| + | 
| +  scroll_content()->AddChildView( | 
| +      TrayPopupUtils::CreateListSubHeaderSeparator()); | 
| + | 
| +  AddSubHeader(l10n_util::GetStringUTF16( | 
| +      IDS_ASH_STATUS_TRAY_ACCESSIBILITY_ADDITIONAL_SETTINGS)); | 
| + | 
| +  large_cursor_enabled_ = delegate->IsLargeCursorEnabled(); | 
| +  large_cursor_view_ = AddScrollListItemWithoutIcon( | 
| +      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_LARGE_CURSOR), | 
| +      large_cursor_enabled_); | 
| + | 
| +  mono_audio_enabled_ = delegate->IsMonoAudioEnabled(); | 
| +  mono_audio_view_ = AddScrollListItemWithoutIcon( | 
| +      bundle.GetLocalizedString(IDS_ASH_STATUS_TRAY_ACCESSIBILITY_MONO_AUDIO), | 
| +      mono_audio_enabled_); | 
| + | 
| +  caret_highlight_enabled_ = delegate->IsCaretHighlightEnabled(); | 
| +  caret_highlight_view_ = AddScrollListItemWithoutIcon( | 
| +      bundle.GetLocalizedString( | 
| +          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_CARET_HIGHLIGHT), | 
| +      caret_highlight_enabled_); | 
| + | 
| +  highlight_mouse_cursor_enabled_ = delegate->IsCursorHighlightEnabled(); | 
| +  highlight_mouse_cursor_view_ = AddScrollListItemWithoutIcon( | 
| +      bundle.GetLocalizedString( | 
| +          IDS_ASH_STATUS_TRAY_ACCESSIBILITY_HIGHLIGHT_MOUSE_CURSOR), | 
| +      highlight_mouse_cursor_enabled_); | 
| + | 
| +  // Focus highlighting can't be on when spoken feedback is on because | 
| +  // ChromeVox does its own focus highlighting. | 
| +  if (!spoken_feedback_enabled_) { | 
| +    highlight_keyboard_focus_enabled_ = delegate->IsFocusHighlightEnabled(); | 
| +    highlight_keyboard_focus_view_ = AddScrollListItemWithoutIcon( | 
| +        bundle.GetLocalizedString( | 
| +            IDS_ASH_STATUS_TRAY_ACCESSIBILITY_HIGHLIGHT_KEYBOARD_FOCUS), | 
| +        highlight_keyboard_focus_enabled_); | 
| +  } | 
| } | 
|  | 
| HoverHighlightView* AccessibilityDetailedView::AddScrollListItem( | 
| @@ -225,22 +263,38 @@ HoverHighlightView* AccessibilityDetailedView::AddScrollListItem( | 
| image, text, highlight, image.width() + kMenuSeparatorVerticalPadding * 2, | 
| padding, padding); | 
|  | 
| -  if (checked) { | 
| -    gfx::ImageSkia check_mark = | 
| -        CreateVectorIcon(kCheckCircleIcon, gfx::kGoogleGreen700); | 
| -    container->AddRightIcon(check_mark, check_mark.width()); | 
| -    container->SetRightViewVisible(true); | 
| -    container->SetAccessiblityState( | 
| -        HoverHighlightView::AccessibilityState::CHECKED_CHECKBOX); | 
| -  } else { | 
| -    container->SetAccessiblityState( | 
| -        HoverHighlightView::AccessibilityState::UNCHECKED_CHECKBOX); | 
| -  } | 
| +  UpdateCheckMark(container, checked); | 
|  | 
| scroll_content()->AddChildView(container); | 
| return container; | 
| } | 
|  | 
| +HoverHighlightView* AccessibilityDetailedView::AddScrollListItemWithoutIcon( | 
| +    const base::string16& text, | 
| +    bool checked) { | 
| +  HoverHighlightView* container = new HoverHighlightView(this); | 
| +  container->AddLabelRowMd(text); | 
| + | 
| +  UpdateCheckMark(container, checked); | 
| + | 
| +  scroll_content()->AddChildView(container); | 
| +  return container; | 
| +} | 
| + | 
| +void AccessibilityDetailedView::AddSubHeader( | 
| +    const base::string16& header_text) { | 
| +  TriView* header = TrayPopupUtils::CreateSubHeaderRowView(); | 
| +  TrayPopupUtils::ConfigureAsStickyHeader(header); | 
| + | 
| +  views::Label* label = TrayPopupUtils::CreateDefaultLabel(); | 
| +  label->SetText(header_text); | 
| +  TrayPopupItemStyle style(TrayPopupItemStyle::FontStyle::SUB_HEADER); | 
| +  style.SetupLabel(label); | 
| +  header->AddView(TriView::Container::CENTER, label); | 
| + | 
| +  scroll_content()->AddChildView(header); | 
| +} | 
| + | 
| void AccessibilityDetailedView::HandleViewClicked(views::View* view) { | 
| AccessibilityDelegate* delegate = | 
| Shell::GetInstance()->accessibility_delegate(); | 
| @@ -275,6 +329,28 @@ void AccessibilityDetailedView::HandleViewClicked(views::View* view) { | 
| ? ash::UMA_STATUS_AREA_DISABLE_VIRTUAL_KEYBOARD | 
| : ash::UMA_STATUS_AREA_ENABLE_VIRTUAL_KEYBOARD; | 
| delegate->SetVirtualKeyboardEnabled(!delegate->IsVirtualKeyboardEnabled()); | 
| +  } else if (caret_highlight_view_ && view == caret_highlight_view_) { | 
| +    user_action = delegate->IsCaretHighlightEnabled() | 
| +                      ? ash::UMA_STATUS_AREA_DISABLE_CARET_HIGHLIGHT | 
| +                      : ash::UMA_STATUS_AREA_ENABLE_CARET_HIGHLIGHT; | 
| +    delegate->SetCaretHighlightEnabled(!delegate->IsCaretHighlightEnabled()); | 
| +  } else if (mono_audio_view_ && view == mono_audio_view_) { | 
| +    user_action = delegate->IsMonoAudioEnabled() | 
| +                      ? ash::UMA_STATUS_AREA_DISABLE_MONO_AUDIO | 
| +                      : ash::UMA_STATUS_AREA_ENABLE_MONO_AUDIO; | 
| +    delegate->SetMonoAudioEnabled(!delegate->IsMonoAudioEnabled()); | 
| +  } else if (highlight_mouse_cursor_view_ && | 
| +             view == highlight_mouse_cursor_view_) { | 
| +    user_action = delegate->IsCursorHighlightEnabled() | 
| +                      ? ash::UMA_STATUS_AREA_DISABLE_HIGHLIGHT_MOUSE_CURSOR | 
| +                      : ash::UMA_STATUS_AREA_ENABLE_HIGHLIGHT_MOUSE_CURSOR; | 
| +    delegate->SetCursorHighlightEnabled(!delegate->IsCursorHighlightEnabled()); | 
| +  } else if (highlight_keyboard_focus_view_ && | 
| +             view == highlight_keyboard_focus_view_) { | 
| +    user_action = delegate->IsFocusHighlightEnabled() | 
| +                      ? ash::UMA_STATUS_AREA_DISABLE_HIGHLIGHT_KEYBOARD_FOCUS | 
| +                      : ash::UMA_STATUS_AREA_ENABLE_HIGHLIGHT_KEYBOARD_FOCUS; | 
| +    delegate->SetFocusHighlightEnabled(!delegate->IsFocusHighlightEnabled()); | 
| } else { | 
| return; | 
| } | 
|  |