Kaydet (Commit) 1b13c952 authored tarafından Caolán McNamara's avatar Caolán McNamara

Resolves: rhbz#895196 sc filter float a11y parent of itself loop/recurse

Change-Id: I3679e7cfcd32a78b40c6a7b803c92ff0abe6f32c
üst 2cfbd84c
...@@ -382,9 +382,11 @@ inline bool hasFloatingChild(Window *pWindow) ...@@ -382,9 +382,11 @@ inline bool hasFloatingChild(Window *pWindow)
} }
else if ( nType == WINDOW_BORDERWINDOW && hasFloatingChild( pWindow ) ) else if ( nType == WINDOW_BORDERWINDOW && hasFloatingChild( pWindow ) )
{ {
PopupMenuFloatingWindow* pChild = dynamic_cast<PopupMenuFloatingWindow*>( // The logic here has to match that of Window::GetAccessibleParentWindow in
pWindow->GetAccessibleChildWindow(0)); // vcl/source/window/window.cxx to avoid PopupMenuFloatingWindow
if ( pChild && pChild->IsPopupMenu() ) // becoming a11y parents of themselves
Window* pChild = pWindow->GetAccessibleChildWindow(0);
if (PopupMenuFloatingWindow::isPopupMenu(pChild))
{ {
// Get the accessible context from the child window. // Get the accessible context from the child window.
Reference<XAccessible> xAccessible = pChild->CreateAccessible(); Reference<XAccessible> xAccessible = pChild->CreateAccessible();
......
...@@ -34,6 +34,9 @@ public: ...@@ -34,6 +34,9 @@ public:
sal_uInt16 GetMenuStackLevel() const; sal_uInt16 GetMenuStackLevel() const;
void SetMenuStackLevel( sal_uInt16 nLevel ); void SetMenuStackLevel( sal_uInt16 nLevel );
bool IsPopupMenu() const; bool IsPopupMenu() const;
//determine if a given window is an activated PopupMenuFloatingWindow
static bool isPopupMenu(const Window *pWindow);
}; };
#endif #endif
......
...@@ -67,4 +67,10 @@ bool PopupMenuFloatingWindow::IsPopupMenu() const ...@@ -67,4 +67,10 @@ bool PopupMenuFloatingWindow::IsPopupMenu() const
return mpImplData->mnMenuStackLevel != ::std::numeric_limits<sal_uInt16>::max(); return mpImplData->mnMenuStackLevel != ::std::numeric_limits<sal_uInt16>::max();
} }
bool PopupMenuFloatingWindow::isPopupMenu(const Window *pWindow)
{
const PopupMenuFloatingWindow* pChild = dynamic_cast<const PopupMenuFloatingWindow*>(pWindow);
return pChild && pChild->IsPopupMenu();
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "vcl/unowrap.hxx" #include "vcl/unowrap.hxx"
#include "vcl/gdimtf.hxx" #include "vcl/gdimtf.hxx"
#include "vcl/pdfextoutdevdata.hxx" #include "vcl/pdfextoutdevdata.hxx"
#include "vcl/popupmenuwindow.hxx"
#include "vcl/lazydelete.hxx" #include "vcl/lazydelete.hxx"
#include "vcl/virdev.hxx" #include "vcl/virdev.hxx"
...@@ -8601,10 +8602,15 @@ Window* Window::GetAccessibleParentWindow() const ...@@ -8601,10 +8602,15 @@ Window* Window::GetAccessibleParentWindow() const
pWorkWin = pWorkWin->mpWindowImpl->mpNext; pWorkWin = pWorkWin->mpWindowImpl->mpNext;
pParent = pWorkWin; pParent = pWorkWin;
} }
// If this a floating window which has a native boarder window, this one should be reported as // If this is a floating window which has a native border window, then that border should be reported as
// accessible parent // the accessible parent, unless the floating window is a PopupMenuFloatingWindow
//
// The logic here has to match that of AccessibleFactory::createAccessibleContext in
// accessibility/source/helper/acc_factory.cxx to avoid PopupMenuFloatingWindow
// becoming a11y parents of themselves
else if( GetType() == WINDOW_FLOATINGWINDOW && else if( GetType() == WINDOW_FLOATINGWINDOW &&
mpWindowImpl->mpBorderWindow && mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame) mpWindowImpl->mpBorderWindow && mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame &&
!PopupMenuFloatingWindow::isPopupMenu(this))
{ {
pParent = mpWindowImpl->mpBorderWindow; pParent = mpWindowImpl->mpBorderWindow;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment