@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/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
- isFirefox,
37
- isWebKit
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 = document.activeElement) == null ? void 0 : _a.localName) === "sp-menu";
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
- <div>
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
- </div>
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 = document.querySelector(
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 elementUpdated(item);
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("aria-activedescendant")
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("aria-activedescendant")
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
- await waitUntil(() => !firstItem.focused, "not visually focused");
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 on click", async () => {
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
- await elementUpdated(el);
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
- await waitUntil(() => !el.open, "closed");
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
- const opened = oneEvent(el, "sp-opened");
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
- const closed = oneEvent(el, "sp-closed");
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
- const opened2 = oneEvent(el, "sp-opened");
561
+ opened = oneEvent(el, "sp-opened");
473
562
  button.click();
474
- await opened2;
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
- const closed2 = oneEvent(el, "sp-closed");
567
+ closed = oneEvent(el, "sp-closed");
480
568
  firstItem.click();
481
- await closed2;
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
- let opened = oneEvent(el, "sp-opened");
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 closed;
531
- await opened;
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 waitUntil(
581
- () => document.querySelector("active-overlay") !== null,
582
- "an active-overlay has been inserted on the page"
583
- );
584
- button.dispatchEvent(escapeEvent());
585
- await elementUpdated(el);
586
- await waitUntil(() => el.open === false, "closed by Escape");
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
- el.open = true;
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
- el.blur();
678
- await elementUpdated(el);
679
- expect(el.open).to.be.true;
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.open).to.be.true;
687
- expect(isMenuActiveElement()).to.be.true;
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 allow tabing to close", async () => {
693
- el.open = true;
694
- await elementUpdated(el);
695
- expect(el.open).to.be.true;
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 elementUpdated(el);
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
- () => isMenuActiveElement(),
700
- "first item refocused"
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
- expect(isMenuActiveElement()).to.be.true;
704
- await sendKeys({ press: "Tab" });
705
- expect(el.open, "stays open").to.be.true;
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('traps tab in the menu as a `type="modal"` overlay forward', async () => {
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.equal(el);
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
- await sendKeys({ press: "Shift+Tab" });
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
- await el.generatePopover();
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 elementUpdated(el);
873
- await waitUntil(() => isMenuActiveElement(), "first item focused");
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
- lastItem.dispatchEvent(arrowDownEvent());
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.optionsMenu === document.activeElement,
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(el2.optionsMenu.getAttribute("aria-activedescendant")).to.equal(
1182
- secondItem.id
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