diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm index 2d062c25387..aa892824c52 100644 --- a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm +++ b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm @@ -549,8 +549,11 @@ static void convertLineOffset(QAccessibleTextInterface *text, int *line, int *of } - (id) accessibilityWindow { - // We're in the same window as our parent. - return [self.accessibilityParent accessibilityWindow]; + // Go up until we find a parent that is a window + NSAccessibilityElement *parent = self.accessibilityParent; + if (parent && parent.accessibilityRole == NSAccessibilityWindowRole) + return parent; + return [parent accessibilityWindow]; } - (id) accessibilityTopLevelUIElementAttribute { @@ -621,11 +624,6 @@ static void convertLineOffset(QAccessibleTextInterface *text, int *line, int *of return NSAccessibilityUnignoredAncestor([QMacAccessibilityElement elementWithId:axid]); } - // macOS expects that the hierarchy is: - // App -> Window -> Children - // We don't actually have the window reflected properly in QAccessibility. - // Check if the parent is the application and then instead return the native window. - if (QAccessibleInterface *parent = iface->parent()) { if (parent->tableInterface()) { QMacAccessibilityElement *tableElement = @@ -643,7 +641,12 @@ static void convertLineOffset(QAccessibleTextInterface *text, int *line, int *of QMacAccessibilityElement *rowElement = tableElement->rows[rowIndex]; return NSAccessibilityUnignoredAncestor(rowElement); } - if (parent->role() != QAccessible::Application) + // macOS expects that the hierarchy is: + // App -> Window -> Children + // We don't actually have the window reflected properly in QAccessibility; + // the native framework does that for us. Check if the parent is the + // Application or a window, and if so return the native NSView instead. + if (parent->role() != QAccessible::Application && parent->role() != QAccessible::Window) return NSAccessibilityUnignoredAncestor([QMacAccessibilityElement elementWithInterface: parent]); } diff --git a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.mm b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.mm index 146fa08a65d..c2e832a5b66 100644 --- a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.mm +++ b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac.mm @@ -382,6 +382,7 @@ QDebug operator<<(QDebug dbg, AXErrorTag err) return rect; } - (AXUIElementRef) parent { return (AXUIElementRef)[self _attributeValue:kAXParentAttribute]; } +- (AXUIElementRef) window { return (AXUIElementRef)[self _attributeValue:kAXWindowAttribute]; } - (BOOL) focused { return [self _boolAttributeValue:kAXFocusedAttribute]; } - (NSInteger) numberOfCharacters { return [self _numberAttributeValue:kAXNumberOfCharactersAttribute]; } - (NSString*) selectedText { return [self _stringAttributeValue:kAXSelectedTextAttribute]; } @@ -449,6 +450,7 @@ private Q_SLOTS: void tableViewTest(); void treeViewTest(); void tabBarTest(); + void windowTest(); private: AccessibleTestWindow *m_window; @@ -933,5 +935,35 @@ void tst_QAccessibilityMac::tabBarTest() } } +void tst_QAccessibilityMac::windowTest() +{ + QTextEdit *textEdit = new QTextEdit; + m_window->addWidget(textEdit); + QVERIFY(QTest::qWaitForWindowExposed(m_window)); + QCoreApplication::processEvents(); + + TestAXObject *appObject = [TestAXObject getApplicationAXObject]; + QVERIFY(appObject); + + NSArray *windowList = [appObject windowList]; + // one window + QVERIFY([windowList count] == 1); + AXUIElementRef windowRef = (AXUIElementRef)[windowList objectAtIndex:0]; + QVERIFY(windowRef != nil); + TestAXObject *window = [[TestAXObject alloc] initWithAXUIElementRef:windowRef]; + QVERIFY(window.valid); + + AXUIElementRef axTextEdit = [window findDirectChildByRole:kAXTextAreaRole]; + QVERIFY(axTextEdit != nil); + + [appObject release]; + [window release]; + + TestAXObject *edit = [[TestAXObject alloc] initWithAXUIElementRef:axTextEdit]; + QVERIFY(edit.valid); + AXUIElementRef axWindow = edit.window; + QVERIFY(axWindow); +} + QTEST_MAIN(tst_QAccessibilityMac) #include "tst_qaccessibilitymac.moc"