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)
}
else if ( nType == WINDOW_BORDERWINDOW && hasFloatingChild( pWindow ) )
{
PopupMenuFloatingWindow* pChild = dynamic_cast<PopupMenuFloatingWindow*>(
pWindow->GetAccessibleChildWindow(0));
if ( pChild && pChild->IsPopupMenu() )
// The logic here has to match that of Window::GetAccessibleParentWindow in
// vcl/source/window/window.cxx to avoid PopupMenuFloatingWindow
// becoming a11y parents of themselves
Window* pChild = pWindow->GetAccessibleChildWindow(0);
if (PopupMenuFloatingWindow::isPopupMenu(pChild))
{
// Get the accessible context from the child window.
Reference<XAccessible> xAccessible = pChild->CreateAccessible();
......
......@@ -34,6 +34,9 @@ public:
sal_uInt16 GetMenuStackLevel() const;
void SetMenuStackLevel( sal_uInt16 nLevel );
bool IsPopupMenu() const;
//determine if a given window is an activated PopupMenuFloatingWindow
static bool isPopupMenu(const Window *pWindow);
};
#endif
......
......@@ -67,4 +67,10 @@ bool PopupMenuFloatingWindow::IsPopupMenu() const
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: */
......@@ -48,6 +48,7 @@
#include "vcl/unowrap.hxx"
#include "vcl/gdimtf.hxx"
#include "vcl/pdfextoutdevdata.hxx"
#include "vcl/popupmenuwindow.hxx"
#include "vcl/lazydelete.hxx"
#include "vcl/virdev.hxx"
......@@ -8601,10 +8602,15 @@ Window* Window::GetAccessibleParentWindow() const
pWorkWin = pWorkWin->mpWindowImpl->mpNext;
pParent = pWorkWin;
}
// If this a floating window which has a native boarder window, this one should be reported as
// accessible parent
// If this is a floating window which has a native border window, then that border should be reported as
// 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 &&
mpWindowImpl->mpBorderWindow && mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame)
mpWindowImpl->mpBorderWindow && mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame &&
!PopupMenuFloatingWindow::isPopupMenu(this))
{
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