diff --git a/core/insertion_marker_manager.ts b/core/insertion_marker_manager.ts index e9d04f728..69d3d2cb9 100644 --- a/core/insertion_marker_manager.ts +++ b/core/insertion_marker_manager.ts @@ -271,6 +271,10 @@ export class InsertionMarkerManager { } } + for (const block of result.getDescendants(false)) { + block.setInsertionMarker(true); + } + result.setCollapsed(sourceBlock.isCollapsed()); result.setInputsInline(sourceBlock.getInputsInline()); diff --git a/tests/mocha/insertion_marker_manager_test.js b/tests/mocha/insertion_marker_manager_test.js index 26996fa95..75cad8ebc 100644 --- a/tests/mocha/insertion_marker_manager_test.js +++ b/tests/mocha/insertion_marker_manager_test.js @@ -177,6 +177,79 @@ suite('Insertion marker manager', function () { const markers = manager.getInsertionMarkers(); chai.assert.equal(markers.length, 2); }); + + suite('children being set as insertion markers', function () { + setup(function () { + Blockly.Blocks['shadows_in_init'] = { + init: function () { + this.appendValueInput('test').connection.setShadowState({ + 'type': 'math_number', + }); + this.setPreviousStatement(true); + }, + }; + + Blockly.Blocks['shadows_in_load'] = { + init: function () { + this.appendValueInput('test'); + this.setPreviousStatement(true); + }, + + loadExtraState: function () { + this.getInput('test').connection.setShadowState({ + 'type': 'math_number', + }); + }, + + saveExtraState: function () { + return true; + }, + }; + }); + + teardown(function () { + delete Blockly.Blocks['shadows_in_init']; + delete Blockly.Blocks['shadows_in_load']; + }); + + test('Shadows added in init are set as insertion markers', function () { + const state = { + 'blocks': { + 'blocks': [ + { + 'id': 'first', + 'type': 'shadows_in_init', + }, + ], + }, + }; + const manager = createBlocksAndManager(this.workspace, state); + const markers = manager.getInsertionMarkers(); + chai.assert.isTrue( + markers[0].getChildren()[0].isInsertionMarker(), + 'Expected the shadow block to be an insertion maker', + ); + }); + + test('Shadows added in `loadExtraState` are set as insertion markers', function () { + const state = { + 'blocks': { + 'blocks': [ + { + 'id': 'first', + 'type': 'shadows_in_load', + }, + ], + }, + }; + const manager = createBlocksAndManager(this.workspace, state); + const markers = manager.getInsertionMarkers(); + chai.assert.isTrue( + markers[0].getChildren()[0].isInsertionMarker(), + 'Expected the shadow block to be an insertion maker', + ); + }); + }); }); suite('Would delete block', function () {