summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@suse.com>2012-12-18 13:29:03 +0000
committerMichael Meeks <michael.meeks@suse.com>2012-12-18 16:47:14 +0000
commit1211bf4682b7e8454d86d5a812df421abf68f662 (patch)
tree75567540196c20c64b2d563b7758d0cc74d1bff1 /vcl
parent28549ae77dee063da50a56eb3cdf9114365a6afd (diff)
fdo#56937 - mac a11y hang related to traversing vast, broken hierarchies.
Change-Id: Iff0537a69b2c6ae929da6a05f26c0d55415d6d8a Signed-off-by: Tor Lillqvist <tml@iki.fi>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/aqua/source/a11y/aqua11ywrapper.mm37
1 files changed, 27 insertions, 10 deletions
diff --git a/vcl/aqua/source/a11y/aqua11ywrapper.mm b/vcl/aqua/source/a11y/aqua11ywrapper.mm
index 1be3e4ae5910..a48aa5a916a1 100644
--- a/vcl/aqua/source/a11y/aqua11ywrapper.mm
+++ b/vcl/aqua/source/a11y/aqua11ywrapper.mm
@@ -986,21 +986,38 @@ Reference < XAccessibleContext > hitTestRunner ( com::sun::star::awt::Point poin
Reference < XAccessibleComponent > rxAccessibleComponent ( rxAccessibleContext, UNO_QUERY );
if ( rxAccessibleComponent.is() ) {
com::sun::star::awt::Point location = rxAccessibleComponent -> getLocationOnScreen();
- com::sun::star::awt::Point hitPoint ( point.X - location.X , point.Y - location.Y);
+ com::sun::star::awt::Point hitPoint ( point.X - location.X , point.Y - location.Y);
Reference < XAccessible > rxAccessible = rxAccessibleComponent -> getAccessibleAtPoint ( hitPoint );
if ( rxAccessible.is() && rxAccessible -> getAccessibleContext().is() &&
rxAccessible -> getAccessibleContext() -> getAccessibleChildCount() == 0 ) {
hitChild = rxAccessible -> getAccessibleContext();
}
- }
- if ( !hitChild.is() && rxAccessibleContext -> getAccessibleChildCount() > 0 ) { // special treatment for e.g. comboboxes
- for ( int i = 0; i < rxAccessibleContext -> getAccessibleChildCount(); i++ ) {
- Reference < XAccessible > rxAccessibleChild = rxAccessibleContext -> getAccessibleChild ( i );
- if ( rxAccessibleChild.is() && rxAccessibleChild -> getAccessibleContext().is() && rxAccessibleChild -> getAccessibleContext() -> getAccessibleRole() != AccessibleRole::LIST ) {
- Reference < XAccessibleContext > myHitChild = hitTestRunner ( point, rxAccessibleChild -> getAccessibleContext() );
- if ( myHitChild.is() ) {
- hitChild = myHitChild;
- break;
+ }
+
+ // iterate the hirerachy looking doing recursive hit testing.
+ // apparently necessary as a special treatment for e.g. comboboxes
+ if ( !hitChild.is() ) {
+ bool bSafeToIterate = true;
+ sal_Int32 nCount = rxAccessibleContext -> getAccessibleChildCount();
+
+ if ( nCount < 0 || nCount > SAL_MAX_UINT16 /* slow enough for anyone */ )
+ bSafeToIterate = false;
+ else { // manages descendants is an horror from the a11y standards guys.
+ Reference< XAccessibleStateSet > xStateSet;
+ xStateSet = rxAccessibleContext -> getAccessibleStateSet();
+ if (xStateSet.is() && xStateSet -> contains(AccessibleStateType::MANAGES_DESCENDANTS ) )
+ bSafeToIterate = false;
+ }
+
+ if( bSafeToIterate ) {
+ for ( int i = 0; i < rxAccessibleContext -> getAccessibleChildCount(); i++ ) {
+ Reference < XAccessible > rxAccessibleChild = rxAccessibleContext -> getAccessibleChild ( i );
+ if ( rxAccessibleChild.is() && rxAccessibleChild -> getAccessibleContext().is() && rxAccessibleChild -> getAccessibleContext() -> getAccessibleRole() != AccessibleRole::LIST ) {
+ Reference < XAccessibleContext > myHitChild = hitTestRunner ( point, rxAccessibleChild -> getAccessibleContext() );
+ if ( myHitChild.is() ) {
+ hitChild = myHitChild;
+ break;
+ }
}
}
}