@gtkx/testing 1.0.0-rc.1 → 1.0.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/act.d.ts +6 -6
- package/dist/act.d.ts.map +1 -1
- package/dist/act.js +34 -26
- package/dist/act.js.map +1 -1
- package/dist/bound-queries.d.ts +5 -5
- package/dist/bound-queries.d.ts.map +1 -1
- package/dist/bound-queries.js.map +1 -1
- package/dist/build-queries.d.ts +5 -5
- package/dist/build-queries.d.ts.map +1 -1
- package/dist/build-queries.js +21 -9
- package/dist/build-queries.js.map +1 -1
- package/dist/cleanup-registry.d.ts +4 -3
- package/dist/cleanup-registry.d.ts.map +1 -1
- package/dist/cleanup-registry.js +13 -3
- package/dist/cleanup-registry.js.map +1 -1
- package/dist/config.d.ts +5 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -9
- package/dist/config.js.map +1 -1
- package/dist/editable.d.ts +6 -5
- package/dist/editable.d.ts.map +1 -1
- package/dist/editable.js +7 -5
- package/dist/editable.js.map +1 -1
- package/dist/errors.d.ts +7 -6
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +64 -48
- package/dist/errors.js.map +1 -1
- package/dist/fire-event.d.ts +2 -1
- package/dist/fire-event.d.ts.map +1 -1
- package/dist/fire-event.js +2 -1
- package/dist/fire-event.js.map +1 -1
- package/dist/frame-sync.d.ts +2 -1
- package/dist/frame-sync.d.ts.map +1 -1
- package/dist/frame-sync.js +28 -21
- package/dist/frame-sync.js.map +1 -1
- package/dist/index.d.ts +9 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/matchers.d.ts +99 -35
- package/dist/matchers.d.ts.map +1 -1
- package/dist/matchers.js +314 -63
- package/dist/matchers.js.map +1 -1
- package/dist/normalize.d.ts +10 -0
- package/dist/normalize.d.ts.map +1 -0
- package/dist/normalize.js +20 -0
- package/dist/normalize.js.map +1 -0
- package/dist/pretty-widget.d.ts +6 -4
- package/dist/pretty-widget.d.ts.map +1 -1
- package/dist/pretty-widget.js +64 -24
- package/dist/pretty-widget.js.map +1 -1
- package/dist/queries.d.ts +129 -90
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +235 -164
- package/dist/queries.js.map +1 -1
- package/dist/register-test-hooks.js +2 -1
- package/dist/register-test-hooks.js.map +1 -1
- package/dist/render-hook.d.ts +3 -2
- package/dist/render-hook.d.ts.map +1 -1
- package/dist/render-hook.js +2 -1
- package/dist/render-hook.js.map +1 -1
- package/dist/render.d.ts +3 -2
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +25 -19
- package/dist/render.js.map +1 -1
- package/dist/role-helpers.d.ts +6 -5
- package/dist/role-helpers.d.ts.map +1 -1
- package/dist/role-helpers.js +16 -12
- package/dist/role-helpers.js.map +1 -1
- package/dist/screen.d.ts +4 -3
- package/dist/screen.d.ts.map +1 -1
- package/dist/screen.js +13 -11
- package/dist/screen.js.map +1 -1
- package/dist/screenshot.d.ts +4 -3
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +43 -36
- package/dist/screenshot.js.map +1 -1
- package/dist/suggestions.d.ts +11 -6
- package/dist/suggestions.d.ts.map +1 -1
- package/dist/suggestions.js +10 -5
- package/dist/suggestions.js.map +1 -1
- package/dist/traversal.d.ts +7 -7
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +17 -11
- package/dist/traversal.js.map +1 -1
- package/dist/types.d.ts +65 -24
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/user-event/adjustment.d.ts +5 -3
- package/dist/user-event/adjustment.d.ts.map +1 -1
- package/dist/user-event/adjustment.js +6 -4
- package/dist/user-event/adjustment.js.map +1 -1
- package/dist/user-event/click.d.ts +6 -5
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +29 -21
- package/dist/user-event/click.js.map +1 -1
- package/dist/user-event/controller.d.ts +7 -5
- package/dist/user-event/controller.d.ts.map +1 -1
- package/dist/user-event/controller.js +16 -6
- package/dist/user-event/controller.js.map +1 -1
- package/dist/user-event/dispatch.d.ts +3 -3
- package/dist/user-event/dispatch.d.ts.map +1 -1
- package/dist/user-event/dispatch.js +3 -2
- package/dist/user-event/dispatch.js.map +1 -1
- package/dist/user-event/event-wrapper.d.ts +2 -1
- package/dist/user-event/event-wrapper.d.ts.map +1 -1
- package/dist/user-event/event-wrapper.js +27 -16
- package/dist/user-event/event-wrapper.js.map +1 -1
- package/dist/user-event/gesture.d.ts +18 -14
- package/dist/user-event/gesture.d.ts.map +1 -1
- package/dist/user-event/gesture.js +70 -37
- package/dist/user-event/gesture.js.map +1 -1
- package/dist/user-event/index.d.ts +17 -10
- package/dist/user-event/index.d.ts.map +1 -1
- package/dist/user-event/index.js +7 -3
- package/dist/user-event/index.js.map +1 -1
- package/dist/user-event/keyboard.d.ts +4 -3
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +89 -58
- package/dist/user-event/keyboard.js.map +1 -1
- package/dist/user-event/pointer.d.ts +7 -3
- package/dist/user-event/pointer.d.ts.map +1 -1
- package/dist/user-event/pointer.js +4 -1
- package/dist/user-event/pointer.js.map +1 -1
- package/dist/user-event/selection.d.ts +3 -2
- package/dist/user-event/selection.d.ts.map +1 -1
- package/dist/user-event/selection.js +26 -27
- package/dist/user-event/selection.js.map +1 -1
- package/dist/user-event/state.d.ts +3 -2
- package/dist/user-event/state.d.ts.map +1 -1
- package/dist/user-event/state.js +2 -1
- package/dist/user-event/state.js.map +1 -1
- package/dist/user-event/text.d.ts +8 -7
- package/dist/user-event/text.d.ts.map +1 -1
- package/dist/user-event/text.js +39 -33
- package/dist/user-event/text.js.map +1 -1
- package/dist/wait-for.d.ts +5 -5
- package/dist/wait-for.d.ts.map +1 -1
- package/dist/wait-for.js +45 -30
- package/dist/wait-for.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +36 -25
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +215 -68
- package/dist/widget-accessible-properties.js.map +1 -1
- package/dist/within.d.ts +2 -1
- package/dist/within.d.ts.map +1 -1
- package/dist/within.js +2 -1
- package/dist/within.js.map +1 -1
- package/package.json +11 -9
- package/src/act.ts +44 -35
- package/src/bound-queries.ts +6 -6
- package/src/build-queries.ts +84 -43
- package/src/cleanup-registry.ts +18 -5
- package/src/config.ts +16 -12
- package/src/editable.ts +13 -6
- package/src/errors.ts +106 -45
- package/src/fire-event.ts +3 -1
- package/src/frame-sync.ts +38 -21
- package/src/index.ts +13 -3
- package/src/matchers.ts +568 -114
- package/src/normalize.ts +28 -0
- package/src/pretty-widget.ts +114 -42
- package/src/queries.ts +418 -256
- package/src/register-test-hooks.ts +4 -1
- package/src/render-hook.tsx +10 -4
- package/src/render.tsx +59 -34
- package/src/role-helpers.ts +29 -16
- package/src/screen.ts +17 -12
- package/src/screenshot.ts +61 -38
- package/src/suggestions.ts +29 -10
- package/src/traversal.ts +35 -15
- package/src/types.ts +111 -32
- package/src/user-event/adjustment.ts +23 -10
- package/src/user-event/click.ts +49 -20
- package/src/user-event/controller.ts +41 -7
- package/src/user-event/dispatch.ts +4 -2
- package/src/user-event/event-wrapper.ts +42 -16
- package/src/user-event/gesture.ts +135 -50
- package/src/user-event/index.ts +19 -12
- package/src/user-event/keyboard.ts +147 -61
- package/src/user-event/pointer.ts +20 -8
- package/src/user-event/selection.ts +69 -32
- package/src/user-event/state.ts +4 -2
- package/src/user-event/text.ts +73 -38
- package/src/wait-for.ts +77 -36
- package/src/widget-accessible-properties.ts +385 -79
- package/src/within.ts +8 -5
|
@@ -2,10 +2,19 @@ import * as Gtk from "@gtkx/gi/gtk";
|
|
|
2
2
|
import { getAccessibleMetadata } from "@gtkx/react/internal";
|
|
3
3
|
import { EDITABLE_ROLES, isEditable, readEditableText } from "./editable.js";
|
|
4
4
|
import { descendants } from "./traversal.js";
|
|
5
|
+
const DEFAULT_TEXT_GETTERS = ["getLabel", "getText", "getTitle"];
|
|
6
|
+
const SELECTABLE_ROLES = new Set([
|
|
7
|
+
Gtk.AccessibleRole.ROW,
|
|
8
|
+
Gtk.AccessibleRole.LIST_ITEM,
|
|
9
|
+
Gtk.AccessibleRole.GRID_CELL,
|
|
10
|
+
Gtk.AccessibleRole.OPTION,
|
|
11
|
+
Gtk.AccessibleRole.TREE_ITEM,
|
|
12
|
+
]);
|
|
5
13
|
const callStringGetter = (widget, method) => {
|
|
6
14
|
const fn = Reflect.get(widget, method);
|
|
7
|
-
if (typeof fn !== "function")
|
|
15
|
+
if (typeof fn !== "function") {
|
|
8
16
|
return null;
|
|
17
|
+
}
|
|
9
18
|
const value = fn.call(widget);
|
|
10
19
|
return value ?? null;
|
|
11
20
|
};
|
|
@@ -17,109 +26,212 @@ const readAccessibleNumber = (widget, key) => {
|
|
|
17
26
|
const value = getAccessibleMetadata(widget, key);
|
|
18
27
|
return typeof value === "number" ? value : null;
|
|
19
28
|
};
|
|
29
|
+
const readAccessibleWidgets = (widget, key) => {
|
|
30
|
+
const value = getAccessibleMetadata(widget, key);
|
|
31
|
+
if (!Array.isArray(value)) {
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const widgets = value.filter((item) => item instanceof Gtk.Widget);
|
|
35
|
+
return widgets.length > 0 ? widgets : null;
|
|
36
|
+
};
|
|
20
37
|
const readAccessibleBoolean = (widget, key) => {
|
|
21
38
|
const value = getAccessibleMetadata(widget, key);
|
|
22
39
|
return typeof value === "boolean" ? value : null;
|
|
23
40
|
};
|
|
24
41
|
const getLabelText = (widget) => {
|
|
25
|
-
if (widget instanceof Gtk.Label)
|
|
42
|
+
if (widget instanceof Gtk.Label) {
|
|
26
43
|
return widget.getLabel();
|
|
27
|
-
|
|
44
|
+
}
|
|
45
|
+
if (widget instanceof Gtk.Inscription) {
|
|
28
46
|
return widget.getText() ?? null;
|
|
47
|
+
}
|
|
29
48
|
return null;
|
|
30
49
|
};
|
|
31
|
-
const DEFAULT_TEXT_GETTERS = ["getLabel", "getText", "getTitle"];
|
|
32
50
|
/**
|
|
33
51
|
* Returns a widget's own text by trying its label, text, and title getters in
|
|
34
52
|
* order, or null when none produce a value.
|
|
35
53
|
*
|
|
36
54
|
* @param widget The widget to read text from.
|
|
37
55
|
*/
|
|
38
|
-
|
|
56
|
+
const getWidgetNodeText = (widget) => {
|
|
39
57
|
for (const getter of DEFAULT_TEXT_GETTERS) {
|
|
40
58
|
const value = callStringGetter(widget, getter);
|
|
41
|
-
if (value)
|
|
59
|
+
if (value) {
|
|
42
60
|
return value;
|
|
61
|
+
}
|
|
43
62
|
}
|
|
44
63
|
return null;
|
|
45
64
|
};
|
|
46
|
-
const stripMnemonic = (text) => text.
|
|
65
|
+
const stripMnemonic = (text) => text.replaceAll(/_(.)/g, "$1");
|
|
47
66
|
const namingLabelText = (widget) => {
|
|
48
67
|
const text = getLabelText(widget);
|
|
49
|
-
if (text === null)
|
|
68
|
+
if (text === null) {
|
|
50
69
|
return null;
|
|
70
|
+
}
|
|
51
71
|
return widget instanceof Gtk.Label && widget.getUseUnderline() ? stripMnemonic(text) : text;
|
|
52
72
|
};
|
|
53
|
-
const isNamingLabelRole = (role,
|
|
73
|
+
const isNamingLabelRole = (role, shouldIncludePresentation) => role === Gtk.AccessibleRole.LABEL ||
|
|
74
|
+
(shouldIncludePresentation && role === Gtk.AccessibleRole.PRESENTATION);
|
|
54
75
|
const collectLabels = (widget) => {
|
|
55
|
-
const
|
|
76
|
+
const isIncludePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;
|
|
56
77
|
const labels = [];
|
|
57
78
|
for (const descendant of descendants(widget)) {
|
|
58
|
-
if (!isNamingLabelRole(descendant.getAccessibleRole(),
|
|
79
|
+
if (!isNamingLabelRole(descendant.getAccessibleRole(), isIncludePresentation)) {
|
|
59
80
|
continue;
|
|
81
|
+
}
|
|
60
82
|
const labelText = namingLabelText(descendant);
|
|
61
|
-
if (labelText)
|
|
83
|
+
if (labelText) {
|
|
62
84
|
labels.push(labelText);
|
|
85
|
+
}
|
|
63
86
|
}
|
|
64
87
|
return labels;
|
|
65
88
|
};
|
|
66
|
-
|
|
67
|
-
if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL)
|
|
89
|
+
const getWidgetLabelText = (widget) => {
|
|
90
|
+
if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) {
|
|
68
91
|
return null;
|
|
92
|
+
}
|
|
69
93
|
return getLabelText(widget);
|
|
70
94
|
};
|
|
71
|
-
|
|
95
|
+
const getChildren = function* (widget) {
|
|
96
|
+
let child = widget.getFirstChild();
|
|
97
|
+
while (child) {
|
|
98
|
+
yield child;
|
|
99
|
+
child = child.getNextSibling();
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const textContentParts = (widget) => {
|
|
103
|
+
const own = getWidgetNodeText(widget);
|
|
104
|
+
if (own !== null) {
|
|
105
|
+
return [own];
|
|
106
|
+
}
|
|
107
|
+
return [...getChildren(widget)].flatMap((child) => textContentParts(child));
|
|
108
|
+
};
|
|
109
|
+
const getWidgetTextContent = (widget) => {
|
|
110
|
+
const parts = textContentParts(widget);
|
|
111
|
+
return parts.length > 0 ? parts.join(" ") : null;
|
|
112
|
+
};
|
|
113
|
+
const isComboBoxFaceCandidate = (widget) => !(widget instanceof Gtk.Popover) && widget.getChildVisible();
|
|
114
|
+
const comboBoxChildFaceText = (child) => isComboBoxFaceCandidate(child) ? getWidgetLabelText(child) ?? comboBoxFaceText(child) : null;
|
|
115
|
+
const comboBoxFaceText = (widget) => {
|
|
116
|
+
for (const child of getChildren(widget)) {
|
|
117
|
+
const text = comboBoxChildFaceText(child);
|
|
118
|
+
if (text !== null) {
|
|
119
|
+
return text;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
};
|
|
124
|
+
const tabPanelTitle = (widget) => {
|
|
125
|
+
const parent = widget.getParent();
|
|
126
|
+
if (parent instanceof Gtk.Stack) {
|
|
127
|
+
return parent.getPage(widget).getTitle() ?? null;
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
};
|
|
131
|
+
const getWidgetAccessibleName = (widget) => {
|
|
72
132
|
const role = widget.getAccessibleRole();
|
|
73
133
|
if (role === Gtk.AccessibleRole.TAB_PANEL) {
|
|
74
|
-
|
|
75
|
-
if (parent instanceof Gtk.Stack) {
|
|
76
|
-
const page = parent.getPage(widget);
|
|
77
|
-
return page.getTitle() ?? null;
|
|
78
|
-
}
|
|
79
|
-
return null;
|
|
134
|
+
return tabPanelTitle(widget);
|
|
80
135
|
}
|
|
81
|
-
const
|
|
82
|
-
if (
|
|
136
|
+
const labelledByText = getWidgetLabelledByText(widget);
|
|
137
|
+
if (labelledByText) {
|
|
138
|
+
return labelledByText;
|
|
139
|
+
}
|
|
140
|
+
const accessibleLabel = readAccessibleString(widget, "accessibleLabel");
|
|
141
|
+
if (accessibleLabel) {
|
|
83
142
|
return accessibleLabel;
|
|
143
|
+
}
|
|
84
144
|
const ownText = getWidgetNodeText(widget);
|
|
85
|
-
if (ownText)
|
|
145
|
+
if (ownText) {
|
|
86
146
|
return ownText;
|
|
147
|
+
}
|
|
87
148
|
const childLabels = collectLabels(widget);
|
|
88
|
-
if (childLabels.length > 0)
|
|
149
|
+
if (childLabels.length > 0) {
|
|
89
150
|
return childLabels.join(" ");
|
|
151
|
+
}
|
|
90
152
|
return callStringGetter(widget, "getTooltipText");
|
|
91
153
|
};
|
|
92
|
-
|
|
154
|
+
const getWidgetName = (widget) => {
|
|
93
155
|
return widget.getName();
|
|
94
156
|
};
|
|
95
|
-
|
|
157
|
+
const getWidgetPlaceholderText = (widget) => {
|
|
96
158
|
if (!EDITABLE_ROLES.has(widget.getAccessibleRole()) || !(widget instanceof Gtk.Editable)) {
|
|
97
159
|
return null;
|
|
98
160
|
}
|
|
99
|
-
|
|
161
|
+
const fromGetter = callStringGetter(widget, "getPlaceholderText");
|
|
162
|
+
if (fromGetter !== null) {
|
|
163
|
+
return fromGetter;
|
|
164
|
+
}
|
|
165
|
+
const fromAccessor = Reflect.get(widget, "placeholderText");
|
|
166
|
+
return typeof fromAccessor === "string" && fromAccessor !== "" ? fromAccessor : null;
|
|
100
167
|
};
|
|
101
|
-
|
|
168
|
+
const getWidgetDisplayValue = (widget) => {
|
|
102
169
|
if (EDITABLE_ROLES.has(widget.getAccessibleRole()) && isEditable(widget)) {
|
|
103
170
|
return readEditableText(widget);
|
|
104
171
|
}
|
|
172
|
+
if (widget.getAccessibleRole() === Gtk.AccessibleRole.COMBO_BOX) {
|
|
173
|
+
return comboBoxFaceText(widget);
|
|
174
|
+
}
|
|
105
175
|
return null;
|
|
106
176
|
};
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
177
|
+
const hasDisplayValue = (widget) => {
|
|
178
|
+
const role = widget.getAccessibleRole();
|
|
179
|
+
return (EDITABLE_ROLES.has(role) && isEditable(widget)) || role === Gtk.AccessibleRole.COMBO_BOX;
|
|
180
|
+
};
|
|
181
|
+
const isWidgetDisabled = (widget) => !widget.isSensitive();
|
|
182
|
+
const hasZeroOpacityAncestor = (widget) => {
|
|
183
|
+
let current = widget;
|
|
184
|
+
while (current) {
|
|
185
|
+
if (current.getOpacity() === 0) {
|
|
186
|
+
return true;
|
|
187
|
+
}
|
|
188
|
+
current = current.getParent();
|
|
189
|
+
}
|
|
190
|
+
return false;
|
|
191
|
+
};
|
|
192
|
+
const isWidgetVisible = (widget) => widget.isVisible() && !hasZeroOpacityAncestor(widget);
|
|
193
|
+
const getWidgetRequiredState = (widget) => readAccessibleBoolean(widget, "accessibleRequired");
|
|
194
|
+
const readTextViewSelection = (view) => {
|
|
195
|
+
const buffer = view.getBuffer();
|
|
196
|
+
const [hasSelection, start, end] = buffer.getSelectionBounds();
|
|
197
|
+
return hasSelection ? buffer.getText(start, end, true) : null;
|
|
198
|
+
};
|
|
199
|
+
const readEditableSelection = (editable) => {
|
|
200
|
+
const [hasSelection, start, end] = editable.getSelectionBounds();
|
|
201
|
+
return hasSelection ? editable.getChars(start, end) : null;
|
|
202
|
+
};
|
|
203
|
+
const getWidgetSelection = (widget) => {
|
|
204
|
+
if (widget instanceof Gtk.TextView) {
|
|
205
|
+
return readTextViewSelection(widget);
|
|
206
|
+
}
|
|
207
|
+
if (widget instanceof Gtk.Editable) {
|
|
208
|
+
return readEditableSelection(widget);
|
|
114
209
|
}
|
|
115
210
|
return null;
|
|
116
211
|
};
|
|
117
|
-
|
|
118
|
-
|
|
212
|
+
const checkedFromActive = (isActive) => (isActive ? "checked" : "unchecked");
|
|
213
|
+
const isCheckableToggle = (widget) => widget instanceof Gtk.Switch ||
|
|
214
|
+
(widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO);
|
|
215
|
+
const getWidgetCheckedState = (widget) => {
|
|
216
|
+
if (widget instanceof Gtk.CheckButton) {
|
|
217
|
+
return widget.getInconsistent() ? "mixed" : checkedFromActive(widget.getActive());
|
|
218
|
+
}
|
|
219
|
+
if (isCheckableToggle(widget)) {
|
|
220
|
+
return checkedFromActive(Reflect.get(widget, "active") === true);
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
};
|
|
224
|
+
const isWidgetChecked = (widget) => {
|
|
225
|
+
const state = getWidgetCheckedState(widget);
|
|
226
|
+
return state === null || state === "mixed" ? null : state === "checked";
|
|
227
|
+
};
|
|
228
|
+
const getWidgetPressedState = (widget) => {
|
|
229
|
+
if (widget instanceof Gtk.ToggleButton) {
|
|
119
230
|
return widget.getActive();
|
|
231
|
+
}
|
|
120
232
|
return null;
|
|
121
233
|
};
|
|
122
|
-
|
|
234
|
+
const getWidgetExpandedState = (widget) => {
|
|
123
235
|
if (widget instanceof Gtk.Expander) {
|
|
124
236
|
return widget.getExpanded();
|
|
125
237
|
}
|
|
@@ -128,29 +240,27 @@ export const getWidgetExpandedState = (widget) => {
|
|
|
128
240
|
}
|
|
129
241
|
return null;
|
|
130
242
|
};
|
|
131
|
-
|
|
132
|
-
if (widget instanceof Gtk.ListBoxRow) {
|
|
243
|
+
const getWidgetSelectedState = (widget) => {
|
|
244
|
+
if (widget instanceof Gtk.ListBoxRow || widget instanceof Gtk.FlowBoxChild) {
|
|
133
245
|
return widget.isSelected();
|
|
134
246
|
}
|
|
135
|
-
if (widget.getAccessibleRole()
|
|
247
|
+
if (SELECTABLE_ROLES.has(widget.getAccessibleRole())) {
|
|
136
248
|
return (widget.getStateFlags() & Gtk.StateFlags.SELECTED) !== 0;
|
|
137
249
|
}
|
|
138
250
|
return null;
|
|
139
251
|
};
|
|
140
|
-
|
|
252
|
+
const getWidgetLevel = (widget) => {
|
|
141
253
|
return readAccessibleNumber(widget, "accessibleLevel");
|
|
142
254
|
};
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
export const getWidgetErrorMessage = (widget) => {
|
|
147
|
-
const targets = getAccessibleMetadata(widget, "accessibleErrorMessage");
|
|
148
|
-
return Array.isArray(targets) && targets.length > 0 ? targets : null;
|
|
255
|
+
const getWidgetInvalidState = (widget) => {
|
|
256
|
+
const value = readAccessibleNumber(widget, "accessibleInvalid");
|
|
257
|
+
return value ?? null;
|
|
149
258
|
};
|
|
150
|
-
|
|
259
|
+
const getWidgetErrorMessage = (widget) => readAccessibleWidgets(widget, "accessibleErrorMessage");
|
|
260
|
+
const getWidgetBusyState = (widget) => {
|
|
151
261
|
return readAccessibleBoolean(widget, "accessibleBusy");
|
|
152
262
|
};
|
|
153
|
-
|
|
263
|
+
const getWidgetDescription = (widget) => {
|
|
154
264
|
return readAccessibleString(widget, "accessibleDescription");
|
|
155
265
|
};
|
|
156
266
|
const adjustmentValue = (adjustment) => ({
|
|
@@ -158,27 +268,40 @@ const adjustmentValue = (adjustment) => ({
|
|
|
158
268
|
min: adjustment.getLower(),
|
|
159
269
|
max: adjustment.getUpper(),
|
|
160
270
|
});
|
|
161
|
-
const
|
|
162
|
-
if (widget instanceof Gtk.Range)
|
|
271
|
+
const adjustmentWidgetValue = (widget) => {
|
|
272
|
+
if (widget instanceof Gtk.Range) {
|
|
163
273
|
return adjustmentValue(widget.getAdjustment());
|
|
164
|
-
|
|
274
|
+
}
|
|
275
|
+
if (widget instanceof Gtk.Scrollbar) {
|
|
165
276
|
return adjustmentValue(widget.getAdjustment());
|
|
166
|
-
|
|
277
|
+
}
|
|
278
|
+
if (widget instanceof Gtk.SpinButton) {
|
|
167
279
|
return adjustmentValue(widget.getAdjustment());
|
|
168
|
-
|
|
280
|
+
}
|
|
281
|
+
if (widget instanceof Gtk.ScaleButton) {
|
|
169
282
|
return adjustmentValue(widget.getAdjustment());
|
|
283
|
+
}
|
|
284
|
+
return null;
|
|
285
|
+
};
|
|
286
|
+
const getWidgetLiveValue = (widget) => {
|
|
287
|
+
const adjustmentBased = adjustmentWidgetValue(widget);
|
|
288
|
+
if (adjustmentBased) {
|
|
289
|
+
return adjustmentBased;
|
|
290
|
+
}
|
|
170
291
|
if (widget instanceof Gtk.LevelBar) {
|
|
171
292
|
return { now: widget.getValue(), min: widget.getMinValue(), max: widget.getMaxValue() };
|
|
172
293
|
}
|
|
173
|
-
if (widget instanceof Gtk.ProgressBar)
|
|
294
|
+
if (widget instanceof Gtk.ProgressBar) {
|
|
174
295
|
return { now: widget.getFraction(), min: 0, max: 1 };
|
|
296
|
+
}
|
|
175
297
|
return null;
|
|
176
298
|
};
|
|
177
|
-
|
|
299
|
+
const getWidgetValue = (widget) => {
|
|
178
300
|
const text = readAccessibleString(widget, "accessibleValueText");
|
|
179
301
|
const live = getWidgetLiveValue(widget);
|
|
180
|
-
if (live)
|
|
302
|
+
if (live) {
|
|
181
303
|
return { ...live, text };
|
|
304
|
+
}
|
|
182
305
|
return {
|
|
183
306
|
now: readAccessibleNumber(widget, "accessibleValueNow"),
|
|
184
307
|
min: readAccessibleNumber(widget, "accessibleValueMin"),
|
|
@@ -186,30 +309,54 @@ export const getWidgetValue = (widget) => {
|
|
|
186
309
|
text,
|
|
187
310
|
};
|
|
188
311
|
};
|
|
189
|
-
|
|
312
|
+
const getWidgetOwnLabel = (widget) => {
|
|
190
313
|
return readAccessibleString(widget, "accessibleLabel");
|
|
191
314
|
};
|
|
192
|
-
|
|
193
|
-
const targets = getAccessibleMetadata(widget, "accessibleLabelledBy");
|
|
194
|
-
if (!Array.isArray(targets) || targets.length === 0)
|
|
195
|
-
return null;
|
|
315
|
+
const collectAccessibleNames = (targets) => {
|
|
196
316
|
const texts = [];
|
|
197
317
|
for (const target of targets) {
|
|
198
318
|
const text = getWidgetAccessibleName(target);
|
|
199
|
-
if (text !== null)
|
|
319
|
+
if (text !== null) {
|
|
200
320
|
texts.push(text);
|
|
321
|
+
}
|
|
201
322
|
}
|
|
323
|
+
return texts;
|
|
324
|
+
};
|
|
325
|
+
const getWidgetLabelledByText = (widget) => {
|
|
326
|
+
const targets = readAccessibleWidgets(widget, "accessibleLabelledBy");
|
|
327
|
+
if (targets === null) {
|
|
328
|
+
return null;
|
|
329
|
+
}
|
|
330
|
+
const texts = collectAccessibleNames(targets);
|
|
202
331
|
return texts.length > 0 ? texts.join(" ") : null;
|
|
203
332
|
};
|
|
204
|
-
|
|
333
|
+
const isTooltipUsedAsName = (widget) => readAccessibleString(widget, "accessibleLabel") === null &&
|
|
334
|
+
getWidgetNodeText(widget) === null &&
|
|
335
|
+
collectLabels(widget).length === 0;
|
|
336
|
+
const getWidgetDescribedByText = (widget) => {
|
|
337
|
+
const targets = readAccessibleWidgets(widget, "accessibleDescribedBy");
|
|
338
|
+
const texts = targets === null ? [] : collectAccessibleNames(targets);
|
|
339
|
+
if (texts.length > 0) {
|
|
340
|
+
return texts.join(" ");
|
|
341
|
+
}
|
|
342
|
+
const description = readAccessibleString(widget, "accessibleDescription");
|
|
343
|
+
if (description !== null) {
|
|
344
|
+
return description;
|
|
345
|
+
}
|
|
346
|
+
return isTooltipUsedAsName(widget) ? null : callStringGetter(widget, "getTooltipText");
|
|
347
|
+
};
|
|
348
|
+
const isInaccessible = (widget) => {
|
|
205
349
|
let current = widget;
|
|
206
350
|
while (current) {
|
|
207
|
-
if (!current.getVisible())
|
|
351
|
+
if (!current.getVisible()) {
|
|
208
352
|
return true;
|
|
209
|
-
|
|
353
|
+
}
|
|
354
|
+
if (readAccessibleBoolean(current, "accessibleHidden") === true) {
|
|
210
355
|
return true;
|
|
356
|
+
}
|
|
211
357
|
current = current.getParent();
|
|
212
358
|
}
|
|
213
359
|
return false;
|
|
214
360
|
};
|
|
361
|
+
export { getWidgetNodeText, getWidgetTextContent, getWidgetLabelText, getWidgetAccessibleName, getWidgetName, getWidgetPlaceholderText, getWidgetDisplayValue, hasDisplayValue, isWidgetDisabled, isWidgetVisible, getWidgetRequiredState, getWidgetSelection, getWidgetDescribedByText, getWidgetCheckedState, isWidgetChecked, getWidgetPressedState, getWidgetExpandedState, getWidgetSelectedState, getWidgetLevel, getWidgetInvalidState, getWidgetErrorMessage, getWidgetBusyState, getWidgetDescription, getWidgetValue, getWidgetOwnLabel, getWidgetLabelledByText, isInaccessible, };
|
|
215
362
|
//# sourceMappingURL=widget-accessible-properties.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget-accessible-properties.js","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { getAccessibleMetadata } from \"@gtkx/react/internal\";\nimport { EDITABLE_ROLES, isEditable, readEditableText } from \"./editable.js\";\nimport { descendants } from \"./traversal.js\";\n\nconst callStringGetter = (widget: Gtk.Widget, method: string): string | null => {\n const fn: unknown = Reflect.get(widget, method);\n if (typeof fn !== \"function\") return null;\n const value = (fn as () => string | null).call(widget);\n return value ?? null;\n};\n\nconst readAccessibleString = (widget: Gtk.Widget, key: string): string | null => {\n const value = getAccessibleMetadata<string>(widget, key);\n return typeof value === \"string\" ? value : null;\n};\n\nconst readAccessibleNumber = (widget: Gtk.Widget, key: string): number | null => {\n const value = getAccessibleMetadata<number>(widget, key);\n return typeof value === \"number\" ? value : null;\n};\n\nconst readAccessibleBoolean = (widget: Gtk.Widget, key: string): boolean | null => {\n const value = getAccessibleMetadata<boolean>(widget, key);\n return typeof value === \"boolean\" ? value : null;\n};\n\nconst getLabelText = (widget: Gtk.Widget): string | null => {\n if (widget instanceof Gtk.Label) return widget.getLabel();\n if (widget instanceof Gtk.Inscription) return widget.getText() ?? null;\n return null;\n};\n\nconst DEFAULT_TEXT_GETTERS = [\"getLabel\", \"getText\", \"getTitle\"] as const;\n\n/**\n * Returns a widget's own text by trying its label, text, and title getters in\n * order, or null when none produce a value.\n *\n * @param widget The widget to read text from.\n */\nexport const getWidgetNodeText = (widget: Gtk.Widget): string | null => {\n for (const getter of DEFAULT_TEXT_GETTERS) {\n const value = callStringGetter(widget, getter);\n if (value) return value;\n }\n return null;\n};\n\nconst stripMnemonic = (text: string): string => text.replace(/_(.)/g, \"$1\");\n\nconst namingLabelText = (widget: Gtk.Widget): string | null => {\n const text = getLabelText(widget);\n if (text === null) return null;\n return widget instanceof Gtk.Label && widget.getUseUnderline() ? stripMnemonic(text) : text;\n};\n\nconst isNamingLabelRole = (role: Gtk.AccessibleRole, includePresentation: boolean): boolean =>\n role === Gtk.AccessibleRole.LABEL || (includePresentation && role === Gtk.AccessibleRole.PRESENTATION);\n\nconst collectLabels = (widget: Gtk.Widget): string[] => {\n const includePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;\n const labels: string[] = [];\n for (const descendant of descendants(widget)) {\n if (!isNamingLabelRole(descendant.getAccessibleRole(), includePresentation)) continue;\n const labelText = namingLabelText(descendant);\n if (labelText) labels.push(labelText);\n }\n return labels;\n};\n\nexport const getWidgetLabelText = (widget: Gtk.Widget): string | null => {\n if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) return null;\n return getLabelText(widget);\n};\n\nexport const getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {\n const role = widget.getAccessibleRole();\n\n if (role === Gtk.AccessibleRole.TAB_PANEL) {\n const parent = widget.getParent();\n if (parent instanceof Gtk.Stack) {\n const page = parent.getPage(widget);\n return page.getTitle() ?? null;\n }\n return null;\n }\n\n const accessibleLabel = getAccessibleMetadata<string>(widget, \"accessibleLabel\");\n if (accessibleLabel) return accessibleLabel;\n\n const ownText = getWidgetNodeText(widget);\n if (ownText) return ownText;\n\n const childLabels = collectLabels(widget);\n if (childLabels.length > 0) return childLabels.join(\" \");\n\n return callStringGetter(widget, \"getTooltipText\");\n};\n\nexport const getWidgetName = (widget: Gtk.Widget): string | null => {\n return widget.getName();\n};\n\nexport const getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {\n if (!EDITABLE_ROLES.has(widget.getAccessibleRole()) || !(widget instanceof Gtk.Editable)) {\n return null;\n }\n\n return callStringGetter(widget, \"getPlaceholderText\");\n};\n\nexport const getWidgetDisplayValue = (widget: Gtk.Widget): string | null => {\n if (EDITABLE_ROLES.has(widget.getAccessibleRole()) && isEditable(widget)) {\n return readEditableText(widget);\n }\n\n return null;\n};\n\nexport const getWidgetCheckedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.CheckButton) return widget.getActive();\n if (widget instanceof Gtk.Switch) return widget.getActive();\n if (widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO) {\n return widget.getActive();\n }\n return null;\n};\n\nexport const getWidgetPressedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.ToggleButton) return widget.getActive();\n return null;\n};\n\nexport const getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.Expander) {\n return widget.getExpanded();\n }\n\n if (widget instanceof Gtk.TreeExpander) {\n return widget.getListRow()?.getExpanded() ?? null;\n }\n\n return null;\n};\n\nexport const getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.ListBoxRow) {\n return widget.isSelected();\n }\n\n if (widget.getAccessibleRole() === Gtk.AccessibleRole.ROW) {\n return (widget.getStateFlags() & Gtk.StateFlags.SELECTED) !== 0;\n }\n\n return null;\n};\n\nexport const getWidgetLevel = (widget: Gtk.Widget): number | null => {\n return readAccessibleNumber(widget, \"accessibleLevel\");\n};\n\nexport const getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null => {\n return getAccessibleMetadata<Gtk.AccessibleInvalidState>(widget, \"accessibleInvalid\");\n};\n\nexport const getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null => {\n const targets = getAccessibleMetadata<Gtk.Widget[]>(widget, \"accessibleErrorMessage\");\n return Array.isArray(targets) && targets.length > 0 ? targets : null;\n};\n\nexport const getWidgetBusyState = (widget: Gtk.Widget): boolean | null => {\n return readAccessibleBoolean(widget, \"accessibleBusy\");\n};\n\nexport const getWidgetDescription = (widget: Gtk.Widget): string | null => {\n return readAccessibleString(widget, \"accessibleDescription\");\n};\n\nexport type WidgetValue = {\n now: number | null;\n min: number | null;\n max: number | null;\n text: string | null;\n};\n\ntype ValueTriplet = { now: number | null; min: number | null; max: number | null };\n\nconst adjustmentValue = (adjustment: Gtk.Adjustment): ValueTriplet => ({\n now: adjustment.getValue(),\n min: adjustment.getLower(),\n max: adjustment.getUpper(),\n});\n\nconst getWidgetLiveValue = (widget: Gtk.Widget): ValueTriplet | null => {\n if (widget instanceof Gtk.Range) return adjustmentValue(widget.getAdjustment());\n if (widget instanceof Gtk.Scrollbar) return adjustmentValue(widget.getAdjustment());\n if (widget instanceof Gtk.SpinButton) return adjustmentValue(widget.getAdjustment());\n if (widget instanceof Gtk.ScaleButton) return adjustmentValue(widget.getAdjustment());\n if (widget instanceof Gtk.LevelBar) {\n return { now: widget.getValue(), min: widget.getMinValue(), max: widget.getMaxValue() };\n }\n if (widget instanceof Gtk.ProgressBar) return { now: widget.getFraction(), min: 0, max: 1 };\n return null;\n};\n\nexport const getWidgetValue = (widget: Gtk.Widget): WidgetValue => {\n const text = readAccessibleString(widget, \"accessibleValueText\");\n const live = getWidgetLiveValue(widget);\n if (live) return { ...live, text };\n return {\n now: readAccessibleNumber(widget, \"accessibleValueNow\"),\n min: readAccessibleNumber(widget, \"accessibleValueMin\"),\n max: readAccessibleNumber(widget, \"accessibleValueMax\"),\n text,\n };\n};\n\nexport const getWidgetOwnLabel = (widget: Gtk.Widget): string | null => {\n return readAccessibleString(widget, \"accessibleLabel\");\n};\n\nexport const getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {\n const targets = getAccessibleMetadata<Gtk.Widget[]>(widget, \"accessibleLabelledBy\");\n if (!Array.isArray(targets) || targets.length === 0) return null;\n\n const texts: string[] = [];\n for (const target of targets) {\n const text = getWidgetAccessibleName(target);\n if (text !== null) texts.push(text);\n }\n\n return texts.length > 0 ? texts.join(\" \") : null;\n};\n\nexport const isInaccessible = (widget: Gtk.Widget): boolean => {\n let current: Gtk.Widget | null = widget;\n while (current) {\n if (!current.getVisible()) return true;\n if (readAccessibleBoolean(current, \"accessibleHidden\") === true) return true;\n current = current.getParent();\n }\n return false;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"widget-accessible-properties.js","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gtk from \"@gtkx/gi/gtk\";\nimport { getAccessibleMetadata } from \"@gtkx/react/internal\";\nimport { EDITABLE_ROLES, isEditable, readEditableText } from \"./editable.js\";\nimport { descendants } from \"./traversal.js\";\n\ntype WidgetValue = {\n now: number | null;\n min: number | null;\n max: number | null;\n text: string | null;\n};\n\ntype ValueTriplet = { now: number | null; min: number | null; max: number | null };\n/** A widget's checked state: on, off, or the mixed state of an inconsistent check button. */\ntype CheckedState = \"checked\" | \"unchecked\" | \"mixed\";\n\nconst DEFAULT_TEXT_GETTERS = [\"getLabel\", \"getText\", \"getTitle\"] as const;\n\nconst SELECTABLE_ROLES: Set<Gtk.AccessibleRole> = new Set<Gtk.AccessibleRole>([\n Gtk.AccessibleRole.ROW,\n Gtk.AccessibleRole.LIST_ITEM,\n Gtk.AccessibleRole.GRID_CELL,\n Gtk.AccessibleRole.OPTION,\n Gtk.AccessibleRole.TREE_ITEM,\n]);\n\nconst callStringGetter = (widget: Gtk.Widget, method: string): string | null => {\n const fn: unknown = Reflect.get(widget, method);\n\n if (typeof fn !== \"function\") {\n return null;\n }\n\n const value = (fn as () => string | null).call(widget);\n\n return value ?? null;\n};\n\nconst readAccessibleString = (widget: Gtk.Widget, key: string): string | null => {\n const value = getAccessibleMetadata(widget, key);\n\n return typeof value === \"string\" ? value : null;\n};\n\nconst readAccessibleNumber = (widget: Gtk.Widget, key: string): number | null => {\n const value = getAccessibleMetadata(widget, key);\n\n return typeof value === \"number\" ? value : null;\n};\n\nconst readAccessibleWidgets = (widget: Gtk.Widget, key: string): Gtk.Widget[] | null => {\n const value = getAccessibleMetadata(widget, key);\n\n if (!Array.isArray(value)) {\n return null;\n }\n\n const widgets = value.filter((item): item is Gtk.Widget => item instanceof Gtk.Widget);\n\n return widgets.length > 0 ? widgets : null;\n};\n\nconst readAccessibleBoolean = (widget: Gtk.Widget, key: string): boolean | null => {\n const value = getAccessibleMetadata(widget, key);\n\n return typeof value === \"boolean\" ? value : null;\n};\n\nconst getLabelText = (widget: Gtk.Widget): string | null => {\n if (widget instanceof Gtk.Label) {\n return widget.getLabel();\n }\n\n if (widget instanceof Gtk.Inscription) {\n return widget.getText() ?? null;\n }\n\n return null;\n};\n\n/**\n * Returns a widget's own text by trying its label, text, and title getters in\n * order, or null when none produce a value.\n *\n * @param widget The widget to read text from.\n */\nconst getWidgetNodeText = (widget: Gtk.Widget): string | null => {\n for (const getter of DEFAULT_TEXT_GETTERS) {\n const value = callStringGetter(widget, getter);\n\n if (value) {\n return value;\n }\n }\n\n return null;\n};\n\nconst stripMnemonic = (text: string): string => text.replaceAll(/_(.)/g, \"$1\");\n\nconst namingLabelText = (widget: Gtk.Widget): string | null => {\n const text = getLabelText(widget);\n\n if (text === null) {\n return null;\n }\n\n return widget instanceof Gtk.Label && widget.getUseUnderline() ? stripMnemonic(text) : text;\n};\n\nconst isNamingLabelRole = (role: Gtk.AccessibleRole, shouldIncludePresentation: boolean): boolean =>\n role === Gtk.AccessibleRole.LABEL ||\n (shouldIncludePresentation && role === Gtk.AccessibleRole.PRESENTATION);\n\nconst collectLabels = (widget: Gtk.Widget): string[] => {\n const isIncludePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;\n const labels: string[] = [];\n\n for (const descendant of descendants(widget)) {\n if (!isNamingLabelRole(descendant.getAccessibleRole(), isIncludePresentation)) {\n continue;\n }\n\n const labelText = namingLabelText(descendant);\n\n if (labelText) {\n labels.push(labelText);\n }\n }\n\n return labels;\n};\n\nconst getWidgetLabelText = (widget: Gtk.Widget): string | null => {\n if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) {\n return null;\n }\n\n return getLabelText(widget);\n};\n\nconst getChildren = function* (widget: Gtk.Widget): Generator<Gtk.Widget> {\n let child = widget.getFirstChild();\n\n while (child) {\n yield child;\n child = child.getNextSibling();\n }\n};\n\nconst textContentParts = (widget: Gtk.Widget): string[] => {\n const own = getWidgetNodeText(widget);\n\n if (own !== null) {\n return [own];\n }\n\n return [...getChildren(widget)].flatMap((child) => textContentParts(child));\n};\n\nconst getWidgetTextContent = (widget: Gtk.Widget): string | null => {\n const parts = textContentParts(widget);\n\n return parts.length > 0 ? parts.join(\" \") : null;\n};\n\nconst isComboBoxFaceCandidate = (widget: Gtk.Widget): boolean =>\n !(widget instanceof Gtk.Popover) && widget.getChildVisible();\n\nconst comboBoxChildFaceText = (child: Gtk.Widget): string | null =>\n isComboBoxFaceCandidate(child) ? getWidgetLabelText(child) ?? comboBoxFaceText(child) : null;\n\nconst comboBoxFaceText = (widget: Gtk.Widget): string | null => {\n for (const child of getChildren(widget)) {\n const text = comboBoxChildFaceText(child);\n\n if (text !== null) {\n return text;\n }\n }\n\n return null;\n};\n\nconst tabPanelTitle = (widget: Gtk.Widget): string | null => {\n const parent = widget.getParent();\n\n if (parent instanceof Gtk.Stack) {\n return parent.getPage(widget).getTitle() ?? null;\n }\n\n return null;\n};\n\nconst getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {\n const role = widget.getAccessibleRole();\n\n if (role === Gtk.AccessibleRole.TAB_PANEL) {\n return tabPanelTitle(widget);\n }\n\n const labelledByText = getWidgetLabelledByText(widget);\n\n if (labelledByText) {\n return labelledByText;\n }\n\n const accessibleLabel = readAccessibleString(widget, \"accessibleLabel\");\n\n if (accessibleLabel) {\n return accessibleLabel;\n }\n\n const ownText = getWidgetNodeText(widget);\n\n if (ownText) {\n return ownText;\n }\n\n const childLabels = collectLabels(widget);\n\n if (childLabels.length > 0) {\n return childLabels.join(\" \");\n }\n\n return callStringGetter(widget, \"getTooltipText\");\n};\n\nconst getWidgetName = (widget: Gtk.Widget): string | null => {\n return widget.getName();\n};\n\nconst getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {\n if (!EDITABLE_ROLES.has(widget.getAccessibleRole()) || !(widget instanceof Gtk.Editable)) {\n return null;\n }\n\n const fromGetter = callStringGetter(widget, \"getPlaceholderText\");\n\n if (fromGetter !== null) {\n return fromGetter;\n }\n\n const fromAccessor: unknown = Reflect.get(widget, \"placeholderText\");\n\n return typeof fromAccessor === \"string\" && fromAccessor !== \"\" ? fromAccessor : null;\n};\n\nconst getWidgetDisplayValue = (widget: Gtk.Widget): string | null => {\n if (EDITABLE_ROLES.has(widget.getAccessibleRole()) && isEditable(widget)) {\n return readEditableText(widget);\n }\n\n if (widget.getAccessibleRole() === Gtk.AccessibleRole.COMBO_BOX) {\n return comboBoxFaceText(widget);\n }\n\n return null;\n};\n\nconst hasDisplayValue = (widget: Gtk.Widget): boolean => {\n const role = widget.getAccessibleRole();\n\n return (EDITABLE_ROLES.has(role) && isEditable(widget)) || role === Gtk.AccessibleRole.COMBO_BOX;\n};\n\nconst isWidgetDisabled = (widget: Gtk.Widget): boolean => !widget.isSensitive();\n\nconst hasZeroOpacityAncestor = (widget: Gtk.Widget): boolean => {\n let current: Gtk.Widget | null = widget;\n\n while (current) {\n if (current.getOpacity() === 0) {\n return true;\n }\n\n current = current.getParent();\n }\n\n return false;\n};\n\nconst isWidgetVisible = (widget: Gtk.Widget): boolean => widget.isVisible() && !hasZeroOpacityAncestor(widget);\n\nconst getWidgetRequiredState = (widget: Gtk.Widget): boolean | null =>\n readAccessibleBoolean(widget, \"accessibleRequired\");\n\nconst readTextViewSelection = (view: Gtk.TextView): string | null => {\n const buffer = view.getBuffer();\n const [hasSelection, start, end] = buffer.getSelectionBounds();\n\n return hasSelection ? buffer.getText(start, end, true) : null;\n};\n\nconst readEditableSelection = (editable: Gtk.Editable): string | null => {\n const [hasSelection, start, end] = editable.getSelectionBounds();\n\n return hasSelection ? editable.getChars(start, end) : null;\n};\n\nconst getWidgetSelection = (widget: Gtk.Widget): string | null => {\n if (widget instanceof Gtk.TextView) {\n return readTextViewSelection(widget);\n }\n\n if (widget instanceof Gtk.Editable) {\n return readEditableSelection(widget);\n }\n\n return null;\n};\n\nconst checkedFromActive = (isActive: boolean): CheckedState => (isActive ? \"checked\" : \"unchecked\");\n\nconst isCheckableToggle = (widget: Gtk.Widget): boolean =>\n widget instanceof Gtk.Switch ||\n (widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO);\n\nconst getWidgetCheckedState = (widget: Gtk.Widget): CheckedState | null => {\n if (widget instanceof Gtk.CheckButton) {\n return widget.getInconsistent() ? \"mixed\" : checkedFromActive(widget.getActive());\n }\n\n if (isCheckableToggle(widget)) {\n return checkedFromActive(Reflect.get(widget, \"active\") === true);\n }\n\n return null;\n};\n\nconst isWidgetChecked = (widget: Gtk.Widget): boolean | null => {\n const state = getWidgetCheckedState(widget);\n\n return state === null || state === \"mixed\" ? null : state === \"checked\";\n};\n\nconst getWidgetPressedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.ToggleButton) {\n return widget.getActive();\n }\n\n return null;\n};\n\nconst getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.Expander) {\n return widget.getExpanded();\n }\n\n if (widget instanceof Gtk.TreeExpander) {\n return widget.getListRow()?.getExpanded() ?? null;\n }\n\n return null;\n};\n\nconst getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.ListBoxRow || widget instanceof Gtk.FlowBoxChild) {\n return widget.isSelected();\n }\n\n if (SELECTABLE_ROLES.has(widget.getAccessibleRole())) {\n return (widget.getStateFlags() & Gtk.StateFlags.SELECTED) !== 0;\n }\n\n return null;\n};\n\nconst getWidgetLevel = (widget: Gtk.Widget): number | null => {\n return readAccessibleNumber(widget, \"accessibleLevel\");\n};\n\nconst getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null => {\n const value = readAccessibleNumber(widget, \"accessibleInvalid\");\n\n return value ?? null;\n};\n\nconst getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null =>\n readAccessibleWidgets(widget, \"accessibleErrorMessage\");\n\nconst getWidgetBusyState = (widget: Gtk.Widget): boolean | null => {\n return readAccessibleBoolean(widget, \"accessibleBusy\");\n};\n\nconst getWidgetDescription = (widget: Gtk.Widget): string | null => {\n return readAccessibleString(widget, \"accessibleDescription\");\n};\n\nconst adjustmentValue = (adjustment: Gtk.Adjustment): ValueTriplet => ({\n now: adjustment.getValue(),\n min: adjustment.getLower(),\n max: adjustment.getUpper(),\n});\n\nconst adjustmentWidgetValue = (widget: Gtk.Widget): ValueTriplet | null => {\n if (widget instanceof Gtk.Range) {\n return adjustmentValue(widget.getAdjustment());\n }\n\n if (widget instanceof Gtk.Scrollbar) {\n return adjustmentValue(widget.getAdjustment());\n }\n\n if (widget instanceof Gtk.SpinButton) {\n return adjustmentValue(widget.getAdjustment());\n }\n\n if (widget instanceof Gtk.ScaleButton) {\n return adjustmentValue(widget.getAdjustment());\n }\n\n return null;\n};\n\nconst getWidgetLiveValue = (widget: Gtk.Widget): ValueTriplet | null => {\n const adjustmentBased = adjustmentWidgetValue(widget);\n\n if (adjustmentBased) {\n return adjustmentBased;\n }\n\n if (widget instanceof Gtk.LevelBar) {\n return { now: widget.getValue(), min: widget.getMinValue(), max: widget.getMaxValue() };\n }\n\n if (widget instanceof Gtk.ProgressBar) {\n return { now: widget.getFraction(), min: 0, max: 1 };\n }\n\n return null;\n};\n\nconst getWidgetValue = (widget: Gtk.Widget): WidgetValue => {\n const text = readAccessibleString(widget, \"accessibleValueText\");\n const live = getWidgetLiveValue(widget);\n\n if (live) {\n return { ...live, text };\n }\n\n return {\n now: readAccessibleNumber(widget, \"accessibleValueNow\"),\n min: readAccessibleNumber(widget, \"accessibleValueMin\"),\n max: readAccessibleNumber(widget, \"accessibleValueMax\"),\n text,\n };\n};\n\nconst getWidgetOwnLabel = (widget: Gtk.Widget): string | null => {\n return readAccessibleString(widget, \"accessibleLabel\");\n};\n\nconst collectAccessibleNames = (targets: Gtk.Widget[]): string[] => {\n const texts: string[] = [];\n\n for (const target of targets) {\n const text = getWidgetAccessibleName(target);\n\n if (text !== null) {\n texts.push(text);\n }\n }\n\n return texts;\n};\n\nconst getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {\n const targets = readAccessibleWidgets(widget, \"accessibleLabelledBy\");\n\n if (targets === null) {\n return null;\n }\n\n const texts = collectAccessibleNames(targets);\n\n return texts.length > 0 ? texts.join(\" \") : null;\n};\n\nconst isTooltipUsedAsName = (widget: Gtk.Widget): boolean =>\n readAccessibleString(widget, \"accessibleLabel\") === null &&\n getWidgetNodeText(widget) === null &&\n collectLabels(widget).length === 0;\n\nconst getWidgetDescribedByText = (widget: Gtk.Widget): string | null => {\n const targets = readAccessibleWidgets(widget, \"accessibleDescribedBy\");\n const texts = targets === null ? [] : collectAccessibleNames(targets);\n\n if (texts.length > 0) {\n return texts.join(\" \");\n }\n\n const description = readAccessibleString(widget, \"accessibleDescription\");\n\n if (description !== null) {\n return description;\n }\n\n return isTooltipUsedAsName(widget) ? null : callStringGetter(widget, \"getTooltipText\");\n};\n\nconst isInaccessible = (widget: Gtk.Widget): boolean => {\n let current: Gtk.Widget | null = widget;\n\n while (current) {\n if (!current.getVisible()) {\n return true;\n }\n\n if (readAccessibleBoolean(current, \"accessibleHidden\") === true) {\n return true;\n }\n\n current = current.getParent();\n }\n\n return false;\n};\n\nexport {\n getWidgetNodeText,\n getWidgetTextContent,\n getWidgetLabelText,\n getWidgetAccessibleName,\n getWidgetName,\n getWidgetPlaceholderText,\n getWidgetDisplayValue,\n hasDisplayValue,\n isWidgetDisabled,\n isWidgetVisible,\n getWidgetRequiredState,\n getWidgetSelection,\n getWidgetDescribedByText,\n getWidgetCheckedState,\n isWidgetChecked,\n getWidgetPressedState,\n getWidgetExpandedState,\n getWidgetSelectedState,\n getWidgetLevel,\n getWidgetInvalidState,\n getWidgetErrorMessage,\n getWidgetBusyState,\n getWidgetDescription,\n getWidgetValue,\n getWidgetOwnLabel,\n getWidgetLabelledByText,\n isInaccessible,\n type CheckedState,\n type WidgetValue,\n};\n"]}
|
package/dist/within.d.ts
CHANGED
|
@@ -9,5 +9,6 @@ import type { BoundCustomQueries, QueryMap } from "./types.js";
|
|
|
9
9
|
* @param queries Optional custom queries to bind alongside the built-in ones.
|
|
10
10
|
* @returns The queries bound to the container.
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
declare const within: <Q extends QueryMap = Record<never, never>>(container: Container, queries?: Q) => BoundQueries & BoundCustomQueries<Q>;
|
|
13
|
+
export { within };
|
|
13
14
|
//# sourceMappingURL=within.d.ts.map
|
package/dist/within.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"within.d.ts","sourceRoot":"","sources":["../src/within.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"within.d.ts","sourceRoot":"","sources":["../src/within.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAc/D;;;;;;;GAOG;AACH,QAAA,MAAM,MAAM,GAAI,CAAC,SAAS,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EACrD,WAAW,SAAS,EACpB,UAAU,CAAC,KACZ,YAAY,GAAG,kBAAkB,CAAC,CAAC,CAGpC,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/within.js
CHANGED
|
@@ -12,8 +12,9 @@ const bindCustomQueries = (customQueries, container) => {
|
|
|
12
12
|
* @param queries Optional custom queries to bind alongside the built-in ones.
|
|
13
13
|
* @returns The queries bound to the container.
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
const within = (container, queries) => ({
|
|
16
16
|
...bindCustomQueries(builtinQueries, container),
|
|
17
17
|
...(queries ? bindCustomQueries(queries, container) : {}),
|
|
18
18
|
});
|
|
19
|
+
export { within };
|
|
19
20
|
//# sourceMappingURL=within.js.map
|
package/dist/within.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"within.js","sourceRoot":"","sources":["../src/within.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"within.js","sourceRoot":"","sources":["../src/within.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,SAAS,GACX,CAAiC,KAAsD,EAAE,SAAoB,EAAE,EAAE,CAC7G,CAAC,GAAG,IAAU,EAAU,EAAE,CACtB,KAAK,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;AAEtC,MAAM,iBAAiB,GAAG,CAAqB,aAAgB,EAAE,SAAoB,EAAyB,EAAE;IAC5G,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,CAAU,CAAC,CAAC;IAEjH,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAA0B,CAAC;AAChE,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,GAAG,CACX,SAAoB,EACpB,OAAW,EACyB,EAAE,CAAC,CAAC;IACxC,GAAI,iBAAiB,CAAC,cAAc,EAAE,SAAS,CAAkB;IACjE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAE,EAA4B,CAAC;CACvF,CAAC,CAAC;AAEH,OAAO,EAAE,MAAM,EAAE,CAAC","sourcesContent":["import type { BoundQueries } from \"./bound-queries.js\";\nimport type { Container } from \"./traversal.js\";\nimport type { BoundCustomQueries, QueryMap } from \"./types.js\";\nimport { builtinQueries } from \"./queries.js\";\n\nconst bindQuery =\n <Args extends unknown[], Result>(query: (container: Container, ...args: Args) => Result, container: Container) =>\n (...args: Args): Result =>\n query(container, ...args);\n\nconst bindCustomQueries = <Q extends QueryMap>(customQueries: Q, container: Container): BoundCustomQueries<Q> => {\n const entries = Object.entries(customQueries).map(([key, query]) => [key, bindQuery(query, container)] as const);\n\n return Object.fromEntries(entries) as BoundCustomQueries<Q>;\n};\n\n/**\n * Binds the built-in queries, and any custom queries, to a specific container\n * so they search only within that scope.\n *\n * @param container The scope the returned queries operate on.\n * @param queries Optional custom queries to bind alongside the built-in ones.\n * @returns The queries bound to the container.\n */\nconst within = <Q extends QueryMap = Record<never, never>>(\n container: Container,\n queries?: Q,\n): BoundQueries & BoundCustomQueries<Q> => ({\n ...(bindCustomQueries(builtinQueries, container) as BoundQueries),\n ...(queries ? bindCustomQueries(queries, container) : ({} as BoundCustomQueries<Q>)),\n});\n\nexport { within };\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/testing",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.3",
|
|
4
4
|
"description": "Testing Library-style queries, user events, and screenshots for GTK4 widget trees rendered by GTKX",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
@@ -44,20 +44,22 @@
|
|
|
44
44
|
"node": ">=24"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@gtkx/runtime": "1.0.0-rc.
|
|
48
|
-
"@gtkx/
|
|
49
|
-
"@gtkx/
|
|
47
|
+
"@gtkx/runtime": "1.0.0-rc.3",
|
|
48
|
+
"@gtkx/react": "1.0.0-rc.3",
|
|
49
|
+
"@gtkx/utils": "1.0.0-rc.3"
|
|
50
|
+
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"@types/react": "^19.2",
|
|
53
|
+
"react": "^19.2"
|
|
50
54
|
},
|
|
51
55
|
"devDependencies": {
|
|
56
|
+
"@types/react": "^19.2.17",
|
|
52
57
|
"@vitest/expect": "^4.1.10",
|
|
53
58
|
"vitest": "^4.1.10",
|
|
54
|
-
"@gtkx/config": "1.0.0-rc.
|
|
55
|
-
"@gtkx/
|
|
56
|
-
"@gtkx/vitest": "1.0.0-rc.1"
|
|
59
|
+
"@gtkx/config": "1.0.0-rc.3",
|
|
60
|
+
"@gtkx/vitest": "1.0.0-rc.3"
|
|
57
61
|
},
|
|
58
62
|
"scripts": {
|
|
59
|
-
"build": "tsc -b tsconfig.lib.json",
|
|
60
|
-
"typecheck": "tsc -b --emitDeclarationOnly",
|
|
61
63
|
"release": "tsx ../../scripts/release-package.ts"
|
|
62
64
|
}
|
|
63
65
|
}
|