diff options
author | dtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-27 17:49:11 +0000 |
---|---|---|
committer | dtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-27 17:49:11 +0000 |
commit | 27096aed544141ccf34e23b8b0d3f17bb67dd255 (patch) | |
tree | dd32f21f4f96a37ce08c8e3faceaec5c75f4ecde /chrome | |
parent | 4c38e315e19269affcbec73190af490840b8bcc4 (diff) | |
download | chromium_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.cc | 17 | ||||
-rw-r--r-- | chrome/browser/views/infobars/infobars.h | 5 |
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); |