From f7c1384f4a78cdbf348d6eac694410bb80723dfb Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Mon, 9 Aug 2021 15:38:16 +0000 Subject: [PATCH 1/2] fix: add throwing errors for bad shadows --- core/connection.js | 21 +++++++++++---- tests/mocha/connection_test.js | 47 ++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/core/connection.js b/core/connection.js index 1dd1e5c1d04..eeb0718c3cc 100644 --- a/core/connection.js +++ b/core/connection.js @@ -781,12 +781,23 @@ Blockly.Connection.prototype.createShadowBlock_ = function(attemptToConnect) { if (shadowDom) { blockShadow = Blockly.Xml.domToBlock(shadowDom, parentBlock.workspace); if (attemptToConnect) { - if (blockShadow.outputConnection) { - this.connect(blockShadow.outputConnection); - } else if (blockShadow.previousConnection) { - this.connect(blockShadow.previousConnection); + if (this.type == Blockly.connectionTypes.INPUT_VALUE) { + if (!blockShadow.outputConnection) { + throw new Error('Shadow block is missing an output connection'); + } + if (!this.connect(blockShadow.outputConnection)) { + throw new Error('Could not connect shadow block to connection'); + } + } else if (this.type == Blockly.connectionTypes.NEXT_STATEMENT) { + if (!blockShadow.previousConnection) { + throw new Error('Shadow block is missing previous connection'); + } + if (!this.connect(blockShadow.previousConnection)) { + throw new Error('Could not connect shadow block to connection'); + } } else { - throw Error('Shadow block does not have output or previous statement.'); + throw new Error( + 'Cannot connect a shadow block to a previous/output connection'); } } return blockShadow; diff --git a/tests/mocha/connection_test.js b/tests/mocha/connection_test.js index 9de52c1c324..dcff36b631c 100644 --- a/tests/mocha/connection_test.js +++ b/tests/mocha/connection_test.js @@ -2512,6 +2512,53 @@ suite('Connection', function() { assertNextNotHasBlock(parent); }); }); + + suite('Invalid', function() { + test('Attach to output', function() { + const block = this.workspace.newBlock('row_block'); + chai.assert.throws(() => + block.outputConnection.setShadowState({'type': 'row_block'})); + }); + + test('Attach to previous', function() { + const block = this.workspace.newBlock('stack_block'); + chai.assert.throws(() => + block.previousConnection.setShadowState( + {'type': 'stack_block'})); + }); + + test('Missing output', function() { + const block = this.workspace.newBlock('row_block'); + chai.assert.throws(() => + block.outputConnection.setShadowState({'type': 'stack_block'})); + }); + + test('Missing previous', function() { + const block = this.workspace.newBlock('stack_block'); + chai.assert.throws(() => + block.previousConnection.setShadowState({'type': 'row_block'})); + }); + + test('Invalid connection checks, output', function() { + const block = this.workspace.newBlock('logic_operation'); + chai.assert.throws(() => + block.getInput('A').connection.setShadowState( + {'type': 'math_number'})); + }); + + test('Invalid connection checks, previous', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "stack_checks_block", + "message0": "", + "previousStatement": "check 1", + "nextStatement": "check 2" + }]); + const block = this.workspace.newBlock('stack_checks_block'); + chai.assert.throws(() => + block.nextConnection.setShadowState( + {'type': 'stack_checks_block'})); + }); + }); }); }); }); From 7e4a68f0a2cbfdc81d76e43f2029011e35aabd5e Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Fri, 20 Aug 2021 21:26:20 +0000 Subject: [PATCH 2/2] tests: add tests for setShadowDom --- tests/mocha/connection_test.js | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/mocha/connection_test.js b/tests/mocha/connection_test.js index dcff36b631c..ea0a9a5ace9 100644 --- a/tests/mocha/connection_test.js +++ b/tests/mocha/connection_test.js @@ -1292,6 +1292,56 @@ suite('Connection', function() { assertNextNotHasBlock(parent); }); }); + + suite('Invalid', function() { + test('Attach to output', function() { + const block = this.workspace.newBlock('row_block'); + chai.assert.throws(() => + block.outputConnection.setShadowDom(Blockly.Xml.textToDom( + ''))); + }); + + test('Attach to previous', function() { + const block = this.workspace.newBlock('stack_block'); + chai.assert.throws(() => + block.previousConnection.setShadowDom(Blockly.Xml.textToDom( + ''))); + }); + + test('Missing output', function() { + const block = this.workspace.newBlock('row_block'); + chai.assert.throws(() => + block.outputConnection.setShadowDom(Blockly.Xml.textToDom( + ''))); + }); + + test('Missing previous', function() { + const block = this.workspace.newBlock('stack_block'); + chai.assert.throws(() => + block.previousConnection.setShadowDom(Blockly.Xml.textToDom( + ''))); + }); + + test('Invalid connection checks, output', function() { + const block = this.workspace.newBlock('logic_operation'); + chai.assert.throws(() => + block.getInput('A').connection.setShadowDom( + Blockly.Xml.textToDom(''))); + }); + + test('Invalid connection checks, previous', function() { + Blockly.defineBlocksWithJsonArray([{ + "type": "stack_checks_block", + "message0": "", + "previousStatement": "check 1", + "nextStatement": "check 2" + }]); + const block = this.workspace.newBlock('stack_checks_block'); + chai.assert.throws(() => + block.nextConnection.setShadowDom(Blockly.Xml.textToDom( + ''))); + }); + }); }); suite('setShadowState', function() {