@gtkx/testing 1.0.0-rc.1 → 1.0.0-rc.2
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 +4 -3
- 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 +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/matchers.d.ts +38 -34
- package/dist/matchers.d.ts.map +1 -1
- package/dist/matchers.js +72 -58
- package/dist/matchers.js.map +1 -1
- 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 +143 -86
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +231 -147
- 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 +24 -18
- 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 +39 -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 +6 -5
- package/dist/user-event/controller.d.ts.map +1 -1
- package/dist/user-event/controller.js +9 -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 +26 -25
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +106 -61
- 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 +5 -4
- 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 +2 -1
- package/src/matchers.ts +158 -107
- package/src/pretty-widget.ts +114 -42
- package/src/queries.ts +422 -233
- package/src/register-test-hooks.ts +4 -1
- package/src/render-hook.tsx +10 -4
- package/src/render.tsx +58 -33
- 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 +65 -32
- package/src/user-event/adjustment.ts +23 -10
- package/src/user-event/click.ts +49 -20
- package/src/user-event/controller.ts +21 -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 +218 -74
- package/src/within.ts +7 -4
|
@@ -3,106 +3,175 @@ import { getAccessibleMetadata } from "@gtkx/react/internal";
|
|
|
3
3
|
import { EDITABLE_ROLES, isEditable, readEditableText } from "./editable.js";
|
|
4
4
|
import { descendants } from "./traversal.js";
|
|
5
5
|
|
|
6
|
+
type WidgetValue = {
|
|
7
|
+
now: number | null;
|
|
8
|
+
min: number | null;
|
|
9
|
+
max: number | null;
|
|
10
|
+
text: string | null;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
type ValueTriplet = { now: number | null; min: number | null; max: number | null };
|
|
14
|
+
|
|
15
|
+
const DEFAULT_TEXT_GETTERS = ["getLabel", "getText", "getTitle"] as const;
|
|
16
|
+
|
|
6
17
|
const callStringGetter = (widget: Gtk.Widget, method: string): string | null => {
|
|
7
18
|
const fn: unknown = Reflect.get(widget, method);
|
|
8
|
-
|
|
19
|
+
|
|
20
|
+
if (typeof fn !== "function") {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
|
|
9
24
|
const value = (fn as () => string | null).call(widget);
|
|
25
|
+
|
|
10
26
|
return value ?? null;
|
|
11
27
|
};
|
|
12
28
|
|
|
13
29
|
const readAccessibleString = (widget: Gtk.Widget, key: string): string | null => {
|
|
14
|
-
const value = getAccessibleMetadata
|
|
30
|
+
const value = getAccessibleMetadata(widget, key);
|
|
31
|
+
|
|
15
32
|
return typeof value === "string" ? value : null;
|
|
16
33
|
};
|
|
17
34
|
|
|
18
35
|
const readAccessibleNumber = (widget: Gtk.Widget, key: string): number | null => {
|
|
19
|
-
const value = getAccessibleMetadata
|
|
36
|
+
const value = getAccessibleMetadata(widget, key);
|
|
37
|
+
|
|
20
38
|
return typeof value === "number" ? value : null;
|
|
21
39
|
};
|
|
22
40
|
|
|
41
|
+
const readAccessibleWidgets = (widget: Gtk.Widget, key: string): Gtk.Widget[] | null => {
|
|
42
|
+
const value = getAccessibleMetadata(widget, key);
|
|
43
|
+
|
|
44
|
+
if (!Array.isArray(value)) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const widgets = value.filter((item): item is Gtk.Widget => item instanceof Gtk.Widget);
|
|
49
|
+
|
|
50
|
+
return widgets.length > 0 ? widgets : null;
|
|
51
|
+
};
|
|
52
|
+
|
|
23
53
|
const readAccessibleBoolean = (widget: Gtk.Widget, key: string): boolean | null => {
|
|
24
|
-
const value = getAccessibleMetadata
|
|
54
|
+
const value = getAccessibleMetadata(widget, key);
|
|
55
|
+
|
|
25
56
|
return typeof value === "boolean" ? value : null;
|
|
26
57
|
};
|
|
27
58
|
|
|
28
59
|
const getLabelText = (widget: Gtk.Widget): string | null => {
|
|
29
|
-
if (widget instanceof Gtk.Label)
|
|
30
|
-
|
|
60
|
+
if (widget instanceof Gtk.Label) {
|
|
61
|
+
return widget.getLabel();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (widget instanceof Gtk.Inscription) {
|
|
65
|
+
return widget.getText() ?? null;
|
|
66
|
+
}
|
|
67
|
+
|
|
31
68
|
return null;
|
|
32
69
|
};
|
|
33
70
|
|
|
34
|
-
const DEFAULT_TEXT_GETTERS = ["getLabel", "getText", "getTitle"] as const;
|
|
35
|
-
|
|
36
71
|
/**
|
|
37
72
|
* Returns a widget's own text by trying its label, text, and title getters in
|
|
38
73
|
* order, or null when none produce a value.
|
|
39
74
|
*
|
|
40
75
|
* @param widget The widget to read text from.
|
|
41
76
|
*/
|
|
42
|
-
|
|
77
|
+
const getWidgetNodeText = (widget: Gtk.Widget): string | null => {
|
|
43
78
|
for (const getter of DEFAULT_TEXT_GETTERS) {
|
|
44
79
|
const value = callStringGetter(widget, getter);
|
|
45
|
-
|
|
80
|
+
|
|
81
|
+
if (value) {
|
|
82
|
+
return value;
|
|
83
|
+
}
|
|
46
84
|
}
|
|
85
|
+
|
|
47
86
|
return null;
|
|
48
87
|
};
|
|
49
88
|
|
|
50
|
-
const stripMnemonic = (text: string): string => text.
|
|
89
|
+
const stripMnemonic = (text: string): string => text.replaceAll(/_(.)/g, "$1");
|
|
51
90
|
|
|
52
91
|
const namingLabelText = (widget: Gtk.Widget): string | null => {
|
|
53
92
|
const text = getLabelText(widget);
|
|
54
|
-
|
|
93
|
+
|
|
94
|
+
if (text === null) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
55
98
|
return widget instanceof Gtk.Label && widget.getUseUnderline() ? stripMnemonic(text) : text;
|
|
56
99
|
};
|
|
57
100
|
|
|
58
|
-
const isNamingLabelRole = (role: Gtk.AccessibleRole,
|
|
59
|
-
role === Gtk.AccessibleRole.LABEL ||
|
|
101
|
+
const isNamingLabelRole = (role: Gtk.AccessibleRole, shouldIncludePresentation: boolean): boolean =>
|
|
102
|
+
role === Gtk.AccessibleRole.LABEL ||
|
|
103
|
+
(shouldIncludePresentation && role === Gtk.AccessibleRole.PRESENTATION);
|
|
60
104
|
|
|
61
105
|
const collectLabels = (widget: Gtk.Widget): string[] => {
|
|
62
|
-
const
|
|
106
|
+
const isIncludePresentation = widget.getAccessibleRole() === Gtk.AccessibleRole.MENU_ITEM;
|
|
63
107
|
const labels: string[] = [];
|
|
108
|
+
|
|
64
109
|
for (const descendant of descendants(widget)) {
|
|
65
|
-
if (!isNamingLabelRole(descendant.getAccessibleRole(),
|
|
110
|
+
if (!isNamingLabelRole(descendant.getAccessibleRole(), isIncludePresentation)) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
|
|
66
114
|
const labelText = namingLabelText(descendant);
|
|
67
|
-
|
|
115
|
+
|
|
116
|
+
if (labelText) {
|
|
117
|
+
labels.push(labelText);
|
|
118
|
+
}
|
|
68
119
|
}
|
|
120
|
+
|
|
69
121
|
return labels;
|
|
70
122
|
};
|
|
71
123
|
|
|
72
|
-
|
|
73
|
-
if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL)
|
|
124
|
+
const getWidgetLabelText = (widget: Gtk.Widget): string | null => {
|
|
125
|
+
if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
|
|
74
129
|
return getLabelText(widget);
|
|
75
130
|
};
|
|
76
131
|
|
|
77
|
-
|
|
132
|
+
const tabPanelTitle = (widget: Gtk.Widget): string | null => {
|
|
133
|
+
const parent = widget.getParent();
|
|
134
|
+
|
|
135
|
+
if (parent instanceof Gtk.Stack) {
|
|
136
|
+
return parent.getPage(widget).getTitle() ?? null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return null;
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
const getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {
|
|
78
143
|
const role = widget.getAccessibleRole();
|
|
79
144
|
|
|
80
145
|
if (role === Gtk.AccessibleRole.TAB_PANEL) {
|
|
81
|
-
|
|
82
|
-
if (parent instanceof Gtk.Stack) {
|
|
83
|
-
const page = parent.getPage(widget);
|
|
84
|
-
return page.getTitle() ?? null;
|
|
85
|
-
}
|
|
86
|
-
return null;
|
|
146
|
+
return tabPanelTitle(widget);
|
|
87
147
|
}
|
|
88
148
|
|
|
89
|
-
const accessibleLabel =
|
|
90
|
-
|
|
149
|
+
const accessibleLabel = readAccessibleString(widget, "accessibleLabel");
|
|
150
|
+
|
|
151
|
+
if (accessibleLabel) {
|
|
152
|
+
return accessibleLabel;
|
|
153
|
+
}
|
|
91
154
|
|
|
92
155
|
const ownText = getWidgetNodeText(widget);
|
|
93
|
-
|
|
156
|
+
|
|
157
|
+
if (ownText) {
|
|
158
|
+
return ownText;
|
|
159
|
+
}
|
|
94
160
|
|
|
95
161
|
const childLabels = collectLabels(widget);
|
|
96
|
-
|
|
162
|
+
|
|
163
|
+
if (childLabels.length > 0) {
|
|
164
|
+
return childLabels.join(" ");
|
|
165
|
+
}
|
|
97
166
|
|
|
98
167
|
return callStringGetter(widget, "getTooltipText");
|
|
99
168
|
};
|
|
100
169
|
|
|
101
|
-
|
|
170
|
+
const getWidgetName = (widget: Gtk.Widget): string | null => {
|
|
102
171
|
return widget.getName();
|
|
103
172
|
};
|
|
104
173
|
|
|
105
|
-
|
|
174
|
+
const getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {
|
|
106
175
|
if (!EDITABLE_ROLES.has(widget.getAccessibleRole()) || !(widget instanceof Gtk.Editable)) {
|
|
107
176
|
return null;
|
|
108
177
|
}
|
|
@@ -110,7 +179,7 @@ export const getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {
|
|
|
110
179
|
return callStringGetter(widget, "getPlaceholderText");
|
|
111
180
|
};
|
|
112
181
|
|
|
113
|
-
|
|
182
|
+
const getWidgetDisplayValue = (widget: Gtk.Widget): string | null => {
|
|
114
183
|
if (EDITABLE_ROLES.has(widget.getAccessibleRole()) && isEditable(widget)) {
|
|
115
184
|
return readEditableText(widget);
|
|
116
185
|
}
|
|
@@ -118,21 +187,31 @@ export const getWidgetDisplayValue = (widget: Gtk.Widget): string | null => {
|
|
|
118
187
|
return null;
|
|
119
188
|
};
|
|
120
189
|
|
|
121
|
-
|
|
122
|
-
if (widget instanceof Gtk.CheckButton)
|
|
123
|
-
|
|
190
|
+
const getWidgetCheckedState = (widget: Gtk.Widget): boolean | null => {
|
|
191
|
+
if (widget instanceof Gtk.CheckButton) {
|
|
192
|
+
return widget.getActive();
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (widget instanceof Gtk.Switch) {
|
|
196
|
+
return widget.getActive();
|
|
197
|
+
}
|
|
198
|
+
|
|
124
199
|
if (widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO) {
|
|
125
200
|
return widget.getActive();
|
|
126
201
|
}
|
|
202
|
+
|
|
127
203
|
return null;
|
|
128
204
|
};
|
|
129
205
|
|
|
130
|
-
|
|
131
|
-
if (widget instanceof Gtk.ToggleButton)
|
|
206
|
+
const getWidgetPressedState = (widget: Gtk.Widget): boolean | null => {
|
|
207
|
+
if (widget instanceof Gtk.ToggleButton) {
|
|
208
|
+
return widget.getActive();
|
|
209
|
+
}
|
|
210
|
+
|
|
132
211
|
return null;
|
|
133
212
|
};
|
|
134
213
|
|
|
135
|
-
|
|
214
|
+
const getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {
|
|
136
215
|
if (widget instanceof Gtk.Expander) {
|
|
137
216
|
return widget.getExpanded();
|
|
138
217
|
}
|
|
@@ -144,7 +223,7 @@ export const getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {
|
|
|
144
223
|
return null;
|
|
145
224
|
};
|
|
146
225
|
|
|
147
|
-
|
|
226
|
+
const getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {
|
|
148
227
|
if (widget instanceof Gtk.ListBoxRow) {
|
|
149
228
|
return widget.isSelected();
|
|
150
229
|
}
|
|
@@ -156,58 +235,79 @@ export const getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {
|
|
|
156
235
|
return null;
|
|
157
236
|
};
|
|
158
237
|
|
|
159
|
-
|
|
238
|
+
const getWidgetLevel = (widget: Gtk.Widget): number | null => {
|
|
160
239
|
return readAccessibleNumber(widget, "accessibleLevel");
|
|
161
240
|
};
|
|
162
241
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
};
|
|
242
|
+
const getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null => {
|
|
243
|
+
const value = readAccessibleNumber(widget, "accessibleInvalid");
|
|
166
244
|
|
|
167
|
-
|
|
168
|
-
const targets = getAccessibleMetadata<Gtk.Widget[]>(widget, "accessibleErrorMessage");
|
|
169
|
-
return Array.isArray(targets) && targets.length > 0 ? targets : null;
|
|
245
|
+
return value ?? null;
|
|
170
246
|
};
|
|
171
247
|
|
|
172
|
-
|
|
248
|
+
const getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null =>
|
|
249
|
+
readAccessibleWidgets(widget, "accessibleErrorMessage");
|
|
250
|
+
|
|
251
|
+
const getWidgetBusyState = (widget: Gtk.Widget): boolean | null => {
|
|
173
252
|
return readAccessibleBoolean(widget, "accessibleBusy");
|
|
174
253
|
};
|
|
175
254
|
|
|
176
|
-
|
|
255
|
+
const getWidgetDescription = (widget: Gtk.Widget): string | null => {
|
|
177
256
|
return readAccessibleString(widget, "accessibleDescription");
|
|
178
257
|
};
|
|
179
258
|
|
|
180
|
-
export type WidgetValue = {
|
|
181
|
-
now: number | null;
|
|
182
|
-
min: number | null;
|
|
183
|
-
max: number | null;
|
|
184
|
-
text: string | null;
|
|
185
|
-
};
|
|
186
|
-
|
|
187
|
-
type ValueTriplet = { now: number | null; min: number | null; max: number | null };
|
|
188
|
-
|
|
189
259
|
const adjustmentValue = (adjustment: Gtk.Adjustment): ValueTriplet => ({
|
|
190
260
|
now: adjustment.getValue(),
|
|
191
261
|
min: adjustment.getLower(),
|
|
192
262
|
max: adjustment.getUpper(),
|
|
193
263
|
});
|
|
194
264
|
|
|
265
|
+
const adjustmentWidgetValue = (widget: Gtk.Widget): ValueTriplet | null => {
|
|
266
|
+
if (widget instanceof Gtk.Range) {
|
|
267
|
+
return adjustmentValue(widget.getAdjustment());
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (widget instanceof Gtk.Scrollbar) {
|
|
271
|
+
return adjustmentValue(widget.getAdjustment());
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (widget instanceof Gtk.SpinButton) {
|
|
275
|
+
return adjustmentValue(widget.getAdjustment());
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (widget instanceof Gtk.ScaleButton) {
|
|
279
|
+
return adjustmentValue(widget.getAdjustment());
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
return null;
|
|
283
|
+
};
|
|
284
|
+
|
|
195
285
|
const getWidgetLiveValue = (widget: Gtk.Widget): ValueTriplet | null => {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
if (
|
|
199
|
-
|
|
286
|
+
const adjustmentBased = adjustmentWidgetValue(widget);
|
|
287
|
+
|
|
288
|
+
if (adjustmentBased) {
|
|
289
|
+
return adjustmentBased;
|
|
290
|
+
}
|
|
291
|
+
|
|
200
292
|
if (widget instanceof Gtk.LevelBar) {
|
|
201
293
|
return { now: widget.getValue(), min: widget.getMinValue(), max: widget.getMaxValue() };
|
|
202
294
|
}
|
|
203
|
-
|
|
295
|
+
|
|
296
|
+
if (widget instanceof Gtk.ProgressBar) {
|
|
297
|
+
return { now: widget.getFraction(), min: 0, max: 1 };
|
|
298
|
+
}
|
|
299
|
+
|
|
204
300
|
return null;
|
|
205
301
|
};
|
|
206
302
|
|
|
207
|
-
|
|
303
|
+
const getWidgetValue = (widget: Gtk.Widget): WidgetValue => {
|
|
208
304
|
const text = readAccessibleString(widget, "accessibleValueText");
|
|
209
305
|
const live = getWidgetLiveValue(widget);
|
|
210
|
-
|
|
306
|
+
|
|
307
|
+
if (live) {
|
|
308
|
+
return { ...live, text };
|
|
309
|
+
}
|
|
310
|
+
|
|
211
311
|
return {
|
|
212
312
|
now: readAccessibleNumber(widget, "accessibleValueNow"),
|
|
213
313
|
min: readAccessibleNumber(widget, "accessibleValueMin"),
|
|
@@ -216,29 +316,73 @@ export const getWidgetValue = (widget: Gtk.Widget): WidgetValue => {
|
|
|
216
316
|
};
|
|
217
317
|
};
|
|
218
318
|
|
|
219
|
-
|
|
319
|
+
const getWidgetOwnLabel = (widget: Gtk.Widget): string | null => {
|
|
220
320
|
return readAccessibleString(widget, "accessibleLabel");
|
|
221
321
|
};
|
|
222
322
|
|
|
223
|
-
|
|
224
|
-
const targets = getAccessibleMetadata<Gtk.Widget[]>(widget, "accessibleLabelledBy");
|
|
225
|
-
if (!Array.isArray(targets) || targets.length === 0) return null;
|
|
226
|
-
|
|
323
|
+
const collectAccessibleNames = (targets: Gtk.Widget[]): string[] => {
|
|
227
324
|
const texts: string[] = [];
|
|
325
|
+
|
|
228
326
|
for (const target of targets) {
|
|
229
327
|
const text = getWidgetAccessibleName(target);
|
|
230
|
-
|
|
328
|
+
|
|
329
|
+
if (text !== null) {
|
|
330
|
+
texts.push(text);
|
|
331
|
+
}
|
|
231
332
|
}
|
|
232
333
|
|
|
334
|
+
return texts;
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
const getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {
|
|
338
|
+
const targets = readAccessibleWidgets(widget, "accessibleLabelledBy");
|
|
339
|
+
|
|
340
|
+
if (targets === null) {
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
const texts = collectAccessibleNames(targets);
|
|
345
|
+
|
|
233
346
|
return texts.length > 0 ? texts.join(" ") : null;
|
|
234
347
|
};
|
|
235
348
|
|
|
236
|
-
|
|
349
|
+
const isInaccessible = (widget: Gtk.Widget): boolean => {
|
|
237
350
|
let current: Gtk.Widget | null = widget;
|
|
351
|
+
|
|
238
352
|
while (current) {
|
|
239
|
-
if (!current.getVisible())
|
|
240
|
-
|
|
353
|
+
if (!current.getVisible()) {
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
if (readAccessibleBoolean(current, "accessibleHidden") === true) {
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
|
|
241
361
|
current = current.getParent();
|
|
242
362
|
}
|
|
363
|
+
|
|
243
364
|
return false;
|
|
244
365
|
};
|
|
366
|
+
|
|
367
|
+
export {
|
|
368
|
+
getWidgetNodeText,
|
|
369
|
+
getWidgetLabelText,
|
|
370
|
+
getWidgetAccessibleName,
|
|
371
|
+
getWidgetName,
|
|
372
|
+
getWidgetPlaceholderText,
|
|
373
|
+
getWidgetDisplayValue,
|
|
374
|
+
getWidgetCheckedState,
|
|
375
|
+
getWidgetPressedState,
|
|
376
|
+
getWidgetExpandedState,
|
|
377
|
+
getWidgetSelectedState,
|
|
378
|
+
getWidgetLevel,
|
|
379
|
+
getWidgetInvalidState,
|
|
380
|
+
getWidgetErrorMessage,
|
|
381
|
+
getWidgetBusyState,
|
|
382
|
+
getWidgetDescription,
|
|
383
|
+
getWidgetValue,
|
|
384
|
+
getWidgetOwnLabel,
|
|
385
|
+
getWidgetLabelledByText,
|
|
386
|
+
isInaccessible,
|
|
387
|
+
type WidgetValue,
|
|
388
|
+
};
|
package/src/within.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import type { BoundQueries } from "./bound-queries.js";
|
|
2
|
-
import { builtinQueries } from "./queries.js";
|
|
3
2
|
import type { Container } from "./traversal.js";
|
|
4
3
|
import type { BoundCustomQueries, QueryMap } from "./types.js";
|
|
4
|
+
import { builtinQueries } from "./queries.js";
|
|
5
5
|
|
|
6
6
|
const bindQuery =
|
|
7
7
|
<Args extends unknown[], Result>(query: (container: Container, ...args: Args) => Result, container: Container) =>
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
(...args: Args): Result =>
|
|
9
|
+
query(container, ...args);
|
|
10
10
|
|
|
11
11
|
const bindCustomQueries = <Q extends QueryMap>(customQueries: Q, container: Container): BoundCustomQueries<Q> => {
|
|
12
12
|
const entries = Object.entries(customQueries).map(([key, query]) => [key, bindQuery(query, container)] as const);
|
|
13
|
+
|
|
13
14
|
return Object.fromEntries(entries) as BoundCustomQueries<Q>;
|
|
14
15
|
};
|
|
15
16
|
|
|
@@ -21,10 +22,12 @@ const bindCustomQueries = <Q extends QueryMap>(customQueries: Q, container: Cont
|
|
|
21
22
|
* @param queries Optional custom queries to bind alongside the built-in ones.
|
|
22
23
|
* @returns The queries bound to the container.
|
|
23
24
|
*/
|
|
24
|
-
|
|
25
|
+
const within = <Q extends QueryMap = Record<never, never>>(
|
|
25
26
|
container: Container,
|
|
26
27
|
queries?: Q,
|
|
27
28
|
): BoundQueries & BoundCustomQueries<Q> => ({
|
|
28
29
|
...bindCustomQueries(builtinQueries, container),
|
|
29
30
|
...(queries ? bindCustomQueries(queries, container) : ({} as BoundCustomQueries<Q>)),
|
|
30
31
|
});
|
|
32
|
+
|
|
33
|
+
export { within };
|