diff --git a/core/xml.js b/core/xml.js index d7461644f..345e23534 100644 --- a/core/xml.js +++ b/core/xml.js @@ -193,7 +193,7 @@ Blockly.Xml.blockToDom = function(block, opt_noId) { } var shadow = input.connection.getShadowDom(); if (shadow && (!childBlock || !childBlock.isShadow())) { - container.appendChild(Blockly.Xml.cloneShadow_(shadow)); + container.appendChild(Blockly.Xml.cloneShadow_(shadow, opt_noId)); } if (childBlock) { container.appendChild(Blockly.Xml.blockToDom(childBlock, opt_noId)); @@ -233,7 +233,7 @@ Blockly.Xml.blockToDom = function(block, opt_noId) { } var shadow = block.nextConnection && block.nextConnection.getShadowDom(); if (shadow && (!nextBlock || !nextBlock.isShadow())) { - container.appendChild(Blockly.Xml.cloneShadow_(shadow)); + container.appendChild(Blockly.Xml.cloneShadow_(shadow, opt_noId)); } return element; @@ -242,15 +242,21 @@ Blockly.Xml.blockToDom = function(block, opt_noId) { /** * Deeply clone the shadow's DOM so that changes don't back-wash to the block. * @param {!Element} shadow A tree of XML elements. + * @param {boolean=} opt_noId True if the encoder should skip the block ID. * @return {!Element} A tree of XML elements. * @private */ -Blockly.Xml.cloneShadow_ = function(shadow) { +Blockly.Xml.cloneShadow_ = function(shadow, opt_noId) { shadow = shadow.cloneNode(true); // Walk the tree looking for whitespace. Don't prune whitespace in a tag. var node = shadow; var textNode; while (node) { + if (opt_noId && node.nodeName == 'shadow') { + // Strip off IDs from shadow blocks. There should never be a 'block' as + // a child of a 'shadow', so no need to check that. + node.removeAttribute('id'); + } if (node.firstChild) { node = node.firstChild; } else {