summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-16 16:22:05 +0000
committerdtseng@chromium.org <dtseng@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-16 16:22:05 +0000
commitba7ac5388517567ba47dcefa3718d2bacfe7bae5 (patch)
tree034ba186b088edbedfbc2ef1f365996cbec6b2b4
parent145bd92616228f20095e3ecd50ba0ccb190ebc59 (diff)
downloadchromium_src-ba7ac5388517567ba47dcefa3718d2bacfe7bae5.zip
chromium_src-ba7ac5388517567ba47dcefa3718d2bacfe7bae5.tar.gz
chromium_src-ba7ac5388517567ba47dcefa3718d2bacfe7bae5.tar.bz2
Add accessibility support for Textfields in Windows.
BUG=none TEST=none Review URL: http://codereview.chromium.org/2791003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@49955 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--views/controls/textfield/native_textfield_win.cc75
-rw-r--r--views/controls/textfield/native_textfield_win.h9
2 files changed, 84 insertions, 0 deletions
diff --git a/views/controls/textfield/native_textfield_win.cc b/views/controls/textfield/native_textfield_win.cc
index f3edb9b4..be1a0bae 100644
--- a/views/controls/textfield/native_textfield_win.cc
+++ b/views/controls/textfield/native_textfield_win.cc
@@ -19,6 +19,7 @@
#include "gfx/native_theme_win.h"
#include "grit/app_strings.h"
#include "skia/ext/skia_utils_win.h"
+#include "views/controls/label.h"
#include "views/controls/menu/menu_win.h"
#include "views/controls/menu/menu_2.h"
#include "views/controls/native/native_view_host.h"
@@ -119,6 +120,8 @@ NativeTextfieldWin::NativeTextfieldWin(Textfield* textfield)
ole_interface.Attach(GetOleInterface());
if (ole_interface)
text_object_model_.QueryFrom(ole_interface);
+
+ InitializeAccessibilityInfo();
}
NativeTextfieldWin::~NativeTextfieldWin() {
@@ -158,6 +161,7 @@ void NativeTextfieldWin::UpdateText() {
if (textfield_->style() & Textfield::STYLE_LOWERCASE)
text_to_set = l10n_util::ToLower(text_to_set);
SetWindowText(text_to_set.c_str());
+ UpdateAccessibleValue(text_to_set);
}
void NativeTextfieldWin::AppendText(const string16& text) {
@@ -217,6 +221,7 @@ void NativeTextfieldWin::UpdateBackgroundColor() {
void NativeTextfieldWin::UpdateReadOnly() {
SendMessage(m_hWnd, EM_SETREADONLY, textfield_->read_only(), 0);
+ UpdateAccessibleState(STATE_SYSTEM_READONLY, textfield_->read_only());
}
void NativeTextfieldWin::UpdateFont() {
@@ -228,10 +233,12 @@ void NativeTextfieldWin::UpdateFont() {
void NativeTextfieldWin::UpdateIsPassword() {
// TODO: Need to implement for Windows.
+ UpdateAccessibleState(STATE_SYSTEM_PROTECTED, textfield_->IsPassword());
}
void NativeTextfieldWin::UpdateEnabled() {
SendMessage(m_hWnd, WM_ENABLE, textfield_->IsEnabled(), 0);
+ UpdateAccessibleState(STATE_SYSTEM_UNAVAILABLE, !textfield_->IsEnabled());
}
gfx::Insets NativeTextfieldWin::CalculateInsets() {
@@ -331,6 +338,73 @@ void NativeTextfieldWin::ExecuteCommand(int command_id) {
OnAfterPossibleChange(true);
}
+void NativeTextfieldWin::InitializeAccessibilityInfo() {
+ // Set the accessible state.
+ accessibility_state_ = 0;
+
+ ScopedComPtr<IAccPropServices> pAccPropServices;
+ HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER,
+ IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices));
+ if (!SUCCEEDED(hr))
+ return;
+
+ VARIANT var;
+
+ // Set the accessible role.
+ var.vt = VT_I4;
+ var.lVal = ROLE_SYSTEM_TEXT;
+ hr = pAccPropServices->SetHwndProp(m_hWnd, OBJID_CLIENT,
+ CHILDID_SELF, PROPID_ACC_ROLE, var);
+
+ // Set the accessible name by getting the label text.
+ View* parent = textfield_->GetParent();
+ int label_index = parent->GetChildIndex(textfield_) - 1;
+ if (label_index >= 0) {
+ // Try to find the name of this text field.
+ // We expect it to be a Label preceeding this view (if it exists).
+ std::wstring name;
+ View* label_view = parent->GetChildViewAt(label_index );
+ if (label_view ->GetClassName() == Label::kViewClassName &&
+ label_view ->GetAccessibleName(&name)) {
+ hr = pAccPropServices->SetHwndPropStr(m_hWnd, OBJID_CLIENT,
+ CHILDID_SELF, PROPID_ACC_NAME, name.c_str());
+ }
+ }
+}
+
+void NativeTextfieldWin::UpdateAccessibleState(uint32 state_flag,
+ bool set_value) {
+ ScopedComPtr<IAccPropServices> pAccPropServices;
+ HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER,
+ IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices));
+ if (!SUCCEEDED(hr))
+ return;
+
+ VARIANT var;
+ var.vt = VT_I4;
+ var.lVal = set_value ? accessibility_state_ | state_flag
+ : accessibility_state_ & ~state_flag;
+ hr = pAccPropServices->SetHwndProp(m_hWnd, OBJID_CLIENT,
+ CHILDID_SELF, PROPID_ACC_STATE, var);
+
+ ::NotifyWinEvent(EVENT_OBJECT_STATECHANGE, m_hWnd, OBJID_CLIENT,
+ CHILDID_SELF);
+}
+
+void NativeTextfieldWin::UpdateAccessibleValue(const std::wstring& value) {
+ ScopedComPtr<IAccPropServices> pAccPropServices;
+ HRESULT hr = CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER,
+ IID_IAccPropServices, reinterpret_cast<void**>(&pAccPropServices));
+ if (!SUCCEEDED(hr))
+ return;
+
+ hr = pAccPropServices->SetHwndPropStr(m_hWnd, OBJID_CLIENT,
+ CHILDID_SELF, PROPID_ACC_VALUE, value.c_str());
+
+ ::NotifyWinEvent(EVENT_OBJECT_VALUECHANGE, m_hWnd, OBJID_CLIENT,
+ CHILDID_SELF);
+}
+
////////////////////////////////////////////////////////////////////////////////
// NativeTextfieldWin, private:
@@ -859,6 +933,7 @@ void NativeTextfieldWin::OnAfterPossibleChange(bool should_redraw_text) {
return;
}
textfield_->SyncText();
+ UpdateAccessibleValue(textfield_->text());
if (textfield_->GetController())
textfield_->GetController()->ContentsChanged(textfield_, new_text);
diff --git a/views/controls/textfield/native_textfield_win.h b/views/controls/textfield/native_textfield_win.h
index f3b4d5e..abb3357 100644
--- a/views/controls/textfield/native_textfield_win.h
+++ b/views/controls/textfield/native_textfield_win.h
@@ -10,6 +10,7 @@
#include <atlcrack.h>
#include <atlctrls.h>
#include <atlmisc.h>
+#include <oleacc.h>
#include <tom.h> // For ITextDocument, a COM interface to CRichEditCtrl
#include <vsstyle.h>
@@ -71,6 +72,11 @@ class NativeTextfieldWin
menus::Accelerator* accelerator);
virtual void ExecuteCommand(int command_id);
+ // Update accessibility information.
+ void InitializeAccessibilityInfo();
+ void UpdateAccessibleState(uint32 state_flag, bool set_value);
+ void UpdateAccessibleValue(const std::wstring& value);
+
// CWindowImpl
BEGIN_MSG_MAP(Edit)
MSG_WM_CHAR(OnChar)
@@ -242,6 +248,9 @@ class NativeTextfieldWin
COLORREF bg_color_;
+ // The accessibility state of this object.
+ int accessibility_state_;
+
DISALLOW_COPY_AND_ASSIGN(NativeTextfieldWin);
};