@spectrum-web-components/picker 0.35.0 → 0.35.1-rc.24
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/package.json +13 -13
- package/src/Picker.d.ts +32 -40
- package/src/Picker.dev.js +181 -187
- package/src/Picker.dev.js.map +3 -3
- package/src/Picker.js +44 -28
- package/src/Picker.js.map +3 -3
- package/src/picker.css.dev.js +1 -1
- package/src/picker.css.dev.js.map +1 -1
- package/src/picker.css.js +1 -1
- package/src/picker.css.js.map +1 -1
- package/sync/index.d.ts +4 -1
- package/sync/index.dev.js +1 -6
- package/sync/index.dev.js.map +2 -2
- package/sync/index.js +1 -1
- package/sync/index.js.map +3 -3
- package/test/index.js +241 -152
- package/test/index.js.map +2 -2
- package/test/picker-reparenting.test.js +13 -17
- package/test/picker-reparenting.test.js.map +2 -2
- package/test/picker-responsive.test.js +3 -2
- package/test/picker-responsive.test.js.map +2 -2
- package/test/picker.test.js +1 -1
- package/test/picker.test.js.map +2 -2
- package/custom-elements.json +0 -1764
package/test/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
import {
|
|
3
|
+
aTimeout,
|
|
3
4
|
elementUpdated,
|
|
4
5
|
expect,
|
|
5
6
|
fixture,
|
|
@@ -15,7 +16,6 @@ import {
|
|
|
15
16
|
arrowLeftEvent,
|
|
16
17
|
arrowRightEvent,
|
|
17
18
|
arrowUpEvent,
|
|
18
|
-
escapeEvent,
|
|
19
19
|
testForLitDevWarnings,
|
|
20
20
|
tEvent
|
|
21
21
|
} from "../../../test/testing-helpers.js";
|
|
@@ -32,21 +32,20 @@ import {
|
|
|
32
32
|
} from "../stories/picker.stories.js";
|
|
33
33
|
import { sendMouse } from "../../../test/plugins/browser.js";
|
|
34
34
|
import { ignoreResizeObserverLoopError } from "../../../test/testing-helpers.js";
|
|
35
|
-
import {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
} from "@spectrum-web-components/shared/src/platform.js";
|
|
35
|
+
import { isFirefox } from "@spectrum-web-components/shared/src/platform.js";
|
|
36
|
+
import "@spectrum-web-components/theme/sp-theme.js";
|
|
37
|
+
import "@spectrum-web-components/theme/src/themes.js";
|
|
39
38
|
ignoreResizeObserverLoopError(before, after);
|
|
40
|
-
const isMenuActiveElement = function() {
|
|
39
|
+
const isMenuActiveElement = function(el) {
|
|
41
40
|
var _a;
|
|
42
|
-
return ((_a =
|
|
41
|
+
return ((_a = el.shadowRoot.activeElement) == null ? void 0 : _a.localName) === "sp-menu";
|
|
43
42
|
};
|
|
44
43
|
export function runPickerTests() {
|
|
45
44
|
let el;
|
|
46
45
|
const pickerFixture = async () => {
|
|
47
46
|
const test = await fixture(
|
|
48
47
|
html`
|
|
49
|
-
<
|
|
48
|
+
<sp-theme scale="medium" color="light">
|
|
50
49
|
<sp-field-label for="picker">
|
|
51
50
|
Where do you live?
|
|
52
51
|
</sp-field-label>
|
|
@@ -64,7 +63,7 @@ export function runPickerTests() {
|
|
|
64
63
|
<sp-menu-item>Save Selection</sp-menu-item>
|
|
65
64
|
<sp-menu-item disabled>Make Work Path</sp-menu-item>
|
|
66
65
|
</sp-picker>
|
|
67
|
-
</
|
|
66
|
+
</sp-theme>
|
|
68
67
|
`
|
|
69
68
|
);
|
|
70
69
|
return test.querySelector("sp-picker");
|
|
@@ -91,6 +90,8 @@ export function runPickerTests() {
|
|
|
91
90
|
).to.not.be.null;
|
|
92
91
|
el2.value = "option-2";
|
|
93
92
|
await elementUpdated(el2);
|
|
93
|
+
await nextFrame();
|
|
94
|
+
await nextFrame();
|
|
94
95
|
snapshot = await a11ySnapshot({});
|
|
95
96
|
expect(
|
|
96
97
|
findAccessibilityNode(
|
|
@@ -121,6 +122,8 @@ export function runPickerTests() {
|
|
|
121
122
|
).to.not.be.null;
|
|
122
123
|
el2.value = "option-2";
|
|
123
124
|
await elementUpdated(el2);
|
|
125
|
+
await nextFrame();
|
|
126
|
+
await nextFrame();
|
|
124
127
|
snapshot = await a11ySnapshot({});
|
|
125
128
|
expect(
|
|
126
129
|
findAccessibilityNode(
|
|
@@ -151,6 +154,8 @@ export function runPickerTests() {
|
|
|
151
154
|
).to.not.be.null;
|
|
152
155
|
el2.value = "option-2";
|
|
153
156
|
await elementUpdated(el2);
|
|
157
|
+
await nextFrame();
|
|
158
|
+
await nextFrame();
|
|
154
159
|
snapshot = await a11ySnapshot({});
|
|
155
160
|
if (isFirefox()) {
|
|
156
161
|
expect(
|
|
@@ -176,13 +181,6 @@ export function runPickerTests() {
|
|
|
176
181
|
el = await pickerFixture();
|
|
177
182
|
await elementUpdated(el);
|
|
178
183
|
});
|
|
179
|
-
afterEach(async () => {
|
|
180
|
-
if (el.open) {
|
|
181
|
-
const closed = oneEvent(el, "sp-closed");
|
|
182
|
-
el.open = false;
|
|
183
|
-
await closed;
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
184
|
it("loads accessibly", async () => {
|
|
187
185
|
await expect(el).to.be.accessible();
|
|
188
186
|
});
|
|
@@ -194,7 +192,7 @@ export function runPickerTests() {
|
|
|
194
192
|
el.open = true;
|
|
195
193
|
await opened;
|
|
196
194
|
expect(el.open).to.be.true;
|
|
197
|
-
const accessibleCloseButton =
|
|
195
|
+
const accessibleCloseButton = el.shadowRoot.querySelector(
|
|
198
196
|
".visually-hidden button"
|
|
199
197
|
);
|
|
200
198
|
expect(accessibleCloseButton).to.have.attribute(
|
|
@@ -210,10 +208,13 @@ export function runPickerTests() {
|
|
|
210
208
|
expect(document.activeElement).to.eq(el);
|
|
211
209
|
});
|
|
212
210
|
it("accepts new selected item content", async () => {
|
|
211
|
+
await nextFrame();
|
|
212
|
+
await nextFrame();
|
|
213
213
|
const option2 = el.querySelector('[value="option-2"');
|
|
214
214
|
el.value = "option-2";
|
|
215
215
|
await elementUpdated(option2);
|
|
216
216
|
await elementUpdated(el);
|
|
217
|
+
await aTimeout(150);
|
|
217
218
|
expect(el.value).to.equal("option-2");
|
|
218
219
|
expect((el.button.textContent || "").trim()).to.include(
|
|
219
220
|
"Select Inverse"
|
|
@@ -234,9 +235,11 @@ export function runPickerTests() {
|
|
|
234
235
|
expect((el.button.textContent || "").trim()).to.include(newLabel2);
|
|
235
236
|
});
|
|
236
237
|
it("accepts new selected item content when open", async () => {
|
|
238
|
+
await nextFrame();
|
|
237
239
|
const option2 = el.querySelector('[value="option-2"');
|
|
238
240
|
el.value = "option-2";
|
|
239
241
|
await elementUpdated(el);
|
|
242
|
+
await aTimeout(150);
|
|
240
243
|
expect(el.value).to.equal("option-2");
|
|
241
244
|
expect((el.button.textContent || "").trim()).to.include(
|
|
242
245
|
"Select Inverse"
|
|
@@ -257,21 +260,27 @@ export function runPickerTests() {
|
|
|
257
260
|
);
|
|
258
261
|
});
|
|
259
262
|
it("unsets value when children removed", async () => {
|
|
263
|
+
await nextFrame();
|
|
260
264
|
el.value = "option-2";
|
|
261
265
|
await elementUpdated(el);
|
|
266
|
+
await aTimeout(150);
|
|
262
267
|
expect(el.value).to.equal("option-2");
|
|
263
268
|
expect((el.button.textContent || "").trim()).to.include(
|
|
264
269
|
"Select Inverse"
|
|
265
270
|
);
|
|
266
271
|
const items = el.querySelectorAll("sp-menu-item");
|
|
267
|
-
const removals = [];
|
|
268
272
|
items.forEach((item) => {
|
|
269
|
-
const removal = oneEvent(el, "sp-menu-item-removed");
|
|
270
273
|
item.remove();
|
|
271
|
-
removals.push(removal);
|
|
272
274
|
});
|
|
273
|
-
await Promise.all(removals);
|
|
274
275
|
await elementUpdated(el);
|
|
276
|
+
await nextFrame();
|
|
277
|
+
await aTimeout(150);
|
|
278
|
+
expect(
|
|
279
|
+
el.optionsMenu.childItems.length
|
|
280
|
+
).to.equal(0);
|
|
281
|
+
if ("showPopover" in document.createElement("div")) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
275
284
|
expect(el.value).to.equal("");
|
|
276
285
|
expect((el.button.textContent || "").trim()).to.not.include(
|
|
277
286
|
"Select Inverse"
|
|
@@ -298,7 +307,7 @@ export function runPickerTests() {
|
|
|
298
307
|
item.value = "option-new";
|
|
299
308
|
item.textContent = "New Option";
|
|
300
309
|
el.append(item);
|
|
301
|
-
await
|
|
310
|
+
await nextFrame();
|
|
302
311
|
await elementUpdated(el);
|
|
303
312
|
let opened = oneEvent(el, "sp-opened");
|
|
304
313
|
el.open = true;
|
|
@@ -316,6 +325,7 @@ export function runPickerTests() {
|
|
|
316
325
|
expect(el.value, "second time").to.equal("option-new");
|
|
317
326
|
});
|
|
318
327
|
it('manages its "name" value in the accessibility tree', async () => {
|
|
328
|
+
await nextFrame();
|
|
319
329
|
let snapshot = await a11ySnapshot({});
|
|
320
330
|
expect(
|
|
321
331
|
findAccessibilityNode(
|
|
@@ -326,6 +336,8 @@ export function runPickerTests() {
|
|
|
326
336
|
).to.not.be.null;
|
|
327
337
|
el.value = "option-2";
|
|
328
338
|
await elementUpdated(el);
|
|
339
|
+
await nextFrame();
|
|
340
|
+
await nextFrame();
|
|
329
341
|
snapshot = await a11ySnapshot({});
|
|
330
342
|
expect(
|
|
331
343
|
findAccessibilityNode(
|
|
@@ -342,12 +354,16 @@ export function runPickerTests() {
|
|
|
342
354
|
el.open = true;
|
|
343
355
|
await opened;
|
|
344
356
|
expect(
|
|
345
|
-
el.optionsMenu.getAttribute(
|
|
357
|
+
el.optionsMenu.getAttribute(
|
|
358
|
+
"aria-activedescendant"
|
|
359
|
+
)
|
|
346
360
|
).to.equal(firstItem == null ? void 0 : firstItem.id);
|
|
347
361
|
await sendKeys({ press: "ArrowDown" });
|
|
348
362
|
await elementUpdated(el);
|
|
349
363
|
expect(
|
|
350
|
-
el.optionsMenu.getAttribute(
|
|
364
|
+
el.optionsMenu.getAttribute(
|
|
365
|
+
"aria-activedescendant"
|
|
366
|
+
)
|
|
351
367
|
).to.equal(secondItem == null ? void 0 : secondItem.id);
|
|
352
368
|
});
|
|
353
369
|
it("renders invalid accessibly", async () => {
|
|
@@ -362,6 +378,7 @@ export function runPickerTests() {
|
|
|
362
378
|
await expect(el).to.be.accessible();
|
|
363
379
|
});
|
|
364
380
|
it("opens with visible focus on a menu item on `DownArrow`", async () => {
|
|
381
|
+
var _a, _b;
|
|
365
382
|
const firstItem = el.querySelector("sp-menu-item");
|
|
366
383
|
await elementUpdated(el);
|
|
367
384
|
expect(firstItem.focused, "should not visually focused").to.be.false;
|
|
@@ -380,12 +397,24 @@ export function runPickerTests() {
|
|
|
380
397
|
});
|
|
381
398
|
await closed;
|
|
382
399
|
expect(el.open).to.be.false;
|
|
383
|
-
|
|
400
|
+
expect(
|
|
401
|
+
document.activeElement === el,
|
|
402
|
+
`focused ${(_a = document.activeElement) == null ? void 0 : _a.localName} instead of back on Picker`
|
|
403
|
+
).to.be.true;
|
|
404
|
+
expect(
|
|
405
|
+
el.shadowRoot.activeElement === el.button,
|
|
406
|
+
`focused ${(_b = el.shadowRoot.activeElement) == null ? void 0 : _b.localName} instead of back on button`
|
|
407
|
+
).to.be.true;
|
|
408
|
+
await waitUntil(
|
|
409
|
+
() => !firstItem.focused,
|
|
410
|
+
"finally, not visually focused"
|
|
411
|
+
);
|
|
384
412
|
});
|
|
385
|
-
it("opens without visible focus on a menu item
|
|
413
|
+
it("opens, on click, without visible focus on a menu item", async () => {
|
|
414
|
+
await nextFrame();
|
|
415
|
+
await nextFrame();
|
|
386
416
|
const firstItem = el.querySelector("sp-menu-item");
|
|
387
|
-
|
|
388
|
-
const boundingRect = el.getBoundingClientRect();
|
|
417
|
+
const boundingRect = el.button.getBoundingClientRect();
|
|
389
418
|
expect(firstItem.focused, "not visually focused").to.be.false;
|
|
390
419
|
const opened = oneEvent(el, "sp-opened");
|
|
391
420
|
sendMouse({
|
|
@@ -400,10 +429,69 @@ export function runPickerTests() {
|
|
|
400
429
|
]
|
|
401
430
|
});
|
|
402
431
|
await opened;
|
|
403
|
-
await elementUpdated(el);
|
|
404
432
|
expect(el.open).to.be.true;
|
|
405
433
|
expect(firstItem.focused, "still not visually focused").to.be.false;
|
|
406
434
|
});
|
|
435
|
+
it("opens/closes multiple times", async () => {
|
|
436
|
+
expect(el.open).to.be.false;
|
|
437
|
+
const boundingRect = el.button.getBoundingClientRect();
|
|
438
|
+
let opened = oneEvent(el, "sp-opened");
|
|
439
|
+
sendMouse({
|
|
440
|
+
steps: [
|
|
441
|
+
{
|
|
442
|
+
type: "click",
|
|
443
|
+
position: [
|
|
444
|
+
boundingRect.x + boundingRect.width / 2,
|
|
445
|
+
boundingRect.y + boundingRect.height / 2
|
|
446
|
+
]
|
|
447
|
+
}
|
|
448
|
+
]
|
|
449
|
+
});
|
|
450
|
+
await opened;
|
|
451
|
+
expect(el.open).to.be.true;
|
|
452
|
+
let closed = oneEvent(el, "sp-closed");
|
|
453
|
+
sendMouse({
|
|
454
|
+
steps: [
|
|
455
|
+
{
|
|
456
|
+
type: "click",
|
|
457
|
+
position: [
|
|
458
|
+
boundingRect.x + boundingRect.width / 2,
|
|
459
|
+
boundingRect.y + boundingRect.height / 2
|
|
460
|
+
]
|
|
461
|
+
}
|
|
462
|
+
]
|
|
463
|
+
});
|
|
464
|
+
await closed;
|
|
465
|
+
expect(el.open).to.be.false;
|
|
466
|
+
opened = oneEvent(el, "sp-opened");
|
|
467
|
+
sendMouse({
|
|
468
|
+
steps: [
|
|
469
|
+
{
|
|
470
|
+
type: "click",
|
|
471
|
+
position: [
|
|
472
|
+
boundingRect.x + boundingRect.width / 2,
|
|
473
|
+
boundingRect.y + boundingRect.height / 2
|
|
474
|
+
]
|
|
475
|
+
}
|
|
476
|
+
]
|
|
477
|
+
});
|
|
478
|
+
await opened;
|
|
479
|
+
expect(el.open).to.be.true;
|
|
480
|
+
closed = oneEvent(el, "sp-closed");
|
|
481
|
+
sendMouse({
|
|
482
|
+
steps: [
|
|
483
|
+
{
|
|
484
|
+
type: "click",
|
|
485
|
+
position: [
|
|
486
|
+
boundingRect.x + boundingRect.width / 2,
|
|
487
|
+
boundingRect.y + boundingRect.height / 2
|
|
488
|
+
]
|
|
489
|
+
}
|
|
490
|
+
]
|
|
491
|
+
});
|
|
492
|
+
await closed;
|
|
493
|
+
expect(el.open).to.be.false;
|
|
494
|
+
});
|
|
407
495
|
it("closes when becoming disabled", async () => {
|
|
408
496
|
expect(el.open).to.be.false;
|
|
409
497
|
el.click();
|
|
@@ -419,11 +507,15 @@ export function runPickerTests() {
|
|
|
419
507
|
document.body.append(other);
|
|
420
508
|
await elementUpdated(el);
|
|
421
509
|
expect(el.open).to.be.false;
|
|
510
|
+
const opened = oneEvent(el, "sp-opened");
|
|
422
511
|
el.click();
|
|
512
|
+
await opened;
|
|
423
513
|
await elementUpdated(el);
|
|
424
514
|
expect(el.open).to.be.true;
|
|
515
|
+
const closed = oneEvent(el, "sp-closed");
|
|
425
516
|
other.click();
|
|
426
|
-
|
|
517
|
+
closed;
|
|
518
|
+
await elementUpdated(el);
|
|
427
519
|
other.remove();
|
|
428
520
|
});
|
|
429
521
|
it("selects", async () => {
|
|
@@ -435,7 +527,6 @@ export function runPickerTests() {
|
|
|
435
527
|
const opened = oneEvent(el, "sp-opened");
|
|
436
528
|
button.click();
|
|
437
529
|
await opened;
|
|
438
|
-
await elementUpdated(el);
|
|
439
530
|
expect(el.open).to.be.true;
|
|
440
531
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
441
532
|
expect(el.value).to.equal("");
|
|
@@ -455,31 +546,27 @@ export function runPickerTests() {
|
|
|
455
546
|
"sp-menu-item:nth-of-type(2)"
|
|
456
547
|
);
|
|
457
548
|
const button = el.button;
|
|
458
|
-
|
|
549
|
+
let opened = oneEvent(el, "sp-opened");
|
|
459
550
|
button.click();
|
|
460
551
|
await opened;
|
|
461
|
-
await nextFrame();
|
|
462
552
|
expect(el.open).to.be.true;
|
|
463
553
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
464
554
|
expect(el.value).to.equal("");
|
|
465
|
-
|
|
555
|
+
let closed = oneEvent(el, "sp-closed");
|
|
466
556
|
secondItem.click();
|
|
467
557
|
await closed;
|
|
468
|
-
await nextFrame();
|
|
469
558
|
expect(el.open).to.be.false;
|
|
470
559
|
expect((_b = el.selectedItem) == null ? void 0 : _b.itemText).to.equal("Select Inverse");
|
|
471
560
|
expect(el.value).to.equal("option-2");
|
|
472
|
-
|
|
561
|
+
opened = oneEvent(el, "sp-opened");
|
|
473
562
|
button.click();
|
|
474
|
-
await
|
|
475
|
-
await nextFrame();
|
|
563
|
+
await opened;
|
|
476
564
|
expect(el.open).to.be.true;
|
|
477
565
|
expect((_c = el.selectedItem) == null ? void 0 : _c.itemText).to.equal("Select Inverse");
|
|
478
566
|
expect(el.value).to.equal("option-2");
|
|
479
|
-
|
|
567
|
+
closed = oneEvent(el, "sp-closed");
|
|
480
568
|
firstItem.click();
|
|
481
|
-
await
|
|
482
|
-
await nextFrame();
|
|
569
|
+
await closed;
|
|
483
570
|
expect(el.open).to.be.false;
|
|
484
571
|
expect((_d = el.selectedItem) == null ? void 0 : _d.itemText).to.equal("Deselect");
|
|
485
572
|
expect(el.value).to.equal("Deselect");
|
|
@@ -487,7 +574,6 @@ export function runPickerTests() {
|
|
|
487
574
|
it("dispatches bubbling and composed events", async () => {
|
|
488
575
|
const changeSpy = spy();
|
|
489
576
|
const parent = el.parentElement;
|
|
490
|
-
parent.attachShadow({ mode: "open" });
|
|
491
577
|
parent.shadowRoot.append(el);
|
|
492
578
|
const secondItem = el.querySelector(
|
|
493
579
|
"sp-menu-item:nth-of-type(2)"
|
|
@@ -497,11 +583,9 @@ export function runPickerTests() {
|
|
|
497
583
|
const opened = oneEvent(el, "sp-opened");
|
|
498
584
|
el.open = true;
|
|
499
585
|
await opened;
|
|
500
|
-
await elementUpdated(el);
|
|
501
586
|
const closed = oneEvent(el, "sp-closed");
|
|
502
587
|
secondItem.click();
|
|
503
588
|
await closed;
|
|
504
|
-
await elementUpdated(el);
|
|
505
589
|
expect(el.value).to.equal(secondItem.value);
|
|
506
590
|
expect(changeSpy.calledOnce).to.be.true;
|
|
507
591
|
});
|
|
@@ -512,10 +596,9 @@ export function runPickerTests() {
|
|
|
512
596
|
"sp-menu-item:nth-of-type(2)"
|
|
513
597
|
);
|
|
514
598
|
const button = el.button;
|
|
515
|
-
|
|
599
|
+
const opened = oneEvent(el, "sp-opened");
|
|
516
600
|
button.click();
|
|
517
601
|
await opened;
|
|
518
|
-
await elementUpdated(el);
|
|
519
602
|
expect(el.open).to.be.true;
|
|
520
603
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
521
604
|
expect(el.value).to.equal("");
|
|
@@ -524,14 +607,12 @@ export function runPickerTests() {
|
|
|
524
607
|
event.preventDefault();
|
|
525
608
|
preventChangeSpy();
|
|
526
609
|
});
|
|
527
|
-
const closed = oneEvent(el, "sp-closed");
|
|
528
|
-
opened = oneEvent(el, "sp-opened");
|
|
529
610
|
secondItem.click();
|
|
530
|
-
await
|
|
531
|
-
await
|
|
532
|
-
await elementUpdated(el);
|
|
611
|
+
await nextFrame();
|
|
612
|
+
await nextFrame();
|
|
533
613
|
expect(preventChangeSpy.calledOnce).to.be.true;
|
|
534
614
|
expect(secondItem.selected, "selection prevented").to.be.false;
|
|
615
|
+
expect(el.open).to.be.true;
|
|
535
616
|
});
|
|
536
617
|
it("can throw focus after `change`", async () => {
|
|
537
618
|
var _a;
|
|
@@ -574,20 +655,17 @@ export function runPickerTests() {
|
|
|
574
655
|
button.dispatchEvent(tEvent());
|
|
575
656
|
await elementUpdated(el);
|
|
576
657
|
expect(el.open, "still closed").to.be.false;
|
|
658
|
+
const opened = oneEvent(el, "sp-opened");
|
|
577
659
|
button.dispatchEvent(arrowUpEvent());
|
|
578
660
|
await elementUpdated(el);
|
|
579
661
|
expect(el.open, "open by ArrowUp").to.be.true;
|
|
580
|
-
await
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
await
|
|
586
|
-
|
|
587
|
-
await waitUntil(
|
|
588
|
-
() => document.querySelector("active-overlay") === null,
|
|
589
|
-
"an active-overlay has been inserted on the page"
|
|
590
|
-
);
|
|
662
|
+
await opened;
|
|
663
|
+
const closed = oneEvent(el, "sp-closed");
|
|
664
|
+
sendKeys({
|
|
665
|
+
press: "Escape"
|
|
666
|
+
});
|
|
667
|
+
await closed;
|
|
668
|
+
expect(el.open).to.be.false;
|
|
591
669
|
});
|
|
592
670
|
it("opens on ArrowDown", async () => {
|
|
593
671
|
var _a, _b;
|
|
@@ -601,19 +679,18 @@ export function runPickerTests() {
|
|
|
601
679
|
const opened = oneEvent(el, "sp-opened");
|
|
602
680
|
button.dispatchEvent(arrowDownEvent());
|
|
603
681
|
await opened;
|
|
604
|
-
await elementUpdated(el);
|
|
605
682
|
expect(el.open, "open by ArrowDown").to.be.true;
|
|
606
683
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
607
684
|
expect(el.value).to.equal("");
|
|
608
685
|
const closed = oneEvent(el, "sp-closed");
|
|
609
686
|
firstItem.click();
|
|
610
687
|
await closed;
|
|
611
|
-
await elementUpdated(el);
|
|
612
688
|
expect(el.open).to.be.false;
|
|
613
689
|
expect((_b = el.selectedItem) == null ? void 0 : _b.itemText).to.equal("Deselect");
|
|
614
690
|
expect(el.value).to.equal("Deselect");
|
|
615
691
|
});
|
|
616
692
|
it("quick selects on ArrowLeft/Right", async () => {
|
|
693
|
+
await nextFrame();
|
|
617
694
|
const selectionSpy = spy();
|
|
618
695
|
el.addEventListener("change", (event) => {
|
|
619
696
|
const { value } = event.target;
|
|
@@ -641,6 +718,7 @@ export function runPickerTests() {
|
|
|
641
718
|
expect(selectionSpy.calledWith("Make Work Path")).to.be.false;
|
|
642
719
|
});
|
|
643
720
|
it("quick selects first item on ArrowRight when no value", async () => {
|
|
721
|
+
await nextFrame();
|
|
644
722
|
const selectionSpy = spy();
|
|
645
723
|
el.addEventListener("change", (event) => {
|
|
646
724
|
const { value } = event.target;
|
|
@@ -658,6 +736,10 @@ export function runPickerTests() {
|
|
|
658
736
|
});
|
|
659
737
|
it("refocuses on list when open", async () => {
|
|
660
738
|
const firstItem = el.querySelector("sp-menu-item");
|
|
739
|
+
const thirdItem = el.querySelector(
|
|
740
|
+
"sp-menu-item:nth-of-type(3)"
|
|
741
|
+
);
|
|
742
|
+
const button = el.button;
|
|
661
743
|
const input = document.createElement("input");
|
|
662
744
|
el.insertAdjacentElement("afterend", input);
|
|
663
745
|
el.focus();
|
|
@@ -665,44 +747,79 @@ export function runPickerTests() {
|
|
|
665
747
|
expect(document.activeElement === input).to.be.true;
|
|
666
748
|
await sendKeys({ press: "Shift+Tab" });
|
|
667
749
|
expect(document.activeElement === el).to.be.true;
|
|
668
|
-
await sendKeys({ press: "Enter" });
|
|
669
750
|
const opened = oneEvent(el, "sp-opened");
|
|
670
|
-
|
|
751
|
+
sendKeys({ press: "Enter" });
|
|
671
752
|
await opened;
|
|
672
753
|
await elementUpdated(el);
|
|
673
754
|
await waitUntil(
|
|
674
755
|
() => firstItem.focused,
|
|
675
756
|
"The first items should have become focused visually."
|
|
676
757
|
);
|
|
677
|
-
|
|
678
|
-
await
|
|
679
|
-
expect(
|
|
758
|
+
await sendKeys({ press: "ArrowDown" });
|
|
759
|
+
await sendKeys({ press: "ArrowDown" });
|
|
760
|
+
expect(thirdItem.focused).to.be.true;
|
|
761
|
+
button.focus();
|
|
762
|
+
expect(isMenuActiveElement(el)).to.be.false;
|
|
680
763
|
el.focus();
|
|
681
764
|
await elementUpdated(el);
|
|
682
765
|
await waitUntil(
|
|
683
|
-
() => isMenuActiveElement(),
|
|
766
|
+
() => isMenuActiveElement(el),
|
|
684
767
|
"first item refocused"
|
|
685
768
|
);
|
|
686
|
-
expect(el
|
|
687
|
-
expect(
|
|
688
|
-
await sendKeys({ press: "ArrowDown" });
|
|
689
|
-
await sendKeys({ press: "ArrowUp" });
|
|
690
|
-
expect(firstItem.focused).to.be.true;
|
|
769
|
+
expect(isMenuActiveElement(el)).to.be.true;
|
|
770
|
+
expect(thirdItem.focused).to.be.true;
|
|
691
771
|
});
|
|
692
|
-
it("does not
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
772
|
+
it("does not listen to streaming `Enter` keydown", async () => {
|
|
773
|
+
const openSpy = spy();
|
|
774
|
+
const closedSpy = spy();
|
|
775
|
+
el.addEventListener("sp-opened", () => openSpy());
|
|
776
|
+
el.addEventListener("sp-closed", () => closedSpy());
|
|
777
|
+
const firstItem = el.querySelector("sp-menu-item");
|
|
778
|
+
const thirdItem = el.querySelector(
|
|
779
|
+
"sp-menu-item:nth-of-type(3)"
|
|
780
|
+
);
|
|
781
|
+
const input = document.createElement("input");
|
|
782
|
+
el.insertAdjacentElement("afterend", input);
|
|
696
783
|
el.focus();
|
|
697
|
-
await
|
|
784
|
+
await sendKeys({ press: "Tab" });
|
|
785
|
+
expect(document.activeElement === input).to.be.true;
|
|
786
|
+
await sendKeys({ press: "Shift+Tab" });
|
|
787
|
+
expect(document.activeElement === el).to.be.true;
|
|
788
|
+
const opened = oneEvent(el, "sp-opened");
|
|
789
|
+
sendKeys({ down: "Enter" });
|
|
790
|
+
await opened;
|
|
791
|
+
await aTimeout(300);
|
|
792
|
+
expect(openSpy.callCount).to.equal(1);
|
|
793
|
+
await sendKeys({ up: "Enter" });
|
|
698
794
|
await waitUntil(
|
|
699
|
-
() =>
|
|
700
|
-
"first
|
|
795
|
+
() => firstItem.focused,
|
|
796
|
+
"The first items should have become focused visually."
|
|
701
797
|
);
|
|
798
|
+
await sendKeys({ press: "ArrowDown" });
|
|
799
|
+
await sendKeys({ press: "ArrowDown" });
|
|
800
|
+
expect(thirdItem.focused).to.be.true;
|
|
801
|
+
const closed = oneEvent(el, "sp-closed");
|
|
802
|
+
sendKeys({ down: "Enter" });
|
|
803
|
+
await closed;
|
|
804
|
+
await aTimeout(300);
|
|
805
|
+
expect(el.value).to.equal(thirdItem.value);
|
|
806
|
+
expect(openSpy.callCount).to.equal(1);
|
|
807
|
+
expect(closedSpy.callCount).to.equal(1);
|
|
808
|
+
await sendKeys({ up: "Enter" });
|
|
809
|
+
});
|
|
810
|
+
it("allows tabing to close", async () => {
|
|
811
|
+
const input = document.createElement("input");
|
|
812
|
+
el.insertAdjacentElement("afterend", input);
|
|
813
|
+
const opened = oneEvent(el, "sp-opened");
|
|
814
|
+
el.open = true;
|
|
815
|
+
await opened;
|
|
816
|
+
await nextFrame();
|
|
702
817
|
expect(el.open).to.be.true;
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
818
|
+
el.focus();
|
|
819
|
+
const closed = oneEvent(el, "sp-closed");
|
|
820
|
+
sendKeys({ press: "Tab" });
|
|
821
|
+
await closed;
|
|
822
|
+
expect(el.open, "closes").to.be.false;
|
|
706
823
|
});
|
|
707
824
|
describe("tab order", () => {
|
|
708
825
|
let input1;
|
|
@@ -757,51 +874,7 @@ export function runPickerTests() {
|
|
|
757
874
|
input1
|
|
758
875
|
);
|
|
759
876
|
});
|
|
760
|
-
it(
|
|
761
|
-
el.focus();
|
|
762
|
-
await nextFrame();
|
|
763
|
-
expect(document.activeElement, "focuses el").to.equal(el);
|
|
764
|
-
const opened = oneEvent(el, "sp-opened");
|
|
765
|
-
sendKeys({ press: "ArrowDown" });
|
|
766
|
-
await opened;
|
|
767
|
-
expect(el.open, "opened").to.be.true;
|
|
768
|
-
await waitUntil(
|
|
769
|
-
() => isMenuActiveElement(),
|
|
770
|
-
"first item focused"
|
|
771
|
-
);
|
|
772
|
-
const activeElement = document.activeElement;
|
|
773
|
-
if (!isWebKit()) {
|
|
774
|
-
const blured = oneEvent(activeElement, "blur");
|
|
775
|
-
sendKeys({ press: "Tab" });
|
|
776
|
-
await blured;
|
|
777
|
-
expect(el.open, "picker still open").to.be.true;
|
|
778
|
-
expect(document.activeElement === input1).to.be.false;
|
|
779
|
-
expect(document.activeElement === input2).to.be.false;
|
|
780
|
-
}
|
|
781
|
-
});
|
|
782
|
-
it('traps tab in the menu as a `type="modal"` overlay backwards', async () => {
|
|
783
|
-
el.focus();
|
|
784
|
-
await nextFrame();
|
|
785
|
-
expect(document.activeElement, "focuses el").to.equal(el);
|
|
786
|
-
const opened = oneEvent(el, "sp-opened");
|
|
787
|
-
await sendKeys({ press: "ArrowDown" });
|
|
788
|
-
await opened;
|
|
789
|
-
expect(el.open, "opened").to.be.true;
|
|
790
|
-
await waitUntil(
|
|
791
|
-
() => isMenuActiveElement(),
|
|
792
|
-
"first item focused"
|
|
793
|
-
);
|
|
794
|
-
const activeElement = document.activeElement;
|
|
795
|
-
if (!isWebKit()) {
|
|
796
|
-
const blured = oneEvent(activeElement, "blur");
|
|
797
|
-
sendKeys({ press: "Shift+Tab" });
|
|
798
|
-
await blured;
|
|
799
|
-
expect(el.open, "picker still open").to.be.true;
|
|
800
|
-
expect(document.activeElement === input1).to.be.false;
|
|
801
|
-
expect(document.activeElement === input2).to.be.false;
|
|
802
|
-
}
|
|
803
|
-
});
|
|
804
|
-
it("can close and immediate tab to the next tab stop", async () => {
|
|
877
|
+
it("can close and immediately tab to the next tab stop", async () => {
|
|
805
878
|
el.focus();
|
|
806
879
|
await nextFrame();
|
|
807
880
|
expect(document.activeElement, "focuses el").to.equal(el);
|
|
@@ -810,7 +883,7 @@ export function runPickerTests() {
|
|
|
810
883
|
await opened;
|
|
811
884
|
expect(el.open, "opened").to.be.true;
|
|
812
885
|
await waitUntil(
|
|
813
|
-
() => isMenuActiveElement(),
|
|
886
|
+
() => isMenuActiveElement(el),
|
|
814
887
|
"first item focused"
|
|
815
888
|
);
|
|
816
889
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -827,13 +900,13 @@ export function runPickerTests() {
|
|
|
827
900
|
it("can close and immediate shift+tab to the previous tab stop", async () => {
|
|
828
901
|
el.focus();
|
|
829
902
|
await nextFrame();
|
|
830
|
-
expect(document.activeElement, "focuses el").to.
|
|
903
|
+
expect(document.activeElement === el, "focuses el").to.be.true;
|
|
831
904
|
const opened = oneEvent(el, "sp-opened");
|
|
832
905
|
await sendKeys({ press: "ArrowUp" });
|
|
833
906
|
await opened;
|
|
834
907
|
expect(el.open, "opened").to.be.true;
|
|
835
908
|
await waitUntil(
|
|
836
|
-
() => isMenuActiveElement(),
|
|
909
|
+
() => isMenuActiveElement(el),
|
|
837
910
|
"first item focused"
|
|
838
911
|
);
|
|
839
912
|
const closed = oneEvent(el, "sp-closed");
|
|
@@ -842,7 +915,7 @@ export function runPickerTests() {
|
|
|
842
915
|
expect(el.open).to.be.false;
|
|
843
916
|
expect(document.activeElement === el).to.be.true;
|
|
844
917
|
const focused = oneEvent(input1, "focus");
|
|
845
|
-
|
|
918
|
+
sendKeys({ press: "Shift+Tab" });
|
|
846
919
|
await focused;
|
|
847
920
|
expect(el.open).to.be.false;
|
|
848
921
|
expect(document.activeElement === input1).to.be.true;
|
|
@@ -857,8 +930,7 @@ export function runPickerTests() {
|
|
|
857
930
|
expect(el.open).to.be.false;
|
|
858
931
|
});
|
|
859
932
|
it("scrolls selected into view on open", async () => {
|
|
860
|
-
|
|
861
|
-
el.popoverEl.style.height = "40px";
|
|
933
|
+
el.shadowRoot.querySelector("sp-popover").style.height = "40px";
|
|
862
934
|
const firstItem = el.querySelector(
|
|
863
935
|
"sp-menu-item:first-child"
|
|
864
936
|
);
|
|
@@ -868,11 +940,15 @@ export function runPickerTests() {
|
|
|
868
940
|
lastItem.disabled = false;
|
|
869
941
|
el.value = lastItem.value;
|
|
870
942
|
await elementUpdated(el);
|
|
943
|
+
const opened = oneEvent(el, "sp-opened");
|
|
871
944
|
el.open = true;
|
|
872
|
-
await
|
|
873
|
-
await waitUntil(
|
|
945
|
+
await opened;
|
|
946
|
+
await waitUntil(
|
|
947
|
+
() => isMenuActiveElement(el),
|
|
948
|
+
"first item focused"
|
|
949
|
+
);
|
|
874
950
|
const getParentOffset = (el2) => {
|
|
875
|
-
const parentScroll = el2.parentElement.scrollTop;
|
|
951
|
+
const parentScroll = el2.assignedSlot.parentElement.scrollTop;
|
|
876
952
|
const parentOffset = el2.offsetTop - parentScroll;
|
|
877
953
|
return parentOffset;
|
|
878
954
|
};
|
|
@@ -881,7 +957,9 @@ export function runPickerTests() {
|
|
|
881
957
|
lastItem.dispatchEvent(
|
|
882
958
|
new FocusEvent("focusin", { bubbles: true })
|
|
883
959
|
);
|
|
884
|
-
|
|
960
|
+
await sendKeys({
|
|
961
|
+
press: "ArrowDown"
|
|
962
|
+
});
|
|
885
963
|
await elementUpdated(el);
|
|
886
964
|
await nextFrame();
|
|
887
965
|
expect(getParentOffset(lastItem)).to.be.greaterThan(40);
|
|
@@ -919,6 +997,8 @@ export function runPickerTests() {
|
|
|
919
997
|
beforeEach(async () => {
|
|
920
998
|
el = await groupedFixture();
|
|
921
999
|
await elementUpdated(el);
|
|
1000
|
+
await nextFrame();
|
|
1001
|
+
await nextFrame();
|
|
922
1002
|
});
|
|
923
1003
|
it("selects the item with a matching value in a group", async () => {
|
|
924
1004
|
const item = el.querySelector("#should-be-selected");
|
|
@@ -956,6 +1036,7 @@ export function runPickerTests() {
|
|
|
956
1036
|
beforeEach(async () => {
|
|
957
1037
|
el = await pickerFixture2();
|
|
958
1038
|
await elementUpdated(el);
|
|
1039
|
+
await nextFrame();
|
|
959
1040
|
});
|
|
960
1041
|
afterEach(async () => {
|
|
961
1042
|
if (el.open) {
|
|
@@ -1041,6 +1122,7 @@ export function runPickerTests() {
|
|
|
1041
1122
|
beforeEach(async () => {
|
|
1042
1123
|
el = await pickerFixture2();
|
|
1043
1124
|
await elementUpdated(el);
|
|
1125
|
+
await nextFrame();
|
|
1044
1126
|
});
|
|
1045
1127
|
afterEach(async () => {
|
|
1046
1128
|
if (el.open) {
|
|
@@ -1057,7 +1139,6 @@ export function runPickerTests() {
|
|
|
1057
1139
|
const opened = oneEvent(el, "sp-opened");
|
|
1058
1140
|
el.button.click();
|
|
1059
1141
|
await opened;
|
|
1060
|
-
await elementUpdated(el);
|
|
1061
1142
|
expect(el.open).to.be.true;
|
|
1062
1143
|
expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
|
|
1063
1144
|
expect(el.value).to.equal("");
|
|
@@ -1077,6 +1158,7 @@ export function runPickerTests() {
|
|
|
1077
1158
|
`);
|
|
1078
1159
|
const el2 = test.querySelector("sp-picker");
|
|
1079
1160
|
await elementUpdated(el2);
|
|
1161
|
+
await nextFrame();
|
|
1080
1162
|
let snapshot = await a11ySnapshot({});
|
|
1081
1163
|
expect(
|
|
1082
1164
|
findAccessibilityNode(
|
|
@@ -1087,6 +1169,9 @@ export function runPickerTests() {
|
|
|
1087
1169
|
).to.not.be.null;
|
|
1088
1170
|
el2.value = "2";
|
|
1089
1171
|
await elementUpdated(el2);
|
|
1172
|
+
await nextFrame();
|
|
1173
|
+
await nextFrame();
|
|
1174
|
+
expect(el2.value).to.equal("2");
|
|
1090
1175
|
snapshot = await a11ySnapshot({});
|
|
1091
1176
|
expect(
|
|
1092
1177
|
findAccessibilityNode(
|
|
@@ -1099,6 +1184,8 @@ export function runPickerTests() {
|
|
|
1099
1184
|
it("toggles between pickers", async () => {
|
|
1100
1185
|
const el2 = await pickerFixture();
|
|
1101
1186
|
const el1 = await pickerFixture();
|
|
1187
|
+
el1.parentElement.style.float = "left";
|
|
1188
|
+
el2.parentElement.style.float = "left";
|
|
1102
1189
|
el1.id = "away";
|
|
1103
1190
|
el2.id = "other";
|
|
1104
1191
|
await Promise.all([elementUpdated(el1), elementUpdated(el2)]);
|
|
@@ -1119,8 +1206,8 @@ export function runPickerTests() {
|
|
|
1119
1206
|
closed = oneEvent(el2, "sp-closed");
|
|
1120
1207
|
el1.click();
|
|
1121
1208
|
await Promise.all([open, closed]);
|
|
1122
|
-
expect(el1.open).to.be.true;
|
|
1123
1209
|
expect(el2.open).to.be.false;
|
|
1210
|
+
expect(el1.open).to.be.true;
|
|
1124
1211
|
closed = oneEvent(el1, "sp-closed");
|
|
1125
1212
|
sendKeys({
|
|
1126
1213
|
press: "Escape"
|
|
@@ -1129,7 +1216,7 @@ export function runPickerTests() {
|
|
|
1129
1216
|
expect(el1.open).to.be.false;
|
|
1130
1217
|
});
|
|
1131
1218
|
it("displays selected item text by default", async () => {
|
|
1132
|
-
var _a, _b, _c, _d;
|
|
1219
|
+
var _a, _b, _c, _d, _e;
|
|
1133
1220
|
const el2 = await fixture(
|
|
1134
1221
|
html`
|
|
1135
1222
|
<sp-picker
|
|
@@ -1146,6 +1233,7 @@ export function runPickerTests() {
|
|
|
1146
1233
|
</sp-picker>
|
|
1147
1234
|
`
|
|
1148
1235
|
);
|
|
1236
|
+
await nextFrame();
|
|
1149
1237
|
await elementUpdated(el2);
|
|
1150
1238
|
await waitUntil(
|
|
1151
1239
|
() => {
|
|
@@ -1171,16 +1259,21 @@ export function runPickerTests() {
|
|
|
1171
1259
|
const opened = oneEvent(el2, "sp-opened");
|
|
1172
1260
|
sendKeys({ press: "Enter" });
|
|
1173
1261
|
await opened;
|
|
1174
|
-
await elementUpdated(el2.optionsMenu);
|
|
1175
1262
|
expect(
|
|
1176
|
-
el2
|
|
1263
|
+
el2 === document.activeElement,
|
|
1177
1264
|
`activeElement is ${(_d = document.activeElement) == null ? void 0 : _d.localName}`
|
|
1178
1265
|
).to.be.true;
|
|
1266
|
+
expect(
|
|
1267
|
+
el2.optionsMenu === el2.shadowRoot.activeElement,
|
|
1268
|
+
`activeElement is ${(_e = el2.shadowRoot.activeElement) == null ? void 0 : _e.localName}`
|
|
1269
|
+
).to.be.true;
|
|
1179
1270
|
expect(firstItem.focused, 'firstItem NOT "focused"').to.be.false;
|
|
1180
1271
|
expect(secondItem.focused, 'secondItem "focused"').to.be.true;
|
|
1181
|
-
expect(
|
|
1182
|
-
|
|
1183
|
-
|
|
1272
|
+
expect(
|
|
1273
|
+
el2.optionsMenu.getAttribute(
|
|
1274
|
+
"aria-activedescendant"
|
|
1275
|
+
)
|
|
1276
|
+
).to.equal(secondItem.id);
|
|
1184
1277
|
});
|
|
1185
1278
|
it("resets value when item not available", async () => {
|
|
1186
1279
|
var _a;
|
|
@@ -1262,15 +1355,11 @@ export function runPickerTests() {
|
|
|
1262
1355
|
await elementUpdated(el2);
|
|
1263
1356
|
expect(openedSpy.calledOnce).to.be.true;
|
|
1264
1357
|
expect(closedSpy.calledOnce).to.be.false;
|
|
1265
|
-
const openedEvent = openedSpy.args[0][0];
|
|
1266
|
-
expect(openedEvent.detail.interaction).to.equal("modal");
|
|
1267
1358
|
const closed = oneEvent(el2, "sp-closed");
|
|
1268
1359
|
el2.open = false;
|
|
1269
1360
|
await closed;
|
|
1270
1361
|
await elementUpdated(el2);
|
|
1271
1362
|
expect(closedSpy.calledOnce).to.be.true;
|
|
1272
|
-
const closedEvent = closedSpy.args[0][0];
|
|
1273
|
-
expect(closedEvent.detail.interaction).to.equal("modal");
|
|
1274
1363
|
});
|
|
1275
1364
|
}
|
|
1276
1365
|
//# sourceMappingURL=index.js.map
|