@spectrum-web-components/picker 0.35.0 → 0.35.1-rc.15

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,41 @@ 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 () => {
772
+ it("allows tabing to close", async () => {
773
+ const input = document.createElement("input");
774
+ el.insertAdjacentElement("afterend", input);
775
+ const opened = oneEvent(el, "sp-opened");
693
776
  el.open = true;
694
- await elementUpdated(el);
777
+ await opened;
778
+ await nextFrame();
695
779
  expect(el.open).to.be.true;
696
780
  el.focus();
697
- await elementUpdated(el);
698
- await waitUntil(
699
- () => isMenuActiveElement(),
700
- "first item refocused"
701
- );
702
- 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;
781
+ const closed = oneEvent(el, "sp-closed");
782
+ sendKeys({ press: "Tab" });
783
+ await closed;
784
+ expect(el.open, "closes").to.be.false;
706
785
  });
707
786
  describe("tab order", () => {
708
787
  let input1;
@@ -757,51 +836,7 @@ export function runPickerTests() {
757
836
  input1
758
837
  );
759
838
  });
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 () => {
839
+ it("can close and immediately tab to the next tab stop", async () => {
805
840
  el.focus();
806
841
  await nextFrame();
807
842
  expect(document.activeElement, "focuses el").to.equal(el);
@@ -810,7 +845,7 @@ export function runPickerTests() {
810
845
  await opened;
811
846
  expect(el.open, "opened").to.be.true;
812
847
  await waitUntil(
813
- () => isMenuActiveElement(),
848
+ () => isMenuActiveElement(el),
814
849
  "first item focused"
815
850
  );
816
851
  const closed = oneEvent(el, "sp-closed");
@@ -827,13 +862,13 @@ export function runPickerTests() {
827
862
  it("can close and immediate shift+tab to the previous tab stop", async () => {
828
863
  el.focus();
829
864
  await nextFrame();
830
- expect(document.activeElement, "focuses el").to.equal(el);
865
+ expect(document.activeElement === el, "focuses el").to.be.true;
831
866
  const opened = oneEvent(el, "sp-opened");
832
867
  await sendKeys({ press: "ArrowUp" });
833
868
  await opened;
834
869
  expect(el.open, "opened").to.be.true;
835
870
  await waitUntil(
836
- () => isMenuActiveElement(),
871
+ () => isMenuActiveElement(el),
837
872
  "first item focused"
838
873
  );
839
874
  const closed = oneEvent(el, "sp-closed");
@@ -842,7 +877,7 @@ export function runPickerTests() {
842
877
  expect(el.open).to.be.false;
843
878
  expect(document.activeElement === el).to.be.true;
844
879
  const focused = oneEvent(input1, "focus");
845
- await sendKeys({ press: "Shift+Tab" });
880
+ sendKeys({ press: "Shift+Tab" });
846
881
  await focused;
847
882
  expect(el.open).to.be.false;
848
883
  expect(document.activeElement === input1).to.be.true;
@@ -857,8 +892,7 @@ export function runPickerTests() {
857
892
  expect(el.open).to.be.false;
858
893
  });
859
894
  it("scrolls selected into view on open", async () => {
860
- await el.generatePopover();
861
- el.popoverEl.style.height = "40px";
895
+ el.shadowRoot.querySelector("sp-popover").style.height = "40px";
862
896
  const firstItem = el.querySelector(
863
897
  "sp-menu-item:first-child"
864
898
  );
@@ -868,11 +902,15 @@ export function runPickerTests() {
868
902
  lastItem.disabled = false;
869
903
  el.value = lastItem.value;
870
904
  await elementUpdated(el);
905
+ const opened = oneEvent(el, "sp-opened");
871
906
  el.open = true;
872
- await elementUpdated(el);
873
- await waitUntil(() => isMenuActiveElement(), "first item focused");
907
+ await opened;
908
+ await waitUntil(
909
+ () => isMenuActiveElement(el),
910
+ "first item focused"
911
+ );
874
912
  const getParentOffset = (el2) => {
875
- const parentScroll = el2.parentElement.scrollTop;
913
+ const parentScroll = el2.assignedSlot.parentElement.scrollTop;
876
914
  const parentOffset = el2.offsetTop - parentScroll;
877
915
  return parentOffset;
878
916
  };
@@ -881,7 +919,9 @@ export function runPickerTests() {
881
919
  lastItem.dispatchEvent(
882
920
  new FocusEvent("focusin", { bubbles: true })
883
921
  );
884
- lastItem.dispatchEvent(arrowDownEvent());
922
+ await sendKeys({
923
+ press: "ArrowDown"
924
+ });
885
925
  await elementUpdated(el);
886
926
  await nextFrame();
887
927
  expect(getParentOffset(lastItem)).to.be.greaterThan(40);
@@ -919,6 +959,8 @@ export function runPickerTests() {
919
959
  beforeEach(async () => {
920
960
  el = await groupedFixture();
921
961
  await elementUpdated(el);
962
+ await nextFrame();
963
+ await nextFrame();
922
964
  });
923
965
  it("selects the item with a matching value in a group", async () => {
924
966
  const item = el.querySelector("#should-be-selected");
@@ -956,6 +998,7 @@ export function runPickerTests() {
956
998
  beforeEach(async () => {
957
999
  el = await pickerFixture2();
958
1000
  await elementUpdated(el);
1001
+ await nextFrame();
959
1002
  });
960
1003
  afterEach(async () => {
961
1004
  if (el.open) {
@@ -1041,6 +1084,7 @@ export function runPickerTests() {
1041
1084
  beforeEach(async () => {
1042
1085
  el = await pickerFixture2();
1043
1086
  await elementUpdated(el);
1087
+ await nextFrame();
1044
1088
  });
1045
1089
  afterEach(async () => {
1046
1090
  if (el.open) {
@@ -1057,7 +1101,6 @@ export function runPickerTests() {
1057
1101
  const opened = oneEvent(el, "sp-opened");
1058
1102
  el.button.click();
1059
1103
  await opened;
1060
- await elementUpdated(el);
1061
1104
  expect(el.open).to.be.true;
1062
1105
  expect((_a = el.selectedItem) == null ? void 0 : _a.itemText).to.be.undefined;
1063
1106
  expect(el.value).to.equal("");
@@ -1077,6 +1120,7 @@ export function runPickerTests() {
1077
1120
  `);
1078
1121
  const el2 = test.querySelector("sp-picker");
1079
1122
  await elementUpdated(el2);
1123
+ await nextFrame();
1080
1124
  let snapshot = await a11ySnapshot({});
1081
1125
  expect(
1082
1126
  findAccessibilityNode(
@@ -1087,6 +1131,9 @@ export function runPickerTests() {
1087
1131
  ).to.not.be.null;
1088
1132
  el2.value = "2";
1089
1133
  await elementUpdated(el2);
1134
+ await nextFrame();
1135
+ await nextFrame();
1136
+ expect(el2.value).to.equal("2");
1090
1137
  snapshot = await a11ySnapshot({});
1091
1138
  expect(
1092
1139
  findAccessibilityNode(
@@ -1099,6 +1146,8 @@ export function runPickerTests() {
1099
1146
  it("toggles between pickers", async () => {
1100
1147
  const el2 = await pickerFixture();
1101
1148
  const el1 = await pickerFixture();
1149
+ el1.parentElement.style.float = "left";
1150
+ el2.parentElement.style.float = "left";
1102
1151
  el1.id = "away";
1103
1152
  el2.id = "other";
1104
1153
  await Promise.all([elementUpdated(el1), elementUpdated(el2)]);
@@ -1119,8 +1168,8 @@ export function runPickerTests() {
1119
1168
  closed = oneEvent(el2, "sp-closed");
1120
1169
  el1.click();
1121
1170
  await Promise.all([open, closed]);
1122
- expect(el1.open).to.be.true;
1123
1171
  expect(el2.open).to.be.false;
1172
+ expect(el1.open).to.be.true;
1124
1173
  closed = oneEvent(el1, "sp-closed");
1125
1174
  sendKeys({
1126
1175
  press: "Escape"
@@ -1129,7 +1178,7 @@ export function runPickerTests() {
1129
1178
  expect(el1.open).to.be.false;
1130
1179
  });
1131
1180
  it("displays selected item text by default", async () => {
1132
- var _a, _b, _c, _d;
1181
+ var _a, _b, _c, _d, _e;
1133
1182
  const el2 = await fixture(
1134
1183
  html`
1135
1184
  <sp-picker
@@ -1146,6 +1195,7 @@ export function runPickerTests() {
1146
1195
  </sp-picker>
1147
1196
  `
1148
1197
  );
1198
+ await nextFrame();
1149
1199
  await elementUpdated(el2);
1150
1200
  await waitUntil(
1151
1201
  () => {
@@ -1171,16 +1221,21 @@ export function runPickerTests() {
1171
1221
  const opened = oneEvent(el2, "sp-opened");
1172
1222
  sendKeys({ press: "Enter" });
1173
1223
  await opened;
1174
- await elementUpdated(el2.optionsMenu);
1175
1224
  expect(
1176
- el2.optionsMenu === document.activeElement,
1225
+ el2 === document.activeElement,
1177
1226
  `activeElement is ${(_d = document.activeElement) == null ? void 0 : _d.localName}`
1178
1227
  ).to.be.true;
1228
+ expect(
1229
+ el2.optionsMenu === el2.shadowRoot.activeElement,
1230
+ `activeElement is ${(_e = el2.shadowRoot.activeElement) == null ? void 0 : _e.localName}`
1231
+ ).to.be.true;
1179
1232
  expect(firstItem.focused, 'firstItem NOT "focused"').to.be.false;
1180
1233
  expect(secondItem.focused, 'secondItem "focused"').to.be.true;
1181
- expect(el2.optionsMenu.getAttribute("aria-activedescendant")).to.equal(
1182
- secondItem.id
1183
- );
1234
+ expect(
1235
+ el2.optionsMenu.getAttribute(
1236
+ "aria-activedescendant"
1237
+ )
1238
+ ).to.equal(secondItem.id);
1184
1239
  });
1185
1240
  it("resets value when item not available", async () => {
1186
1241
  var _a;
@@ -1262,15 +1317,11 @@ export function runPickerTests() {
1262
1317
  await elementUpdated(el2);
1263
1318
  expect(openedSpy.calledOnce).to.be.true;
1264
1319
  expect(closedSpy.calledOnce).to.be.false;
1265
- const openedEvent = openedSpy.args[0][0];
1266
- expect(openedEvent.detail.interaction).to.equal("modal");
1267
1320
  const closed = oneEvent(el2, "sp-closed");
1268
1321
  el2.open = false;
1269
1322
  await closed;
1270
1323
  await elementUpdated(el2);
1271
1324
  expect(closedSpy.calledOnce).to.be.true;
1272
- const closedEvent = closedSpy.args[0][0];
1273
- expect(closedEvent.detail.interaction).to.equal("modal");
1274
1325
  });
1275
1326
  }
1276
1327
  //# sourceMappingURL=index.js.map