Skip to content

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

appinventor/blocklyeditor/src/backpack.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,10 @@ AI.Blockly.Backpack = class extends Blockly.DragTarget {
384384
if (contents === undefined || contents.length === 0) {
385385
return;
386386
}
387+
let headlessWorkspace = null;
387388
let lastPastedBlock = null;
388389
try {
390+
headlessWorkspace = new Blockly.Workspace();
389391
Blockly.Events.setGroup(true);
390392
for (let i = 0; i < contents.length; i++) {
391393
const xml = Blockly.utils.xml.textToDom(contents[i]);
@@ -401,7 +403,17 @@ AI.Blockly.Backpack = class extends Blockly.DragTarget {
401403
}
402404
}
403405
if (ok) {
404-
const newBlock = this.workspace_.paste(blk);
406+
const tempBlock = Blockly.Xml.domToBlock(blk, headlessWorkspace);
407+
// Manually construct BlockCopyData since headless blocks don't have toCopyData()
408+
// See: https://github.com/google/blockly/blob/blockly-v11.2.2/core/block_svg.ts#L851-L868
409+
const copyData = {
410+
paster: Blockly.clipboard.BlockPaster.TYPE,
411+
blockState: Blockly.serialization.blocks.save(tempBlock, {
412+
addNextBlocks: false,
413+
}),
414+
typeCounts: Blockly.common.getBlockTypeCounts(tempBlock, true)
415+
};
416+
const newBlock = Blockly.clipboard.paste(copyData, this.workspace_);
405417
if (newBlock) {
406418
lastPastedBlock = newBlock;
407419
}
@@ -412,6 +424,7 @@ AI.Blockly.Backpack = class extends Blockly.DragTarget {
412424
}
413425
} finally {
414426
Blockly.Events.setGroup(false);
427+
headlessWorkspace.dispose();
415428
}
416429
if (lastPastedBlock) {
417430
Blockly.common.setSelected(lastPastedBlock);

0 commit comments

Comments
 (0)