diff --git a/core/serialization/blocks.js b/core/serialization/blocks.js index 2e3b76bbdc5..6aabb08eebd 100644 --- a/core/serialization/blocks.js +++ b/core/serialization/blocks.js @@ -514,8 +514,13 @@ const loadIcons = function(block, state) { const comment = state['icons']['comment']; if (comment) { block.setCommentText(comment['text']); - block.commentModel.pinned = comment['pinned']; - block.commentModel.size = new Size(comment['width'], comment['height']); + // Load if saved. (Cleaned unnecessary attributes when in the trashcan.) + if ('pinned' in comment) { + block.commentModel.pinned = comment['pinned']; + } + if ('width' in comment && 'height' in comment) { + block.commentModel.size = new Size(comment['width'], comment['height']); + } if (comment['pinned'] && block.rendered && !block.isInFlyout) { // Give the block a chance to be positioned and rendered before showing. const blockSvg = /** @type {!BlockSvg} */ (block); diff --git a/tests/deps.mocha.js b/tests/deps.mocha.js index c43d84e13a5..ba58a1b3151 100644 --- a/tests/deps.mocha.js +++ b/tests/deps.mocha.js @@ -4,6 +4,7 @@ goog.addDependency('../../tests/mocha/block_change_event_test.js', ['Blockly.tes goog.addDependency('../../tests/mocha/block_create_event_test.js', ['Blockly.test.blockCreateEvent'], ['Blockly.Events.utils', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../tests/mocha/block_json_test.js', ['Blockly.test.blockJson'], ['Blockly.Input'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../tests/mocha/block_test.js', ['Blockly.test.blocks'], ['Blockly.ConnectionType', 'Blockly.Events.utils', 'Blockly.blocks', 'Blockly.test.helpers.blockDefinitions', 'Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.warnings'], {'lang': 'es6', 'module': 'goog'}); +goog.addDependency('../../tests/mocha/comment_deserialization_test.js', ['Blockly.test.commentDeserialization'], ['Blockly.test.helpers.setupTeardown', 'Blockly.test.helpers.userInput'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../tests/mocha/comment_test.js', ['Blockly.test.comments'], ['Blockly.Events.utils', 'Blockly.test.helpers.events', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../tests/mocha/connection_checker_test.js', ['Blockly.test.connectionChecker'], ['Blockly.ConnectionType', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../tests/mocha/connection_db_test.js', ['Blockly.test.connectionDb'], ['Blockly.ConnectionType', 'Blockly.test.helpers.setupTeardown'], {'lang': 'es6', 'module': 'goog'}); diff --git a/tests/mocha/comment_deserialization_test.js b/tests/mocha/comment_deserialization_test.js new file mode 100644 index 00000000000..f3eb48dc5e1 --- /dev/null +++ b/tests/mocha/comment_deserialization_test.js @@ -0,0 +1,117 @@ +/** + * @license + * Copyright 2022 Google LLC + * SPDX-License-Identifier: Apache-2.0 + */ + +goog.module('Blockly.test.commentDeserialization'); + +const {sharedTestSetup, sharedTestTeardown} = goog.require('Blockly.test.helpers.setupTeardown'); +const {simulateClick} = goog.require('Blockly.test.helpers.userInput'); + + +suite('Comment Deserialization', function() { + setup(function() { + sharedTestSetup.call(this); + Blockly.defineBlocksWithJsonArray([ + { + "type": "empty_block", + "message0": "", + "args0": [], + }, + ]); + const toolboxXml = ` + + + + test toolbox text + + + + `; + this.workspace = Blockly.inject('blocklyDiv', { + comments: true, + scrollbars: true, + trashcan: true, + maxTrashcanContents: Infinity, + toolbox: Blockly.Xml.textToDom(toolboxXml), + }); + }); + teardown(function() { + sharedTestTeardown.call(this); + }); + suite('Pattern', function() { + teardown(function() { + // Delete all blocks. + this.workspace.clear(); + }); + function createBlock(workspace) { + const block = Blockly.Xml.domToBlock(Blockly.Xml.textToDom( + '' + ), workspace); + block.setCommentText('test text'); + return block; + } + function assertComment(workspace, text) { + // Show comment. + const block = workspace.getAllBlocks()[0]; + block.comment.setVisible(true); + // Check comment bubble size. + const comment = block.getCommentIcon(); + const bubbleSize = comment.getBubbleSize(); + chai.assert.isNotNaN(bubbleSize.width); + chai.assert.isNotNaN(bubbleSize.height); + // Check comment text. + chai.assert.equal(comment.textarea_.value, text); + } + test('Trashcan', function() { + // Create block. + this.block = createBlock(this.workspace); + // Delete block. + this.block.checkAndDelete(); + chai.assert.equal(this.workspace.getAllBlocks().length, 0); + // Open trashcan. + simulateClick(this.workspace.trashcan.svgGroup_); + // Place from trashcan. + simulateClick(this.workspace.trashcan.flyout.svgGroup_.querySelector('.blocklyDraggable')); + chai.assert.equal(this.workspace.getAllBlocks().length, 1); + // Check comment. + assertComment(this.workspace, 'test text'); + }); + test('Undo', function() { + // Create block. + this.block = createBlock(this.workspace); + // Delete block. + this.block.checkAndDelete(); + chai.assert.equal(this.workspace.getAllBlocks().length, 0); + // Undo. + this.workspace.undo(false); + chai.assert.equal(this.workspace.getAllBlocks().length, 1); + // Check comment. + assertComment(this.workspace, 'test text'); + }); + test('Redo', function() { + // Create block. + this.block = createBlock(this.workspace); + // Undo & undo. + this.workspace.undo(false); + this.workspace.undo(false); + chai.assert.equal(this.workspace.getAllBlocks().length, 0); + // Redo & redo. + this.workspace.undo(true); + this.workspace.undo(true); + chai.assert.equal(this.workspace.getAllBlocks().length, 1); + // Check comment. + assertComment(this.workspace, 'test text'); + }); + test('Toolbox', function() { + // Place from toolbox. + const toolbox = this.workspace.getToolbox(); + simulateClick(toolbox.HtmlDiv.querySelector('.blocklyTreeRow')); + simulateClick(toolbox.getFlyout().svgGroup_.querySelector('.blocklyDraggable')); + chai.assert.equal(this.workspace.getAllBlocks().length, 1); + // Check comment. + assertComment(this.workspace, 'test toolbox text'); + }); + }); +}); diff --git a/tests/mocha/index.html b/tests/mocha/index.html index 3d1cfaa9cde..b845630702a 100644 --- a/tests/mocha/index.html +++ b/tests/mocha/index.html @@ -59,6 +59,7 @@ goog.require('Blockly.test.blockJson'); goog.require('Blockly.test.blocks'); goog.require('Blockly.test.comments'); + goog.require('Blockly.test.commentDeserialization'); goog.require('Blockly.test.connectionChecker'); goog.require('Blockly.test.connectionDb'); goog.require('Blockly.test.connection');