diff options
author | ctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-09 04:28:48 +0000 |
---|---|---|
committer | ctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-03-09 04:28:48 +0000 |
commit | a3018be3ef7cf4f916a313bca028160694f87d7e (patch) | |
tree | c03f48ee1e36acb3cf38be1ebdba18c18d45cf07 /chrome | |
parent | 290c970f0d8d0322c175cb9f6bef4e653a9862b1 (diff) | |
download | chromium_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.cc | 13 | ||||
-rw-r--r-- | chrome/browser/browser_accessibility_manager.h | 6 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.cc | 11 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.h | 1 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 6 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 25 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 2 |
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, |