@gtkx/testing 1.0.0-rc.4 → 1.0.0

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.
Files changed (182) hide show
  1. package/README.md +5 -5
  2. package/dist/accessible-native.d.ts +16 -0
  3. package/dist/accessible-native.d.ts.map +1 -0
  4. package/dist/accessible-native.js +206 -0
  5. package/dist/accessible-native.js.map +1 -0
  6. package/dist/build-queries.d.ts +27 -10
  7. package/dist/build-queries.d.ts.map +1 -1
  8. package/dist/build-queries.js +22 -24
  9. package/dist/build-queries.js.map +1 -1
  10. package/dist/cleanup-registry.d.ts +1 -1
  11. package/dist/cleanup-registry.d.ts.map +1 -1
  12. package/dist/cleanup-registry.js.map +1 -1
  13. package/dist/errors.d.ts +10 -1
  14. package/dist/errors.d.ts.map +1 -1
  15. package/dist/errors.js +10 -1
  16. package/dist/errors.js.map +1 -1
  17. package/dist/fire-event.d.ts +35 -6
  18. package/dist/fire-event.d.ts.map +1 -1
  19. package/dist/fire-event.js +23 -7
  20. package/dist/fire-event.js.map +1 -1
  21. package/dist/frame-sync.d.ts +2 -1
  22. package/dist/frame-sync.d.ts.map +1 -1
  23. package/dist/frame-sync.js +15 -5
  24. package/dist/frame-sync.js.map +1 -1
  25. package/dist/harness-window.d.ts +4 -0
  26. package/dist/harness-window.d.ts.map +1 -0
  27. package/dist/harness-window.js +6 -0
  28. package/dist/harness-window.js.map +1 -0
  29. package/dist/index.d.ts +14 -7
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +9 -5
  32. package/dist/index.js.map +1 -1
  33. package/dist/internal.d.ts +4 -0
  34. package/dist/internal.d.ts.map +1 -0
  35. package/dist/internal.js +4 -0
  36. package/dist/internal.js.map +1 -0
  37. package/dist/matchers.d.ts +88 -46
  38. package/dist/matchers.d.ts.map +1 -1
  39. package/dist/matchers.js +156 -18
  40. package/dist/matchers.js.map +1 -1
  41. package/dist/pretty-format.d.ts +2 -0
  42. package/dist/pretty-format.d.ts.map +1 -0
  43. package/dist/pretty-format.js +2 -0
  44. package/dist/pretty-format.js.map +1 -0
  45. package/dist/pretty-widget.d.ts +5 -2
  46. package/dist/pretty-widget.d.ts.map +1 -1
  47. package/dist/pretty-widget.js +73 -56
  48. package/dist/pretty-widget.js.map +1 -1
  49. package/dist/production.d.ts +8 -0
  50. package/dist/production.d.ts.map +1 -0
  51. package/dist/production.js +34 -0
  52. package/dist/production.js.map +1 -0
  53. package/dist/queries.d.ts +98 -56
  54. package/dist/queries.d.ts.map +1 -1
  55. package/dist/queries.js +123 -83
  56. package/dist/queries.js.map +1 -1
  57. package/dist/query-helpers.d.ts +44 -0
  58. package/dist/query-helpers.d.ts.map +1 -0
  59. package/dist/query-helpers.js +57 -0
  60. package/dist/query-helpers.js.map +1 -0
  61. package/dist/render-children.d.ts +9 -0
  62. package/dist/render-children.d.ts.map +1 -0
  63. package/dist/render-children.js +11 -0
  64. package/dist/render-children.js.map +1 -0
  65. package/dist/render.d.ts.map +1 -1
  66. package/dist/render.js +11 -9
  67. package/dist/render.js.map +1 -1
  68. package/dist/role-helpers.d.ts +12 -3
  69. package/dist/role-helpers.d.ts.map +1 -1
  70. package/dist/role-helpers.js +13 -4
  71. package/dist/role-helpers.js.map +1 -1
  72. package/dist/role-naming.d.ts +5 -0
  73. package/dist/role-naming.d.ts.map +1 -0
  74. package/dist/role-naming.js +96 -0
  75. package/dist/role-naming.js.map +1 -0
  76. package/dist/screenshot.d.ts +12 -20
  77. package/dist/screenshot.d.ts.map +1 -1
  78. package/dist/screenshot.js +183 -91
  79. package/dist/screenshot.js.map +1 -1
  80. package/dist/traversal.d.ts +4 -1
  81. package/dist/traversal.d.ts.map +1 -1
  82. package/dist/traversal.js +25 -6
  83. package/dist/traversal.js.map +1 -1
  84. package/dist/types.d.ts +26 -14
  85. package/dist/types.d.ts.map +1 -1
  86. package/dist/types.js.map +1 -1
  87. package/dist/user-event/adjustment.d.ts +3 -0
  88. package/dist/user-event/adjustment.d.ts.map +1 -1
  89. package/dist/user-event/adjustment.js +23 -2
  90. package/dist/user-event/adjustment.js.map +1 -1
  91. package/dist/user-event/click.d.ts +43 -8
  92. package/dist/user-event/click.d.ts.map +1 -1
  93. package/dist/user-event/click.js +175 -44
  94. package/dist/user-event/click.js.map +1 -1
  95. package/dist/user-event/column-header-click.d.ts +4 -0
  96. package/dist/user-event/column-header-click.d.ts.map +1 -0
  97. package/dist/user-event/column-header-click.js +65 -0
  98. package/dist/user-event/column-header-click.js.map +1 -0
  99. package/dist/user-event/event-wrapper.d.ts.map +1 -1
  100. package/dist/user-event/event-wrapper.js +2 -1
  101. package/dist/user-event/event-wrapper.js.map +1 -1
  102. package/dist/user-event/index.d.ts +51 -10
  103. package/dist/user-event/index.d.ts.map +1 -1
  104. package/dist/user-event/index.js +43 -26
  105. package/dist/user-event/index.js.map +1 -1
  106. package/dist/user-event/indexed-children.d.ts +10 -0
  107. package/dist/user-event/indexed-children.d.ts.map +1 -0
  108. package/dist/user-event/indexed-children.js +50 -0
  109. package/dist/user-event/indexed-children.js.map +1 -0
  110. package/dist/user-event/keyboard.d.ts.map +1 -1
  111. package/dist/user-event/keyboard.js +33 -4
  112. package/dist/user-event/keyboard.js.map +1 -1
  113. package/dist/user-event/list-row-click.d.ts +4 -0
  114. package/dist/user-event/list-row-click.d.ts.map +1 -0
  115. package/dist/user-event/list-row-click.js +39 -0
  116. package/dist/user-event/list-row-click.js.map +1 -0
  117. package/dist/user-event/native-click.d.ts +6 -0
  118. package/dist/user-event/native-click.d.ts.map +1 -0
  119. package/dist/user-event/native-click.js +32 -0
  120. package/dist/user-event/native-click.js.map +1 -0
  121. package/dist/user-event/pointer.d.ts +1 -1
  122. package/dist/user-event/pointer.d.ts.map +1 -1
  123. package/dist/user-event/pointer.js +33 -9
  124. package/dist/user-event/pointer.js.map +1 -1
  125. package/dist/user-event/selection.d.ts +11 -8
  126. package/dist/user-event/selection.d.ts.map +1 -1
  127. package/dist/user-event/selection.js +49 -38
  128. package/dist/user-event/selection.js.map +1 -1
  129. package/dist/user-event/text.d.ts +6 -2
  130. package/dist/user-event/text.d.ts.map +1 -1
  131. package/dist/user-event/text.js +68 -18
  132. package/dist/user-event/text.js.map +1 -1
  133. package/dist/widget-accessible-properties.d.ts +14 -26
  134. package/dist/widget-accessible-properties.d.ts.map +1 -1
  135. package/dist/widget-accessible-properties.js +135 -190
  136. package/dist/widget-accessible-properties.js.map +1 -1
  137. package/dist/widget-getters.d.ts +8 -0
  138. package/dist/widget-getters.d.ts.map +1 -0
  139. package/dist/widget-getters.js +19 -0
  140. package/dist/widget-getters.js.map +1 -0
  141. package/dist/within.d.ts +3 -2
  142. package/dist/within.d.ts.map +1 -1
  143. package/dist/within.js +3 -2
  144. package/dist/within.js.map +1 -1
  145. package/package.json +12 -7
  146. package/src/accessible-native.ts +333 -0
  147. package/src/build-queries.ts +47 -41
  148. package/src/cleanup-registry.ts +1 -1
  149. package/src/errors.ts +12 -1
  150. package/src/fire-event.ts +61 -8
  151. package/src/frame-sync.ts +21 -5
  152. package/src/harness-window.ts +9 -0
  153. package/src/index.ts +18 -11
  154. package/src/internal.ts +11 -0
  155. package/src/matchers.ts +428 -70
  156. package/src/pretty-format.ts +1 -0
  157. package/src/pretty-widget.ts +97 -70
  158. package/src/production.ts +52 -0
  159. package/src/queries.ts +127 -89
  160. package/src/query-helpers.ts +97 -0
  161. package/src/render-children.ts +25 -0
  162. package/src/render.tsx +16 -11
  163. package/src/role-helpers.ts +14 -4
  164. package/src/role-naming.ts +99 -0
  165. package/src/screenshot.ts +272 -103
  166. package/src/traversal.ts +44 -6
  167. package/src/types.ts +28 -16
  168. package/src/user-event/adjustment.ts +29 -2
  169. package/src/user-event/click.ts +247 -52
  170. package/src/user-event/column-header-click.ts +90 -0
  171. package/src/user-event/event-wrapper.ts +3 -1
  172. package/src/user-event/index.ts +100 -37
  173. package/src/user-event/indexed-children.ts +75 -0
  174. package/src/user-event/keyboard.ts +52 -4
  175. package/src/user-event/list-row-click.ts +57 -0
  176. package/src/user-event/native-click.ts +46 -0
  177. package/src/user-event/pointer.ts +48 -9
  178. package/src/user-event/selection.ts +67 -41
  179. package/src/user-event/text.ts +92 -21
  180. package/src/widget-accessible-properties.ts +183 -230
  181. package/src/widget-getters.ts +32 -0
  182. package/src/within.ts +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/user-event/text.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as GObject from \"@gtkx/gi/gobject\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { EDITABLE_ROLES, type EditableTarget, getEditableDelegate, isEditable } from \"../editable.js\";\nimport { formatRoleList } from \"../role-helpers.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\n/** Options for `userEvent.type`. */\ntype TypeOptions = {\n /** Focus the widget before typing; defaults to true. */\n shouldFocus?: boolean | undefined;\n /** Select from this offset before typing, replacing the selected range with the typed text. */\n initialSelectionStart?: number | undefined;\n /** End offset of the initial selection (defaults to the start offset). */\n initialSelectionEnd?: number | undefined;\n};\n\nconst EDITABLE_REQUIRED = `expected editable widget (${formatRoleList(EDITABLE_ROLES)})`;\n\nconst insertEditableText = (widget: EditableTarget, text: string): void => {\n if (widget instanceof Gtk.TextView) {\n widget.emit(\"insert-at-cursor\", text);\n\n return;\n }\n\n const target = getEditableDelegate(widget) ?? widget;\n\n if (target instanceof Gtk.Text) {\n target.emit(\"insert-at-cursor\", text);\n\n return;\n }\n\n const position = widget.getPosition();\n const newPosition = widget.insertText(text, text.length, position);\n widget.setPosition(newPosition);\n};\n\nconst readSelection = (widget: EditableTarget): string => {\n if (widget instanceof Gtk.TextView) {\n const buffer = widget.getBuffer();\n const [hasSelection, start, end] = buffer.getSelectionBounds();\n\n return hasSelection ? buffer.getText(start, end, true) : \"\";\n }\n\n const [hasSelection, start, end] = widget.getSelectionBounds();\n\n return hasSelection ? widget.getChars(start, end) : \"\";\n};\n\nconst deleteSelection = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n widget.getBuffer().deleteSelection(false, true);\n\n return;\n }\n\n widget.deleteSelection();\n};\n\nconst setEditableText = (widget: EditableTarget, text: string): void => {\n if (widget instanceof Gtk.TextView) {\n widget.getBuffer().setText(text, text.length);\n\n return;\n }\n\n widget.setText(text);\n};\n\nconst applyTextViewSelection = (widget: Gtk.TextView, start: number, end: number): void => {\n const buffer = widget.getBuffer();\n buffer.selectRange(buffer.getIterAtOffset(start), buffer.getIterAtOffset(end));\n\n if (end !== start) {\n deleteSelection(widget);\n }\n};\n\nconst applyEditableSelection = (widget: Gtk.Editable, start: number, end: number): void => {\n widget.selectRegion(start, end);\n\n if (end !== start) {\n widget.deleteSelection();\n }\n\n widget.setPosition(start);\n};\n\nconst applyInitialSelection = (widget: EditableTarget, options: TypeOptions): void => {\n if (options.initialSelectionStart === undefined) {\n return;\n }\n\n const start = options.initialSelectionStart;\n const end = options.initialSelectionEnd ?? start;\n\n if (widget instanceof Gtk.TextView) {\n applyTextViewSelection(widget, start, end);\n\n return;\n }\n\n applyEditableSelection(widget, start, end);\n};\n\nconst writeClipboardText = (widget: Gtk.Widget, text: string): void => {\n const value = GObject.buildValue(GObject.TYPE_STRING, (v) => {\n v.setString(text);\n });\n\n widget.getClipboard().set(value);\n};\n\nconst resetClipboard = (): void => {\n Gdk.Display.getDefault()?.getClipboard().setContent(null);\n};\n\nconst runEditableEvent = (\n widget: Gtk.Widget,\n failure: string,\n action: (editable: EditableTarget) => void,\n): Promise<void> =>\n wrapEvent(widget, () => {\n if (!isEditable(widget)) {\n throw new Error(`${failure}: ${EDITABLE_REQUIRED}`);\n }\n\n action(widget);\n });\n\n/**\n * Focuses the widget unless `shouldFocus` is false, applies any initial selection, and inserts the text\n * at the cursor.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst type = (widget: Gtk.Widget, text: string, options?: TypeOptions): Promise<void> =>\n runEditableEvent(widget, \"Cannot type into element\", (editable) => {\n if (options?.shouldFocus ?? true) {\n editable.grabFocus();\n }\n\n applyInitialSelection(editable, options ?? {});\n insertEditableText(editable, text);\n });\n\n/**\n * Replaces an editable widget's text with the empty string.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst clear = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot clear element\", (editable) => {\n setEditableText(editable, \"\");\n });\n\n/**\n * Writes an editable widget's selected text to its clipboard, or the empty string when nothing is selected.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst copy = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot copy\", (editable) => {\n writeClipboardText(editable, readSelection(editable));\n });\n\n/**\n * Writes an editable widget's selected text to its clipboard, then deletes that selection.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst cut = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot cut\", (editable) => {\n writeClipboardText(editable, readSelection(editable));\n deleteSelection(editable);\n });\n\n/**\n * Inserts the given text at an editable widget's cursor, reading the clipboard instead when no text\n * is given.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst paste = async (widget: Gtk.Widget, text?: string): Promise<void> => {\n if (!isEditable(widget)) {\n throw new Error(`Cannot paste: ${EDITABLE_REQUIRED}`);\n }\n\n const content = text ?? (await widget.getClipboard().readTextAsync(null)) ?? \"\";\n\n await wrapEvent(widget, () => {\n insertEditableText(widget, content);\n });\n};\n\nexport { resetClipboard, type, clear, copy, cut, paste, type TypeOptions };\n"]}
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/user-event/text.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Gdk from \"@gtkx/gi/gdk\";\nimport * as GObject from \"@gtkx/gi/gobject\";\nimport * as Gtk from \"@gtkx/gi/gtk\";\nimport { EDITABLE_ROLES, type EditableTarget, getEditableDelegate, isEditable, readEditableText } from \"../editable.js\";\nimport { formatRoleList } from \"../role-helpers.js\";\nimport { getWidgetSelection } from \"../widget-accessible-properties.js\";\nimport { callBooleanGetter } from \"../widget-getters.js\";\nimport { wrapEvent } from \"./event-wrapper.js\";\n\ntype SignalWatchTarget = {\n on(signal: string, handler: (...args: unknown[]) => unknown, isAfter?: boolean): unknown;\n off(signal: string, handler: (...args: unknown[]) => unknown): unknown;\n};\n\n/** Options for `userEvent.type`. */\ntype TypeOptions = {\n /** Focus the widget before typing; defaults to true. */\n shouldFocus?: boolean | undefined;\n /** Select from this offset before typing, replacing the selected range with the typed text. */\n initialSelectionStart?: number | undefined;\n /** End offset of the initial selection (defaults to the start offset). */\n initialSelectionEnd?: number | undefined;\n};\n\nconst EDITABLE_REQUIRED = `expected editable widget (${formatRoleList(EDITABLE_ROLES)})`;\nconst CLEAR_REFUSED = \"Cannot clear element: the widget refuses to delete part of its text\";\n\nconst insertEditableText = (widget: EditableTarget, text: string): void => {\n if (widget instanceof Gtk.TextView) {\n widget.emit(\"insert-at-cursor\", text);\n\n return;\n }\n\n const target = getEditableDelegate(widget) ?? widget;\n\n if (target instanceof Gtk.Text) {\n target.emit(\"insert-at-cursor\", text);\n\n return;\n }\n\n const position = widget.getPosition();\n const newPosition = widget.insertText(text, text.length, position);\n widget.setPosition(newPosition);\n};\n\nconst readSelection = (widget: EditableTarget): string => getWidgetSelection(widget) ?? \"\";\n\nconst deleteSelection = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n widget.getBuffer().deleteSelection(false, true);\n\n return;\n }\n\n widget.deleteSelection();\n};\n\nconst deleteAllText = (widget: EditableTarget): void => {\n if (widget instanceof Gtk.TextView) {\n const buffer = widget.getBuffer();\n buffer.deleteInteractive(buffer.getStartIter(), buffer.getEndIter(), widget.getEditable());\n\n return;\n }\n\n widget.deleteText(0, -1);\n};\n\nconst applyTextViewSelection = (widget: Gtk.TextView, start: number, end: number): void => {\n const buffer = widget.getBuffer();\n buffer.selectRange(buffer.getIterAtOffset(start), buffer.getIterAtOffset(end));\n\n if (end !== start) {\n deleteSelection(widget);\n }\n};\n\nconst applyEditableSelection = (widget: Gtk.Editable, start: number, end: number): void => {\n widget.selectRegion(start, end);\n\n if (end !== start) {\n widget.deleteSelection();\n }\n\n widget.setPosition(start);\n};\n\nconst applyInitialSelection = (widget: EditableTarget, options: TypeOptions): void => {\n if (options.initialSelectionStart === undefined) {\n return;\n }\n\n const start = options.initialSelectionStart;\n const end = options.initialSelectionEnd ?? start;\n\n if (widget instanceof Gtk.TextView) {\n applyTextViewSelection(widget, start, end);\n\n return;\n }\n\n applyEditableSelection(widget, start, end);\n};\n\nconst writeClipboardText = (widget: Gtk.Widget, text: string): void => {\n const value = GObject.buildValue(GObject.TYPE_STRING, (v) => {\n v.setString(text);\n });\n\n widget.getClipboard().set(value);\n};\n\nconst resetClipboard = (): void => {\n Gdk.Display.getDefault()?.getClipboard().setContent(null);\n};\n\nconst runEditableEvent = (\n widget: Gtk.Widget,\n failure: string,\n action: (editable: EditableTarget) => void,\n): Promise<void> =>\n wrapEvent(widget, () => {\n if (!isEditable(widget)) {\n throw new Error(`${failure}: ${EDITABLE_REQUIRED}`);\n }\n\n action(widget);\n });\n\n/**\n * Focuses the widget unless `shouldFocus` is false, applies any initial selection, and inserts the text\n * at the cursor.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst type = (widget: Gtk.Widget, text: string, options?: TypeOptions): Promise<void> =>\n runEditableEvent(widget, \"Cannot type into element\", (editable) => {\n if (options?.shouldFocus ?? true) {\n editable.grabFocus();\n }\n\n applyInitialSelection(editable, options ?? {});\n insertEditableText(editable, text);\n });\n\nconst isWidgetEditable = (widget: Gtk.Widget): boolean => callBooleanGetter(widget, \"getEditable\") ?? true;\n\nconst hasNonEditableChar = (iter: Gtk.TextIter, isDefaultEditable: boolean): boolean => {\n while (!iter.isEnd()) {\n if (!iter.editable(isDefaultEditable)) {\n return true;\n }\n\n if (!iter.forwardChar()) {\n return false;\n }\n }\n\n return false;\n};\n\nconst hasProtectedText = (widget: EditableTarget): boolean =>\n widget instanceof Gtk.TextView && hasNonEditableChar(widget.getBuffer().getStartIter(), widget.getEditable());\n\nconst requireClearableText = (editable: EditableTarget): void => {\n if (!isWidgetEditable(editable)) {\n throw new Error(\"Cannot clear element: the widget is not editable\");\n }\n\n if (hasProtectedText(editable)) {\n throw new Error(CLEAR_REFUSED);\n }\n};\n\nconst deletionSignalFor = (widget: EditableTarget): [SignalWatchTarget, string] =>\n widget instanceof Gtk.TextView ? [widget.getBuffer(), \"delete-range\"] : [widget, \"delete-text\"];\n\nconst isDeletionApplied = (emitter: SignalWatchTarget, signal: string, apply: () => void): boolean => {\n let isApplied = false;\n\n const watch = (): void => {\n isApplied = true;\n };\n\n emitter.on(signal, watch, true);\n\n try {\n apply();\n } finally {\n emitter.off(signal, watch);\n }\n\n return isApplied;\n};\n\nconst didDeleteAllText = (widget: EditableTarget): boolean => {\n const [emitter, signal] = deletionSignalFor(widget);\n\n return isDeletionApplied(emitter, signal, () => {\n deleteAllText(widget);\n });\n};\n\nconst clearEditable = (editable: EditableTarget): void => {\n requireClearableText(editable);\n editable.grabFocus();\n\n if (readEditableText(editable) === \"\") {\n return;\n }\n\n if (!didDeleteAllText(editable)) {\n throw new Error(CLEAR_REFUSED);\n }\n};\n\n/**\n * Focuses an editable widget and deletes its whole text through the widget's own editing API, so the\n * deletion emits the signals an edit made by hand emits. Text a tag protects is detected before the\n * deletion runs, leaving such a widget untouched. A widget that writes a new value back in response\n * to the deletion, as an input mask does, is cleared successfully and keeps whatever it wrote.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView, when it refuses edits, when\n * a tag protects part of its text, or when a handler blocks the deletion.\n */\nconst clear = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot clear element\", clearEditable);\n\n/**\n * Writes an editable widget's selected text to its clipboard, or the empty string when nothing is selected.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst copy = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot copy\", (editable) => {\n writeClipboardText(editable, readSelection(editable));\n });\n\n/**\n * Writes an editable widget's selected text to its clipboard, then deletes that selection.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst cut = (widget: Gtk.Widget): Promise<void> =>\n runEditableEvent(widget, \"Cannot cut\", (editable) => {\n writeClipboardText(editable, readSelection(editable));\n deleteSelection(editable);\n });\n\n/**\n * Inserts the given text at an editable widget's cursor, reading the clipboard instead when no text\n * is given.\n *\n * @throws When the widget is neither a Gtk.Editable nor a Gtk.TextView.\n */\nconst paste = async (widget: Gtk.Widget, text?: string): Promise<void> => {\n if (!isEditable(widget)) {\n throw new Error(`Cannot paste: ${EDITABLE_REQUIRED}`);\n }\n\n const content = text ?? (await widget.getClipboard().readTextAsync(null)) ?? \"\";\n\n await wrapEvent(widget, () => {\n insertEditableText(widget, content);\n });\n};\n\nexport { resetClipboard, type, clear, copy, cut, paste, type TypeOptions };\n"]}
@@ -1,10 +1,5 @@
1
1
  import * as Gtk from "@gtkx/gi/gtk";
