@gtkx/testing 2.0.0-beta.5 → 2.0.0-beta.7
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/README.md +43 -40
- package/dist/accessible-native.d.ts +1 -1
- package/dist/accessible-native.d.ts.map +1 -1
- package/dist/accessible-native.js +29 -8
- package/dist/accessible-native.js.map +1 -1
- package/dist/queries.d.ts.map +1 -1
- package/dist/queries.js +4 -3
- package/dist/queries.js.map +1 -1
- package/dist/screenshot.d.ts.map +1 -1
- package/dist/screenshot.js +22 -4
- package/dist/screenshot.js.map +1 -1
- package/dist/traversal.d.ts +1 -1
- package/dist/traversal.d.ts.map +1 -1
- package/dist/traversal.js +24 -6
- package/dist/traversal.js.map +1 -1
- package/dist/user-event/click.d.ts +17 -4
- package/dist/user-event/click.d.ts.map +1 -1
- package/dist/user-event/click.js +26 -7
- package/dist/user-event/click.js.map +1 -1
- package/dist/user-event/keyboard.d.ts.map +1 -1
- package/dist/user-event/keyboard.js +23 -2
- package/dist/user-event/keyboard.js.map +1 -1
- package/dist/user-event/pointer.d.ts.map +1 -1
- package/dist/user-event/pointer.js +9 -11
- package/dist/user-event/pointer.js.map +1 -1
- package/dist/widget-accessible-properties.d.ts +2 -1
- package/dist/widget-accessible-properties.d.ts.map +1 -1
- package/dist/widget-accessible-properties.js +23 -18
- package/dist/widget-accessible-properties.js.map +1 -1
- package/package.json +8 -6
- package/src/accessible-native.ts +45 -9
- package/src/queries.ts +5 -3
- package/src/screenshot.ts +45 -4
- package/src/traversal.ts +31 -7
- package/src/user-event/click.ts +35 -15
- package/src/user-event/keyboard.ts +32 -3
- package/src/user-event/pointer.ts +11 -15
- package/src/widget-accessible-properties.ts +34 -22
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { directClickFor, emitSitePhase } from "./click.js";
|
|
2
2
|
import { wrapEvent } from "./event-wrapper.js";
|
|
3
|
-
import { isClickTransparent
|
|
3
|
+
import { isClickTransparent } from "./native-click.js";
|
|
4
4
|
const PRESS_INPUTS = new Set(["[MouseLeft>]", "down"]);
|
|
5
5
|
const RELEASE_INPUTS = new Set(["[/MouseLeft]", "up"]);
|
|
6
6
|
const CLICK_INPUTS = new Set(["[MouseLeft]", "click"]);
|
|
@@ -15,20 +15,18 @@ const pointerWidgetFor = (widget) => {
|
|
|
15
15
|
}
|
|
16
16
|
return current;
|
|
17
17
|
};
|
|
18
|
-
const pointerGesturesFor = (widget, native) => native === null ? clickGestures(widget) : getAuthoredClickGestures(widget);
|
|
19
18
|
const pointerTargetFor = (widget) => {
|
|
20
19
|
const target = pointerWidgetFor(widget);
|
|
21
|
-
|
|
22
|
-
return { widget: target, gestures: pointerGesturesFor(target, native), native };
|
|
20
|
+
return { widget: target, click: directClickFor(target) };
|
|
23
21
|
};
|
|
24
|
-
const pressPointer = ({
|
|
25
|
-
|
|
22
|
+
const pressPointer = ({ click }) => {
|
|
23
|
+
emitSitePhase(click.sites, 1, "pressed");
|
|
26
24
|
};
|
|
27
|
-
const releasePointer = ({ widget,
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
const releasePointer = ({ widget, click }) => {
|
|
26
|
+
emitSitePhase(click.sites, 1, "released");
|
|
27
|
+
click.outcome?.(widget, 1);
|
|
30
28
|
};
|
|
31
|
-
const isPointerPressable = (target) => target.
|
|
29
|
+
const isPointerPressable = (target) => target.click.outcome !== null || target.click.sites.some((site) => site.gestures.length > 0);
|
|
32
30
|
const applyPointerInput = (widget, state, input) => {
|
|
33
31
|
const target = pointerTargetFor(widget);
|
|
34
32
|
if (CLICK_INPUTS.has(input)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pointer.js","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pointer.js","sourceRoot":"","sources":["../../src/user-event/pointer.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as Gtk from \"@gtkx/gi/gtk\";\nimport type { UserEventState } from \"./state.js\";\nimport { type DirectClick, directClickFor, emitSitePhase } from \"./click.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\nimport { isClickTransparent } from \"./native-click.js\";\n\n/**\n * A pointer action token: a full click (`click`, `[MouseLeft]`), a button press (`down`,\n * `[MouseLeft>]`), or a button release (`up`, `[/MouseLeft]`).\n */\ntype PointerInput = \"click\" | \"down\" | \"up\" | \"[MouseLeft]\" | \"[MouseLeft>]\" | \"[/MouseLeft]\";\ntype PointerTarget = { widget: Gtk.Widget; click: DirectClick };\n\nconst PRESS_INPUTS: Set<PointerInput> = new Set([\"[MouseLeft>]\", \"down\"]);\nconst RELEASE_INPUTS: Set<PointerInput> = new Set([\"[/MouseLeft]\", \"up\"]);\nconst CLICK_INPUTS: Set<PointerInput> = new Set([\"[MouseLeft]\", \"click\"]);\n\nconst pointerWidgetFor = (widget: Gtk.Widget): Gtk.Widget => {\n let current = widget;\n\n while (isClickTransparent(current)) {\n const parent = current.getParent();\n\n if (parent === null) {\n return current;\n }\n\n current = parent;\n }\n\n return current;\n};\n\nconst pointerTargetFor = (widget: Gtk.Widget): PointerTarget => {\n const target = pointerWidgetFor(widget);\n\n return { widget: target, click: directClickFor(target) };\n};\n\nconst pressPointer = ({ click }: PointerTarget): void => {\n emitSitePhase(click.sites, 1, \"pressed\");\n};\n\nconst releasePointer = ({ widget, click }: PointerTarget): void => {\n emitSitePhase(click.sites, 1, \"released\");\n click.outcome?.(widget, 1);\n};\n\nconst isPointerPressable = (target: PointerTarget): boolean =>\n target.click.outcome !== null || target.click.sites.some((site) => site.gestures.length > 0);\n\nconst applyPointerInput = (widget: Gtk.Widget, state: UserEventState, input: PointerInput): void => {\n const target = pointerTargetFor(widget);\n\n if (CLICK_INPUTS.has(input)) {\n pressPointer(target);\n releasePointer(target);\n state.isMouseLeftDown = false;\n\n return;\n }\n\n if (PRESS_INPUTS.has(input) && !state.isMouseLeftDown && isPointerPressable(target)) {\n pressPointer(target);\n state.isMouseLeftDown = true;\n\n return;\n }\n\n if (RELEASE_INPUTS.has(input) && state.isMouseLeftDown) {\n releasePointer(target);\n state.isMouseLeftDown = false;\n }\n};\n\nconst pointer = (state: UserEventState, widget: Gtk.Widget, input: PointerInput): Promise<void> =>\n wrapEvent(widget, () => {\n applyPointerInput(widget, state, input);\n });\n\nexport { pointer, type PointerInput };\n"]}
|
|
@@ -37,6 +37,7 @@ declare const getWidgetOwnLabel: (widget: Gtk.Widget) => string | null;
|
|
|
37
37
|
declare const getWidgetLabelledByText: (widget: Gtk.Widget) => string | null;
|
|
38
38
|
declare const getWidgetExternalLabelText: (widget: Gtk.Widget) => string | null;
|
|
39
39
|
declare const getWidgetDescribedByText: (widget: Gtk.Widget) => string | null;
|
|
40
|
+
declare const buildInaccessibilityCheck: () => ((target: Gtk.Accessible) => boolean);
|
|
40
41
|
/**
|
|
41
42
|
* Returns whether a widget is excluded from the accessibility tree, because it or one of its
|
|
42
43
|
* ancestors is marked hidden.
|
|
@@ -44,5 +45,5 @@ declare const getWidgetDescribedByText: (widget: Gtk.Widget) => string | null;
|
|
|
44
45
|
* @param widget The widget to test.
|
|
45
46
|
*/
|
|
46
47
|
declare const isInaccessible: (target: Gtk.Accessible) => boolean;
|
|
47
|
-
export { namingLabelText, getWidgetText, getWidgetTextContent, getWidgetLabelText, getWidgetAccessibleName, getWidgetName, getWidgetPlaceholderText, getWidgetDisplayValue, hasDisplayValue, isWidgetDisabled, isWidgetVisible, getWidgetRequiredState, getWidgetSelection, getWidgetDescribedByText, getWidgetCheckedState, isWidgetChecked, getWidgetPressedState, getWidgetExpandedState, getWidgetSelectedState, getWidgetLevel, getWidgetInvalidState, getWidgetErrorMessage, getWidgetBusyState, getWidgetDescription, getWidgetValueNow, getWidgetValueText, getWidgetOwnLabel, getWidgetExternalLabelText, getWidgetLabelledByText, isInaccessible, isWidgetValueMatch, type CheckedState, type WidgetValueField, };
|
|
48
|
+
export { buildInaccessibilityCheck, namingLabelText, getWidgetText, getWidgetTextContent, getWidgetLabelText, getWidgetAccessibleName, getWidgetName, getWidgetPlaceholderText, getWidgetDisplayValue, hasDisplayValue, isWidgetDisabled, isWidgetVisible, getWidgetRequiredState, getWidgetSelection, getWidgetDescribedByText, getWidgetCheckedState, isWidgetChecked, getWidgetPressedState, getWidgetExpandedState, getWidgetSelectedState, getWidgetLevel, getWidgetInvalidState, getWidgetErrorMessage, getWidgetBusyState, getWidgetDescription, getWidgetValueNow, getWidgetValueText, getWidgetOwnLabel, getWidgetExternalLabelText, getWidgetLabelledByText, isInaccessible, isWidgetValueMatch, type CheckedState, type WidgetValueField, };
|
|
48
49
|
//# sourceMappingURL=widget-accessible-properties.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"widget-accessible-properties.d.ts","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,cAAc,CAAC;AAiBpC,KAAK,gBAAgB,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;AAC9C,KAAK,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;AAkEtD;;;;;GAKG;AACH,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,UAAU,KAAG,MAAM,GAAG,IAAmD,CAAC;AAE7G,QAAA,MAAM,eAAe,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAQtD,CAAC;AAyBF,QAAA,MAAM,kBAAkB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAMzD,CAAC;AAYF,QAAA,MAAM,oBAAoB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAI3D,CAAC;AA6CF,QAAA,MAAM,uBAAuB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAkB9D,CAAC;AAEF,QAAA,MAAM,aAAa,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAAwB,CAAC;AAU9E,QAAA,MAAM,wBAAwB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAU/D,CAAC;AAOF,QAAA,MAAM,qBAAqB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IAU5D,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAI7C,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAgC,CAAC;AAgBhF,QAAA,MAAM,eAAe,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAgE,CAAC;AAE/G,QAAA,MAAM,sBAAsB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IACW,CAAC;AAkC3E,QAAA,MAAM,kBAAkB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IACuC,CAAC;AAKlG,QAAA,MAAM,qBAAqB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,YAAY,GAAG,IAalE,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAIvD,CAAC;AAEF,QAAA,MAAM,qBAAqB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAI7D,CAAC;AAEF,QAAA,MAAM,sBAAsB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAM9D,CAAC;AAEF,QAAA,MAAM,sBAAsB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IAY9D,CAAC;AAEF,QAAA,MAAM,cAAc,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IACK,CAAC;AAE5D,QAAA,MAAM,qBAAqB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,GAAG,CAAC,sBAAsB,GAAG,IACrB,CAAC;AAE7D,QAAA,MAAM,qBAAqB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,GAAG,CAAC,MAAM,EAAE,GAAG,IACI,CAAC;AAExE,QAAA,MAAM,kBAAkB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,OAAO,GAAG,IACA,CAAC;AAE5D,QAAA,MAAM,oBAAoB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IACQ,CAAC;AAErE,QAAA,MAAM,iBAAiB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IACS,CAAC;AAEnE,QAAA,MAAM,kBAAkB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IACS,CAAC;AAEpE,QAAA,MAAM,kBAAkB,GAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,gBAAgB,EAAE,UAAU,MAAM,KAAG,OACtB,CAAC;AAEvE,QAAA,MAAM,iBAAiB,GAAI,QAAQ,GAAG,CAAC,MAAM,KAAG,MAAM,GAAG,IACK,CAAC;
|
|
1
|
+
{"version":3,"file":"widget-accessible-properties.d.ts","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"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"}
|
|
@@ -258,17 +258,17 @@ const isSelfLabelling = (widget, targets) => {
|
|
|
258
258
|
const own = new Set(descendants(widget));
|
|
259
259
|
return targets.every((target) => own.has(target));
|
|
260
260
|
};
|
|
261
|
-
const
|
|
262
|
-
const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);
|
|
263
|
-
if (targets === null) {
|
|
264
|
-
return null;
|
|
265
|
-
}
|
|
261
|
+
const labelledByText = (targets) => {
|
|
266
262
|
const texts = collectAccessibleNames(targets);
|
|
267
263
|
return texts.length > 0 ? texts.join(" ") : null;
|
|
268
264
|
};
|
|
265
|
+
const getWidgetLabelledByText = (widget) => {
|
|
266
|
+
const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);
|
|
267
|
+
return targets === null ? null : labelledByText(targets);
|
|
268
|
+
};
|
|
269
269
|
const getWidgetExternalLabelText = (widget) => {
|
|
270
270
|
const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);
|
|
271
|
-
return targets === null || isSelfLabelling(widget, targets) ? null :
|
|
271
|
+
return targets === null || isSelfLabelling(widget, targets) ? null : labelledByText(targets);
|
|
272
272
|
};
|
|
273
273
|
const isTooltipUsedAsName = (widget) => readAccessibleString(widget, Gtk.AccessibleProperty.LABEL) === null &&
|
|
274
274
|
getWidgetText(widget) === null &&
|
|
@@ -285,22 +285,27 @@ const getWidgetDescribedByText = (widget) => {
|
|
|
285
285
|
}
|
|
286
286
|
return isTooltipUsedAsName(widget) ? null : callStringGetter(widget, "getTooltipText");
|
|
287
287
|
};
|
|
288
|
+
const isHiddenWithin = (widget, hiddenWidgets) => {
|
|
289
|
+
const cached = hiddenWidgets.get(widget);
|
|
290
|
+
if (cached !== undefined) {
|
|
291
|
+
return cached;
|
|
292
|
+
}
|
|
293
|
+
const parent = widget.getParent();
|
|
294
|
+
const isHidden = readAccessibleBoolean(widget, Gtk.AccessibleState.HIDDEN) === true ||
|
|
295
|
+
(parent !== null && isHiddenWithin(parent, hiddenWidgets));
|
|
296
|
+
hiddenWidgets.set(widget, isHidden);
|
|
297
|
+
return isHidden;
|
|
298
|
+
};
|
|
299
|
+
const buildInaccessibilityCheck = () => {
|
|
300
|
+
const hiddenWidgets = new Map();
|
|
301
|
+
return (target) => isHiddenWithin(requireWidget(target), hiddenWidgets);
|
|
302
|
+
};
|
|
288
303
|
/**
|
|
289
304
|
* Returns whether a widget is excluded from the accessibility tree, because it or one of its
|
|
290
305
|
* ancestors is marked hidden.
|
|
291
306
|
*
|
|
292
307
|
* @param widget The widget to test.
|
|
293
308
|
*/
|
|
294
|
-
const isInaccessible = (target) =>
|
|
295
|
-
|
|
296
|
-
let current = widget;
|
|
297
|
-
while (current) {
|
|
298
|
-
if (readAccessibleBoolean(current, Gtk.AccessibleState.HIDDEN) === true) {
|
|
299
|
-
return true;
|
|
300
|
-
}
|
|
301
|
-
current = current.getParent();
|
|
302
|
-
}
|
|
303
|
-
return false;
|
|
304
|
-
};
|
|
305
|
-
export { namingLabelText, getWidgetText, getWidgetTextContent, getWidgetLabelText, getWidgetAccessibleName, getWidgetName, getWidgetPlaceholderText, getWidgetDisplayValue, hasDisplayValue, isWidgetDisabled, isWidgetVisible, getWidgetRequiredState, getWidgetSelection, getWidgetDescribedByText, getWidgetCheckedState, isWidgetChecked, getWidgetPressedState, getWidgetExpandedState, getWidgetSelectedState, getWidgetLevel, getWidgetInvalidState, getWidgetErrorMessage, getWidgetBusyState, getWidgetDescription, getWidgetValueNow, getWidgetValueText, getWidgetOwnLabel, getWidgetExternalLabelText, getWidgetLabelledByText, isInaccessible, isWidgetValueMatch, };
|
|
309
|
+
const isInaccessible = (target) => buildInaccessibilityCheck()(target);
|
|
310
|
+
export { buildInaccessibilityCheck, namingLabelText, getWidgetText, getWidgetTextContent, getWidgetLabelText, getWidgetAccessibleName, getWidgetName, getWidgetPlaceholderText, getWidgetDisplayValue, hasDisplayValue, isWidgetDisabled, isWidgetVisible, getWidgetRequiredState, getWidgetSelection, getWidgetDescribedByText, getWidgetCheckedState, isWidgetChecked, getWidgetPressedState, getWidgetExpandedState, getWidgetSelectedState, getWidgetLevel, getWidgetInvalidState, getWidgetErrorMessage, getWidgetBusyState, getWidgetDescription, getWidgetValueNow, getWidgetValueText, getWidgetOwnLabel, getWidgetExternalLabelText, getWidgetLabelledByText, isInaccessible, isWidgetValueMatch, };
|
|
306
311
|
//# 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 {\n isAccessibleNumberMatch,\n readAccessibleBooleanProperty,\n readAccessibleFlag,\n readAccessibleInt,\n readAccessibleNumber,\n readAccessibleRelation,\n readAccessibleState,\n readAccessibleString,\n} from \"./accessible-native.js\";\nimport { EDITABLE_ROLES, isEditable, readEditableText } from \"./editable.js\";\nimport { isNameFromAuthor, isNameProhibited } from \"./role-naming.js\";\nimport { children, descendants, relationCandidates } from \"./traversal.js\";\nimport { callBooleanGetter, callStringGetter, getCallableMethod } from \"./widget-getters.js\";\nimport { requireWidget } from \"./widget-target.js\";\n\ntype WidgetValueField = \"now\" | \"min\" | \"max\";\ntype CheckedState = \"checked\" | \"unchecked\" | \"mixed\";\n\nconst EDITABLE_TEXT_GETTER = \"getText\";\nconst DEFAULT_TEXT_GETTERS = [\"getLabel\", EDITABLE_TEXT_GETTER, \"getTitle\"];\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 PRESSED_BY_TRISTATE: Map<number, boolean> = new Map<number, boolean>([\n [Gtk.AccessibleTristate.FALSE, false],\n [Gtk.AccessibleTristate.TRUE, true],\n]);\n\nconst CHECKED_BY_TRISTATE: Map<number, CheckedState> = new Map<number, CheckedState>([\n [Gtk.AccessibleTristate.FALSE, \"unchecked\"],\n [Gtk.AccessibleTristate.TRUE, \"checked\"],\n [Gtk.AccessibleTristate.MIXED, \"mixed\"],\n]);\n\nconst VALUE_PROPERTIES: Record<WidgetValueField, Gtk.AccessibleProperty> = {\n now: Gtk.AccessibleProperty.VALUE_NOW,\n min: Gtk.AccessibleProperty.VALUE_MIN,\n max: Gtk.AccessibleProperty.VALUE_MAX,\n};\n\nconst readAccessibleWidgets = (widget: Gtk.Widget, relation: Gtk.AccessibleRelation): Gtk.Widget[] | null => {\n const targets = readAccessibleRelation(widget, relation, relationCandidates(widget));\n const widgets = targets.filter((target): target is Gtk.Widget => target instanceof Gtk.Widget);\n\n return widgets.length > 0 ? widgets : null;\n};\n\nconst readAccessibleBoolean = (widget: Gtk.Widget, state: Gtk.AccessibleState): boolean | null =>\n readAccessibleFlag(widget, state);\n\nconst getLabelText = (widget: Gtk.Widget): string | null => {\n if (widget instanceof Gtk.Label) {\n return widget.getLabel();\n }\n\n return readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);\n};\n\nconst stripMnemonic = (text: string): string => text.replaceAll(/_(.)/g, \"$1\");\nconst isUnderlineUsed = (widget: object): boolean => callBooleanGetter(widget, \"getUseUnderline\") ?? false;\n\nconst readNamingText = (widget: object, getter: string, value: string): string =>\n getter !== EDITABLE_TEXT_GETTER && isUnderlineUsed(widget) ? stripMnemonic(value) : value;\n\nconst readFirstText = (widget: object, getters: string[]): string | null => {\n for (const getter of getters) {\n const value = callStringGetter(widget, getter);\n\n if (value) {\n return readNamingText(widget, getter, value);\n }\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 getWidgetText = (widget: Gtk.Accessible): string | null => readFirstText(widget, DEFAULT_TEXT_GETTERS);\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 isUnderlineUsed(widget) ? 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 namingLabelText(widget);\n};\n\nconst textContentParts = (widget: Gtk.Widget): string[] => {\n const own = getWidgetText(widget);\n\n if (own !== null) {\n return [own];\n }\n\n return [...children(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 isDropDownFaceCandidate = (widget: Gtk.Widget): boolean =>\n !(widget instanceof Gtk.Popover) && widget.getChildVisible();\n\nconst dropDownChildFaceText = (child: Gtk.Widget): string | null =>\n isDropDownFaceCandidate(child) ? getWidgetLabelText(child) ?? dropDownFaceText(child) : null;\n\nconst dropDownFaceText = (widget: Gtk.Widget): string | null => {\n for (const child of children(widget)) {\n const text = dropDownChildFaceText(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 nameFromAuthor = (widget: Gtk.Widget): string | null =>\n getWidgetLabelledByText(widget) ?? readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);\n\nconst nameFromContent = (widget: Gtk.Widget): string | null => {\n const ownText = getWidgetText(widget);\n\n if (ownText) {\n return ownText;\n }\n\n const childLabels = collectLabels(widget);\n\n return childLabels.length > 0 ? childLabels.join(\" \") : null;\n};\n\nconst getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {\n const role = widget.getAccessibleRole();\n\n if (isNameProhibited(role)) {\n return null;\n }\n\n if (role === Gtk.AccessibleRole.TAB_PANEL) {\n return tabPanelTitle(widget);\n }\n\n const authored = isNameFromAuthor(role) ? nameFromAuthor(widget) : null;\n\n if (authored) {\n return authored;\n }\n\n return nameFromContent(widget) ?? callStringGetter(widget, \"getTooltipText\");\n};\n\nconst getWidgetName = (widget: Gtk.Widget): string | null => widget.getName();\n\nconst nonEmptyText = (text: string | null): string | null => (text === null || text === \"\" ? null : text);\n\nconst readPlaceholderProperty = (widget: Gtk.Widget): string | null => {\n const value: unknown = Reflect.get(widget, \"placeholderText\");\n\n return typeof value === \"string\" ? nonEmptyText(value) : null;\n};\n\nconst getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {\n if (!EDITABLE_ROLES.has(widget.getAccessibleRole())) {\n return null;\n }\n\n return (\n nonEmptyText(callStringGetter(widget, \"getPlaceholderText\")) ??\n readPlaceholderProperty(widget) ??\n nonEmptyText(readAccessibleString(widget, Gtk.AccessibleProperty.PLACEHOLDER))\n );\n};\n\nconst comboBoxDisplayValue = (widget: Gtk.Widget): string | null =>\n widget instanceof Gtk.DropDown\n ? (dropDownFaceText(widget) ?? getWidgetValueText(widget))\n : (getWidgetValueText(widget) ?? dropDownFaceText(widget));\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 comboBoxDisplayValue(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 readAccessibleBooleanProperty(widget, Gtk.AccessibleProperty.REQUIRED);\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 sliceSelectedText = (widget: Gtk.Widget, start: number, end: number): string | null => {\n const chars = getCallableMethod<[number, number], string | null>(widget, \"getChars\");\n\n if (chars) {\n return chars(start, end) ?? null;\n }\n\n const text = callStringGetter(widget, \"getText\");\n\n /* eslint-disable-next-line @typescript-eslint/no-misused-spread -- bounds are code point offsets */\n return text === null ? null : [...text].slice(start, end).join(\"\");\n};\n\nconst readBoundedSelection = (widget: Gtk.Widget): string | null => {\n const bounds = getCallableMethod<[], [boolean, number, number]>(widget, \"getSelectionBounds\");\n\n if (!bounds) {\n return null;\n }\n\n const [hasSelection, start, end] = bounds();\n\n return hasSelection ? sliceSelectedText(widget, start, end) : null;\n};\n\nconst getWidgetSelection = (widget: Gtk.Widget): string | null =>\n widget instanceof Gtk.TextView ? readTextViewSelection(widget) : readBoundedSelection(widget);\n\nconst isRadioToggle = (widget: Gtk.Widget): widget is Gtk.ToggleButton =>\n widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO;\n\nconst getWidgetCheckedState = (widget: Gtk.Widget): CheckedState | null => {\n const tristate = readAccessibleState(widget, Gtk.AccessibleState.CHECKED);\n const state = tristate === null ? undefined : CHECKED_BY_TRISTATE.get(tristate);\n\n if (state !== undefined) {\n return state;\n }\n\n if (!isRadioToggle(widget)) {\n return null;\n }\n\n return widget.getActive() ? \"checked\" : \"unchecked\";\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 const tristate = readAccessibleState(widget, Gtk.AccessibleState.PRESSED);\n\n return tristate === null ? null : PRESSED_BY_TRISTATE.get(tristate) ?? null;\n};\n\nconst getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.TreeExpander) {\n return widget.getListRow()?.getExpanded() ?? null;\n }\n\n return readAccessibleBoolean(widget, Gtk.AccessibleState.EXPANDED);\n};\n\nconst getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {\n const selected = readAccessibleBoolean(widget, Gtk.AccessibleState.SELECTED);\n\n if (selected !== null) {\n return selected;\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 readAccessibleInt(widget, Gtk.AccessibleProperty.LEVEL);\n\nconst getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null =>\n readAccessibleState(widget, Gtk.AccessibleState.INVALID);\n\nconst getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null =>\n readAccessibleWidgets(widget, Gtk.AccessibleRelation.ERROR_MESSAGE);\n\nconst getWidgetBusyState = (widget: Gtk.Widget): boolean | null =>\n readAccessibleBoolean(widget, Gtk.AccessibleState.BUSY);\n\nconst getWidgetDescription = (widget: Gtk.Widget): string | null =>\n readAccessibleString(widget, Gtk.AccessibleProperty.DESCRIPTION);\n\nconst getWidgetValueNow = (widget: Gtk.Widget): number | null =>\n readAccessibleNumber(widget, Gtk.AccessibleProperty.VALUE_NOW);\n\nconst getWidgetValueText = (widget: Gtk.Widget): string | null =>\n readAccessibleString(widget, Gtk.AccessibleProperty.VALUE_TEXT);\n\nconst isWidgetValueMatch = (widget: Gtk.Widget, field: WidgetValueField, expected: number): boolean =>\n isAccessibleNumberMatch(widget, VALUE_PROPERTIES[field], expected);\n\nconst getWidgetOwnLabel = (widget: Gtk.Widget): string | null =>\n readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);\n\nconst collectAccessibleNames = (targets: Gtk.Widget[]): string[] =>\n targets\n .map((target) => getWidgetAccessibleName(target))\n .filter((text): text is string => text !== null && text !== \"\");\n\nconst isSelfLabelling = (widget: Gtk.Widget, targets: Gtk.Widget[]): boolean => {\n const own = new Set(descendants(widget));\n\n return targets.every((target) => own.has(target));\n};\n\nconst getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {\n const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);\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 getWidgetExternalLabelText = (widget: Gtk.Widget): string | null => {\n const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);\n\n return targets === null || isSelfLabelling(widget, targets) ? null : getWidgetLabelledByText(widget);\n};\n\nconst isTooltipUsedAsName = (widget: Gtk.Widget): boolean =>\n readAccessibleString(widget, Gtk.AccessibleProperty.LABEL) === null &&\n getWidgetText(widget) === null &&\n collectLabels(widget).length === 0;\n\nconst getWidgetDescribedByText = (widget: Gtk.Widget): string | null => {\n const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.DESCRIBED_BY);\n const texts = targets === null ? [] : collectAccessibleNames(targets);\n\n if (texts.length > 0) {\n return texts.join(\" \");\n }\n\n const description = readAccessibleString(widget, Gtk.AccessibleProperty.DESCRIPTION);\n\n if (description !== null) {\n return description;\n }\n\n return isTooltipUsedAsName(widget) ? null : callStringGetter(widget, \"getTooltipText\");\n};\n\n/**\n * Returns whether a widget is excluded from the accessibility tree, because it or one of its\n * ancestors is marked hidden.\n *\n * @param widget The widget to test.\n */\nconst isInaccessible = (target: Gtk.Accessible): boolean => {\n const widget = requireWidget(target);\n let current: Gtk.Widget | null = widget;\n\n while (current) {\n if (readAccessibleBoolean(current, Gtk.AccessibleState.HIDDEN) === true) {\n return true;\n }\n\n current = current.getParent();\n }\n\n return false;\n};\n\nexport {\n namingLabelText,\n getWidgetText,\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 getWidgetValueNow,\n getWidgetValueText,\n getWidgetOwnLabel,\n getWidgetExternalLabelText,\n getWidgetLabelledByText,\n isInaccessible,\n isWidgetValueMatch,\n type CheckedState,\n type WidgetValueField,\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 {\n isAccessibleNumberMatch,\n readAccessibleBooleanProperty,\n readAccessibleFlag,\n readAccessibleInt,\n readAccessibleNumber,\n readAccessibleRelation,\n readAccessibleState,\n readAccessibleString,\n} from \"./accessible-native.js\";\nimport { EDITABLE_ROLES, isEditable, readEditableText } from \"./editable.js\";\nimport { isNameFromAuthor, isNameProhibited } from \"./role-naming.js\";\nimport { children, descendants, relationCandidates } from \"./traversal.js\";\nimport { callBooleanGetter, callStringGetter, getCallableMethod } from \"./widget-getters.js\";\nimport { requireWidget } from \"./widget-target.js\";\n\ntype WidgetValueField = \"now\" | \"min\" | \"max\";\ntype CheckedState = \"checked\" | \"unchecked\" | \"mixed\";\n\nconst EDITABLE_TEXT_GETTER = \"getText\";\nconst DEFAULT_TEXT_GETTERS = [\"getLabel\", EDITABLE_TEXT_GETTER, \"getTitle\"];\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 PRESSED_BY_TRISTATE: Map<number, boolean> = new Map<number, boolean>([\n [Gtk.AccessibleTristate.FALSE, false],\n [Gtk.AccessibleTristate.TRUE, true],\n]);\n\nconst CHECKED_BY_TRISTATE: Map<number, CheckedState> = new Map<number, CheckedState>([\n [Gtk.AccessibleTristate.FALSE, \"unchecked\"],\n [Gtk.AccessibleTristate.TRUE, \"checked\"],\n [Gtk.AccessibleTristate.MIXED, \"mixed\"],\n]);\n\nconst VALUE_PROPERTIES: Record<WidgetValueField, Gtk.AccessibleProperty> = {\n now: Gtk.AccessibleProperty.VALUE_NOW,\n min: Gtk.AccessibleProperty.VALUE_MIN,\n max: Gtk.AccessibleProperty.VALUE_MAX,\n};\n\nconst readAccessibleWidgets = (widget: Gtk.Widget, relation: Gtk.AccessibleRelation): Gtk.Widget[] | null => {\n const targets = readAccessibleRelation(widget, relation, relationCandidates(widget));\n const widgets = targets.filter((target): target is Gtk.Widget => target instanceof Gtk.Widget);\n\n return widgets.length > 0 ? widgets : null;\n};\n\nconst readAccessibleBoolean = (widget: Gtk.Widget, state: Gtk.AccessibleState): boolean | null =>\n readAccessibleFlag(widget, state);\n\nconst getLabelText = (widget: Gtk.Widget): string | null => {\n if (widget instanceof Gtk.Label) {\n return widget.getLabel();\n }\n\n return readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);\n};\n\nconst stripMnemonic = (text: string): string => text.replaceAll(/_(.)/g, \"$1\");\nconst isUnderlineUsed = (widget: object): boolean => callBooleanGetter(widget, \"getUseUnderline\") ?? false;\n\nconst readNamingText = (widget: object, getter: string, value: string): string =>\n getter !== EDITABLE_TEXT_GETTER && isUnderlineUsed(widget) ? stripMnemonic(value) : value;\n\nconst readFirstText = (widget: object, getters: string[]): string | null => {\n for (const getter of getters) {\n const value = callStringGetter(widget, getter);\n\n if (value) {\n return readNamingText(widget, getter, value);\n }\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 getWidgetText = (widget: Gtk.Accessible): string | null => readFirstText(widget, DEFAULT_TEXT_GETTERS);\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 isUnderlineUsed(widget) ? 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 namingLabelText(widget);\n};\n\nconst textContentParts = (widget: Gtk.Widget): string[] => {\n const own = getWidgetText(widget);\n\n if (own !== null) {\n return [own];\n }\n\n return [...children(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 isDropDownFaceCandidate = (widget: Gtk.Widget): boolean =>\n !(widget instanceof Gtk.Popover) && widget.getChildVisible();\n\nconst dropDownChildFaceText = (child: Gtk.Widget): string | null =>\n isDropDownFaceCandidate(child) ? getWidgetLabelText(child) ?? dropDownFaceText(child) : null;\n\nconst dropDownFaceText = (widget: Gtk.Widget): string | null => {\n for (const child of children(widget)) {\n const text = dropDownChildFaceText(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 nameFromAuthor = (widget: Gtk.Widget): string | null =>\n getWidgetLabelledByText(widget) ?? readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);\n\nconst nameFromContent = (widget: Gtk.Widget): string | null => {\n const ownText = getWidgetText(widget);\n\n if (ownText) {\n return ownText;\n }\n\n const childLabels = collectLabels(widget);\n\n return childLabels.length > 0 ? childLabels.join(\" \") : null;\n};\n\nconst getWidgetAccessibleName = (widget: Gtk.Widget): string | null => {\n const role = widget.getAccessibleRole();\n\n if (isNameProhibited(role)) {\n return null;\n }\n\n if (role === Gtk.AccessibleRole.TAB_PANEL) {\n return tabPanelTitle(widget);\n }\n\n const authored = isNameFromAuthor(role) ? nameFromAuthor(widget) : null;\n\n if (authored) {\n return authored;\n }\n\n return nameFromContent(widget) ?? callStringGetter(widget, \"getTooltipText\");\n};\n\nconst getWidgetName = (widget: Gtk.Widget): string | null => widget.getName();\n\nconst nonEmptyText = (text: string | null): string | null => (text === null || text === \"\" ? null : text);\n\nconst readPlaceholderProperty = (widget: Gtk.Widget): string | null => {\n const value: unknown = Reflect.get(widget, \"placeholderText\");\n\n return typeof value === \"string\" ? nonEmptyText(value) : null;\n};\n\nconst getWidgetPlaceholderText = (widget: Gtk.Widget): string | null => {\n if (!EDITABLE_ROLES.has(widget.getAccessibleRole())) {\n return null;\n }\n\n return (\n nonEmptyText(callStringGetter(widget, \"getPlaceholderText\")) ??\n readPlaceholderProperty(widget) ??\n nonEmptyText(readAccessibleString(widget, Gtk.AccessibleProperty.PLACEHOLDER))\n );\n};\n\nconst comboBoxDisplayValue = (widget: Gtk.Widget): string | null =>\n widget instanceof Gtk.DropDown\n ? (dropDownFaceText(widget) ?? getWidgetValueText(widget))\n : (getWidgetValueText(widget) ?? dropDownFaceText(widget));\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 comboBoxDisplayValue(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 readAccessibleBooleanProperty(widget, Gtk.AccessibleProperty.REQUIRED);\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 sliceSelectedText = (widget: Gtk.Widget, start: number, end: number): string | null => {\n const chars = getCallableMethod<[number, number], string | null>(widget, \"getChars\");\n\n if (chars) {\n return chars(start, end) ?? null;\n }\n\n const text = callStringGetter(widget, \"getText\");\n\n /* eslint-disable-next-line @typescript-eslint/no-misused-spread -- bounds are code point offsets */\n return text === null ? null : [...text].slice(start, end).join(\"\");\n};\n\nconst readBoundedSelection = (widget: Gtk.Widget): string | null => {\n const bounds = getCallableMethod<[], [boolean, number, number]>(widget, \"getSelectionBounds\");\n\n if (!bounds) {\n return null;\n }\n\n const [hasSelection, start, end] = bounds();\n\n return hasSelection ? sliceSelectedText(widget, start, end) : null;\n};\n\nconst getWidgetSelection = (widget: Gtk.Widget): string | null =>\n widget instanceof Gtk.TextView ? readTextViewSelection(widget) : readBoundedSelection(widget);\n\nconst isRadioToggle = (widget: Gtk.Widget): widget is Gtk.ToggleButton =>\n widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO;\n\nconst getWidgetCheckedState = (widget: Gtk.Widget): CheckedState | null => {\n const tristate = readAccessibleState(widget, Gtk.AccessibleState.CHECKED);\n const state = tristate === null ? undefined : CHECKED_BY_TRISTATE.get(tristate);\n\n if (state !== undefined) {\n return state;\n }\n\n if (!isRadioToggle(widget)) {\n return null;\n }\n\n return widget.getActive() ? \"checked\" : \"unchecked\";\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 const tristate = readAccessibleState(widget, Gtk.AccessibleState.PRESSED);\n\n return tristate === null ? null : PRESSED_BY_TRISTATE.get(tristate) ?? null;\n};\n\nconst getWidgetExpandedState = (widget: Gtk.Widget): boolean | null => {\n if (widget instanceof Gtk.TreeExpander) {\n return widget.getListRow()?.getExpanded() ?? null;\n }\n\n return readAccessibleBoolean(widget, Gtk.AccessibleState.EXPANDED);\n};\n\nconst getWidgetSelectedState = (widget: Gtk.Widget): boolean | null => {\n const selected = readAccessibleBoolean(widget, Gtk.AccessibleState.SELECTED);\n\n if (selected !== null) {\n return selected;\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 readAccessibleInt(widget, Gtk.AccessibleProperty.LEVEL);\n\nconst getWidgetInvalidState = (widget: Gtk.Widget): Gtk.AccessibleInvalidState | null =>\n readAccessibleState(widget, Gtk.AccessibleState.INVALID);\n\nconst getWidgetErrorMessage = (widget: Gtk.Widget): Gtk.Widget[] | null =>\n readAccessibleWidgets(widget, Gtk.AccessibleRelation.ERROR_MESSAGE);\n\nconst getWidgetBusyState = (widget: Gtk.Widget): boolean | null =>\n readAccessibleBoolean(widget, Gtk.AccessibleState.BUSY);\n\nconst getWidgetDescription = (widget: Gtk.Widget): string | null =>\n readAccessibleString(widget, Gtk.AccessibleProperty.DESCRIPTION);\n\nconst getWidgetValueNow = (widget: Gtk.Widget): number | null =>\n readAccessibleNumber(widget, Gtk.AccessibleProperty.VALUE_NOW);\n\nconst getWidgetValueText = (widget: Gtk.Widget): string | null =>\n readAccessibleString(widget, Gtk.AccessibleProperty.VALUE_TEXT);\n\nconst isWidgetValueMatch = (widget: Gtk.Widget, field: WidgetValueField, expected: number): boolean =>\n isAccessibleNumberMatch(widget, VALUE_PROPERTIES[field], expected);\n\nconst getWidgetOwnLabel = (widget: Gtk.Widget): string | null =>\n readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);\n\nconst collectAccessibleNames = (targets: Gtk.Widget[]): string[] =>\n targets\n .map((target) => getWidgetAccessibleName(target))\n .filter((text): text is string => text !== null && text !== \"\");\n\nconst isSelfLabelling = (widget: Gtk.Widget, targets: Gtk.Widget[]): boolean => {\n const own = new Set(descendants(widget));\n\n return targets.every((target) => own.has(target));\n};\n\nconst labelledByText = (targets: Gtk.Widget[]): string | null => {\n const texts = collectAccessibleNames(targets);\n\n return texts.length > 0 ? texts.join(\" \") : null;\n};\n\nconst getWidgetLabelledByText = (widget: Gtk.Widget): string | null => {\n const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);\n\n return targets === null ? null : labelledByText(targets);\n};\n\nconst getWidgetExternalLabelText = (widget: Gtk.Widget): string | null => {\n const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);\n\n return targets === null || isSelfLabelling(widget, targets) ? null : labelledByText(targets);\n};\n\nconst isTooltipUsedAsName = (widget: Gtk.Widget): boolean =>\n readAccessibleString(widget, Gtk.AccessibleProperty.LABEL) === null &&\n getWidgetText(widget) === null &&\n collectLabels(widget).length === 0;\n\nconst getWidgetDescribedByText = (widget: Gtk.Widget): string | null => {\n const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.DESCRIBED_BY);\n const texts = targets === null ? [] : collectAccessibleNames(targets);\n\n if (texts.length > 0) {\n return texts.join(\" \");\n }\n\n const description = readAccessibleString(widget, Gtk.AccessibleProperty.DESCRIPTION);\n\n if (description !== null) {\n return description;\n }\n\n return isTooltipUsedAsName(widget) ? null : callStringGetter(widget, \"getTooltipText\");\n};\n\nconst isHiddenWithin = (widget: Gtk.Widget, hiddenWidgets: Map<Gtk.Widget, boolean>): boolean => {\n const cached = hiddenWidgets.get(widget);\n\n if (cached !== undefined) {\n return cached;\n }\n\n const parent = widget.getParent();\n\n const isHidden =\n readAccessibleBoolean(widget, Gtk.AccessibleState.HIDDEN) === true ||\n (parent !== null && isHiddenWithin(parent, hiddenWidgets));\n\n hiddenWidgets.set(widget, isHidden);\n\n return isHidden;\n};\n\nconst buildInaccessibilityCheck = (): ((target: Gtk.Accessible) => boolean) => {\n const hiddenWidgets: Map<Gtk.Widget, boolean> = new Map();\n\n return (target) => isHiddenWithin(requireWidget(target), hiddenWidgets);\n};\n\n/**\n * Returns whether a widget is excluded from the accessibility tree, because it or one of its\n * ancestors is marked hidden.\n *\n * @param widget The widget to test.\n */\nconst isInaccessible = (target: Gtk.Accessible): boolean => buildInaccessibilityCheck()(target);\n\nexport {\n buildInaccessibilityCheck,\n namingLabelText,\n getWidgetText,\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 getWidgetValueNow,\n getWidgetValueText,\n getWidgetOwnLabel,\n getWidgetExternalLabelText,\n getWidgetLabelledByText,\n isInaccessible,\n isWidgetValueMatch,\n type CheckedState,\n type WidgetValueField,\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gtkx/testing",
|
|
3
|
-
"version": "2.0.0-beta.
|
|
4
|
-
"description": "Queries, events, and screenshots for
|
|
3
|
+
"version": "2.0.0-beta.7",
|
|
4
|
+
"description": "Queries, events, and screenshots for Adwaita and GTK4 widget trees.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gtkx",
|
|
7
7
|
"gtk",
|
|
8
8
|
"gtk4",
|
|
9
|
+
"adwaita",
|
|
10
|
+
"gnome",
|
|
9
11
|
"react",
|
|
10
12
|
"typescript",
|
|
11
13
|
"testing",
|
|
@@ -62,9 +64,9 @@
|
|
|
62
64
|
"node": ">=26.7.0"
|
|
63
65
|
},
|
|
64
66
|
"dependencies": {
|
|
65
|
-
"@gtkx/runtime": "2.0.0-beta.
|
|
66
|
-
"@gtkx/react": "2.0.0-beta.
|
|
67
|
-
"@gtkx/utils": "2.0.0-beta.
|
|
67
|
+
"@gtkx/runtime": "2.0.0-beta.7",
|
|
68
|
+
"@gtkx/react": "2.0.0-beta.7",
|
|
69
|
+
"@gtkx/utils": "2.0.0-beta.7",
|
|
68
70
|
"@vitest/expect": "^4.1.11",
|
|
69
71
|
"@vitest/pretty-format": "^4.1.11"
|
|
70
72
|
},
|
|
@@ -73,7 +75,7 @@
|
|
|
73
75
|
"react": "^19.2"
|
|
74
76
|
},
|
|
75
77
|
"devDependencies": {
|
|
76
|
-
"@gtkx/config": "2.0.0-beta.
|
|
78
|
+
"@gtkx/config": "2.0.0-beta.7",
|
|
77
79
|
"@types/react": "^19.2.18"
|
|
78
80
|
},
|
|
79
81
|
"scripts": {
|
package/src/accessible-native.ts
CHANGED
|
@@ -168,33 +168,69 @@ const findRelationSize = (
|
|
|
168
168
|
return 0;
|
|
169
169
|
};
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
type RelationScan = { size: number; targets: Gtk.Accessible[] };
|
|
172
|
+
|
|
173
|
+
const unseen = function* <T>(items: Iterable<T>, seen: Set<T>): Generator<T> {
|
|
174
|
+
for (const item of items) {
|
|
175
|
+
if (seen.has(item)) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
seen.add(item);
|
|
180
|
+
yield item;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
const possibleTargets = (relation: Gtk.AccessibleRelation, candidates: Iterable<Gtk.Accessible>): Gtk.Accessible[] => {
|
|
172
185
|
const reverse = REVERSE_RELATIONS[relation];
|
|
173
186
|
|
|
174
187
|
if (reverse === undefined) {
|
|
175
|
-
return candidates;
|
|
188
|
+
return [...candidates];
|
|
176
189
|
}
|
|
177
190
|
|
|
178
|
-
return candidates.filter((candidate) => Gtk.testAccessibleHasRelation(candidate, reverse));
|
|
191
|
+
return [...candidates].filter((candidate) => Gtk.testAccessibleHasRelation(candidate, reverse));
|
|
179
192
|
};
|
|
180
193
|
|
|
194
|
+
const scanRelationTier = (
|
|
195
|
+
accessible: Gtk.Accessible,
|
|
196
|
+
relation: Gtk.AccessibleRelation,
|
|
197
|
+
candidates: Gtk.Accessible[],
|
|
198
|
+
scan: RelationScan,
|
|
199
|
+
): RelationScan => {
|
|
200
|
+
const size = scan.size > 0 ? scan.size : findRelationSize(accessible, relation, candidates);
|
|
201
|
+
|
|
202
|
+
if (size === 0) {
|
|
203
|
+
return scan;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const found = candidates.filter((candidate) => isRelationExactly(accessible, relation, candidate, size));
|
|
207
|
+
|
|
208
|
+
return { size, targets: [...scan.targets, ...found] };
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
const isRelationComplete = (scan: RelationScan): boolean => scan.size > 0 && scan.targets.length >= scan.size;
|
|
212
|
+
|
|
181
213
|
const readAccessibleRelation = (
|
|
182
214
|
accessible: Gtk.Accessible,
|
|
183
215
|
relation: Gtk.AccessibleRelation,
|
|
184
|
-
|
|
216
|
+
tiers: Iterable<Gtk.Accessible>[],
|
|
185
217
|
): Gtk.Accessible[] => {
|
|
186
218
|
if (!Gtk.testAccessibleHasRelation(accessible, relation)) {
|
|
187
219
|
return [];
|
|
188
220
|
}
|
|
189
221
|
|
|
190
|
-
const
|
|
191
|
-
|
|
222
|
+
const seen: Set<Gtk.Accessible> = new Set();
|
|
223
|
+
let scan: RelationScan = { size: 0, targets: [] };
|
|
192
224
|
|
|
193
|
-
|
|
194
|
-
|
|
225
|
+
for (const tier of tiers) {
|
|
226
|
+
scan = scanRelationTier(accessible, relation, possibleTargets(relation, unseen(tier, seen)), scan);
|
|
227
|
+
|
|
228
|
+
if (isRelationComplete(scan)) {
|
|
229
|
+
break;
|
|
230
|
+
}
|
|
195
231
|
}
|
|
196
232
|
|
|
197
|
-
return
|
|
233
|
+
return scan.targets;
|
|
198
234
|
};
|
|
199
235
|
|
|
200
236
|
const memberOfDomain = (check: CheckInt, handle: unknown, attribute: number, domain: number[]): number | null => {
|
package/src/queries.ts
CHANGED
|
@@ -12,6 +12,7 @@ import { multipleFoundError, notFoundError } from "./errors.js";
|
|
|
12
12
|
import { getDefaultNormalizer } from "./normalize.js";
|
|
13
13
|
import { type Container, findAll, traverse } from "./traversal.js";
|
|
14
14
|
import {
|
|
15
|
+
buildInaccessibilityCheck,
|
|
15
16
|
getWidgetAccessibleName,
|
|
16
17
|
getWidgetBusyState,
|
|
17
18
|
getWidgetDescription,
|
|
@@ -26,7 +27,6 @@ import {
|
|
|
26
27
|
getWidgetPressedState,
|
|
27
28
|
getWidgetSelectedState,
|
|
28
29
|
getWidgetValueText,
|
|
29
|
-
isInaccessible,
|
|
30
30
|
isWidgetChecked,
|
|
31
31
|
isWidgetValueMatch,
|
|
32
32
|
namingLabelText,
|
|
@@ -332,16 +332,18 @@ function queryAllByRole<T extends Gtk.Accessible = Gtk.Widget>(
|
|
|
332
332
|
role: Gtk.AccessibleRole,
|
|
333
333
|
options?: ByRoleOptions<T>,
|
|
334
334
|
): T[] {
|
|
335
|
+
const isInaccessible = buildInaccessibilityCheck();
|
|
336
|
+
|
|
335
337
|
const matches = findAll(container, (widget) => {
|
|
336
338
|
if (widget.getAccessibleRole() !== role) {
|
|
337
339
|
return false;
|
|
338
340
|
}
|
|
339
341
|
|
|
340
|
-
if (!
|
|
342
|
+
if (!isMatchingWidgetType(widget, options)) {
|
|
341
343
|
return false;
|
|
342
344
|
}
|
|
343
345
|
|
|
344
|
-
if (!
|
|
346
|
+
if (!options?.hidden && isInaccessible(widget)) {
|
|
345
347
|
return false;
|
|
346
348
|
}
|
|
347
349
|
|
package/src/screenshot.ts
CHANGED
|
@@ -32,6 +32,20 @@ type CaptureOutcome =
|
|
|
32
32
|
{ status: "captured"; result: ScreenshotResult } |
|
|
33
33
|
{ status: "stalled"; failure: CaptureFailure };
|
|
34
34
|
|
|
35
|
+
type BackgroundSnapshot = {
|
|
36
|
+
renderBackground(...args: [context: object, x: number, y: number, width: number, height: number]): void;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
type StyledWidget = {
|
|
40
|
+
getStyleContext(): object;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
type RenderSize = {
|
|
44
|
+
scale: number;
|
|
45
|
+
width: number;
|
|
46
|
+
height: number;
|
|
47
|
+
};
|
|
48
|
+
|
|
35
49
|
const DEFAULT_SCREENSHOT_INTERVAL = 10;
|
|
36
50
|
const PRESENTATION_PROBE_MS = 250;
|
|
37
51
|
|
|
@@ -180,16 +194,43 @@ const getChildrenNode = (widget: Gtk.Widget, scale: number): Gsk.RenderNode | nu
|
|
|
180
194
|
return snapshot.toNode();
|
|
181
195
|
};
|
|
182
196
|
|
|
197
|
+
const addWindowBackground = (
|
|
198
|
+
widget: Gtk.Widget,
|
|
199
|
+
node: Gsk.RenderNode,
|
|
200
|
+
{ scale, width, height }: RenderSize,
|
|
201
|
+
): Gsk.RenderNode => {
|
|
202
|
+
if (!(widget instanceof Gtk.Window)) {
|
|
203
|
+
return node;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const snapshot = new Gtk.Snapshot();
|
|
207
|
+
const backgroundSnapshot: BackgroundSnapshot = snapshot;
|
|
208
|
+
const styledWidget: StyledWidget = widget;
|
|
209
|
+
snapshot.save();
|
|
210
|
+
snapshot.scale(scale, scale);
|
|
211
|
+
backgroundSnapshot.renderBackground(styledWidget.getStyleContext(), 0, 0, width, height);
|
|
212
|
+
snapshot.restore();
|
|
213
|
+
snapshot.appendNode(node);
|
|
214
|
+
|
|
215
|
+
return snapshot.toNode() ?? node;
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
const getFallbackNode = (widget: Gtk.Widget, size: RenderSize): Gsk.RenderNode | null => {
|
|
219
|
+
const content = getChildrenNode(widget, size.scale);
|
|
220
|
+
|
|
221
|
+
return content === null ? null : addWindowBackground(widget, content, size);
|
|
222
|
+
};
|
|
223
|
+
|
|
183
224
|
const getRenderNode = (widget: Gtk.Widget, scale: number, width: number, height: number): Gsk.RenderNode | null => {
|
|
184
|
-
const
|
|
225
|
+
const content = getPaintableNode(widget, scale, width, height);
|
|
185
226
|
|
|
186
|
-
if (
|
|
187
|
-
return
|
|
227
|
+
if (content) {
|
|
228
|
+
return content;
|
|
188
229
|
}
|
|
189
230
|
|
|
190
231
|
allocateRoot(widget);
|
|
191
232
|
|
|
192
|
-
return getPaintableNode(widget, scale, width, height) ??
|
|
233
|
+
return getPaintableNode(widget, scale, width, height) ?? getFallbackNode(widget, { scale, width, height });
|
|
193
234
|
};
|
|
194
235
|
|
|
195
236
|
const renderToPng = (widget: Gtk.Widget, node: Gsk.RenderNode, width: number, height: number): ScreenshotResult => {
|
package/src/traversal.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Gtk from "@gtkx/gi/gtk";
|
|
2
|
+
import { getClassType, getInstanceType, typeIsA } from "@gtkx/runtime";
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* A scope that resolves to a single root widget: the widget itself, the widget a controller or
|
|
@@ -15,11 +16,26 @@ type WidgetClass<T extends object> = abstract new (...args: never[]) => T;
|
|
|
15
16
|
|
|
16
17
|
/** Container sentinel that widens a query to every toplevel window currently open. */
|
|
17
18
|
const TOPLEVELS: unique symbol = Symbol("gtkx.toplevels");
|
|
19
|
+
const nativeWidgetTypes: Map<bigint, boolean> = new Map();
|
|
18
20
|
|
|
19
21
|
const isApplication = (container: Container): container is Gtk.Application => container instanceof Gtk.Application;
|
|
20
22
|
const isAnyWidget = (): boolean => true;
|
|
21
23
|
const isOnScreen = (widget: Gtk.Widget): boolean => widget.getMapped();
|
|
22
24
|
|
|
25
|
+
const isNativeWidget = (widget: Gtk.Widget): boolean => {
|
|
26
|
+
const type = getInstanceType(widget);
|
|
27
|
+
const cached = nativeWidgetTypes.get(type);
|
|
28
|
+
|
|
29
|
+
if (cached !== undefined) {
|
|
30
|
+
return cached;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const isNative = typeIsA(type, getClassType(Gtk.Native));
|
|
34
|
+
nativeWidgetTypes.set(type, isNative);
|
|
35
|
+
|
|
36
|
+
return isNative;
|
|
37
|
+
};
|
|
38
|
+
|
|
23
39
|
const traverseWidgetTree = function* (
|
|
24
40
|
root: Gtk.Widget,
|
|
25
41
|
isIncluded: (widget: Gtk.Widget) => boolean,
|
|
@@ -70,15 +86,23 @@ const ancestorFor = <T extends object>(widget: Gtk.Widget, type: WidgetClass<T>)
|
|
|
70
86
|
return null;
|
|
71
87
|
};
|
|
72
88
|
|
|
73
|
-
const
|
|
74
|
-
const
|
|
75
|
-
|
|
89
|
+
const mappedWidgets = function* (widget: Gtk.Widget, isParentMapped: boolean): Generator<Gtk.Widget> {
|
|
90
|
+
const isMapped = (isParentMapped || isNativeWidget(widget)) && isOnScreen(widget);
|
|
91
|
+
|
|
92
|
+
if (isMapped) {
|
|
93
|
+
yield widget;
|
|
94
|
+
}
|
|
76
95
|
|
|
77
|
-
|
|
78
|
-
|
|
96
|
+
for (const child of children(widget)) {
|
|
97
|
+
yield* mappedWidgets(child, isMapped);
|
|
79
98
|
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const relationCandidates = (widget: Gtk.Widget): Iterable<Gtk.Accessible>[] => {
|
|
102
|
+
const root = widget.getRoot();
|
|
103
|
+
const tree: Iterable<Gtk.Accessible> = root instanceof Gtk.Widget ? traverseWidgetTree(root, isAnyWidget) : [];
|
|
80
104
|
|
|
81
|
-
return [
|
|
105
|
+
return [widget.listMnemonicLabels(), descendants(widget), tree];
|
|
82
106
|
};
|
|
83
107
|
|
|
84
108
|
const resolveRoot = (container: QueryContainer): Gtk.Widget | null => {
|
|
@@ -117,7 +141,7 @@ const roots = function* (container: Container): Generator<Gtk.Widget> {
|
|
|
117
141
|
|
|
118
142
|
const traverse = function* (container: Container): Generator<Gtk.Widget> {
|
|
119
143
|
for (const root of roots(container)) {
|
|
120
|
-
yield*
|
|
144
|
+
yield* mappedWidgets(root, true);
|
|
121
145
|
}
|
|
122
146
|
};
|
|
123
147
|
|