+ //
+ //
- submenu
+ //
Item 1
+ // Item 2
+ //
+ //
+ test('handleOnOpen focuses first item inside submenu wrapper, not the button and then refocuses on close', () => {
+ const wrapperDiv = document.createElement('div');
+ wrapperDiv.setAttribute('tabIndex', '-1');
+ wrapperDiv.setAttribute('data-menu-item-wrapper', 'true');
+ const wrapperFocusSpy = jest.spyOn(wrapperDiv, 'focus');
+
+ // Should not be focused
+ const menuButton = document.createElement('button');
+ menuButton.setAttribute('data-menu-item', 'true');
+ wrapperDiv.appendChild(menuButton);
+ const buttonFocusSpy = jest.spyOn(menuButton, 'focus');
+
+ const submenu = document.createElement('div');
+
+ submenu.appendChild(item1);
+ submenu.appendChild(item2);
+
+ wrapperDiv.appendChild(submenu);
+
+ const itemFocusSpy = jest.spyOn(item1, 'focus');
+
+ const {result} = renderHook(() => useMenuNavigation({depth: 2, defaultIndexOnOpen: 0}), {
+ wrapper: createWrapper
+ });
+
+ result.current.menuRef.current = wrapperDiv;
+ result.current.handleOnOpen();
+
+ jest.runAllTimers();
+
+ expect(menuContextMock.openInnerMenu).toHaveBeenCalled();
+ expect(buttonFocusSpy).not.toHaveBeenCalled();
+ expect(itemFocusSpy).toHaveBeenCalled();
+
+ result.current.handleOnClose();
+ expect(menuContextMock.closeMenuByRef).toHaveBeenCalledWith(result.current.menuRef);
+ expect(wrapperFocusSpy).toHaveBeenCalled();
+ });
+
+ test('ENTER, SPACE and ARROW_RIGHT don"t interact with the button', () => {
+ const wrapperDiv = document.createElement('div');
+ wrapperDiv.setAttribute('tabIndex', '-1');
+ wrapperDiv.setAttribute('data-menu-item-wrapper', 'true');
+
+ const menuButton = document.createElement('button');
+ menuButton.setAttribute('data-menu-item', 'true');
+ wrapperDiv.appendChild(menuButton);
+ const buttonFocusSpy = jest.spyOn(menuButton, 'focus');
+
+ const submenu = document.createElement('div');
+
+ submenu.appendChild(item1);
+ submenu.appendChild(item2);
+
+ wrapperDiv.appendChild(submenu);
+
+ const {result} = renderHook(() => useMenuNavigation({depth: 2, defaultIndexOnOpen: 0}), {
+ wrapper: createWrapper
+ });
+
+ result.current.menuRef.current = wrapperDiv;
+ const keysToTest = [KEY.ENTER, KEY.SPACE, KEY.ARROW_RIGHT];
+
+ keysToTest.forEach(key => {
+ menuContextMock.openInnerMenu.mockClear();
+ result.current.handleKeyDown({
+ key,
+ preventDefault: jest.fn(),
+ stopPropagation: jest.fn()
+ });
+ expect(buttonFocusSpy).not.toHaveBeenCalled();
+ });
+ });
+});
diff --git a/packages/scratch-render/package.json b/packages/scratch-render/package.json
index 5284abbd8d..e69e7d7281 100644
--- a/packages/scratch-render/package.json
+++ b/packages/scratch-render/package.json
@@ -79,13 +79,13 @@
"playwright-chromium": "1.58.1",
"scratch-render-fonts": "1.0.252",
"scratch-semantic-release-config": "4.0.1",
- "scratch-storage": "6.1.5",
+ "scratch-storage": "6.1.7",
"scratch-webpack-configuration": "3.1.1",
"semantic-release": "25.0.3",
- "tap": "21.5.0",
+ "tap": "21.5.1",
"terser-webpack-plugin": "5.3.16",
"typedoc": "0.28.16",
- "webpack": "5.104.1",
+ "webpack": "5.105.0",
"webpack-cli": "5.1.4",
"webpack-dev-server": "5.2.3"
},
diff --git a/packages/scratch-svg-renderer/package.json b/packages/scratch-svg-renderer/package.json
index e63c0d8af0..1d9cd07ba8 100644
--- a/packages/scratch-svg-renderer/package.json
+++ b/packages/scratch-svg-renderer/package.json
@@ -72,8 +72,8 @@
"scratch-semantic-release-config": "4.0.1",
"scratch-webpack-configuration": "3.1.1",
"semantic-release": "25.0.3",
- "tap": "21.5.0",
- "webpack": "5.104.1",
+ "tap": "21.5.1",
+ "webpack": "5.105.0",
"webpack-cli": "5.1.4",
"webpack-dev-server": "5.2.3",
"xmldom": "0.1.31"
diff --git a/packages/scratch-vm/package.json b/packages/scratch-vm/package.json
index adbf67640f..930df325b6 100644
--- a/packages/scratch-vm/package.json
+++ b/packages/scratch-vm/package.json
@@ -76,7 +76,7 @@
"scratch-audio": "2.0.268",
"scratch-parser": "6.0.0",
"scratch-sb1-converter": "2.0.279",
- "scratch-storage": "6.1.5",
+ "scratch-storage": "6.1.7",
"scratch-translate-extension-languages": "1.0.7",
"text-encoding": "0.7.0",
"tslog": "4.10.2",
@@ -107,10 +107,10 @@
"script-loader": "0.7.2",
"semantic-release": "25.0.3",
"stats.js": "0.17.0",
- "tap": "21.5.0",
+ "tap": "21.5.1",
"tiny-worker": "2.3.0",
"typedoc": "0.28.16",
- "webpack": "5.104.1",
+ "webpack": "5.105.0",
"webpack-cli": "4.10.0",
"webpack-dev-server": "5.2.3"
}