2
- type WidgetValue = {
3
- now: number | null;
4
- min: number | null;
5
- max: number | null;
6
- text: string | null;
7
- };
2
+ type WidgetValueField = "now" | "min" | "max";
8
3
  type CheckedState = "checked" | "unchecked" | "mixed";
9
4
  /**
10
5
  * Returns a widget's own text by trying its label, text, and title getters in
@@ -12,14 +7,9 @@ type CheckedState = "checked" | "unchecked" | "mixed";
12
7
  *
13
8
  * @param widget The widget to read text from.
14
9
  */
15
- declare const getWidgetNodeText: (widget: Gtk.Widget) => string | null;
10
+ declare const getWidgetText: (widget: Gtk.Widget) => string | null;
11
+ declare const namingLabelText: (widget: Gtk.Widget) => string | null;
16
12
  declare const getWidgetLabelText: (widget: Gtk.Widget) => string | null;
17
- /**
18
- * Returns a widget's own text, or the space-joined text of its descendants when it has none of its
19
- * own, or null when neither produces a value.
20
- *
21
- * @param widget The widget whose subtree is read.
22
- */
23
13
  declare const getWidgetTextContent: (widget: Gtk.Widget) => string | null;
24
14
  declare const getWidgetAccessibleName: (widget: Gtk.Widget) => string | null;
