1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_ACCESSIBILITY_HANDLER_H_
6#define CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_ACCESSIBILITY_HANDLER_H_
7#pragma once
8
9#include <string>
10
11#include "base/gtest_prod_util.h"
12#include "content/common/notification_observer.h"
13#include "content/common/notification_source.h"
14#include "content/common/notification_type.h"
15
16class AccessibilityControlInfo;
17class AccessibilityTextBoxInfo;
18
19namespace chromeos {
20
21enum EarconType {
22  NO_EARCON,
23  EARCON_BUTTON,
24  EARCON_CHECK_OFF,
25  EARCON_CHECK_ON,
26  EARCON_ELLIPSES,
27  EARCON_LINK,
28  EARCON_LISTBOX,
29  EARCON_MENU,
30  EARCON_OBJECT_OPENED,
31  EARCON_OBJECT_CLOSED,
32  EARCON_TAB,
33  EARCON_TEXTBOX,
34};
35
36// Class that handles the accessibility notifications and generates
37// appropriate spoken/audio feedback.
38class WizardAccessibilityHandler : public NotificationObserver {
39 public:
40  WizardAccessibilityHandler() { }
41
42  // Speaks the specified string.
43  void Speak(const char* speak_str, bool queue, bool interruptible);
44
45 private:
46  // Override from NotificationObserver.
47  virtual void Observe(NotificationType type,
48                       const NotificationSource& source,
49                       const NotificationDetails& details);
50
51  // Get text to speak and an earcon identifier (which may be NONE) for any
52  // accessibility event.
53  void DescribeAccessibilityEvent(NotificationType event_type,
54                                  const AccessibilityControlInfo* control_info,
55                                  std::string* out_spoken_description,
56                                  EarconType* out_earcon);
57
58  // Get text to speak and an optional earcon identifier, specifically for
59  // a focus or select accessibility event on a control.
60  void DescribeControl(const AccessibilityControlInfo* control_info,
61                       bool is_action,
62                       std::string* out_spoken_description,
63                       EarconType* out_earcon);
64
65  // Get text to speak when a text control has changed in some way, either
66  // the contents or selection/cursor.
67  void DescribeTextChanged(const AccessibilityControlInfo* control_info,
68                           std::string* out_spoken_description,
69                           EarconType* out_earcon);
70
71  // Get the text from an AccessibilityTextBoxInfo, obscuring the
72  // text if it's a password field.
73  std::string GetTextBoxValue(const AccessibilityTextBoxInfo* textbox_info);
74
75  // Get text to speak when only the selection/cursor has changed.
76  void DescribeTextSelectionChanged(const std::string& value,
77                                    int old_start, int old_end,
78                                    int new_start, int new_end,
79                                    std::string* out_spoken_description);
80
81  // Get text to speak when the contents of a text control has changed.
82  void DescribeTextContentsChanged(const std::string& old_value,
83                                   const std::string& new_value,
84                                   std::string* out_spoken_description);
85
86  int previous_text_selection_start_;
87  int previous_text_selection_end_;
88  std::string previous_text_value_;
89
90  friend class WizardAccessibilityHandlerTest;
91  FRIEND_TEST_ALL_PREFIXES(WizardAccessibilityHandlerTest, TestFocusEvents);
92  FRIEND_TEST_ALL_PREFIXES(WizardAccessibilityHandlerTest, TestTextEvents);
93
94  DISALLOW_COPY_AND_ASSIGN(WizardAccessibilityHandler);
95};
96
97}  // namespace chromeos
98
99#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_WIZARD_ACCESSIBILITY_HANDLER_H_
100