From 1d2ebedcbcc05bc32f98e996b77d4fc4b173ae17 Mon Sep 17 00:00:00 2001 From: "aaronleventhal%moonset.net" Date: Tue, 25 May 2004 14:37:07 +0000 Subject: [PATCH] Bug 244288. MSAA's WindowFromAccessibleObject doesn't work because our get_accParent doesnreturn a ROLE_WINDOW object as the parent of the ROLE_CLIENT git-svn-id: svn://10.0.0.236/trunk@156917 18797224-902f-48f8-a5cc-f745e15eee43 --- .../accessible/src/msaa/nsAccessibleWrap.cpp | 28 ++++--------------- .../src/msaa/nsDocAccessibleWrap.cpp | 26 +++++++++++++++++ .../accessible/src/msaa/nsDocAccessibleWrap.h | 9 +++++- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/mozilla/accessible/src/msaa/nsAccessibleWrap.cpp b/mozilla/accessible/src/msaa/nsAccessibleWrap.cpp index 24b03139219..859b4cd88f8 100644 --- a/mozilla/accessible/src/msaa/nsAccessibleWrap.cpp +++ b/mozilla/accessible/src/msaa/nsAccessibleWrap.cpp @@ -40,6 +40,9 @@ #include "nsIAccessibleSelectable.h" #include "nsIAccessibleWin32Object.h" #include "nsArray.h" +#include "nsIDOMDocument.h" +#include "nsIPrefService.h" +#include "nsIServiceManager.h" // for the COM IEnumVARIANT solution in get_AccSelection() #define _ATLBASE_IMPL @@ -162,35 +165,14 @@ STDMETHODIMP nsAccessibleWrap::get_accParent( IDispatch __RPC_FAR *__RPC_FAR *pp return E_FAIL; // We've been shut down nsCOMPtr xpParentAccessible; - GetParent(getter_AddRefs(xpParentAccessible)); + GetParent(getter_AddRefs(xpParentAccessible)); if (xpParentAccessible) { *ppdispParent = NativeAccessible(xpParentAccessible); return S_OK; } - // If we have a widget but no parent nsIAccessible then we might have a native - // widget parent that could give us a IAccessible. Lets check. - - void* wnd; - GetOwnerWindow(&wnd); - - HWND pWnd = ::GetParent(NS_REINTERPRET_CAST(HWND, wnd)); - if (pWnd) { - // get the accessible. - void* ptr = nsnull; - HRESULT result = AccessibleObjectFromWindow(pWnd, OBJID_WINDOW, IID_IAccessible, &ptr); - if (SUCCEEDED(result)) { - IAccessible* msaaParentAccessible = (IAccessible*)ptr; - // got one? return it. - if (msaaParentAccessible) { - *ppdispParent = msaaParentAccessible; - return NS_OK; - } - } - } - - return E_FAIL; + return E_FAIL; } STDMETHODIMP nsAccessibleWrap::get_accChildCount( long __RPC_FAR *pcountChildren) diff --git a/mozilla/accessible/src/msaa/nsDocAccessibleWrap.cpp b/mozilla/accessible/src/msaa/nsDocAccessibleWrap.cpp index 6d2fef352e8..d8ac19ff1a8 100644 --- a/mozilla/accessible/src/msaa/nsDocAccessibleWrap.cpp +++ b/mozilla/accessible/src/msaa/nsDocAccessibleWrap.cpp @@ -152,6 +152,32 @@ STDMETHODIMP nsDocAccessibleWrap::get_accChild( return nsAccessibleWrap::get_accChild(varChild, ppdispChild); } +STDMETHODIMP nsDocAccessibleWrap::get_accParent( IDispatch __RPC_FAR *__RPC_FAR *ppdispParent) +{ + // MSAA expects that client area accessibles return the native accessible for + // their containing window, otherwise WindowFromAccessibleObject() doesn't work. + + void* wnd; + GetWindowHandle(&wnd); + + HWND pWnd = ::GetParent(NS_REINTERPRET_CAST(HWND, wnd)); + if (pWnd) { + // get the accessible. + void* ptr = nsnull; + HRESULT result = AccessibleObjectFromWindow(pWnd, OBJID_WINDOW, IID_IAccessible, &ptr); + if (SUCCEEDED(result)) { + IAccessible* msaaParentAccessible = (IAccessible*)ptr; + // got one? return it. + if (msaaParentAccessible) { + *ppdispParent = msaaParentAccessible; + return S_OK; + } + } + } + + return E_FAIL; +} + NS_IMETHODIMP nsDocAccessibleWrap::FireToolkitEvent(PRUint32 aEvent, nsIAccessible* aAccessible, void* aData) { if (!mWeakShell) { // Means we're not active diff --git a/mozilla/accessible/src/msaa/nsDocAccessibleWrap.h b/mozilla/accessible/src/msaa/nsDocAccessibleWrap.h index 7e49e1002ef..516ac96d157 100644 --- a/mozilla/accessible/src/msaa/nsDocAccessibleWrap.h +++ b/mozilla/accessible/src/msaa/nsDocAccessibleWrap.h @@ -61,6 +61,7 @@ public: static PRInt32 GetChildIDFor(nsIAccessible* aAccessible); void GetXPAccessibleFor(const VARIANT& varChild, nsIAccessible **aXPAccessible); + // ISimpleDOMDocument virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_URL( /* [out] */ BSTR __RPC_FAR *url); @@ -82,11 +83,17 @@ public: /* [in] */ BSTR __RPC_FAR *commaSeparatedMediaTypes); // IAccessible - // Overrid get_accChild so that it can get any child via the unique ID + // Override get_accChild so that it can get any child via the unique ID virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accChild( /* [in] */ VARIANT varChild, /* [retval][out] */ IDispatch __RPC_FAR *__RPC_FAR *ppdispChild); + // Override get_accParent so that native accessible for window is + // returned as parent, otherwise WindowFromAccessibleObject() doesn't work. + // Also necessary for MSAA SDK's accexplore.exe testing tool to work. + virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_accParent( + /* [retval][out] */ IDispatch __RPC_FAR *__RPC_FAR *ppdispParent); + NS_IMETHOD FireToolkitEvent(PRUint32 aEvent, nsIAccessible* aAccessible, void* aData); };