25
15
  declare const getWidgetName: (widget: Gtk.Widget) => string | null;
@@ -36,25 +26,23 @@ declare const getWidgetPressedState: (widget: Gtk.Widget) => boolean | null;
36
26
  declare const getWidgetExpandedState: (widget: Gtk.Widget) => boolean | null;
37
27
  declare const getWidgetSelectedState: (widget: Gtk.Widget) => boolean | null;
38
28
  declare const getWidgetLevel: (widget: Gtk.Widget) => number | null;
39
- /**
40
- * Returns the accessible invalid state declared on a widget, or null when it declares none.
41
- *
42
- * @param widget The widget to read the state from.
43
- */
44
29
  declare const getWidgetInvalidState: (widget: Gtk.Widget) => Gtk.AccessibleInvalidState | null;
45
- /**
46
- * Returns the widgets a widget's accessible error-message relation points at, or null when it
47
- * declares none.
48
- *
49
- * @param widget The widget to read the relation from.
50
- */
51
30
  declare const getWidgetErrorMessage: (widget: Gtk.Widget) => Gtk.Widget[] | null;
52
31
  declare const getWidgetBusyState: (widget: Gtk.Widget) => boolean | null;
53
32
  declare const getWidgetDescription: (widget: Gtk.Widget) => string | null;
