@flighthq/accessibility 0.3.1-next.975.01aea94 → 0.4.0-edge.1908.751021c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/accessibility.d.ts +5 -0
- package/dist/accessibility.d.ts.map +1 -1
- package/dist/accessibility.js +51 -8
- package/dist/accessibility.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/accessibility.test.ts +114 -31
package/dist/accessibility.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import type { AccessibilityBackend, AccessibilityLiveness, AccessibilityNode } from '@flighthq/types/contract';
|
|
2
|
+
import type { BackendExplanation } from '@flighthq/types/contract';
|
|
2
3
|
export declare function announceAccessibility(message: string, liveness?: AccessibilityLiveness): void;
|
|
3
4
|
export declare function clearAccessibilityTree(): void;
|
|
4
5
|
export declare function createWebAccessibilityBackend(container?: HTMLElement): AccessibilityBackend;
|
|
6
|
+
export declare function explainAccessibilityBackend(): BackendExplanation;
|
|
5
7
|
export declare function getAccessibilityBackend(): AccessibilityBackend;
|
|
8
|
+
export declare function installAccessibilityHostBackend(backend: AccessibilityBackend): void;
|
|
9
|
+
export declare function observeAccessibilityHostResult(operation: string, succeeded: boolean): void;
|
|
6
10
|
export declare function removeAccessibilityNode(id: string): void;
|
|
11
|
+
export declare function resetAccessibilityBackendForTest(): void;
|
|
7
12
|
export declare function setAccessibilityBackend(backend: AccessibilityBackend | null): void;
|
|
8
13
|
export declare function setAccessibilityFocus(id: string): boolean;
|
|
9
14
|
export declare function setAccessibilityNode(node: Readonly<AccessibilityNode>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessibility.d.ts","sourceRoot":"","sources":["../src/accessibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EAElB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"accessibility.d.ts","sourceRoot":"","sources":["../src/accessibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAKnE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,qBAAgC,GAAG,IAAI,CAEvG;AAID,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAQD,wBAAgB,6BAA6B,CAAC,SAAS,CAAC,EAAE,WAAW,GAAG,oBAAoB,CAgE3F;AAED,wBAAgB,2BAA2B,IAAI,kBAAkB,CAahE;AAGD,wBAAgB,uBAAuB,IAAI,oBAAoB,CAE9D;AAED,wBAAgB,+BAA+B,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAMnF;AAED,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAK1F;AAGD,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAExD;AAED,wBAAgB,gCAAgC,IAAI,IAAI,CAKvD;AAGD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAElF;AAID,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEzD;AAID,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAE5E"}
|
package/dist/accessibility.js
CHANGED
|
@@ -87,20 +87,51 @@ export function createWebAccessibilityBackend(container) {
|
|
|
87
87
|
},
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
export function explainAccessibilityBackend() {
|
|
91
|
+
if (_custom !== null) {
|
|
92
|
+
return { conflict: _hostConflict, layer: 'custom', operation: null, viability: 'unobserved' };
|
|
93
|
+
}
|
|
94
|
+
if (_host !== null) {
|
|
95
|
+
return {
|
|
96
|
+
conflict: _hostConflict,
|
|
97
|
+
layer: 'host',
|
|
98
|
+
operation: _hostObservation !== null ? _hostObservation.operation : null,
|
|
99
|
+
viability: _hostObservation !== null ? _hostObservation.viability : 'unobserved',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
return { conflict: false, layer: 'host-not-enabled', operation: null, viability: 'unobserved' };
|
|
103
|
+
}
|
|
104
|
+
// The active accessibility backend. Precedence: custom > host > sentinel.
|
|
92
105
|
export function getAccessibilityBackend() {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
106
|
+
return _custom ?? _host ?? _sentinel;
|
|
107
|
+
}
|
|
108
|
+
export function installAccessibilityHostBackend(backend) {
|
|
109
|
+
if (_host !== null) {
|
|
110
|
+
if (_host !== backend)
|
|
111
|
+
_hostConflict = true;
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
_host = backend;
|
|
115
|
+
}
|
|
116
|
+
export function observeAccessibilityHostResult(operation, succeeded) {
|
|
117
|
+
_hostObservation = {
|
|
118
|
+
operation,
|
|
119
|
+
viability: succeeded ? 'available' : 'runtime-api-unavailable',
|
|
120
|
+
};
|
|
96
121
|
}
|
|
97
122
|
// Removes a node and its entire descendant subtree from the mirrored tree.
|
|
98
123
|
export function removeAccessibilityNode(id) {
|
|
99
124
|
getAccessibilityBackend().removeNode(id);
|
|
100
125
|
}
|
|
101
|
-
|
|
126
|
+
export function resetAccessibilityBackendForTest() {
|
|
127
|
+
_custom = null;
|
|
128
|
+
_host = null;
|
|
129
|
+
_hostConflict = false;
|
|
130
|
+
_hostObservation = null;
|
|
131
|
+
}
|
|
132
|
+
// Installs a custom accessibility backend; pass null to revert to precedence fallback.
|
|
102
133
|
export function setAccessibilityBackend(backend) {
|
|
103
|
-
|
|
134
|
+
_custom = backend;
|
|
104
135
|
}
|
|
105
136
|
// Moves platform focus to the published node. Returns false when the node is missing or the platform
|
|
106
137
|
// could not focus it — a sentinel, never a throw.
|
|
@@ -112,7 +143,19 @@ export function setAccessibilityFocus(id) {
|
|
|
112
143
|
export function setAccessibilityNode(node) {
|
|
113
144
|
getAccessibilityBackend().setNode(node);
|
|
114
145
|
}
|
|
115
|
-
let
|
|
146
|
+
let _custom = null;
|
|
147
|
+
let _host = null;
|
|
148
|
+
let _hostConflict = false;
|
|
149
|
+
let _hostObservation = null;
|
|
150
|
+
const _sentinel = {
|
|
151
|
+
setNode() { },
|
|
152
|
+
removeNode() { },
|
|
153
|
+
clear() { },
|
|
154
|
+
setFocus() {
|
|
155
|
+
return false;
|
|
156
|
+
},
|
|
157
|
+
announce() { },
|
|
158
|
+
};
|
|
116
159
|
const _TEXT_NODE = 3;
|
|
117
160
|
// Reflects a node's semantics onto its overlay element: role, the label/description/value text and
|
|
118
161
|
// their ARIA attributes, focusability, and the mapped state attributes. Attributes are cleared when
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessibility.js","sourceRoot":"","sources":["../src/accessibility.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accessibility.js","sourceRoot":"","sources":["../src/accessibility.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { announceAccessibility, clearAccessibilityTree, removeAccessibilityNode, setAccessibilityFocus, setAccessibilityNode, } from './contract';
|
|
1
|
+
export { explainAccessibilityBackend, announceAccessibility, clearAccessibilityTree, removeAccessibilityNode, setAccessibilityFocus, setAccessibilityNode, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { announceAccessibility, clearAccessibilityTree, removeAccessibilityNode, setAccessibilityFocus, setAccessibilityNode, } from './contract';
|
|
1
|
+
export { explainAccessibilityBackend, announceAccessibility, clearAccessibilityTree, removeAccessibilityNode, setAccessibilityFocus, setAccessibilityNode, } from './contract';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/accessibility",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0-edge.1908.751021c",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/types": "0.
|
|
41
|
+
"@flighthq/types": "0.4.0-edge.1908.751021c"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"typescript": "^5.3.0"
|
|
@@ -10,6 +10,10 @@ import {
|
|
|
10
10
|
setAccessibilityBackend,
|
|
11
11
|
setAccessibilityFocus,
|
|
12
12
|
setAccessibilityNode,
|
|
13
|
+
explainAccessibilityBackend,
|
|
14
|
+
installAccessibilityHostBackend,
|
|
15
|
+
observeAccessibilityHostResult,
|
|
16
|
+
resetAccessibilityBackendForTest,
|
|
13
17
|
} from './accessibility';
|
|
14
18
|
|
|
15
19
|
afterEach(() => {
|
|
@@ -187,6 +191,34 @@ describe('createWebAccessibilityBackend', () => {
|
|
|
187
191
|
});
|
|
188
192
|
});
|
|
189
193
|
|
|
194
|
+
describe('explainAccessibilityBackend', () => {
|
|
195
|
+
afterEach(() => resetAccessibilityBackendForTest());
|
|
196
|
+
|
|
197
|
+
it('reports host-not-enabled when no backend is installed', () => {
|
|
198
|
+
resetAccessibilityBackendForTest();
|
|
199
|
+
const explanation = explainAccessibilityBackend();
|
|
200
|
+
expect(explanation.layer).toBe('host-not-enabled');
|
|
201
|
+
expect(explanation.conflict).toBe(false);
|
|
202
|
+
expect(explanation.viability).toBe('unobserved');
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('reports custom layer when a custom backend is set', () => {
|
|
206
|
+
setAccessibilityBackend(getAccessibilityBackend());
|
|
207
|
+
expect(explainAccessibilityBackend().layer).toBe('custom');
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
it('reports host layer when a host backend is installed', () => {
|
|
211
|
+
installAccessibilityHostBackend(getAccessibilityBackend());
|
|
212
|
+
expect(explainAccessibilityBackend().layer).toBe('host');
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it('reports conflict when two different host backends are installed', () => {
|
|
216
|
+
installAccessibilityHostBackend({ ...getAccessibilityBackend() });
|
|
217
|
+
installAccessibilityHostBackend({ ...getAccessibilityBackend() });
|
|
218
|
+
expect(explainAccessibilityBackend().conflict).toBe(true);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
|
|
190
222
|
describe('getAccessibilityBackend', () => {
|
|
191
223
|
it('lazily returns a stable web default', () => {
|
|
192
224
|
const first = getAccessibilityBackend();
|
|
@@ -200,48 +232,49 @@ describe('getAccessibilityBackend', () => {
|
|
|
200
232
|
});
|
|
201
233
|
});
|
|
202
234
|
|
|
203
|
-
describe('
|
|
204
|
-
|
|
205
|
-
const mock = createMockAccessibilityBackend();
|
|
206
|
-
setAccessibilityBackend(mock.backend);
|
|
207
|
-
removeAccessibilityNode('gone');
|
|
208
|
-
expect(mock.calls.removeNode).toEqual(['gone']);
|
|
209
|
-
});
|
|
210
|
-
});
|
|
235
|
+
describe('installAccessibilityHostBackend', () => {
|
|
236
|
+
afterEach(() => resetAccessibilityBackendForTest());
|
|
211
237
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
setAccessibilityNode(node('a', 'button', {}));
|
|
217
|
-
expect(mock.calls.setNode.length).toBe(1);
|
|
238
|
+
it('installs a host backend that getAccessibilityBackend returns', () => {
|
|
239
|
+
const backend = getAccessibilityBackend();
|
|
240
|
+
installAccessibilityHostBackend(backend);
|
|
241
|
+
expect(getAccessibilityBackend()).toBe(backend);
|
|
218
242
|
});
|
|
219
243
|
|
|
220
|
-
it('
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
244
|
+
it('is first-host-wins: a second different backend sets conflict', () => {
|
|
245
|
+
const first = { ...getAccessibilityBackend() };
|
|
246
|
+
const second = { ...getAccessibilityBackend() };
|
|
247
|
+
installAccessibilityHostBackend(first);
|
|
248
|
+
installAccessibilityHostBackend(second);
|
|
249
|
+
expect(getAccessibilityBackend()).toBe(first);
|
|
250
|
+
expect(explainAccessibilityBackend().conflict).toBe(true);
|
|
225
251
|
});
|
|
226
252
|
});
|
|
227
253
|
|
|
228
|
-
describe('
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
254
|
+
describe('observeAccessibilityHostResult', () => {
|
|
255
|
+
afterEach(() => resetAccessibilityBackendForTest());
|
|
256
|
+
|
|
257
|
+
it('records a successful observation', () => {
|
|
258
|
+
installAccessibilityHostBackend(getAccessibilityBackend());
|
|
259
|
+
observeAccessibilityHostResult('setNode', true);
|
|
260
|
+
const explanation = explainAccessibilityBackend();
|
|
261
|
+
expect(explanation.operation).toBe('setNode');
|
|
262
|
+
expect(explanation.viability).toBe('available');
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
it('records a failed observation', () => {
|
|
266
|
+
installAccessibilityHostBackend(getAccessibilityBackend());
|
|
267
|
+
observeAccessibilityHostResult('setNode', false);
|
|
268
|
+
expect(explainAccessibilityBackend().viability).toBe('runtime-api-unavailable');
|
|
235
269
|
});
|
|
236
270
|
});
|
|
237
271
|
|
|
238
|
-
describe('
|
|
239
|
-
it('dispatches the
|
|
272
|
+
describe('removeAccessibilityNode', () => {
|
|
273
|
+
it('dispatches the id to the backend', () => {
|
|
240
274
|
const mock = createMockAccessibilityBackend();
|
|
241
275
|
setAccessibilityBackend(mock.backend);
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
expect(mock.calls.setNode).toEqual([target]);
|
|
276
|
+
removeAccessibilityNode('gone');
|
|
277
|
+
expect(mock.calls.removeNode).toEqual(['gone']);
|
|
245
278
|
});
|
|
246
279
|
});
|
|
247
280
|
|
|
@@ -283,3 +316,53 @@ function createMockAccessibilityBackend(): { backend: AccessibilityBackend; call
|
|
|
283
316
|
};
|
|
284
317
|
return { backend, calls };
|
|
285
318
|
}
|
|
319
|
+
|
|
320
|
+
describe('resetAccessibilityBackendForTest', () => {
|
|
321
|
+
it('clears all backend slots', () => {
|
|
322
|
+
setAccessibilityBackend(getAccessibilityBackend());
|
|
323
|
+
installAccessibilityHostBackend(getAccessibilityBackend());
|
|
324
|
+
observeAccessibilityHostResult('setNode', true);
|
|
325
|
+
resetAccessibilityBackendForTest();
|
|
326
|
+
expect(explainAccessibilityBackend().layer).toBe('host-not-enabled');
|
|
327
|
+
expect(explainAccessibilityBackend().conflict).toBe(false);
|
|
328
|
+
expect(explainAccessibilityBackend().viability).toBe('unobserved');
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
describe('setAccessibilityBackend', () => {
|
|
333
|
+
it('installs a backend that later commands dispatch through', () => {
|
|
334
|
+
const mock = createMockAccessibilityBackend();
|
|
335
|
+
setAccessibilityBackend(mock.backend);
|
|
336
|
+
setAccessibilityNode(node('a', 'button', {}));
|
|
337
|
+
expect(mock.calls.setNode.length).toBe(1);
|
|
338
|
+
});
|
|
339
|
+
|
|
340
|
+
it('reverts to the sentinel when passed null', () => {
|
|
341
|
+
const sentinel = getAccessibilityBackend();
|
|
342
|
+
const mock = createMockAccessibilityBackend();
|
|
343
|
+
setAccessibilityBackend(mock.backend);
|
|
344
|
+
expect(getAccessibilityBackend()).toBe(mock.backend);
|
|
345
|
+
setAccessibilityBackend(null);
|
|
346
|
+
expect(getAccessibilityBackend()).toBe(sentinel);
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
describe('setAccessibilityFocus', () => {
|
|
351
|
+
it('dispatches the id and returns the backend result', () => {
|
|
352
|
+
const mock = createMockAccessibilityBackend();
|
|
353
|
+
setAccessibilityBackend(mock.backend);
|
|
354
|
+
expect(setAccessibilityFocus('ok')).toBe(true);
|
|
355
|
+
expect(setAccessibilityFocus('nope')).toBe(false);
|
|
356
|
+
expect(mock.calls.setFocus).toEqual(['ok', 'nope']);
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
describe('setAccessibilityNode', () => {
|
|
361
|
+
it('dispatches the node to the backend', () => {
|
|
362
|
+
const mock = createMockAccessibilityBackend();
|
|
363
|
+
setAccessibilityBackend(mock.backend);
|
|
364
|
+
const target = node('a', 'button', { label: 'Go' });
|
|
365
|
+
setAccessibilityNode(target);
|
|
366
|
+
expect(mock.calls.setNode).toEqual([target]);
|
|
367
|
+
});
|
|
368
|
+
});
|