iOS: Iterate accessible interface to find window
Many subclasses of QAccessibleInterface implement window(), but some don't, and the documentation states that the backend (us) will traverse ancestors until it finds one with a window. We were not doing that for iOS, which caused a crash for QAccessibleTabButton, which doesn't have a window. In case we ever hit the code path where we can't find a window we also skip adding the nil element to the array in createAccessibleElement, as that causes an exception. Amends 7a512d1267442e646bb7942291197b2b03f4d1cd Pick-to: 6.5 Change-Id: I9b758423956e845a01b014022f4d3ab6306be94e Reviewed-by: Doris Verria <doris.verria@qt.io> (cherry picked from commit 6689921b9da3780676a416324eafcac98ab211a3) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit b3c60bd11fd19a98569285643f5ecad84cd60c29)
This commit is contained in:
parent
7d9de89e75
commit
596278c7cb
@ -36,16 +36,22 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QMacAccessibilityElement);
|
||||
|
||||
QMacAccessibilityElement *element = cache->elementForId(anId);
|
||||
if (!element) {
|
||||
auto *a11yInterface = QAccessible::accessibleInterface(anId);
|
||||
Q_ASSERT(a11yInterface);
|
||||
auto *window = a11yInterface->window();
|
||||
QWindow *window = nullptr;
|
||||
auto *iface = QAccessible::accessibleInterface(anId);
|
||||
while (iface) {
|
||||
if ((window = iface->window()))
|
||||
break;
|
||||
iface = iface->parent();
|
||||
}
|
||||
|
||||
if (window && window->handle()) {
|
||||
auto *platformWindow = static_cast<QIOSWindow*>(window->handle());
|
||||
element = [[self alloc] initWithId:anId withAccessibilityContainer:platformWindow->view()];
|
||||
cache->insertElement(anId, element);
|
||||
} else {
|
||||
qWarning() << "Could not create a11y element for" << window
|
||||
<< "with platform window" << (window ? window->handle() : nullptr);
|
||||
qWarning() << "Could not create a11y element for" << iface
|
||||
<< "with window" << window
|
||||
<< "and platform window" << (window ? window->handle() : nullptr);
|
||||
}
|
||||
}
|
||||
return element;
|
||||
|
@ -13,8 +13,8 @@
|
||||
if (!iface || iface->state().invisible || (iface->text(QAccessible::Name).isEmpty() && iface->text(QAccessible::Value).isEmpty() && iface->text(QAccessible::Description).isEmpty()))
|
||||
return;
|
||||
QAccessible::Id accessibleId = QAccessible::uniqueId(iface);
|
||||
UIAccessibilityElement *elem = [QT_MANGLE_NAMESPACE(QMacAccessibilityElement) elementWithId:accessibleId];
|
||||
[m_accessibleElements addObject:elem];
|
||||
if (UIAccessibilityElement *elem = [QT_MANGLE_NAMESPACE(QMacAccessibilityElement) elementWithId:accessibleId])
|
||||
[m_accessibleElements addObject:elem];
|
||||
}
|
||||
|
||||
- (void)createAccessibleContainer:(QAccessibleInterface *)iface
|
||||
|
Loading…
x
Reference in New Issue
Block a user