Index: chrome/browser/render_widget_host_hwnd.cc |
=================================================================== |
--- chrome/browser/render_widget_host_hwnd.cc (revision 2530) |
+++ chrome/browser/render_widget_host_hwnd.cc (working copy) |
@@ -9,6 +9,8 @@ |
#include "base/gfx/rect.h" |
#include "base/histogram.h" |
#include "base/win_util.h" |
+#include "chrome/browser/browser_accessibility.h" |
+#include "chrome/browser/browser_accessibility_manager.h" |
#include "chrome/browser/render_process_host.h" |
// TODO(beng): (Cleanup) we should not need to include this file... see comment |
// in |DidBecomeSelected|. |
@@ -747,6 +749,55 @@ |
} |
} |
+LRESULT RenderWidgetHostHWND::OnGetObject(UINT message, WPARAM wparam, |
+ LPARAM lparam, BOOL& handled) { |
+ LRESULT reference_result = static_cast<LRESULT>(0L); |
+ |
+ // Accessibility readers will send an OBJID_CLIENT message. |
+ if (OBJID_CLIENT == lparam) { |
+ // If our MSAA DOM root is already created, reuse that pointer. Otherwise, |
+ // create a new one. |
+ if (!browser_accessibility_root_) { |
+ CComObject<BrowserAccessibility>* accessibility = NULL; |
+ |
+ if (!SUCCEEDED(CComObject<BrowserAccessibility>::CreateInstance( |
+ &accessibility)) || !accessibility) { |
+ // Return with failure. |
+ return static_cast<LRESULT>(0L); |
+ } |
+ |
+ CComPtr<IAccessible> accessibility_comptr(accessibility); |
+ |
+ // Root id is always 0, to distinguish this particular instance when |
+ // mapping to the render-side IAccessible. |
+ accessibility->set_iaccessible_id(0); |
+ |
+ // Set the unique member variables of this particular process. |
+ accessibility->set_instance_id(BrowserAccessibilityManager::Instance()-> |
+ SetMembers(accessibility, m_hWnd, render_widget_host_)); |
+ |
+ // All is well, assign the temp instance to the class smart pointer. |
+ browser_accessibility_root_.Attach(accessibility_comptr.Detach()); |
+ |
+ if (!browser_accessibility_root_) { |
+ // Paranoia check. Return with failure. |
+ NOTREACHED(); |
+ return static_cast<LRESULT>(0L); |
+ } |
+ |
+ // Notify that an instance of IAccessible was allocated for m_hWnd. |
+ ::NotifyWinEvent(EVENT_OBJECT_CREATE, m_hWnd, OBJID_CLIENT, |
+ CHILDID_SELF); |
+ } |
+ |
+ // Create a reference to ViewAccessibility that MSAA will marshall |
+ // to the client. |
+ reference_result = LresultFromObject(IID_IAccessible, wparam, |
+ static_cast<IAccessible*>(browser_accessibility_root_)); |
+ } |
+ return reference_result; |
+} |
+ |
void RenderWidgetHostHWND::OnFinalMessage(HWND window) { |
render_widget_host_->ViewDestroyed(); |
delete this; |