@spectrum-web-components/menu 1.2.0-beta.8 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +503 -253
- package/package.json +11 -11
- package/src/Menu.d.ts +62 -10
- package/src/Menu.dev.js +137 -169
- package/src/Menu.dev.js.map +2 -2
- package/src/Menu.js +2 -2
- package/src/Menu.js.map +3 -3
- package/src/MenuGroup.d.ts +9 -0
- package/src/MenuGroup.dev.js +13 -9
- package/src/MenuGroup.dev.js.map +2 -2
- package/src/MenuGroup.js +3 -3
- package/src/MenuGroup.js.map +2 -2
- package/src/MenuItem.d.ts +60 -1
- package/src/MenuItem.dev.js +107 -19
- package/src/MenuItem.dev.js.map +2 -2
- package/src/MenuItem.js +7 -7
- package/src/MenuItem.js.map +3 -3
- package/stories/index.js +13 -5
- package/stories/index.js.map +2 -2
- package/stories/menu.stories.js +20 -0
- package/stories/menu.stories.js.map +2 -2
- package/test/menu-group.test.js +88 -92
- package/test/menu-group.test.js.map +2 -2
- package/test/menu-item.test.js +39 -1
- package/test/menu-item.test.js.map +2 -2
- package/test/menu-selects.test.js +42 -49
- package/test/menu-selects.test.js.map +2 -2
- package/test/menu.test.js +102 -98
- package/test/menu.test.js.map +2 -2
- package/test/submenu.test.js +60 -34
- package/test/submenu.test.js.map +2 -2
package/test/menu.test.js
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
import "@spectrum-web-components/menu/sp-menu.js";
|
|
3
|
-
import "@spectrum-web-components/menu/sp-menu-divider.js";
|
|
4
|
-
import "@spectrum-web-components/menu/sp-menu-group.js";
|
|
5
|
-
import "@spectrum-web-components/menu/sp-menu-item.js";
|
|
6
2
|
import {
|
|
7
3
|
aTimeout,
|
|
8
4
|
elementUpdated,
|
|
@@ -11,6 +7,14 @@ import {
|
|
|
11
7
|
nextFrame,
|
|
12
8
|
waitUntil
|
|
13
9
|
} from "@open-wc/testing";
|
|
10
|
+
import "@spectrum-web-components/menu/sp-menu-divider.js";
|
|
11
|
+
import "@spectrum-web-components/menu/sp-menu-group.js";
|
|
12
|
+
import "@spectrum-web-components/menu/sp-menu-item.js";
|
|
13
|
+
import "@spectrum-web-components/menu/sp-menu.js";
|
|
14
|
+
import { isFirefox, isWebKit } from "@spectrum-web-components/shared";
|
|
15
|
+
import { sendKeys } from "@web/test-runner-commands";
|
|
16
|
+
import { spy } from "sinon";
|
|
17
|
+
import { sendMouse } from "../../../test/plugins/browser.js";
|
|
14
18
|
import {
|
|
15
19
|
arrowDownEvent,
|
|
16
20
|
arrowUpEvent,
|
|
@@ -19,10 +23,6 @@ import {
|
|
|
19
23
|
testForLitDevWarnings,
|
|
20
24
|
tEvent
|
|
21
25
|
} from "../../../test/testing-helpers.js";
|
|
22
|
-
import { sendMouse } from "../../../test/plugins/browser.js";
|
|
23
|
-
import { spy } from "sinon";
|
|
24
|
-
import { sendKeys } from "@web/test-runner-commands";
|
|
25
|
-
import { isWebKit } from "@spectrum-web-components/shared";
|
|
26
26
|
describe("Menu", () => {
|
|
27
27
|
it("renders empty", async () => {
|
|
28
28
|
const el = await fixture(html`
|
|
@@ -88,15 +88,8 @@ describe("Menu", () => {
|
|
|
88
88
|
<sp-menu-item disabled>Make Work Path</sp-menu-item>
|
|
89
89
|
</sp-menu>
|
|
90
90
|
`);
|
|
91
|
-
await waitUntil(
|
|
92
|
-
() => el.childItems.length == 6,
|
|
93
|
-
"expected menu to manage 6 menu items"
|
|
94
|
-
);
|
|
95
91
|
await elementUpdated(el);
|
|
96
|
-
|
|
97
|
-
'[tabindex]:not([tabindex="-1"])'
|
|
98
|
-
);
|
|
99
|
-
expect(inTabindexElement).to.be.null;
|
|
92
|
+
expect(el.childItems.length).to.equal(6);
|
|
100
93
|
await expect(el).to.be.accessible();
|
|
101
94
|
});
|
|
102
95
|
testForLitDevWarnings(
|
|
@@ -117,10 +110,14 @@ describe("Menu", () => {
|
|
|
117
110
|
</sp-menu>
|
|
118
111
|
`);
|
|
119
112
|
await elementUpdated(el);
|
|
113
|
+
const selectedItem = el.querySelector(
|
|
114
|
+
"sp-menu-item[selected]"
|
|
115
|
+
);
|
|
116
|
+
expect(selectedItem.selected).to.be.true;
|
|
120
117
|
await expect(el).to.be.accessible();
|
|
121
118
|
});
|
|
122
119
|
it('has a "value" that can be copied during "change" events', async function() {
|
|
123
|
-
if (isWebKit()) {
|
|
120
|
+
if (isWebKit() || isFirefox()) {
|
|
124
121
|
this.skip();
|
|
125
122
|
}
|
|
126
123
|
const el = await fixture(html`
|
|
@@ -138,8 +135,10 @@ describe("Menu", () => {
|
|
|
138
135
|
</sp-menu>
|
|
139
136
|
`);
|
|
140
137
|
await elementUpdated(el);
|
|
141
|
-
const
|
|
142
|
-
|
|
138
|
+
const selectedItem = el.querySelector(
|
|
139
|
+
"sp-menu-item[selected]"
|
|
140
|
+
);
|
|
141
|
+
selectedItem.focus();
|
|
143
142
|
await elementUpdated(el);
|
|
144
143
|
await sendKeys({
|
|
145
144
|
press: "ArrowDown"
|
|
@@ -148,12 +147,12 @@ describe("Menu", () => {
|
|
|
148
147
|
await sendKeys({
|
|
149
148
|
press: "Enter"
|
|
150
149
|
});
|
|
151
|
-
await elementUpdated(el);
|
|
152
150
|
const clipboardText = await navigator.clipboard.readText();
|
|
151
|
+
await elementUpdated(el);
|
|
153
152
|
expect(clipboardText).to.equal("Other");
|
|
154
153
|
});
|
|
155
154
|
it("accepts Numpad keys", async function() {
|
|
156
|
-
if (isWebKit()) {
|
|
155
|
+
if (isWebKit() || isFirefox()) {
|
|
157
156
|
this.skip();
|
|
158
157
|
}
|
|
159
158
|
const el = await fixture(html`
|
|
@@ -171,8 +170,10 @@ describe("Menu", () => {
|
|
|
171
170
|
</sp-menu>
|
|
172
171
|
`);
|
|
173
172
|
await elementUpdated(el);
|
|
174
|
-
const
|
|
175
|
-
|
|
173
|
+
const selectedItem = el.querySelector(
|
|
174
|
+
"sp-menu-item[selected]"
|
|
175
|
+
);
|
|
176
|
+
selectedItem.focus();
|
|
176
177
|
await elementUpdated(el);
|
|
177
178
|
await sendKeys({
|
|
178
179
|
press: "ArrowDown"
|
|
@@ -231,25 +232,36 @@ describe("Menu", () => {
|
|
|
231
232
|
);
|
|
232
233
|
el.focus();
|
|
233
234
|
await elementUpdated(el);
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
expect(
|
|
237
|
-
expect(firstItem.focused).to.be.true;
|
|
235
|
+
expect(document.activeElement === firstItem, "active element").to.be.true;
|
|
236
|
+
expect(firstItem.focused, "first item focused").to.be.true;
|
|
237
|
+
expect(firstItem.textContent, "focused item text").to.equal("Deselect");
|
|
238
238
|
el.dispatchEvent(arrowUpEvent());
|
|
239
239
|
el.dispatchEvent(arrowUpEvent());
|
|
240
240
|
el.dispatchEvent(tEvent());
|
|
241
|
-
expect(
|
|
242
|
-
|
|
241
|
+
expect(
|
|
242
|
+
document.activeElement === thirdToLastItem,
|
|
243
|
+
"active element after arrow up"
|
|
244
|
+
).to.be.true;
|
|
245
|
+
expect(thirdToLastItem.focused, "third to last item focused").to.be.true;
|
|
246
|
+
expect(thirdToLastItem.textContent, "focused item text").to.equal(
|
|
247
|
+
"Select and Mask..."
|
|
248
|
+
);
|
|
243
249
|
el.dispatchEvent(arrowDownEvent());
|
|
244
|
-
expect(
|
|
245
|
-
|
|
250
|
+
expect(
|
|
251
|
+
document.activeElement === secondToLastItem,
|
|
252
|
+
"active element after arrow down"
|
|
253
|
+
).to.be.true;
|
|
254
|
+
expect(secondToLastItem.focused, "second to last item focused").to.be.true;
|
|
255
|
+
expect(secondToLastItem.textContent, "focused item text").to.equal(
|
|
256
|
+
"Save Selection"
|
|
257
|
+
);
|
|
246
258
|
});
|
|
247
|
-
it("handle focus and late
|
|
259
|
+
it("handle focus and late descendant additions", async () => {
|
|
248
260
|
const el = await fixture(html`
|
|
249
261
|
<sp-menu>
|
|
250
262
|
<sp-menu-group selects="inherit">
|
|
251
263
|
<span slot="header">Options</span>
|
|
252
|
-
<sp-menu-item>Deselect</sp-menu-item>
|
|
264
|
+
<sp-menu-item id="deselect">Deselect</sp-menu-item>
|
|
253
265
|
</sp-menu-group>
|
|
254
266
|
</sp-menu>
|
|
255
267
|
`);
|
|
@@ -258,15 +270,14 @@ describe("Menu", () => {
|
|
|
258
270
|
"expected menu to manage 1 item"
|
|
259
271
|
);
|
|
260
272
|
await elementUpdated(el);
|
|
261
|
-
const
|
|
262
|
-
"sp-menu-item:nth-of-type(1)"
|
|
263
|
-
);
|
|
273
|
+
const initialLoadedItem = el.querySelector("#deselect");
|
|
264
274
|
el.focus();
|
|
265
275
|
await elementUpdated(el);
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
expect(
|
|
269
|
-
|
|
276
|
+
expect(document.activeElement === initialLoadedItem, "active element").to.be.true;
|
|
277
|
+
expect(initialLoadedItem.focused, "visually focused").to.be.true;
|
|
278
|
+
expect(initialLoadedItem.textContent, "focused item text").to.equal(
|
|
279
|
+
"Deselect"
|
|
280
|
+
);
|
|
270
281
|
el.blur();
|
|
271
282
|
const group = el.querySelector("sp-menu-group");
|
|
272
283
|
const prependedItem = document.createElement("sp-menu-item");
|
|
@@ -280,49 +291,45 @@ describe("Menu", () => {
|
|
|
280
291
|
return el.childItems.length == 3;
|
|
281
292
|
}, "expected menu to manage 3 items");
|
|
282
293
|
await elementUpdated(el);
|
|
283
|
-
expect(
|
|
284
|
-
expect(firstItem.focused).to.be.false;
|
|
285
|
-
expect(prependedItem.focused).to.be.false;
|
|
294
|
+
expect(el.childItems.length).to.equal(3);
|
|
286
295
|
el.focus();
|
|
287
|
-
|
|
296
|
+
expect(
|
|
297
|
+
document.activeElement === prependedItem,
|
|
298
|
+
"prepended item is active element?"
|
|
299
|
+
).to.be.true;
|
|
300
|
+
expect(prependedItem.focused, "prepended item visibly focused").to.be.true;
|
|
288
301
|
await sendKeys({ press: "ArrowUp" });
|
|
289
|
-
expect(
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
expect(appendedItem.focused, "
|
|
302
|
+
expect(
|
|
303
|
+
document.activeElement === appendedItem,
|
|
304
|
+
"appended item is active element"
|
|
305
|
+
).to.be.true;
|
|
306
|
+
expect(appendedItem.focused, "appended visibly focused").to.be.true;
|
|
294
307
|
});
|
|
295
308
|
it("cleans up when tabbing away", async () => {
|
|
296
309
|
const el = await fixture(html`
|
|
297
|
-
<sp-menu
|
|
310
|
+
<sp-menu>
|
|
298
311
|
<sp-menu-item>Deselect</sp-menu-item>
|
|
299
312
|
<sp-menu-item>Select Inverse</sp-menu-item>
|
|
300
313
|
<sp-menu-item>Third Item</sp-menu-item>
|
|
301
314
|
</sp-menu>
|
|
302
315
|
`);
|
|
303
|
-
await waitUntil(
|
|
304
|
-
() => el.childItems.length == 3,
|
|
305
|
-
"expected menu to manage 3 items"
|
|
306
|
-
);
|
|
307
316
|
await elementUpdated(el);
|
|
308
317
|
const firstItem = el.querySelector(
|
|
309
318
|
"sp-menu-item:nth-of-type(1)"
|
|
310
319
|
);
|
|
311
|
-
const secondItem = el.querySelector(
|
|
312
|
-
"sp-menu-item:nth-of-type(2)"
|
|
313
|
-
);
|
|
314
320
|
const thirdItem = el.querySelector(
|
|
315
321
|
"sp-menu-item:nth-of-type(3)"
|
|
316
322
|
);
|
|
317
323
|
el.focus();
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
324
|
+
expect(
|
|
325
|
+
document.activeElement === firstItem,
|
|
326
|
+
"first item is active element"
|
|
327
|
+
).to.be.true;
|
|
328
|
+
expect(firstItem.focused, "first item focused").to.be.true;
|
|
322
329
|
el.dispatchEvent(arrowDownEvent());
|
|
323
330
|
el.dispatchEvent(arrowDownEvent());
|
|
324
|
-
expect(thirdItem.focused, "third").to.be.true;
|
|
325
|
-
|
|
331
|
+
expect(thirdItem.focused, "third item focused").to.be.true;
|
|
332
|
+
thirdItem.dispatchEvent(tabEvent());
|
|
326
333
|
el.dispatchEvent(
|
|
327
334
|
new CustomEvent("focusout", {
|
|
328
335
|
composed: true,
|
|
@@ -330,39 +337,44 @@ describe("Menu", () => {
|
|
|
330
337
|
})
|
|
331
338
|
);
|
|
332
339
|
await nextFrame();
|
|
333
|
-
el.
|
|
334
|
-
|
|
335
|
-
expect(
|
|
340
|
+
el.focus();
|
|
341
|
+
await sendKeys({ press: "ArrowDown" });
|
|
342
|
+
expect(firstItem.focused, "first item focused again").to.be.true;
|
|
336
343
|
});
|
|
337
344
|
it("handles focus across focused MenuItem removals", async () => {
|
|
338
345
|
const el = await fixture(html`
|
|
339
|
-
<sp-menu id="
|
|
340
|
-
<sp-menu-item
|
|
341
|
-
<sp-menu-item>
|
|
342
|
-
<sp-menu-item>
|
|
343
|
-
<sp-menu-item>Select and Mask...</sp-menu-item>
|
|
344
|
-
<sp-menu-item selected class="selected">
|
|
345
|
-
Save Selection
|
|
346
|
-
</sp-menu-item>
|
|
346
|
+
<sp-menu id="remove">
|
|
347
|
+
<sp-menu-item id="#deselect">Deselect</sp-menu-item>
|
|
348
|
+
<sp-menu-item selected>Select Inverse</sp-menu-item>
|
|
349
|
+
<sp-menu-item>Third Item</sp-menu-item>
|
|
347
350
|
</sp-menu>
|
|
348
351
|
`);
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
352
|
+
await waitUntil(
|
|
353
|
+
() => el.childItems.length == 3,
|
|
354
|
+
"expected menu to manage 3 items",
|
|
355
|
+
{ timeout: 100 }
|
|
356
|
+
);
|
|
357
|
+
expect(el.children.length).to.equal(el.childItems.length);
|
|
353
358
|
el.focus();
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
await sendKeys({
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
359
|
+
const children = [...el.children];
|
|
360
|
+
expect(children[1], "selected element is focused").to.equal(
|
|
361
|
+
document.activeElement
|
|
362
|
+
);
|
|
363
|
+
await sendKeys({ press: "ArrowUp" });
|
|
364
|
+
expect(children[0], "first element is focused").to.equal(
|
|
365
|
+
document.activeElement
|
|
366
|
+
);
|
|
367
|
+
if (isFirefox() || isWebKit()) {
|
|
368
|
+
children[0].remove();
|
|
369
|
+
await elementUpdated(el);
|
|
370
|
+
expect(children[1], "selected element is focused").to.equal(
|
|
371
|
+
document.activeElement
|
|
372
|
+
);
|
|
373
|
+
await sendKeys({ press: "ArrowUp" });
|
|
374
|
+
expect(children[2], "last element is focused").to.equal(
|
|
375
|
+
document.activeElement
|
|
376
|
+
);
|
|
377
|
+
}
|
|
366
378
|
});
|
|
367
379
|
it("handles single selection", async () => {
|
|
368
380
|
const el = await fixture(html`
|
|
@@ -372,14 +384,6 @@ describe("Menu", () => {
|
|
|
372
384
|
<sp-menu-item>Third</sp-menu-item>
|
|
373
385
|
</sp-menu>
|
|
374
386
|
`);
|
|
375
|
-
await waitUntil(
|
|
376
|
-
() => el.childItems.length == 3,
|
|
377
|
-
"expected menu to manage 3 items"
|
|
378
|
-
);
|
|
379
|
-
await waitUntil(
|
|
380
|
-
() => el.selectedItems.length == 1,
|
|
381
|
-
"expected menu to have 1 selected item"
|
|
382
|
-
);
|
|
383
387
|
await elementUpdated(el);
|
|
384
388
|
const firstItem = el.querySelector(
|
|
385
389
|
"sp-menu-item:nth-of-type(1)"
|
package/test/menu.test.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["menu.test.ts"],
|
|
4
|
-
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport '@spectrum-web-components/menu/sp-menu.js';\nimport '@spectrum-web-components/menu/sp-menu-divider.js';\nimport '@spectrum-web-components/menu/sp-menu-group.js';\nimport '@spectrum-web-components/menu/sp-menu-item.js';\nimport { Menu, MenuItem } from '@spectrum-web-components/menu';\nimport {\n aTimeout,\n elementUpdated,\n expect,\n html,\n nextFrame,\n waitUntil,\n} from '@open-wc/testing';\nimport {\n arrowDownEvent,\n arrowUpEvent,\n fixture,\n tabEvent,\n testForLitDevWarnings,\n tEvent,\n} from '../../../test/testing-helpers.js';\nimport { sendMouse } from '../../../test/plugins/browser.js';\nimport { spy } from 'sinon';\nimport { sendKeys } from '@web/test-runner-commands';\nimport { isWebKit } from '@spectrum-web-components/shared';\n\ndescribe('Menu', () => {\n it('renders empty', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu tabindex=\"0\"><a href=\"#anchor\">Test</a></sp-menu>\n `);\n\n const anchor = el.querySelector('a') as HTMLAnchorElement;\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 1').to.be\n .false;\n expect(document.activeElement === anchor, 'child not focused, 1').to.be\n .false;\n\n expect(el.getAttribute('role')).to.equal('menu');\n\n el.focus();\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 2').to.be\n .false;\n expect(document.activeElement === anchor, 'child not focused, 2').to.be\n .false;\n\n anchor.focus();\n expect(document.activeElement === el, 'self not focused, 3').to.be\n .false;\n expect(document.activeElement === anchor, 'anchor').to.be.true;\n });\n it('renders w/ [disabled] menu items', async () => {\n const focusinSpy = spy();\n const el = await fixture<Menu>(html`\n <sp-menu tabindex=\"0\" @focusin=${() => focusinSpy()}>\n <sp-menu-item disabled>Disabled item</sp-menu-item>\n </sp-menu>\n `);\n\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 1').to.be\n .false;\n\n el.focus();\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 2').to.be\n .false;\n expect(focusinSpy.callCount).to.equal(0);\n });\n it('renders w/ all [disabled] menu items', async () => {\n const focusinSpy = spy();\n const el = await fixture<Menu>(html`\n <sp-menu tabindex=\"0\" @focusin=${() => focusinSpy()}>\n <sp-menu-item disabled>Disabled item 1</sp-menu-item>\n <sp-menu-item disabled>Disabled item 2</sp-menu-item>\n </sp-menu>\n `);\n const firstItem = el.querySelector('sp-menu-item') as MenuItem;\n\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 1').to.be\n .false;\n\n el.focus();\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 2').to.be\n .false;\n expect(focusinSpy.callCount).to.equal(0);\n firstItem.focus();\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 2').to.be\n .false;\n expect(focusinSpy.callCount).to.equal(0);\n expect(el.matches(':focus-within')).to.be.false;\n });\n it('renders w/ menu items', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu label=\"Pick an action:\">\n <sp-menu-item>Deselect</sp-menu-item>\n <sp-menu-item>Select Inverse</sp-menu-item>\n <sp-menu-item>Feather...</sp-menu-item>\n <sp-menu-item>Select and Mask...</sp-menu-item>\n <sp-menu-divider></sp-menu-divider>\n <sp-menu-item>Save Selection</sp-menu-item>\n <sp-menu-item disabled>Make Work Path</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 6,\n 'expected menu to manage 6 menu items'\n );\n await elementUpdated(el);\n\n const inTabindexElement = el.querySelector(\n '[tabindex]:not([tabindex=\"-1\"])'\n );\n expect(inTabindexElement).to.be.null;\n await expect(el).to.be.accessible();\n });\n\n testForLitDevWarnings(\n async () =>\n await fixture<Menu>(html`\n <sp-menu selects=\"single\">\n <sp-menu-item>Not Selected</sp-menu-item>\n <sp-menu-item selected>Selected</sp-menu-item>\n <sp-menu-item>Other</sp-menu-item>\n </sp-menu>\n `)\n );\n\n it('renders w/ selected', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu selects=\"single\">\n <sp-menu-item>Not Selected</sp-menu-item>\n <sp-menu-item selected>Selected</sp-menu-item>\n <sp-menu-item>Other</sp-menu-item>\n </sp-menu>\n `);\n\n await elementUpdated(el);\n\n await expect(el).to.be.accessible();\n });\n\n it('has a \"value\" that can be copied during \"change\" events', async function () {\n if (isWebKit()) {\n this.skip();\n }\n const el = await fixture<Menu>(html`\n <sp-menu\n selects=\"single\"\n @change=${({\n target: { value },\n }: Event & { target: Menu }): void => {\n navigator.clipboard.writeText(value);\n }}\n >\n <sp-menu-item>Not Selected</sp-menu-item>\n <sp-menu-item selected>Selected</sp-menu-item>\n <sp-menu-item id=\"other\">Other</sp-menu-item>\n </sp-menu>\n `);\n\n await elementUpdated(el);\n\n const otherItem = el.querySelector('#other') as MenuItem;\n otherItem.focus();\n await elementUpdated(el);\n await sendKeys({\n press: 'ArrowDown',\n });\n await elementUpdated(el);\n await sendKeys({\n press: 'Enter',\n });\n\n await elementUpdated(el);\n\n const clipboardText = await navigator.clipboard.readText();\n expect(clipboardText).to.equal('Other');\n });\n\n it('accepts Numpad keys', async function () {\n if (isWebKit()) {\n this.skip();\n }\n const el = await fixture<Menu>(html`\n <sp-menu\n selects=\"single\"\n @change=${({\n target: { value },\n }: Event & { target: Menu }): void => {\n navigator.clipboard.writeText(value);\n }}\n >\n <sp-menu-item>Not Selected</sp-menu-item>\n <sp-menu-item selected>Selected</sp-menu-item>\n <sp-menu-item id=\"other\">Other</sp-menu-item>\n </sp-menu>\n `);\n\n await elementUpdated(el);\n\n const otherItem = el.querySelector('#other') as MenuItem;\n otherItem.focus();\n await elementUpdated(el);\n await sendKeys({\n press: 'ArrowDown',\n });\n await elementUpdated(el);\n await sendKeys({\n press: 'NumpadEnter',\n });\n\n await elementUpdated(el);\n\n const clipboardText = await navigator.clipboard.readText();\n expect(clipboardText).to.equal('Other');\n });\n\n it('renders w/ hrefs', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu>\n <sp-menu-item href=\"not-selected.html\">\n Not Selected\n </sp-menu-item>\n <sp-menu-item href=\"selected.html\">Selected</sp-menu-item>\n <sp-menu-item href=\"other.html\">Other</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 3,\n 'expected menu to manage 3 items'\n );\n await elementUpdated(el);\n\n await expect(el).to.be.accessible();\n\n expect(el.getAttribute('role')).to.equal('menu');\n });\n\n it('handle focus and keyboard input', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu>\n <sp-menu-item>Deselect</sp-menu-item>\n <sp-menu-item>Select Inverse</sp-menu-item>\n <sp-menu-item>Feather...</sp-menu-item>\n <sp-menu-item>Select and Mask...</sp-menu-item>\n <sp-menu-divider></sp-menu-divider>\n <sp-menu-item>Save Selection</sp-menu-item>\n <sp-menu-item disabled>Make Work Path</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 6,\n 'expected menu to manage 6 items'\n );\n await elementUpdated(el);\n\n const firstItem = el.querySelector(\n 'sp-menu-item:nth-of-type(1)'\n ) as MenuItem;\n const thirdToLastItem = el.querySelector(\n 'sp-menu-item:nth-last-of-type(3)'\n ) as MenuItem;\n const secondToLastItem = el.querySelector(\n 'sp-menu-item:nth-last-of-type(2)'\n ) as MenuItem;\n\n el.focus();\n await elementUpdated(el);\n // Activate :focus-visible\n await sendKeys({ press: 'ArrowDown' });\n await sendKeys({ press: 'ArrowUp' });\n\n expect(document.activeElement === el).to.be.true;\n expect(firstItem.focused).to.be.true;\n\n el.dispatchEvent(arrowUpEvent());\n el.dispatchEvent(arrowUpEvent());\n el.dispatchEvent(tEvent());\n\n expect(document.activeElement === el).to.be.true;\n expect(thirdToLastItem.focused).to.be.true;\n\n el.dispatchEvent(arrowDownEvent());\n\n expect(document.activeElement === el).to.be.true;\n expect(secondToLastItem.focused).to.be.true;\n });\n\n it('handle focus and late descendent additions', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu>\n <sp-menu-group selects=\"inherit\">\n <span slot=\"header\">Options</span>\n <sp-menu-item>Deselect</sp-menu-item>\n </sp-menu-group>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 1,\n 'expected menu to manage 1 item'\n );\n await elementUpdated(el);\n\n const firstItem = el.querySelector(\n 'sp-menu-item:nth-of-type(1)'\n ) as MenuItem;\n\n el.focus();\n\n await elementUpdated(el);\n // Activate :focus-visible\n await sendKeys({ press: 'ArrowDown' });\n await sendKeys({ press: 'ArrowUp' });\n\n expect(document.activeElement === el, 'active element').to.be.true;\n expect(firstItem.focused, 'visually focused').to.be.true;\n\n el.blur();\n\n const group = el.querySelector('sp-menu-group') as HTMLElement;\n const prependedItem = document.createElement('sp-menu-item');\n prependedItem.textContent = 'Prepended Item';\n const appendedItem = document.createElement('sp-menu-item');\n appendedItem.textContent = 'Appended Item';\n group.prepend(prependedItem);\n group.append(appendedItem);\n await elementUpdated(el);\n\n await waitUntil(() => {\n return el.childItems.length == 3;\n }, 'expected menu to manage 3 items');\n await elementUpdated(el);\n\n expect(document.activeElement === el).to.be.false;\n expect(firstItem.focused).to.be.false;\n expect(prependedItem.focused).to.be.false;\n\n el.focus();\n // Activate :focus-visible\n await sendKeys({ press: 'ArrowDown' });\n await sendKeys({ press: 'ArrowUp' });\n\n expect(document.activeElement === el, 'another active element').to.be\n .true;\n expect(prependedItem.focused, 'another visibly focused').to.be.true;\n\n el.dispatchEvent(arrowUpEvent());\n\n expect(document.activeElement === el, 'last active element').to.be.true;\n expect(appendedItem.focused, 'last visibly focused').to.be.true;\n });\n it('cleans up when tabbing away', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu tabindex=\"0\">\n <sp-menu-item>Deselect</sp-menu-item>\n <sp-menu-item>Select Inverse</sp-menu-item>\n <sp-menu-item>Third Item</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 3,\n 'expected menu to manage 3 items'\n );\n await elementUpdated(el);\n\n const firstItem = el.querySelector(\n 'sp-menu-item:nth-of-type(1)'\n ) as MenuItem;\n const secondItem = el.querySelector(\n 'sp-menu-item:nth-of-type(2)'\n ) as MenuItem;\n const thirdItem = el.querySelector(\n 'sp-menu-item:nth-of-type(3)'\n ) as MenuItem;\n\n el.focus();\n // Activate :focus-visible\n await sendKeys({ press: 'ArrowDown' });\n await sendKeys({ press: 'ArrowUp' });\n expect(document.activeElement === el).to.be.true;\n expect(firstItem.focused, 'first').to.be.true;\n el.dispatchEvent(arrowDownEvent());\n el.dispatchEvent(arrowDownEvent());\n expect(thirdItem.focused, 'third').to.be.true;\n // imitate tabbing away\n el.dispatchEvent(tabEvent());\n el.dispatchEvent(\n new CustomEvent('focusout', {\n composed: true,\n bubbles: true,\n })\n );\n await nextFrame();\n // re-bind keyevents\n el.startListeningToKeyboard();\n // focus management should start again from the first item.\n el.dispatchEvent(arrowDownEvent());\n expect(secondItem.focused, 'second').to.be.true;\n });\n it('handles focus across focused MenuItem removals', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu id=\"test\">\n <sp-menu-item class=\"first\">Deselect</sp-menu-item>\n <sp-menu-item>Invert Selection</sp-menu-item>\n <sp-menu-item>Feather...</sp-menu-item>\n <sp-menu-item>Select and Mask...</sp-menu-item>\n <sp-menu-item selected class=\"selected\">\n Save Selection\n </sp-menu-item>\n </sp-menu>\n `);\n const firstItem = el.querySelector('.first') as MenuItem;\n const selectedItem = el.querySelector('.selected') as MenuItem;\n\n await elementUpdated(el);\n await nextFrame();\n el.focus();\n\n expect(document.activeElement).to.equal(el);\n // Enforce visible focus\n await sendKeys({\n press: 'ArrowUp',\n });\n await sendKeys({\n press: 'ArrowDown',\n });\n expect(selectedItem.focused).to.be.true;\n\n selectedItem.remove();\n await elementUpdated(el);\n\n expect(document.activeElement).to.equal(el);\n expect(firstItem.focused).to.be.true;\n });\n it('handles single selection', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu selects=\"single\">\n <sp-menu-item selected>First</sp-menu-item>\n <sp-menu-item>Second</sp-menu-item>\n <sp-menu-item>Third</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 3,\n 'expected menu to manage 3 items'\n );\n await waitUntil(\n () => el.selectedItems.length == 1,\n 'expected menu to have 1 selected item'\n );\n await elementUpdated(el);\n\n const firstItem = el.querySelector(\n 'sp-menu-item:nth-of-type(1)'\n ) as MenuItem;\n\n const secondItem = el.querySelector(\n 'sp-menu-item:nth-of-type(2)'\n ) as MenuItem;\n\n expect(firstItem.getAttribute('role')).to.equal('menuitemradio');\n expect(secondItem.getAttribute('role')).to.equal('menuitemradio');\n\n expect(firstItem.selected).to.be.true;\n expect(secondItem.selected).to.be.false;\n expect(firstItem.getAttribute('aria-checked')).to.equal('true');\n expect(secondItem.getAttribute('aria-checked')).to.equal('false');\n expect(el.value).to.equal('First');\n\n secondItem.click();\n\n await elementUpdated(el);\n await elementUpdated(firstItem);\n await elementUpdated(secondItem);\n\n expect(firstItem.selected).to.be.false;\n expect(secondItem.selected).to.be.true;\n expect(firstItem.getAttribute('aria-checked')).to.equal('false');\n expect(secondItem.getAttribute('aria-checked')).to.equal('true');\n expect(el.value).to.equal('Second');\n });\n it('does not make a selection on a right/middle mouse click', async () => {\n const changeSpy = spy();\n const el = await fixture<Menu>(html`\n <sp-menu\n selects=\"single\"\n @change=${() => {\n changeSpy();\n }}\n >\n <sp-menu-item>First</sp-menu-item>\n <sp-menu-item>Second</sp-menu-item>\n <sp-menu-item>Third</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 3,\n 'expected menu to manage 3 items'\n );\n await elementUpdated(el);\n\n const secondItem = el.querySelector(\n 'sp-menu-item:nth-of-type(2)'\n ) as MenuItem;\n\n // send right mouse click to the secondItem\n const rect = secondItem.getBoundingClientRect();\n sendMouse({\n steps: [\n {\n position: [\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n ],\n type: 'click',\n options: {\n button: 'right',\n },\n },\n ],\n });\n await elementUpdated(el);\n await elementUpdated(secondItem);\n await aTimeout(150);\n expect(changeSpy.callCount, 'no change').to.equal(0);\n\n // send middle mouse click to the secondItem\n sendMouse({\n steps: [\n {\n position: [\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n ],\n type: 'click',\n options: {\n button: 'middle',\n },\n },\n ],\n });\n await elementUpdated(el);\n await elementUpdated(secondItem);\n await aTimeout(150);\n expect(changeSpy.callCount, 'no change').to.equal(0);\n });\n it('handles multiple selection', async () => {\n const changeSpy = spy();\n const el = await fixture<Menu>(html`\n <sp-menu selects=\"multiple\" @change=${() => changeSpy()}>\n <sp-menu-item selected>First</sp-menu-item>\n <sp-menu-item>Second</sp-menu-item>\n <sp-menu-item>Third</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 3,\n 'expected menu to manage 3 items'\n );\n await elementUpdated(el);\n\n const firstItem = el.querySelector(\n 'sp-menu-item:nth-of-type(1)'\n ) as MenuItem;\n\n const secondItem = el.querySelector(\n 'sp-menu-item:nth-of-type(2)'\n ) as MenuItem;\n\n expect(firstItem.getAttribute('role')).to.equal('menuitemcheckbox');\n expect(secondItem.getAttribute('role')).to.equal('menuitemcheckbox');\n\n expect(firstItem.selected).to.be.true;\n expect(secondItem.selected).to.be.false;\n expect(firstItem.getAttribute('aria-checked')).to.equal('true');\n expect(secondItem.getAttribute('aria-checked')).to.equal('false');\n expect(el.value).to.equal('First');\n expect(el.selectedItems.length).to.equal(1);\n\n secondItem.click();\n\n await elementUpdated(el);\n await elementUpdated(firstItem);\n await elementUpdated(secondItem);\n\n expect(changeSpy.callCount, 'one change').to.equal(1);\n expect(firstItem.selected).to.be.true;\n expect(secondItem.selected).to.be.true;\n expect(firstItem.getAttribute('aria-checked')).to.equal('true');\n expect(secondItem.getAttribute('aria-checked')).to.equal('true');\n expect(el.value).to.equal('First,Second');\n expect(el.selectedItems.length).to.equal(2);\n\n firstItem.click();\n\n await elementUpdated(el);\n await elementUpdated(firstItem);\n await elementUpdated(secondItem);\n\n expect(changeSpy.callCount, 'two changes').to.equal(2);\n expect(firstItem.selected).to.be.false;\n expect(secondItem.selected).to.be.true;\n expect(firstItem.getAttribute('aria-checked')).to.equal('false');\n expect(secondItem.getAttribute('aria-checked')).to.equal('true');\n expect(el.value).to.equal('Second');\n expect(el.selectedItems.length).to.equal(1);\n });\n it('can be controlled to manage a single togglable selection', async () => {\n const toggleSingleSelected = (\n event: Event & { target: Menu }\n ): void => {\n event.preventDefault();\n const selected: string[] = [];\n if (event.target.selected.length) {\n selected.push(event.target.selected.at(-1) as string);\n }\n event.target.updateComplete.then(() => {\n event.target.selected = selected;\n });\n };\n const el = await fixture<Menu>(html`\n <sp-menu selects=\"multiple\" @change=${toggleSingleSelected}>\n <sp-menu-item value=\"1\">First</sp-menu-item>\n <sp-menu-item value=\"2\">Second</sp-menu-item>\n <sp-menu-item value=\"3\">Third</sp-menu-item>\n </sp-menu>\n `);\n await nextFrame();\n await nextFrame();\n expect(el.selected).to.deep.equal([]);\n\n const items = [...el.children] as MenuItem[];\n await Promise.all(items.map((child) => child.updateComplete));\n\n items[0].click();\n await nextFrame();\n await nextFrame();\n expect(el.selected).to.deep.equal(['1']);\n\n items[0].click();\n await nextFrame();\n await nextFrame();\n expect(el.selected).to.deep.equal([]);\n\n items[1].click();\n await nextFrame();\n await nextFrame();\n expect(el.selected).to.deep.equal(['2']);\n\n items[2].click();\n await nextFrame();\n await nextFrame();\n expect(el.selected).to.deep.equal(['3']);\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n aTimeout,\n elementUpdated,\n expect,\n html,\n nextFrame,\n waitUntil,\n} from '@open-wc/testing';\nimport { Menu, MenuItem } from '@spectrum-web-components/menu';\nimport '@spectrum-web-components/menu/sp-menu-divider.js';\nimport '@spectrum-web-components/menu/sp-menu-group.js';\nimport '@spectrum-web-components/menu/sp-menu-item.js';\nimport '@spectrum-web-components/menu/sp-menu.js';\nimport { isFirefox, isWebKit } from '@spectrum-web-components/shared';\nimport { sendKeys } from '@web/test-runner-commands';\nimport { spy } from 'sinon';\nimport { sendMouse } from '../../../test/plugins/browser.js';\nimport {\n arrowDownEvent,\n arrowUpEvent,\n fixture,\n tabEvent,\n testForLitDevWarnings,\n tEvent,\n} from '../../../test/testing-helpers.js';\n\ndescribe('Menu', () => {\n it('renders empty', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu tabindex=\"0\"><a href=\"#anchor\">Test</a></sp-menu>\n `);\n\n const anchor = el.querySelector('a') as HTMLAnchorElement;\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 1').to.be\n .false;\n expect(document.activeElement === anchor, 'child not focused, 1').to.be\n .false;\n\n expect(el.getAttribute('role')).to.equal('menu');\n\n el.focus();\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 2').to.be\n .false;\n expect(document.activeElement === anchor, 'child not focused, 2').to.be\n .false;\n\n anchor.focus();\n expect(document.activeElement === el, 'self not focused, 3').to.be\n .false;\n expect(document.activeElement === anchor, 'anchor').to.be.true;\n });\n it('renders w/ [disabled] menu items', async () => {\n const focusinSpy = spy();\n const el = await fixture<Menu>(html`\n <sp-menu tabindex=\"0\" @focusin=${() => focusinSpy()}>\n <sp-menu-item disabled>Disabled item</sp-menu-item>\n </sp-menu>\n `);\n\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 1').to.be\n .false;\n\n el.focus();\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 2').to.be\n .false;\n expect(focusinSpy.callCount).to.equal(0);\n });\n it('renders w/ all [disabled] menu items', async () => {\n const focusinSpy = spy();\n const el = await fixture<Menu>(html`\n <sp-menu tabindex=\"0\" @focusin=${() => focusinSpy()}>\n <sp-menu-item disabled>Disabled item 1</sp-menu-item>\n <sp-menu-item disabled>Disabled item 2</sp-menu-item>\n </sp-menu>\n `);\n const firstItem = el.querySelector('sp-menu-item') as MenuItem;\n\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 1').to.be\n .false;\n\n el.focus();\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 2').to.be\n .false;\n expect(focusinSpy.callCount).to.equal(0);\n firstItem.focus();\n await elementUpdated(el);\n expect(document.activeElement === el, 'self not focused, 2').to.be\n .false;\n expect(focusinSpy.callCount).to.equal(0);\n expect(el.matches(':focus-within')).to.be.false;\n });\n it('renders w/ menu items', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu label=\"Pick an action:\">\n <sp-menu-item>Deselect</sp-menu-item>\n <sp-menu-item>Select Inverse</sp-menu-item>\n <sp-menu-item>Feather...</sp-menu-item>\n <sp-menu-item>Select and Mask...</sp-menu-item>\n <sp-menu-divider></sp-menu-divider>\n <sp-menu-item>Save Selection</sp-menu-item>\n <sp-menu-item disabled>Make Work Path</sp-menu-item>\n </sp-menu>\n `);\n\n await elementUpdated(el);\n\n expect(el.childItems.length).to.equal(6);\n await expect(el).to.be.accessible();\n });\n\n testForLitDevWarnings(\n async () =>\n await fixture<Menu>(html`\n <sp-menu selects=\"single\">\n <sp-menu-item>Not Selected</sp-menu-item>\n <sp-menu-item selected>Selected</sp-menu-item>\n <sp-menu-item>Other</sp-menu-item>\n </sp-menu>\n `)\n );\n\n it('renders w/ selected', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu selects=\"single\">\n <sp-menu-item>Not Selected</sp-menu-item>\n <sp-menu-item selected>Selected</sp-menu-item>\n <sp-menu-item>Other</sp-menu-item>\n </sp-menu>\n `);\n\n await elementUpdated(el);\n\n const selectedItem = el.querySelector(\n 'sp-menu-item[selected]'\n ) as MenuItem;\n\n expect(selectedItem.selected).to.be.true;\n await expect(el).to.be.accessible();\n });\n\n it('has a \"value\" that can be copied during \"change\" events', async function () {\n if (isWebKit() || isFirefox()) {\n this.skip();\n }\n const el = await fixture<Menu>(html`\n <sp-menu\n selects=\"single\"\n @change=${({\n target: { value },\n }: Event & { target: Menu }): void => {\n navigator.clipboard.writeText(value);\n }}\n >\n <sp-menu-item>Not Selected</sp-menu-item>\n <sp-menu-item selected>Selected</sp-menu-item>\n <sp-menu-item id=\"other\">Other</sp-menu-item>\n </sp-menu>\n `);\n\n await elementUpdated(el);\n\n const selectedItem = el.querySelector(\n 'sp-menu-item[selected]'\n ) as MenuItem;\n\n selectedItem.focus();\n\n await elementUpdated(el);\n await sendKeys({\n press: 'ArrowDown',\n });\n await elementUpdated(el);\n await sendKeys({\n press: 'Enter',\n });\n\n const clipboardText = await navigator.clipboard.readText();\n await elementUpdated(el);\n\n expect(clipboardText).to.equal('Other');\n });\n\n it('accepts Numpad keys', async function () {\n if (isWebKit() || isFirefox()) {\n this.skip();\n }\n const el = await fixture<Menu>(html`\n <sp-menu\n selects=\"single\"\n @change=${({\n target: { value },\n }: Event & { target: Menu }): void => {\n navigator.clipboard.writeText(value);\n }}\n >\n <sp-menu-item>Not Selected</sp-menu-item>\n <sp-menu-item selected>Selected</sp-menu-item>\n <sp-menu-item id=\"other\">Other</sp-menu-item>\n </sp-menu>\n `);\n\n await elementUpdated(el);\n const selectedItem = el.querySelector(\n 'sp-menu-item[selected]'\n ) as MenuItem;\n selectedItem.focus();\n await elementUpdated(el);\n await sendKeys({\n press: 'ArrowDown',\n });\n await elementUpdated(el);\n await sendKeys({\n press: 'NumpadEnter',\n });\n\n await elementUpdated(el);\n\n const clipboardText = await navigator.clipboard.readText();\n expect(clipboardText).to.equal('Other');\n });\n\n it('renders w/ hrefs', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu>\n <sp-menu-item href=\"not-selected.html\">\n Not Selected\n </sp-menu-item>\n <sp-menu-item href=\"selected.html\">Selected</sp-menu-item>\n <sp-menu-item href=\"other.html\">Other</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 3,\n 'expected menu to manage 3 items'\n );\n await elementUpdated(el);\n\n await expect(el).to.be.accessible();\n\n expect(el.getAttribute('role')).to.equal('menu');\n });\n\n it('handle focus and keyboard input', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu>\n <sp-menu-item>Deselect</sp-menu-item>\n <sp-menu-item>Select Inverse</sp-menu-item>\n <sp-menu-item>Feather...</sp-menu-item>\n <sp-menu-item>Select and Mask...</sp-menu-item>\n <sp-menu-divider></sp-menu-divider>\n <sp-menu-item>Save Selection</sp-menu-item>\n <sp-menu-item disabled>Make Work Path</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 6,\n 'expected menu to manage 6 items'\n );\n await elementUpdated(el);\n\n const firstItem = el.querySelector(\n 'sp-menu-item:nth-of-type(1)'\n ) as MenuItem;\n const thirdToLastItem = el.querySelector(\n 'sp-menu-item:nth-last-of-type(3)'\n ) as MenuItem;\n const secondToLastItem = el.querySelector(\n 'sp-menu-item:nth-last-of-type(2)'\n ) as MenuItem;\n\n el.focus();\n await elementUpdated(el);\n\n expect(document.activeElement === firstItem, 'active element').to.be\n .true;\n expect(firstItem.focused, 'first item focused').to.be.true;\n expect(firstItem.textContent, 'focused item text').to.equal('Deselect');\n\n el.dispatchEvent(arrowUpEvent());\n el.dispatchEvent(arrowUpEvent());\n el.dispatchEvent(tEvent());\n\n expect(\n document.activeElement === thirdToLastItem,\n 'active element after arrow up'\n ).to.be.true;\n expect(thirdToLastItem.focused, 'third to last item focused').to.be\n .true;\n expect(thirdToLastItem.textContent, 'focused item text').to.equal(\n 'Select and Mask...'\n );\n\n el.dispatchEvent(arrowDownEvent());\n\n expect(\n document.activeElement === secondToLastItem,\n 'active element after arrow down'\n ).to.be.true;\n expect(secondToLastItem.focused, 'second to last item focused').to.be\n .true;\n expect(secondToLastItem.textContent, 'focused item text').to.equal(\n 'Save Selection'\n );\n });\n\n it('handle focus and late descendant additions', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu>\n <sp-menu-group selects=\"inherit\">\n <span slot=\"header\">Options</span>\n <sp-menu-item id=\"deselect\">Deselect</sp-menu-item>\n </sp-menu-group>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 1,\n 'expected menu to manage 1 item'\n );\n await elementUpdated(el);\n\n const initialLoadedItem = el.querySelector('#deselect') as MenuItem;\n\n el.focus();\n\n await elementUpdated(el);\n\n expect(document.activeElement === initialLoadedItem, 'active element')\n .to.be.true;\n expect(initialLoadedItem.focused, 'visually focused').to.be.true;\n expect(initialLoadedItem.textContent, 'focused item text').to.equal(\n 'Deselect'\n );\n\n el.blur();\n\n const group = el.querySelector('sp-menu-group') as HTMLElement;\n\n const prependedItem = document.createElement('sp-menu-item');\n prependedItem.textContent = 'Prepended Item';\n\n const appendedItem = document.createElement('sp-menu-item');\n appendedItem.textContent = 'Appended Item';\n\n group.prepend(prependedItem);\n group.append(appendedItem);\n await elementUpdated(el);\n\n await waitUntil(() => {\n return el.childItems.length == 3;\n }, 'expected menu to manage 3 items');\n\n await elementUpdated(el);\n\n expect(el.childItems.length).to.equal(3);\n el.focus();\n\n expect(\n document.activeElement === prependedItem,\n 'prepended item is active element?'\n ).to.be.true;\n expect(prependedItem.focused, 'prepended item visibly focused').to.be\n .true;\n\n await sendKeys({ press: 'ArrowUp' });\n\n expect(\n document.activeElement === appendedItem,\n 'appended item is active element'\n ).to.be.true;\n expect(appendedItem.focused, 'appended visibly focused').to.be.true;\n });\n\n it('cleans up when tabbing away', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu>\n <sp-menu-item>Deselect</sp-menu-item>\n <sp-menu-item>Select Inverse</sp-menu-item>\n <sp-menu-item>Third Item</sp-menu-item>\n </sp-menu>\n `);\n await elementUpdated(el);\n\n const firstItem = el.querySelector(\n 'sp-menu-item:nth-of-type(1)'\n ) as MenuItem;\n const thirdItem = el.querySelector(\n 'sp-menu-item:nth-of-type(3)'\n ) as MenuItem;\n\n el.focus();\n\n expect(\n document.activeElement === firstItem,\n 'first item is active element'\n ).to.be.true;\n expect(firstItem.focused, 'first item focused').to.be.true;\n el.dispatchEvent(arrowDownEvent());\n el.dispatchEvent(arrowDownEvent());\n expect(thirdItem.focused, 'third item focused').to.be.true;\n // imitate tabbing away\n thirdItem.dispatchEvent(tabEvent());\n el.dispatchEvent(\n new CustomEvent('focusout', {\n composed: true,\n bubbles: true,\n })\n );\n await nextFrame();\n\n el.focus();\n // focus management should start again from the first item.\n await sendKeys({ press: 'ArrowDown' });\n expect(firstItem.focused, 'first item focused again').to.be.true;\n });\n\n it('handles focus across focused MenuItem removals', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu id=\"remove\">\n <sp-menu-item id=\"#deselect\">Deselect</sp-menu-item>\n <sp-menu-item selected>Select Inverse</sp-menu-item>\n <sp-menu-item>Third Item</sp-menu-item>\n </sp-menu>\n `);\n await waitUntil(\n () => el.childItems.length == 3,\n 'expected menu to manage 3 items',\n { timeout: 100 }\n );\n\n expect(el.children.length).to.equal(el.childItems.length);\n\n el.focus();\n\n const children = [...el.children];\n\n expect(children[1], 'selected element is focused').to.equal(\n document.activeElement\n );\n\n await sendKeys({ press: 'ArrowUp' });\n\n expect(children[0], 'first element is focused').to.equal(\n document.activeElement\n );\n //@todo this test fails on Chromium\n if (isFirefox() || isWebKit()) {\n children[0].remove();\n await elementUpdated(el);\n expect(children[1], 'selected element is focused').to.equal(\n document.activeElement\n );\n\n await sendKeys({ press: 'ArrowUp' });\n expect(children[2], 'last element is focused').to.equal(\n document.activeElement\n );\n }\n });\n\n it('handles single selection', async () => {\n const el = await fixture<Menu>(html`\n <sp-menu selects=\"single\">\n <sp-menu-item selected>First</sp-menu-item>\n <sp-menu-item>Second</sp-menu-item>\n <sp-menu-item>Third</sp-menu-item>\n </sp-menu>\n `);\n await elementUpdated(el);\n\n const firstItem = el.querySelector(\n 'sp-menu-item:nth-of-type(1)'\n ) as MenuItem;\n\n const secondItem = el.querySelector(\n 'sp-menu-item:nth-of-type(2)'\n ) as MenuItem;\n\n expect(firstItem.getAttribute('role')).to.equal('menuitemradio');\n expect(secondItem.getAttribute('role')).to.equal('menuitemradio');\n\n expect(firstItem.selected).to.be.true;\n expect(secondItem.selected).to.be.false;\n expect(firstItem.getAttribute('aria-checked')).to.equal('true');\n expect(secondItem.getAttribute('aria-checked')).to.equal('false');\n expect(el.value).to.equal('First');\n\n secondItem.click();\n\n await elementUpdated(el);\n await elementUpdated(firstItem);\n await elementUpdated(secondItem);\n\n expect(firstItem.selected).to.be.false;\n expect(secondItem.selected).to.be.true;\n expect(firstItem.getAttribute('aria-checked')).to.equal('false');\n expect(secondItem.getAttribute('aria-checked')).to.equal('true');\n expect(el.value).to.equal('Second');\n });\n it('does not make a selection on a right/middle mouse click', async () => {\n const changeSpy = spy();\n const el = await fixture<Menu>(html`\n <sp-menu\n selects=\"single\"\n @change=${() => {\n changeSpy();\n }}\n >\n <sp-menu-item>First</sp-menu-item>\n <sp-menu-item>Second</sp-menu-item>\n <sp-menu-item>Third</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 3,\n 'expected menu to manage 3 items'\n );\n await elementUpdated(el);\n\n const secondItem = el.querySelector(\n 'sp-menu-item:nth-of-type(2)'\n ) as MenuItem;\n\n // send right mouse click to the secondItem\n const rect = secondItem.getBoundingClientRect();\n sendMouse({\n steps: [\n {\n position: [\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n ],\n type: 'click',\n options: {\n button: 'right',\n },\n },\n ],\n });\n await elementUpdated(el);\n await elementUpdated(secondItem);\n await aTimeout(150);\n expect(changeSpy.callCount, 'no change').to.equal(0);\n\n // send middle mouse click to the secondItem\n sendMouse({\n steps: [\n {\n position: [\n rect.left + rect.width / 2,\n rect.top + rect.height / 2,\n ],\n type: 'click',\n options: {\n button: 'middle',\n },\n },\n ],\n });\n await elementUpdated(el);\n await elementUpdated(secondItem);\n await aTimeout(150);\n expect(changeSpy.callCount, 'no change').to.equal(0);\n });\n it('handles multiple selection', async () => {\n const changeSpy = spy();\n const el = await fixture<Menu>(html`\n <sp-menu selects=\"multiple\" @change=${() => changeSpy()}>\n <sp-menu-item selected>First</sp-menu-item>\n <sp-menu-item>Second</sp-menu-item>\n <sp-menu-item>Third</sp-menu-item>\n </sp-menu>\n `);\n\n await waitUntil(\n () => el.childItems.length == 3,\n 'expected menu to manage 3 items'\n );\n await elementUpdated(el);\n\n const firstItem = el.querySelector(\n 'sp-menu-item:nth-of-type(1)'\n ) as MenuItem;\n\n const secondItem = el.querySelector(\n 'sp-menu-item:nth-of-type(2)'\n ) as MenuItem;\n\n expect(firstItem.getAttribute('role')).to.equal('menuitemcheckbox');\n expect(secondItem.getAttribute('role')).to.equal('menuitemcheckbox');\n\n expect(firstItem.selected).to.be.true;\n expect(secondItem.selected).to.be.false;\n expect(firstItem.getAttribute('aria-checked')).to.equal('true');\n expect(secondItem.getAttribute('aria-checked')).to.equal('false');\n expect(el.value).to.equal('First');\n expect(el.selectedItems.length).to.equal(1);\n\n secondItem.click();\n\n await elementUpdated(el);\n await elementUpdated(firstItem);\n await elementUpdated(secondItem);\n\n expect(changeSpy.callCount, 'one change').to.equal(1);\n expect(firstItem.selected).to.be.true;\n expect(secondItem.selected).to.be.true;\n expect(firstItem.getAttribute('aria-checked')).to.equal('true');\n expect(secondItem.getAttribute('aria-checked')).to.equal('true');\n expect(el.value).to.equal('First,Second');\n expect(el.selectedItems.length).to.equal(2);\n\n firstItem.click();\n\n await elementUpdated(el);\n await elementUpdated(firstItem);\n await elementUpdated(secondItem);\n\n expect(changeSpy.callCount, 'two changes').to.equal(2);\n expect(firstItem.selected).to.be.false;\n expect(secondItem.selected).to.be.true;\n expect(firstItem.getAttribute('aria-checked')).to.equal('false');\n expect(secondItem.getAttribute('aria-checked')).to.equal('true');\n expect(el.value).to.equal('Second');\n expect(el.selectedItems.length).to.equal(1);\n });\n it('can be controlled to manage a single togglable selection', async () => {\n const toggleSingleSelected = (\n event: Event & { target: Menu }\n ): void => {\n event.preventDefault();\n const selected: string[] = [];\n if (event.target.selected.length) {\n selected.push(event.target.selected.at(-1) as string);\n }\n event.target.updateComplete.then(() => {\n event.target.selected = selected;\n });\n };\n const el = await fixture<Menu>(html`\n <sp-menu selects=\"multiple\" @change=${toggleSingleSelected}>\n <sp-menu-item value=\"1\">First</sp-menu-item>\n <sp-menu-item value=\"2\">Second</sp-menu-item>\n <sp-menu-item value=\"3\">Third</sp-menu-item>\n </sp-menu>\n `);\n await nextFrame();\n await nextFrame();\n expect(el.selected).to.deep.equal([]);\n\n const items = [...el.children] as MenuItem[];\n await Promise.all(items.map((child) => child.updateComplete));\n\n items[0].click();\n await nextFrame();\n await nextFrame();\n expect(el.selected).to.deep.equal(['1']);\n\n items[0].click();\n await nextFrame();\n await nextFrame();\n expect(el.selected).to.deep.equal([]);\n\n items[1].click();\n await nextFrame();\n await nextFrame();\n expect(el.selected).to.deep.equal(['2']);\n\n items[2].click();\n await nextFrame();\n await nextFrame();\n expect(el.selected).to.deep.equal(['3']);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|