diff options
author | Andre de la Rocha <andre.rocha@qt.io> | 2018-07-24 16:26:28 +0200 |
---|---|---|
committer | Andre de la Rocha <andre.rocha@qt.io> | 2018-07-25 08:50:13 +0000 |
commit | 54e117d27d4015892ede52c11ac41f68ae8ea6a6 (patch) | |
tree | cfb881bd7936416b1e80a28e77d467eeb3ccac48 | |
parent | f493324066e1b1763929799a32eacd1e567e9a23 (diff) |
WinRT: 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: Ic8f55486685837cf5e21b3499085bb669c1dc6c8
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Oliver Wolff <oliver.wolff@qt.io>
3 files changed, 20 insertions, 2 deletions
diff --git a/src/plugins/platforms/winrt/uiautomation/qwinrtuiaaccessibility.cpp b/src/plugins/platforms/winrt/uiautomation/qwinrtuiaaccessibility.cpp index 878fcd0f96..40274fb967 100644 --- a/src/plugins/platforms/winrt/uiautomation/qwinrtuiaaccessibility.cpp +++ b/src/plugins/platforms/winrt/uiautomation/qwinrtuiaaccessibility.cpp @@ -81,6 +81,13 @@ void QWinRTUiaAccessibility::notifyAccessibilityUpdate(QAccessibleEvent *event) case QAccessible::Focus: QWinRTUiaMainProvider::notifyFocusChange(event); break; + case QAccessible::ObjectCreated: + case QAccessible::ObjectDestroyed: + case QAccessible::ObjectShow: + case QAccessible::ObjectHide: + case QAccessible::ObjectReorder: + QWinRTUiaMainProvider::notifyVisibilityChange(event); + break; case QAccessible::StateChanged: QWinRTUiaMainProvider::notifyStateChange(static_cast<QAccessibleStateChangeEvent *>(event)); break; diff --git a/src/plugins/platforms/winrt/uiautomation/qwinrtuiamainprovider.cpp b/src/plugins/platforms/winrt/uiautomation/qwinrtuiamainprovider.cpp index 99efe27c34..6f3ad6dcd2 100644 --- a/src/plugins/platforms/winrt/uiautomation/qwinrtuiamainprovider.cpp +++ b/src/plugins/platforms/winrt/uiautomation/qwinrtuiamainprovider.cpp @@ -230,6 +230,14 @@ void QWinRTUiaMainProvider::notifyFocusChange(QAccessibleEvent *event) } } +void QWinRTUiaMainProvider::notifyVisibilityChange(QAccessibleEvent *event) +{ + if (QAccessibleInterface *accessible = event->accessibleInterface()) { + QAccessible::Id accid = idForAccessible(accessible); + QWinRTUiaMetadataCache::instance()->load(accid); + } +} + void QWinRTUiaMainProvider::notifyStateChange(QAccessibleStateChangeEvent *event) { if (QAccessibleInterface *accessible = event->accessibleInterface()) { @@ -517,7 +525,8 @@ HRESULT STDMETHODCALLTYPE QWinRTUiaMainProvider::GetChildrenCore(IVector<Automat if (QAccessibleInterface *childAcc = accessible->child(i)) { QAccessible::Id childId = idForAccessible(childAcc); QWinRTUiaMetadataCache::instance()->load(childId); - (*ptrChildren)->append(childId); + if (!childAcc->state().invisible) + (*ptrChildren)->append(childId); } } } @@ -683,7 +692,8 @@ HRESULT STDMETHODCALLTYPE QWinRTUiaMainProvider::IsOffscreenCore(boolean *return if (!returnValue) return E_INVALIDARG; - *returnValue = false; + QSharedPointer<QWinRTUiaControlMetadata> metadata = QWinRTUiaMetadataCache::instance()->metadataForId(id()); + *returnValue = (metadata->state().offscreen != 0); return S_OK; } diff --git a/src/plugins/platforms/winrt/uiautomation/qwinrtuiamainprovider.h b/src/plugins/platforms/winrt/uiautomation/qwinrtuiamainprovider.h index 3ae9d2759e..384a166cf7 100644 --- a/src/plugins/platforms/winrt/uiautomation/qwinrtuiamainprovider.h +++ b/src/plugins/platforms/winrt/uiautomation/qwinrtuiamainprovider.h @@ -71,6 +71,7 @@ public: static HRESULT rawProviderForAccessibleId(QAccessible::Id elementId, ABI::Windows::UI::Xaml::Automation::Provider::IIRawElementProviderSimple **returnValue); static HRESULT rawProviderArrayForAccessibleIdList(const QList<QAccessible::Id> &elementIds, UINT32 *returnValueSize, ABI::Windows::UI::Xaml::Automation::Provider::IIRawElementProviderSimple ***returnValue); static void notifyFocusChange(QAccessibleEvent *event); + static void notifyVisibilityChange(QAccessibleEvent *event); static void notifyStateChange(QAccessibleStateChangeEvent *event); static void notifyValueChange(QAccessibleValueChangeEvent *event); static void notifyTextChange(QAccessibleEvent *event); |