summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authordtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-27 17:49:11 +0000
committerdtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-27 17:49:11 +0000
commit27096aed544141ccf34e23b8b0d3f17bb67dd255 (patch)
treedd32f21f4f96a37ce08c8e3faceaec5c75f4ecde /chrome
parent4c38e315e19269affcbec73190af490840b8bcc4 (diff)
downloadchromium_src-27096aed544141ccf34e23b8b0d3f17bb67dd255.zip
chromium_src-27096aed544141ccf34e23b8b0d3f17bb67dd255.tar.gz
chromium_src-27096aed544141ccf34e23b8b0d3f17bb67dd255.tar.bz2
Send an EVENT_SYSTEM_ALERT when a user first places focus within an infobar.
TEST=use Jaws and NVDA to verify that alert gets read when focus enters the infobar. BUG=37360 Review URL: http://codereview.chromium.org/3421033 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@60672 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/views/infobars/infobars.cc17
-rw-r--r--chrome/browser/views/infobars/infobars.h5
2 files changed, 22 insertions, 0 deletions
diff --git a/chrome/browser/views/infobars/infobars.cc b/chrome/browser/views/infobars/infobars.cc
index e2bfd4b..ad9a2c8 100644
--- a/chrome/browser/views/infobars/infobars.cc
+++ b/chrome/browser/views/infobars/infobars.cc
@@ -193,6 +193,17 @@ void InfoBar::ButtonPressed(views::Button* sender, const views::Event& event) {
}
}
+// InfoBar, views::FocusChangeListener implementation: ------------------
+
+void InfoBar::FocusWillChange(View* focused_before, View* focused_now) {
+ // This will trigger some screen readers to read the entire contents of this
+ // infobar.
+ if (focused_before && focused_now &&
+ !this->IsParentOf(focused_before) && this->IsParentOf(focused_now)) {
+ NotifyAccessibilityEvent(AccessibilityTypes::EVENT_ALERT);
+ }
+}
+
// InfoBar, AnimationDelegate implementation: ----------------------------------
void InfoBar::AnimationProgressed(const Animation* animation) {
@@ -262,6 +273,9 @@ void InfoBar::InfoBarAdded() {
}
#endif
+ if (GetFocusManager())
+ GetFocusManager()->AddFocusChangeListener(this);
+
NotifyAccessibilityEvent(AccessibilityTypes::EVENT_ALERT);
}
@@ -275,6 +289,9 @@ void InfoBar::InfoBarRemoved() {
// since no-one refers to us now.
MessageLoop::current()->PostTask(FROM_HERE,
delete_factory_.NewRunnableMethod(&InfoBar::DeleteSelf));
+
+ if (GetFocusManager())
+ GetFocusManager()->RemoveFocusChangeListener(this);
}
void InfoBar::DestroyFocusTracker(bool restore_focus) {
diff --git a/chrome/browser/views/infobars/infobars.h b/chrome/browser/views/infobars/infobars.h
index 47a41fa..4419d8f 100644
--- a/chrome/browser/views/infobars/infobars.h
+++ b/chrome/browser/views/infobars/infobars.h
@@ -11,6 +11,7 @@
#include "chrome/browser/tab_contents/infobar_delegate.h"
#include "views/controls/button/button.h"
#include "views/controls/link.h"
+#include "views/focus/focus_manager.h"
class InfoBarContainer;
class SlideAnimation;
@@ -41,6 +42,7 @@ class InfoBarBackground : public views::Background {
class InfoBar : public views::View,
public views::ButtonListener,
+ public views::FocusChangeListener,
public AnimationDelegate {
public:
explicit InfoBar(InfoBarDelegate* delegate);
@@ -99,6 +101,9 @@ class InfoBar : public views::View,
// Overridden from views::ButtonListener:
virtual void ButtonPressed(views::Button* sender, const views::Event& event);
+ // Overridden from views::FocusChangeListener:
+ virtual void FocusWillChange(View* focused_before, View* focused_now);
+
// Overridden from AnimationDelegate:
virtual void AnimationProgressed(const Animation* animation);
virtual void AnimationEnded(const Animation* animation);