From 37dbf5f35f63ba13be0f48ea357c38056a64c775 Mon Sep 17 00:00:00 2001 From: Matt Hillsdon Date: Tue, 9 Jun 2026 15:03:51 +0100 Subject: [PATCH] fix: don't allow disconnecting shadow blocks (#9964) --- packages/blockly/core/shortcut_items.ts | 4 +++- .../blockly/tests/mocha/shortcut_items_test.js | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/blockly/core/shortcut_items.ts b/packages/blockly/core/shortcut_items.ts index 9775ec86d..3d7bdc979 100644 --- a/packages/blockly/core/shortcut_items.ts +++ b/packages/blockly/core/shortcut_items.ts @@ -940,10 +940,12 @@ export function registerDisconnectBlock() { const disconnectShortcut: ShortcutRegistry.KeyboardShortcut = { name: names.DISCONNECT, preconditionFn: (workspace, scope) => { + const focused = scope.focusedNode; const result = !workspace.isDragging() && !workspace.isReadOnly() && - scope.focusedNode instanceof BlockSvg; + focused instanceof BlockSvg && + !focused.isShadow(); if (!result) { workspace.getAudioManager().playErrorBeep(); diff --git a/packages/blockly/tests/mocha/shortcut_items_test.js b/packages/blockly/tests/mocha/shortcut_items_test.js index 503079c4c..33fa180ac 100644 --- a/packages/blockly/tests/mocha/shortcut_items_test.js +++ b/packages/blockly/tests/mocha/shortcut_items_test.js @@ -1036,6 +1036,23 @@ suite('Keyboard Shortcut Items', function () { assert.deepEqual(bounds, this.blockE.getBoundingRectangle()); }); + test('Does nothing for a shadow block', function () { + this.blockH.setShadow(true); + Blockly.getFocusManager().focusNode(this.blockH); + assert.isTrue(this.blockH.outputConnection.isConnected()); + + this.injectionDiv.dispatchEvent( + createKeyDownEvent(Blockly.utils.KeyCodes.X), + ); + + // The shadow should remain connected to its parent input. + assert.isTrue(this.blockH.outputConnection.isConnected()); + assert.strictEqual( + Blockly.getFocusManager().getFocusedNode(), + this.blockH, + ); + }); + test('Disconnects child blocks when triggered on top stack block', function () { Blockly.getFocusManager().focusNode(this.blockB); assert.isTrue(this.blockB.nextConnection.isConnected());