Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
quiview_accessibility.mm
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
7#include "qioswindow.h"
8
9#include <QtGui/private/qguiapplication_p.h>
10#include <QtGui/private/qaccessiblebridgeutils_p.h>
11
12@implementation QUIView (Accessibility)
13
14- (void)createAccessibleElement:(QAccessibleInterface *)iface
15{
16 if (!iface || iface->state().invisible || (iface->text(QAccessible::Name).isEmpty() && iface->text(QAccessible::Value).isEmpty() && iface->text(QAccessible::Description).isEmpty()))
17 return;
18 QAccessible::Id accessibleId = QAccessible::uniqueId(iface);
19 if (UIAccessibilityElement *elem = [QT_MANGLE_NAMESPACE(QMacAccessibilityElement) elementWithId:accessibleId])
20 [m_accessibleElements addObject:elem];
21}
22
23- (void)createAccessibleContainer:(QAccessibleInterface *)iface
24{
25 if (!iface || iface->state().invisible)
26 return;
27
28 QWindow *window = self.qwindow;
29
30 for (int i = 0; i < iface->childCount(); ++i) {
31 QAccessibleInterface *child = iface->child(i);
32 if (!child || child->state().invisible)
33 continue;
34
35 QWindow *childWindow = QAccessibleBridgeUtils::windowFor(child, iface, window);
36 if (childWindow != window && childWindow->handle()) {
37 [m_accessibleElements addObject:reinterpret_cast<UIView *>(childWindow->handle()->winId())];
38 continue;
39 }
40
41 [self createAccessibleContainer:child];
42 }
43
44 // The container element must go last, so that it underlays all its children
45 [self createAccessibleElement:iface];
46}
47
48- (void)initAccessibility
49{
50 // The window may have gone away, but with the view
51 // temporarily caught in the a11y subsystem.
52 if (!self.platformWindow)
53 return;
54
55 static bool init = false;
56 if (!init)
57 QGuiApplicationPrivate::platformIntegration()->accessibility()->setActive(true);
58 init = true;
59
60 if ([m_accessibleElements count])
61 return;
62
63 QWindow *win = self.platformWindow->window();
64 QAccessibleInterface *iface = win->accessibleRoot();
65 if (iface)
66 [self createAccessibleContainer: iface];
67}
68
69- (void)clearAccessibleCache
70{
71 [m_accessibleElements removeAllObjects];
72}
73
74// this is a container, returning yes here means the functions below will never be called
75- (BOOL)isAccessibilityElement
76{
77 return NO;
78}
79
80- (NSInteger)accessibilityElementCount
81{
82 [self initAccessibility];
83 return [m_accessibleElements count];
84}
85
86- (id)accessibilityElementAtIndex:(NSInteger)index
87{
88 [self initAccessibility];
89 if (NSUInteger(index) >= [m_accessibleElements count])
90 return nil;
91 return m_accessibleElements[index];
92}
93
94- (NSInteger)indexOfAccessibilityElement:(id)element
95{
96 [self initAccessibility];
97 return [m_accessibleElements indexOfObject:element];
98}
99
100- (NSArray *)accessibilityElements
101{
102 [self initAccessibility];
103 return m_accessibleElements;
104}
105
106@end
long NSInteger