summaryrefslogtreecommitdiffstats
path: root/src/plugins
diff options
context:
space:
mode:
authorAndre de la Rocha <andre.rocha@qt.io>2018-07-23 18:07:30 +0200
committerAndre de la Rocha <andre.rocha@qt.io>2018-07-24 13:10:52 +0000
commit947df4e63ec9ef74de81f95eacc994a440874cbd (patch)
treed5475be4aae9027feb94f52d5ab94cd3eac191c5 /src/plugins
parent8d4617d5a9675e38e6832ec9d826247bf814cf17 (diff)
Windows: Fix invisible element being included in the UI Automation tree
When an element is not visible then it should not be shown in the element tree at all when using tools like Inspect. Also, the IsOffscreen property was hardcoded to false instead of reflecting the actual object offscreen state. Task-number: QTBUG-69537 Change-Id: If6e8a4685c0505ee2b99dfbb8bf2b5d0f4112b1e Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp67
1 files changed, 45 insertions, 22 deletions
diff --git a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp
index 46f73f81a0..e36006c103 100644
--- a/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp
+++ b/src/plugins/platforms/windows/uiautomation/qwindowsuiamainprovider.cpp
@@ -364,7 +364,7 @@ HRESULT QWindowsUiaMainProvider::GetPropertyValue(PROPERTYID idProp, VARIANT *pR
setVariantBool(accessible->state().focusable, pRetVal);
break;
case UIA_IsOffscreenPropertyId:
- setVariantBool(false, pRetVal);
+ setVariantBool(accessible->state().offscreen, pRetVal);
break;
case UIA_IsContentElementPropertyId:
setVariantBool(true, pRetVal);
@@ -454,30 +454,53 @@ HRESULT QWindowsUiaMainProvider::Navigate(NavigateDirection direction, IRawEleme
QAccessibleInterface *targetacc = nullptr;
- switch (direction) {
- case NavigateDirection_Parent:
- targetacc = accessible->parent();
- if (targetacc && (targetacc->role() == QAccessible::Application)) {
- targetacc = nullptr; // The app's children are considered top level objects.
- }
- break;
- case NavigateDirection_FirstChild:
- targetacc = accessible->child(0);
- break;
- case NavigateDirection_LastChild:
- targetacc = accessible->child(accessible->childCount() - 1);
- break;
- case NavigateDirection_NextSibling:
- case NavigateDirection_PreviousSibling:
+ if (direction == NavigateDirection_Parent) {
if (QAccessibleInterface *parent = accessible->parent()) {
- if (parent->isValid()) {
- int index = parent->indexOfChild(accessible);
- index += (direction == NavigateDirection_NextSibling) ? 1 : -1;
- if (index >= 0 && index < parent->childCount())
- targetacc = parent->child(index);
+ // The Application's children are considered top level objects.
+ if (parent->isValid() && parent->role() != QAccessible::Application) {
+ targetacc = parent;
+ }
+ }
+ } else {
+ QAccessibleInterface *parent = nullptr;
+ int index = 0;
+ int incr = 1;
+ switch (direction) {
+ case NavigateDirection_FirstChild:
+ parent = accessible;
+ index = 0;
+ incr = 1;
+ break;
+ case NavigateDirection_LastChild:
+ parent = accessible;
+ index = accessible->childCount() - 1;
+ incr = -1;
+ break;
+ case NavigateDirection_NextSibling:
+ if ((parent = accessible->parent()))
+ index = parent->indexOfChild(accessible) + 1;
+ incr = 1;
+ break;
+ case NavigateDirection_PreviousSibling:
+ if ((parent = accessible->parent()))
+ index = parent->indexOfChild(accessible) - 1;
+ incr = -1;
+ break;
+ default:
+ Q_UNREACHABLE();
+ break;
+ }
+
+ if (parent && parent->isValid()) {
+ for (int count = parent->childCount(); index >= 0 && index < count; index += incr) {
+ if (QAccessibleInterface *child = parent->child(index)) {
+ if (child->isValid() && !child->state().invisible) {
+ targetacc = child;
+ break;
+ }
+ }
}
}
- break;
}
if (targetacc)