From b7e6d3704a911911d4844fcdafc81db028a40fe0 Mon Sep 17 00:00:00 2001 From: Beka Westberg Date: Wed, 10 Jul 2019 16:58:25 -0700 Subject: [PATCH] Fixed Procedure Argument Escaping (#2626) * Refactored procedure decompose to build XML node by node. Fixed argument name escaping. * Fixed review comments. --- blocks/procedures.js | 48 ++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/blocks/procedures.js b/blocks/procedures.js index ba252e162..7a0abf716 100644 --- a/blocks/procedures.js +++ b/blocks/procedures.js @@ -164,26 +164,44 @@ Blockly.Blocks['procedures_defnoreturn'] = { * @this Blockly.Block */ decompose: function(workspace) { - var xml = Blockly.Xml.textToDom( - '' + - ' ' + - ''); - var node = xml.getElementsByTagName('statement')[0]; + /* + * Creates the following XML: + * + * + * + * arg1_name + * etc... + * + * + * + */ + + var containerBlockNode = Blockly.utils.xml.createElement('block'); + containerBlockNode.setAttribute('type', 'procedures_mutatorcontainer'); + var statementNode = Blockly.utils.xml.createElement('statement'); + statementNode.setAttribute('name', 'STACK'); + containerBlockNode.appendChild(statementNode); + + var node = statementNode; for (var i = 0; i < this.arguments_.length; i++) { - node.appendChild(Blockly.Xml.textToDom( - '' + - ' ' + this.arguments_[i] + '' + - ' ' + - '' - )); - node = node.getElementsByTagName('next')[0]; + var argBlockNode = Blockly.utils.xml.createElement('block'); + argBlockNode.setAttribute('type', 'procedures_mutatorarg'); + var fieldNode = Blockly.utils.xml.createElement('field'); + fieldNode.setAttribute('name', 'NAME'); + var argumentName = Blockly.utils.xml.createTextNode(this.arguments_[i]); + fieldNode.appendChild(argumentName); + argBlockNode.appendChild(fieldNode); + var nextNode = Blockly.utils.xml.createElement('next'); + argBlockNode.appendChild(nextNode); + + node.appendChild(argBlockNode); + node = nextNode; } - var containerBlock = Blockly.Xml.domToBlock(xml, workspace); + var containerBlock = Blockly.Xml.domToBlock(containerBlockNode, workspace); if (this.type == 'procedures_defreturn') { - containerBlock.setFieldValue( - this.hasStatements_ ? 'TRUE' : 'FALSE', 'STATEMENTS'); + containerBlock.setFieldValue(this.hasStatements_, 'STATEMENTS'); } else { containerBlock.removeInput('STATEMENT_INPUT'); }