summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-09 04:28:48 +0000
committerctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-03-09 04:28:48 +0000
commita3018be3ef7cf4f916a313bca028160694f87d7e (patch)
treec03f48ee1e36acb3cf38be1ebdba18c18d45cf07 /chrome
parent290c970f0d8d0322c175cb9f6bef4e653a9862b1 (diff)
downloadchromium_src-a3018be3ef7cf4f916a313bca028160694f87d7e.zip
chromium_src-a3018be3ef7cf4f916a313bca028160694f87d7e.tar.gz
chromium_src-a3018be3ef7cf4f916a313bca028160694f87d7e.tar.bz2
Notify MSAA clients when a state change notification is received.
BUG=36165 TEST=The screen reader JAWS should speak the checked state of a check box when it is toggled. Review URL: http://codereview.chromium.org/693002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40998 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/browser_accessibility_manager.cc13
-rw-r--r--chrome/browser/browser_accessibility_manager.h6
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc11
-rw-r--r--chrome/browser/renderer_host/render_view_host.h1
-rw-r--r--chrome/common/render_messages_internal.h6
-rw-r--r--chrome/renderer/render_view.cc25
-rw-r--r--chrome/renderer/render_view.h2
7 files changed, 64 insertions, 0 deletions
diff --git a/chrome/browser/browser_accessibility_manager.cc b/chrome/browser/browser_accessibility_manager.cc
index ccbf5b8..cd53e72 100644
--- a/chrome/browser/browser_accessibility_manager.cc
+++ b/chrome/browser/browser_accessibility_manager.cc
@@ -110,6 +110,19 @@ bool BrowserAccessibilityManager::ChangeAccessibilityFocus(int acc_obj_id,
return false;
}
+bool BrowserAccessibilityManager::OnAccessibilityObjectStateChange(
+ int acc_obj_id, int process_id, int routing_id) {
+ BrowserAccessibility* browser_acc =
+ GetBrowserAccessibility(process_id, routing_id);
+ if (browser_acc) {
+ // Notify Access Technology that there was a change in state.
+ ::NotifyWinEvent(EVENT_OBJECT_STATECHANGE, browser_acc->parent_hwnd(),
+ OBJID_CLIENT, static_cast<LONG>(acc_obj_id));
+ return true;
+ }
+ return false;
+}
+
const WebAccessibility::OutParams& BrowserAccessibilityManager::response() {
return out_params_;
}
diff --git a/chrome/browser/browser_accessibility_manager.h b/chrome/browser/browser_accessibility_manager.h
index 4af1363..4850242 100644
--- a/chrome/browser/browser_accessibility_manager.h
+++ b/chrome/browser/browser_accessibility_manager.h
@@ -56,6 +56,12 @@ class BrowserAccessibilityManager : public NotificationObserver {
// platform-specific channels.
bool ChangeAccessibilityFocus(int acc_obj_id, int process_id, int routing_id);
+ // Notifies assistive technology that an object's state changed, through the
+ // platform-specific channels.
+ bool OnAccessibilityObjectStateChange(int acc_obj_id,
+ int process_id,
+ int routing_id);
+
// Wrapper function, for cleaner code.
const WebAccessibility::OutParams& response();
diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc
index c6f673a..59ba321 100644
--- a/chrome/browser/renderer_host/render_view_host.cc
+++ b/chrome/browser/renderer_host/render_view_host.cc
@@ -813,6 +813,8 @@ void RenderViewHost::OnMessageReceived(const IPC::Message& msg) {
OnExtensionPostMessage)
IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityFocusChange,
OnAccessibilityFocusChange)
+ IPC_MESSAGE_HANDLER(ViewHostMsg_AccessibilityObjectStateChange,
+ OnAccessibilityObjectStateChange)
IPC_MESSAGE_HANDLER(ViewHostMsg_OnCSSInserted, OnCSSInserted)
IPC_MESSAGE_HANDLER(ViewHostMsg_PageContents, OnPageContents)
IPC_MESSAGE_HANDLER(ViewHostMsg_PageTranslated, OnPageTranslated)
@@ -1815,6 +1817,15 @@ void RenderViewHost::OnAccessibilityFocusChange(int acc_obj_id) {
#endif
}
+void RenderViewHost::OnAccessibilityObjectStateChange(int acc_obj_id) {
+#if defined(OS_WIN)
+ BrowserAccessibilityManager::GetInstance()->OnAccessibilityObjectStateChange(
+ acc_obj_id, process()->id(), routing_id());
+#else
+ // TODO(port): accessibility not yet implemented. See http://crbug.com/8288.
+#endif
+}
+
void RenderViewHost::OnCSSInserted() {
delegate_->DidInsertCSS();
}
diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h
index d7ad3e9a7..e860dc2 100644
--- a/chrome/browser/renderer_host/render_view_host.h
+++ b/chrome/browser/renderer_host/render_view_host.h
@@ -607,6 +607,7 @@ class RenderViewHost : public RenderWidgetHost {
int request_id, bool has_callback);
void OnExtensionPostMessage(int port_id, const std::string& message);
void OnAccessibilityFocusChange(int acc_obj_id);
+ void OnAccessibilityObjectStateChange(int acc_obj_id);
void OnCSSInserted();
void OnPageContents(const GURL& url,
int32 page_id,
diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h
index dc852f7..7c6755b 100644
--- a/chrome/common/render_messages_internal.h
+++ b/chrome/common/render_messages_internal.h
@@ -2033,6 +2033,12 @@ IPC_BEGIN_MESSAGES(ViewHost)
IPC_MESSAGE_ROUTED1(ViewHostMsg_AccessibilityFocusChange,
int /* accessibility object id */)
+ // Send as a result of a state change in the renderer (if accessibility is
+ // enabled), to notify the browser side. Takes the id of the accessibility
+ // object that had a state change
+ IPC_MESSAGE_ROUTED1(ViewHostMsg_AccessibilityObjectStateChange,
+ int /* accessibility object id */)
+
// Message sent from the renderer to the browser to request that the browser
// close all sockets. Used for debugging/testing.
IPC_MESSAGE_CONTROL0(ViewHostMsg_CloseCurrentConnections)
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index d511825..f18d06b 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -4411,6 +4411,31 @@ void RenderView::SendForms(WebFrame* frame) {
Send(new ViewHostMsg_FormsSeen(routing_id_, forms));
}
+void RenderView::didChangeAccessibilityObjectState(
+ const WebKit::WebAccessibilityObject& acc_obj) {
+#if defined(OS_WIN)
+ // TODO(dglazkov): Current logic implies that a state change can only be made
+ // after at least one call to RenderView::OnGetAccessibilityInfo, which is
+ // where accessibility is initialized. We should determine whether that's
+ // right.
+ if (!accessibility_.get())
+ return;
+
+ // Retrieve the accessibility object id of the AccessibilityObject.
+ int acc_obj_id = accessibility_->addOrGetId(acc_obj);
+
+ // If id is valid, alert the browser side that an accessibility object state
+ // change occurred.
+ if (acc_obj_id >= 0)
+ Send(new ViewHostMsg_AccessibilityObjectStateChange(routing_id_,
+ acc_obj_id));
+
+#else // defined(OS_WIN)
+ // TODO(port): accessibility not yet implemented
+ NOTIMPLEMENTED();
+#endif
+}
+
void RenderView::SendPasswordForms(WebFrame* frame) {
WebVector<WebFormElement> forms;
frame->forms(forms);
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index c149320..b0db68f 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -259,6 +259,8 @@ class RenderView : public RenderWidget,
virtual void didAddHistoryItem();
virtual void focusAccessibilityObject(
const WebKit::WebAccessibilityObject& acc_obj);
+ virtual void didChangeAccessibilityObjectState(
+ const WebKit::WebAccessibilityObject& acc_obj);
virtual void didUpdateInspectorSettings();
virtual void queryAutofillSuggestions(
const WebKit::WebNode& node, const WebKit::WebString& name,