54
- declare const getWidgetValue: (widget: Gtk.Widget) => WidgetValue;
33
+ declare const getWidgetValueNow: (widget: Gtk.Widget) => number | null;
34
+ declare const getWidgetValueText: (widget: Gtk.Widget) => string | null;
35
+ declare const isWidgetValueMatch: (widget: Gtk.Widget, field: WidgetValueField, expected: number) => boolean;
55
36
  declare const getWidgetOwnLabel: (widget: Gtk.Widget) => string | null;
56
37
  declare const getWidgetLabelledByText: (widget: Gtk.Widget) => string | null;
38
+ declare const getWidgetExternalLabelText: (widget: Gtk.Widget) => string | null;
57
39
  declare const getWidgetDescribedByText: (widget: Gtk.Widget) => string | null;
40
+ /**
41
+ * Returns whether a widget is excluded from the accessibility tree, because it or one of its
42
+ * ancestors is marked hidden.
43
+ *
44
+ * @param widget The widget to test.
45
+ */
58
46
  declare const isInaccessible: (widget: Gtk.Widget) => boolean;
59
- 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, type CheckedState, type WidgetValue, };
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, };
60
48
  //# 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":"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"}
1
+ {"version":3,"file":"widget-accessible-properties.d.ts","sourceRoot":"","sources":["../src/widget-accessible-properties.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  import * as Gtk from "@gtkx/gi/gtk";
2
- import { getAccessibleMetadata } from "@gtkx/react/internal";
2
+ import { isAccessibleNumberMatch, readAccessibleBooleanProperty, readAccessibleFlag, readAccessibleInt, readAccessibleRelation, readAccessibleState, readAccessibleNumber as readNativeNumber, readAccessibleString as readNativeString, } from "./accessible-native.js";
3
3
  import { EDITABLE_ROLES, isEditable, readEditableText } from "./editable.js";
4
- import { descendants } from "./traversal.js";
5
- const DEFAULT_TEXT_GETTERS = ["getLabel", "getText", "getTitle"];
4
+ import { isNameFromAuthor, isNameProhibited } from "./role-naming.js";
5
+ import { children, descendants, relationCandidates } from "./traversal.js";
6
+ import { callBooleanGetter, callStringGetter, getCallableMethod } from "./widget-getters.js";
7
+ const EDITABLE_TEXT_GETTER = "getText";
8
+ const DEFAULT_TEXT_GETTERS = ["getLabel", EDITABLE_TEXT_GETTER, "getTitle"];
6
9
  const SELECTABLE_ROLES = new Set([
7
10
  Gtk.AccessibleRole.ROW,
8
11
  Gtk.AccessibleRole.LIST_ITEM,
@@ -10,40 +13,43 @@ const SELECTABLE_ROLES = new Set([
10
13
  Gtk.AccessibleRole.OPTION,
11
14
  Gtk.AccessibleRole.TREE_ITEM,
12
15
  ]);
13
- const callStringGetter = (widget, method) => {
14
- const fn = Reflect.get(widget, method);
15
- if (typeof fn !== "function") {
16
- return null;
17
- }
18
- const value = fn.call(widget);
19
- return value ?? null;
20
- };
21
- const readAccessibleString = (widget, key) => {
22
- const value = getAccessibleMetadata(widget, key);
23
- return typeof value === "string" ? value : null;
24
- };
25
- const readAccessibleNumber = (widget, key) => {
26
- const value = getAccessibleMetadata(widget, key);
27
- return typeof value === "number" ? value : null;
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);
16
+ const PRESSED_BY_TRISTATE = new Map([
17
+ [Gtk.AccessibleTristate.FALSE, false],
18
+ [Gtk.AccessibleTristate.TRUE, true],
19
+ ]);
20
+ const CHECKED_BY_TRISTATE = new Map([
21
+ [Gtk.AccessibleTristate.FALSE, "unchecked"],
22
+ [Gtk.AccessibleTristate.TRUE, "checked"],
23
+ [Gtk.AccessibleTristate.MIXED, "mixed"],
24
+ ]);
25
+ const VALUE_PROPERTIES = {
26
+ now: Gtk.AccessibleProperty.VALUE_NOW,
27
+ min: Gtk.AccessibleProperty.VALUE_MIN,
28
+ max: Gtk.AccessibleProperty.VALUE_MAX,
29
+ };
30
+ const readAccessibleString = (widget, property) => readNativeString(widget, property);
31
+ const readAccessibleNumber = (widget, property) => readNativeNumber(widget, property);
32
+ const readAccessibleWidgets = (widget, relation) => {
33
+ const targets = readAccessibleRelation(widget, relation, relationCandidates(widget));
34
+ const widgets = targets.filter((target) => target instanceof Gtk.Widget);
35
35
  return widgets.length > 0 ? widgets : null;
36
36
  };
37
- const readAccessibleBoolean = (widget, key) => {
38
- const value = getAccessibleMetadata(widget, key);
39
- return typeof value === "boolean" ? value : null;
40
- };
37
+ const readAccessibleBoolean = (widget, state) => readAccessibleFlag(widget, state);
41
38
  const getLabelText = (widget) => {
42
39
  if (widget instanceof Gtk.Label) {
43
40
  return widget.getLabel();
44
41
  }
45
- if (widget instanceof Gtk.Inscription) {
46
- return widget.getText() ?? null;
42
+ return readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);
43
+ };
44
+ const stripMnemonic = (text) => text.replaceAll(/_(.)/g, "$1");
45
+ const isUnderlineUsed = (widget) => callBooleanGetter(widget, "getUseUnderline") ?? false;
46
+ const readNamingText = (widget, getter, value) => getter !== EDITABLE_TEXT_GETTER && isUnderlineUsed(widget) ? stripMnemonic(value) : value;
47
+ const readFirstText = (widget, getters) => {
48
+ for (const getter of getters) {
49
+ const value = callStringGetter(widget, getter);
50
+ if (value) {
51
+ return readNamingText(widget, getter, value);
52
+ }
47
53
  }
48
54
  return null;
49
55
  };
@@ -53,22 +59,13 @@ const getLabelText = (widget) => {
53
59
  *
54
60
  * @param widget The widget to read text from.
55
61
  */
56
- const getWidgetNodeText = (widget) => {
57
- for (const getter of DEFAULT_TEXT_GETTERS) {
58
- const value = callStringGetter(widget, getter);
59
- if (value) {
60
- return value;
61
- }
62
- }
63
- return null;
64
- };
65
- const stripMnemonic = (text) => text.replaceAll(/_(.)/g, "$1");
62
+ const getWidgetText = (widget) => readFirstText(widget, DEFAULT_TEXT_GETTERS);
66
63
  const namingLabelText = (widget) => {
67
64
  const text = getLabelText(widget);
68
65
  if (text === null) {
69
66
  return null;
70
67
  }
71
- return widget instanceof Gtk.Label && widget.getUseUnderline() ? stripMnemonic(text) : text;
68
+ return isUnderlineUsed(widget) ? stripMnemonic(text) : text;
72
69
  };
73
70
  const isNamingLabelRole = (role, shouldIncludePresentation) => role === Gtk.AccessibleRole.LABEL ||
74
71
  (shouldIncludePresentation && role === Gtk.AccessibleRole.PRESENTATION);
@@ -90,37 +87,24 @@ const getWidgetLabelText = (widget) => {
90
87
  if (widget.getAccessibleRole() !== Gtk.AccessibleRole.LABEL) {
91
88
  return null;
92
89
  }
93
- return getLabelText(widget);
94
- };
95
- const getChildren = function* (widget) {
96
- let child = widget.getFirstChild();
97
- while (child) {
98
- yield child;
99
- child = child.getNextSibling();
100
- }
90
+ return namingLabelText(widget);
101
91
  };
102
92
  const textContentParts = (widget) => {
103
- const own = getWidgetNodeText(widget);
93
+ const own = getWidgetText(widget);
104
94
  if (own !== null) {
105
95
  return [own];
106
96
  }
107
- return [...getChildren(widget)].flatMap((child) => textContentParts(child));
97
+ return [...children(widget)].flatMap((child) => textContentParts(child));
108
98
  };
109
- /**
110
- * Returns a widget's own text, or the space-joined text of its descendants when it has none of its
111
- * own, or null when neither produces a value.
112
- *
113
- * @param widget The widget whose subtree is read.
114
- */
115
99
  const getWidgetTextContent = (widget) => {
116
100
  const parts = textContentParts(widget);
117
101
  return parts.length > 0 ? parts.join(" ") : null;
118
102
  };
119
- const isComboBoxFaceCandidate = (widget) => !(widget instanceof Gtk.Popover) && widget.getChildVisible();
120
- const comboBoxChildFaceText = (child) => isComboBoxFaceCandidate(child) ? getWidgetLabelText(child) ?? comboBoxFaceText(child) : null;
121
- const comboBoxFaceText = (widget) => {
122
- for (const child of getChildren(widget)) {
123
- const text = comboBoxChildFaceText(child);
103
+ const isDropDownFaceCandidate = (widget) => !(widget instanceof Gtk.Popover) && widget.getChildVisible();
104
+ const dropDownChildFaceText = (child) => isDropDownFaceCandidate(child) ? getWidgetLabelText(child) ?? dropDownFaceText(child) : null;
105
+ const dropDownFaceText = (widget) => {
106
+ for (const child of children(widget)) {
107
+ const text = dropDownChildFaceText(child);
124
108
  if (text !== null) {
125
109
  return text;
126
110
  }
@@ -134,49 +118,54 @@ const tabPanelTitle = (widget) => {
134
118
  }
135
119
  return null;
136
120
  };
121
+ const nameFromAuthor = (widget) => getWidgetLabelledByText(widget) ?? readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);
122
+ const nameFromContent = (widget) => {
123
+ const ownText = getWidgetText(widget);
124
+ if (ownText) {
125
+ return ownText;
126
+ }
127
+ const childLabels = collectLabels(widget);
128
+ return childLabels.length > 0 ? childLabels.join(" ") : null;
129
+ };
137
130
  const getWidgetAccessibleName = (widget) => {
138
131
  const role = widget.getAccessibleRole();
132
+ if (isNameProhibited(role)) {
133
+ return null;
134
+ }
139
135
  if (role === Gtk.AccessibleRole.TAB_PANEL) {
140
136
  return tabPanelTitle(widget);
141
137
  }
142
- const labelledByText = getWidgetLabelledByText(widget);
143
- if (labelledByText) {
144
- return labelledByText;
138
+ const authored = isNameFromAuthor(role) ? nameFromAuthor(widget) : null;
139
+ if (authored) {
140
+ return authored;
145
141
  }
146
- const accessibleLabel = readAccessibleString(widget, "accessibleLabel");
147
- if (accessibleLabel) {
148
- return accessibleLabel;
149
- }
150
- const ownText = getWidgetNodeText(widget);
151
- if (ownText) {
152
- return ownText;
153
- }
154
- const childLabels = collectLabels(widget);
155
- if (childLabels.length > 0) {
156
- return childLabels.join(" ");
157
- }
158
- return callStringGetter(widget, "getTooltipText");
142
+ return nameFromContent(widget) ?? callStringGetter(widget, "getTooltipText");
159
143
  };
160
144
  const getWidgetName = (widget) => {
161
145
  return widget.getName();
162
146
  };
147
+ const nonEmptyText = (text) => (text === null || text === "" ? null : text);
148
+ const readPlaceholderProperty = (widget) => {
149
+ const value = Reflect.get(widget, "placeholderText");
150
+ return typeof value === "string" ? nonEmptyText(value) : null;
151
+ };
163
152
  const getWidgetPlaceholderText = (widget) => {
164
- if (!EDITABLE_ROLES.has(widget.getAccessibleRole()) || !(widget instanceof Gtk.Editable)) {
153
+ if (!EDITABLE_ROLES.has(widget.getAccessibleRole())) {
165
154
  return null;
166
155
  }
167
- const fromGetter = callStringGetter(widget, "getPlaceholderText");
168
- if (fromGetter !== null) {
169
- return fromGetter;
170
- }
171
- const fromAccessor = Reflect.get(widget, "placeholderText");
172
- return typeof fromAccessor === "string" && fromAccessor !== "" ? fromAccessor : null;
156
+ return (nonEmptyText(callStringGetter(widget, "getPlaceholderText")) ??
157
+ readPlaceholderProperty(widget) ??
158
+ nonEmptyText(readAccessibleString(widget, Gtk.AccessibleProperty.PLACEHOLDER)));
173
159
  };
160
+ const comboBoxDisplayValue = (widget) => widget instanceof Gtk.DropDown
161
+ ? (dropDownFaceText(widget) ?? getWidgetValueText(widget))
162
+ : (getWidgetValueText(widget) ?? dropDownFaceText(widget));
174
163
  const getWidgetDisplayValue = (widget) => {
175
164
  if (EDITABLE_ROLES.has(widget.getAccessibleRole()) && isEditable(widget)) {
176
165
  return readEditableText(widget);
177
166
  }
178
167
  if (widget.getAccessibleRole() === Gtk.AccessibleRole.COMBO_BOX) {
179
- return comboBoxFaceText(widget);
168
+ return comboBoxDisplayValue(widget);
180
169
  }
181
170
  return null;
182
171
  };
@@ -196,59 +185,58 @@ const hasZeroOpacityAncestor = (widget) => {
196
185
  return false;
197
186
  };
198
187
  const isWidgetVisible = (widget) => widget.isVisible() && !hasZeroOpacityAncestor(widget);
199
- const getWidgetRequiredState = (widget) => readAccessibleBoolean(widget, "accessibleRequired");
188
+ const getWidgetRequiredState = (widget) => readAccessibleBooleanProperty(widget, Gtk.AccessibleProperty.REQUIRED);
200
189
  const readTextViewSelection = (view) => {
201
190
  const buffer = view.getBuffer();
202
191
  const [hasSelection, start, end] = buffer.getSelectionBounds();
203
192
  return hasSelection ? buffer.getText(start, end, true) : null;
204
193
  };
205
- const readEditableSelection = (editable) => {
206
- const [hasSelection, start, end] = editable.getSelectionBounds();
207
- return hasSelection ? editable.getChars(start, end) : null;
208
- };
209
- const getWidgetSelection = (widget) => {
210
- if (widget instanceof Gtk.TextView) {
211
- return readTextViewSelection(widget);
194
+ const sliceSelectedText = (widget, start, end) => {
195
+ const chars = getCallableMethod(widget, "getChars");
196
+ if (chars) {
197
+ return chars(start, end) ?? null;
212
198
  }
213
- if (widget instanceof Gtk.Editable) {
214
- return readEditableSelection(widget);
199
+ const text = callStringGetter(widget, "getText");
200
+ /* eslint-disable-next-line @typescript-eslint/no-misused-spread -- bounds are code point offsets */
201
+ return text === null ? null : [...text].slice(start, end).join("");
202
+ };
203
+ const readBoundedSelection = (widget) => {
204
+ const bounds = getCallableMethod(widget, "getSelectionBounds");
205
+ if (!bounds) {
206
+ return null;
215
207
  }
216
- return null;
208
+ const [hasSelection, start, end] = bounds();
209
+ return hasSelection ? sliceSelectedText(widget, start, end) : null;
217
210
  };
211
+ const getWidgetSelection = (widget) => widget instanceof Gtk.TextView ? readTextViewSelection(widget) : readBoundedSelection(widget);
218
212
  const checkedFromActive = (isActive) => (isActive ? "checked" : "unchecked");
219
- const isCheckableToggle = (widget) => widget instanceof Gtk.Switch ||
220
- (widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO);
213
+ const isRadioToggle = (widget) => widget instanceof Gtk.ToggleButton && widget.getAccessibleRole() === Gtk.AccessibleRole.RADIO;
221
214
  const getWidgetCheckedState = (widget) => {
222
- if (widget instanceof Gtk.CheckButton) {
223
- return widget.getInconsistent() ? "mixed" : checkedFromActive(widget.getActive());
224
- }
225
- if (isCheckableToggle(widget)) {
226
- return checkedFromActive(Reflect.get(widget, "active") === true);
215
+ const tristate = readAccessibleState(widget, Gtk.AccessibleState.CHECKED);
216
+ const state = tristate === null ? undefined : CHECKED_BY_TRISTATE.get(tristate);
217
+ if (state !== undefined) {
218
+ return state;
227
219
  }
228
- return null;
220
+ return isRadioToggle(widget) ? checkedFromActive(widget.getActive()) : null;
229
221
  };
230
222
  const isWidgetChecked = (widget) => {
231
223
  const state = getWidgetCheckedState(widget);
232
224
  return state === null || state === "mixed" ? null : state === "checked";
233
225
  };
234
226
  const getWidgetPressedState = (widget) => {
235
- if (widget instanceof Gtk.ToggleButton) {
236
- return widget.getActive();
237
- }
238
- return null;
227
+ const tristate = readAccessibleState(widget, Gtk.AccessibleState.PRESSED);
228
+ return tristate === null ? null : PRESSED_BY_TRISTATE.get(tristate) ?? null;
239
229
  };
240
230
  const getWidgetExpandedState = (widget) => {
241
- if (widget instanceof Gtk.Expander) {
242
- return widget.getExpanded();
243
- }
244
231
  if (widget instanceof Gtk.TreeExpander) {
245
232
  return widget.getListRow()?.getExpanded() ?? null;
246
233
  }
247
- return null;
234
+ return readAccessibleBoolean(widget, Gtk.AccessibleState.EXPANDED);
248
235
  };
249
236
  const getWidgetSelectedState = (widget) => {
250
- if (widget instanceof Gtk.ListBoxRow || widget instanceof Gtk.FlowBoxChild) {
251
- return widget.isSelected();
237
+ const selected = readAccessibleBoolean(widget, Gtk.AccessibleState.SELECTED);
238
+ if (selected !== null) {
239
+ return selected;
252
240
  }
253
241
  if (SELECTABLE_ROLES.has(widget.getAccessibleRole())) {
254
242
  return (widget.getStateFlags() & Gtk.StateFlags.SELECTED) !== 0;
@@ -256,124 +244,81 @@ const getWidgetSelectedState = (widget) => {
256
244
  return null;
257
245
  };
258
246
  const getWidgetLevel = (widget) => {
259
- return readAccessibleNumber(widget, "accessibleLevel");
247
+ return readAccessibleInt(widget, Gtk.AccessibleProperty.LEVEL);
260
248
  };
261
- /**
262
- * Returns the accessible invalid state declared on a widget, or null when it declares none.
263
- *
264
- * @param widget The widget to read the state from.
265
- */
266
249
  const getWidgetInvalidState = (widget) => {
267
- const value = readAccessibleNumber(widget, "accessibleInvalid");
250
+ const value = readAccessibleState(widget, Gtk.AccessibleState.INVALID);
268
251
  return value ?? null;
269
252
  };
270
- /**
271
- * Returns the widgets a widget's accessible error-message relation points at, or null when it
272
- * declares none.
273
- *
274
- * @param widget The widget to read the relation from.
275
- */
276
- const getWidgetErrorMessage = (widget) => readAccessibleWidgets(widget, "accessibleErrorMessage");
253
+ const getWidgetErrorMessage = (widget) => readAccessibleWidgets(widget, Gtk.AccessibleRelation.ERROR_MESSAGE);
277
254
  const getWidgetBusyState = (widget) => {
278
- return readAccessibleBoolean(widget, "accessibleBusy");
255
+ return readAccessibleBoolean(widget, Gtk.AccessibleState.BUSY);
279
256
  };
280
257
  const getWidgetDescription = (widget) => {
281
- return readAccessibleString(widget, "accessibleDescription");
282
- };
283
- const adjustmentValue = (adjustment) => ({
284
- now: adjustment.getValue(),
285
- min: adjustment.getLower(),
286
- max: adjustment.getUpper(),
287
- });
288
- const adjustmentWidgetValue = (widget) => {
289
- if (widget instanceof Gtk.Range) {
290
- return adjustmentValue(widget.getAdjustment());
291
- }
292
- if (widget instanceof Gtk.Scrollbar) {
293
- return adjustmentValue(widget.getAdjustment());
294
- }
295
- if (widget instanceof Gtk.SpinButton) {
296
- return adjustmentValue(widget.getAdjustment());
297
- }
298
- if (widget instanceof Gtk.ScaleButton) {
299
- return adjustmentValue(widget.getAdjustment());
300
- }
301
- return null;
302
- };
303
- const getWidgetLiveValue = (widget) => {
304
- const adjustmentBased = adjustmentWidgetValue(widget);
305
- if (adjustmentBased) {
306
- return adjustmentBased;
307
- }
308
- if (widget instanceof Gtk.LevelBar) {
309
- return { now: widget.getValue(), min: widget.getMinValue(), max: widget.getMaxValue() };
310
- }
311
- if (widget instanceof Gtk.ProgressBar) {
312
- return { now: widget.getFraction(), min: 0, max: 1 };
313
- }
314
- return null;
315
- };
316
- const getWidgetValue = (widget) => {
317
- const text = readAccessibleString(widget, "accessibleValueText");
318
- const live = getWidgetLiveValue(widget);
319
- if (live) {
320
- return { ...live, text };
321
- }
322
- return {
323
- now: readAccessibleNumber(widget, "accessibleValueNow"),
324
- min: readAccessibleNumber(widget, "accessibleValueMin"),
325
- max: readAccessibleNumber(widget, "accessibleValueMax"),
326
- text,
327
- };
258
+ return readAccessibleString(widget, Gtk.AccessibleProperty.DESCRIPTION);
328
259
  };
260
+ const getWidgetValueNow = (widget) => readAccessibleNumber(widget, Gtk.AccessibleProperty.VALUE_NOW);
261
+ const getWidgetValueText = (widget) => readAccessibleString(widget, Gtk.AccessibleProperty.VALUE_TEXT);
262
+ const isWidgetValueMatch = (widget, field, expected) => isAccessibleNumberMatch(widget, VALUE_PROPERTIES[field], expected);
329
263
  const getWidgetOwnLabel = (widget) => {
330
- return readAccessibleString(widget, "accessibleLabel");
264
+ return readAccessibleString(widget, Gtk.AccessibleProperty.LABEL);
331
265
  };
332
266
  const collectAccessibleNames = (targets) => {
333
267
  const texts = [];
334
268
  for (const target of targets) {
335
269
  const text = getWidgetAccessibleName(target);
336
- if (text !== null) {
270
+ if (text) {
337
271
  texts.push(text);
338
272
  }
339
273
  }
340
274
  return texts;
341
275
  };
276
+ const isSelfLabelling = (widget, targets) => {
277
+ const own = new Set(descendants(widget));
278
+ return targets.every((target) => own.has(target));
279
+ };
342
280
  const getWidgetLabelledByText = (widget) => {
343
- const targets = readAccessibleWidgets(widget, "accessibleLabelledBy");
281
+ const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);
344
282
  if (targets === null) {
345
283
  return null;
346
284
  }
347
285
  const texts = collectAccessibleNames(targets);
348
286
  return texts.length > 0 ? texts.join(" ") : null;
349
287
  };
350
- const isTooltipUsedAsName = (widget) => readAccessibleString(widget, "accessibleLabel") === null &&
351
- getWidgetNodeText(widget) === null &&
288
+ const getWidgetExternalLabelText = (widget) => {
289
+ const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.LABELLED_BY);
290
+ return targets === null || isSelfLabelling(widget, targets) ? null : getWidgetLabelledByText(widget);
291
+ };
292
+ const isTooltipUsedAsName = (widget) => readAccessibleString(widget, Gtk.AccessibleProperty.LABEL) === null &&
293
+ getWidgetText(widget) === null &&
352
294
  collectLabels(widget).length === 0;
353
295
  const getWidgetDescribedByText = (widget) => {
354
- const targets = readAccessibleWidgets(widget, "accessibleDescribedBy");
296
+ const targets = readAccessibleWidgets(widget, Gtk.AccessibleRelation.DESCRIBED_BY);
355
297
  const texts = targets === null ? [] : collectAccessibleNames(targets);
356
298
  if (texts.length > 0) {
357
299
  return texts.join(" ");
358
300
  }
359
- const description = readAccessibleString(widget, "accessibleDescription");
301
+ const description = readAccessibleString(widget, Gtk.AccessibleProperty.DESCRIPTION);
360
302
  if (description !== null) {
361
303
  return description;
362
304
  }
363
305
  return isTooltipUsedAsName(widget) ? null : callStringGetter(widget, "getTooltipText");
364
306
  };
307
+ /**
308
+ * Returns whether a widget is excluded from the accessibility tree, because it or one of its
309
+ * ancestors is marked hidden.
310
+ *
311
+ * @param widget The widget to test.
312
+ */
365
313
  const isInaccessible = (widget) => {
366
314
  let current = widget;
367
315
  while (current) {
368
- if (!current.getVisible()) {
369
- return true;
370
- }
371
- if (readAccessibleBoolean(current, "accessibleHidden") === true) {
316
+ if (readAccessibleBoolean(current, Gtk.AccessibleState.HIDDEN) === true) {
372
317
  return true;
373
318
  }
374
319
  current = current.getParent();
375
320
  }
376
321
  return false;
377
322
  };
378
- 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, };
323
+ 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, };
379
324
  //# sourceMappingURL=widget-accessible-properties.js.map