From 098472376bd85a24a8fc23235d81c48e28296c1d Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Thu, 30 Aug 2018 16:43:01 -0700 Subject: [PATCH 1/4] Bumping develop version to 1.20180831.0-develop --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 31c183160..6415f74ce 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "1.20180629.0-develop", + "version": "1.20180831.0-develop", "description": "Blockly is a library for building visual programming editors.", "main": "blockly_node_javascript_en.js", "keywords": [ From b8a1873f0104aa4568526f40f2aad396fad61ab4 Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Fri, 31 Aug 2018 12:42:38 -0700 Subject: [PATCH 2/4] Converting bad block warning into an error. --- core/block.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/block.js b/core/block.js index d73336697..8b451bd6c 100644 --- a/core/block.js +++ b/core/block.js @@ -53,14 +53,13 @@ goog.require('goog.math.Coordinate'); * @param {string=} opt_id Optional ID. Use this ID if provided, otherwise * create a new ID. * @constructor + * @throw When block is not valid or block name is not allowed. */ Blockly.Block = function(workspace, prototypeName, opt_id) { if (typeof Blockly.Generator.prototype[prototypeName] !== 'undefined') { - console.warn('FUTURE ERROR: Block prototypeName "' + prototypeName + - '" conflicts with Blockly.Generator members. Registering Generators ' + - 'for this block type will incur errors.' + - '\nThis name will be DISALLOWED (throwing an error) in future ' + - 'versions of Blockly.'); + // Occluding Generator class members is not allowed. + throw Error('Block prototypeName "' + prototypeName + + '" conflicts with Blockly.Generator members.'); } /** @type {string} */ From 411ec9724e858d5c8b457b85c058f4c17b6d255d Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Tue, 4 Sep 2018 13:31:53 -0700 Subject: [PATCH 3/4] Replacing node.parentNode.removeChild(node) ...with Blockly.utils.removeNode(..), which includes a null/undefined check on parentNode before continuing. --- core/block_animations.js | 4 ++-- core/block_svg.js | 2 +- core/bubble.js | 2 +- core/field.js | 2 +- core/field_dropdown.js | 2 +- core/field_image.js | 2 +- core/field_label.js | 2 +- core/flyout_base.js | 4 ++-- core/flyout_button.js | 2 +- core/icon.js | 2 +- core/rendered_connection.js | 2 +- core/scrollbar.js | 4 ++-- core/toolbox.js | 2 +- core/trashcan.js | 2 +- core/utils.js | 10 ++++++++++ core/workspace_comment_svg.js | 2 +- core/workspace_svg.js | 4 ++-- core/xml.js | 4 ++-- core/zoom_controls.js | 2 +- 19 files changed, 33 insertions(+), 23 deletions(-) diff --git a/core/block_animations.js b/core/block_animations.js index 3d35dfee1..d4ad8048f 100644 --- a/core/block_animations.js +++ b/core/block_animations.js @@ -81,7 +81,7 @@ Blockly.BlockAnimations.disposeUiStep_ = function(clone, rtl, start, var ms = new Date - start; var percent = ms / 150; if (percent > 1) { - clone.parentNode.removeChild(clone); + Blockly.utils.removeNode(clone); } else { var x = clone.translateX_ + (rtl ? -1 : 1) * clone.bBox_.width * workspaceScale / 2 * percent; @@ -141,7 +141,7 @@ Blockly.BlockAnimations.connectionUiStep_ = function(ripple, start, scale) { var ms = new Date - start; var percent = ms / 150; if (percent > 1) { - ripple.parentNode.removeChild(ripple); + Blockly.utils.removeNode(ripple); } else { ripple.setAttribute('r', percent * 25 * scale); ripple.style.opacity = 1 - percent; diff --git a/core/block_svg.js b/core/block_svg.js index 661609f0b..54445d3ff 100644 --- a/core/block_svg.js +++ b/core/block_svg.js @@ -855,7 +855,7 @@ Blockly.BlockSvg.prototype.dispose = function(healStack, animate) { } Blockly.BlockSvg.superClass_.dispose.call(this, healStack); - this.svgGroup_.parentNode.removeChild(this.svgGroup_); + Blockly.utils.removeNode(this.svgGroup_); blockWorkspace.resizeContents(); // Sever JavaScript to DOM connections. this.svgGroup_ = null; diff --git a/core/bubble.js b/core/bubble.js index f0cc1182f..a0a7d67c7 100644 --- a/core/bubble.js +++ b/core/bubble.js @@ -604,7 +604,7 @@ Blockly.Bubble.prototype.setColour = function(hexColour) { Blockly.Bubble.prototype.dispose = function() { Blockly.Bubble.unbindDragEvents_(); // Dispose of and unlink the bubble. - this.bubbleGroup_.parentNode.removeChild(this.bubbleGroup_); + Blockly.utils.removeNode(this.bubbleGroup_); this.bubbleGroup_ = null; this.bubbleArrow_ = null; this.bubbleBack_ = null; diff --git a/core/field.js b/core/field.js index c81ab904b..7b0830004 100644 --- a/core/field.js +++ b/core/field.js @@ -226,7 +226,7 @@ Blockly.Field.prototype.dispose = function() { } this.sourceBlock_ = null; if (this.fieldGroup_) { - this.fieldGroup_.parentNode.removeChild(this.fieldGroup_); + Blockly.utils.removeNode(this.fieldGroup_); this.fieldGroup_ = null; } this.textElement_ = null; diff --git a/core/field_dropdown.js b/core/field_dropdown.js index 6c4908871..8b69950a8 100644 --- a/core/field_dropdown.js +++ b/core/field_dropdown.js @@ -441,7 +441,7 @@ Blockly.FieldDropdown.prototype.render_ = function() { this.textElement_.removeChild(child); } if (this.imageElement_) { - this.imageElement_.parentNode.removeChild(this.imageElement_); + Blockly.utils.removeNode(this.imageElement_); this.imageElement_ = null; } diff --git a/core/field_image.js b/core/field_image.js index f6d0c534f..a2627eee5 100644 --- a/core/field_image.js +++ b/core/field_image.js @@ -120,7 +120,7 @@ Blockly.FieldImage.prototype.init = function() { */ Blockly.FieldImage.prototype.dispose = function() { if (this.fieldGroup_) { - this.fieldGroup_.parentNode.removeChild(this.fieldGroup_); + Blockly.utils.removeNode(this.fieldGroup_); this.fieldGroup_ = null; } this.imageElement_ = null; diff --git a/core/field_label.js b/core/field_label.js index c473d2be5..eeaee34f9 100644 --- a/core/field_label.js +++ b/core/field_label.js @@ -96,7 +96,7 @@ Blockly.FieldLabel.prototype.init = function() { */ Blockly.FieldLabel.prototype.dispose = function() { if (this.textElement_) { - this.textElement_.parentNode.removeChild(this.textElement_); + Blockly.utils.removeNode(this.textElement_); this.textElement_ = null; } }; diff --git a/core/flyout_base.js b/core/flyout_base.js index 65b51ef4b..c7cce4b34 100644 --- a/core/flyout_base.js +++ b/core/flyout_base.js @@ -276,7 +276,7 @@ Blockly.Flyout.prototype.dispose = function() { this.workspace_ = null; } if (this.svgGroup_) { - this.svgGroup_.parentNode.removeChild(this.svgGroup_); + Blockly.utils.removeNode(this.svgGroup_); this.svgGroup_ = null; } this.svgBackground_ = null; @@ -526,7 +526,7 @@ Blockly.Flyout.prototype.clearOldBlocks_ = function() { for (var j = 0; j < this.mats_.length; j++) { var rect = this.mats_[j]; if (rect) { - rect.parentNode.removeChild(rect); + Blockly.utils.removeNode(rect); } } this.mats_.length = 0; diff --git a/core/flyout_button.js b/core/flyout_button.js index 718a9f692..c81e86ed2 100644 --- a/core/flyout_button.js +++ b/core/flyout_button.js @@ -239,7 +239,7 @@ Blockly.FlyoutButton.prototype.dispose = function() { Blockly.unbindEvent_(this.onMouseUpWrapper_); } if (this.svgGroup_) { - this.svgGroup_.parentNode.removeChild(this.svgGroup_); + Blockly.utils.removeNode(this.svgGroup_); this.svgGroup_ = null; } this.workspace_ = null; diff --git a/core/icon.js b/core/icon.js index 51c4d8e0d..6c259245d 100644 --- a/core/icon.js +++ b/core/icon.js @@ -96,7 +96,7 @@ Blockly.Icon.prototype.createIcon = function() { */ Blockly.Icon.prototype.dispose = function() { // Dispose of and unlink the icon. - this.iconGroup_.parentNode.removeChild(this.iconGroup_); + Blockly.utils.removeNode(this.iconGroup_); this.iconGroup_ = null; // Dispose of and unlink the bubble. this.setVisible(false); diff --git a/core/rendered_connection.js b/core/rendered_connection.js index cfcc375e3..8b786b26d 100644 --- a/core/rendered_connection.js +++ b/core/rendered_connection.js @@ -262,7 +262,7 @@ Blockly.RenderedConnection.prototype.unhideAll = function() { * Remove the highlighting around this connection. */ Blockly.RenderedConnection.prototype.unhighlight = function() { - Blockly.Connection.highlightedPath_.parentNode.removeChild(Blockly.Connection.highlightedPath_); + Blockly.utils.removeNode(Blockly.Connection.highlightedPath_); delete Blockly.Connection.highlightedPath_; }; diff --git a/core/scrollbar.js b/core/scrollbar.js index 26eadee43..116d6df67 100644 --- a/core/scrollbar.js +++ b/core/scrollbar.js @@ -72,7 +72,7 @@ Blockly.ScrollbarPair.prototype.oldHostMetrics_ = null; * Unlink from all DOM elements to prevent memory leaks. */ Blockly.ScrollbarPair.prototype.dispose = function() { - this.corner_.parentNode.removeChild(this.corner_); + Blockly.utils.removeNode(this.corner_); this.corner_ = null; this.workspace_ = null; this.oldHostMetrics_ = null; @@ -347,7 +347,7 @@ Blockly.Scrollbar.prototype.dispose = function() { Blockly.unbindEvent_(this.onMouseDownHandleWrapper_); this.onMouseDownHandleWrapper_ = null; - this.outerSvg_.parentNode.removeChild(this.outerSvg_); + Blockly.utils.removeNode(this.outerSvg_); this.outerSvg_ = null; this.svgGroup_ = null; this.svgBackground_ = null; diff --git a/core/toolbox.js b/core/toolbox.js index 382ed36c7..84fab3153 100644 --- a/core/toolbox.js +++ b/core/toolbox.js @@ -219,7 +219,7 @@ Blockly.Toolbox.prototype.init = function() { Blockly.Toolbox.prototype.dispose = function() { this.flyout_.dispose(); this.tree_.dispose(); - this.HtmlDiv.parentNode.removeChild(this.HtmlDiv); + Blockly.utils.removeNode(this.HtmlDiv); this.workspace_ = null; this.lastCategory_ = null; }; diff --git a/core/trashcan.js b/core/trashcan.js index 6b96a2889..bd6a70954 100644 --- a/core/trashcan.js +++ b/core/trashcan.js @@ -228,7 +228,7 @@ Blockly.Trashcan.prototype.init = function(bottom) { */ Blockly.Trashcan.prototype.dispose = function() { if (this.svgGroup_) { - this.svgGroup_.parentNode.removeChild(this.svgGroup_); + Blockly.utils.removeNode(this.svgGroup_); this.svgGroup_ = null; } this.svgLid_ = null; diff --git a/core/utils.js b/core/utils.js index 4d4e36f1f..ebfe37ba6 100644 --- a/core/utils.js +++ b/core/utils.js @@ -114,6 +114,16 @@ Blockly.utils.hasClass = function(element, className) { return (' ' + classes + ' ').indexOf(' ' + className + ' ') != -1; }; +/** + * Removes a node from its parent. No-op if not attached to a parent. + * @param {Node} node The node to remove. + * @return {Node} The node removed if removed; else, null. + */ +// Copied from Closure goog.dom.removeNode +Blockly.utils.removeNode = function(node) { + return node && node.parentNode ? node.parentNode.removeChild(node) : null; +}; + /** * Don't do anything for this event, just halt propagation. * @param {!Event} e An event. diff --git a/core/workspace_comment_svg.js b/core/workspace_comment_svg.js index 6f5e8ea0d..b65051d30 100644 --- a/core/workspace_comment_svg.js +++ b/core/workspace_comment_svg.js @@ -117,7 +117,7 @@ Blockly.WorkspaceCommentSvg.prototype.dispose = function() { Blockly.Events.fire(new Blockly.Events.CommentDelete(this)); } - this.svgGroup_.parentNode.removeChild(this.svgGroup_); + Blockly.utils.removeNode(this.svgGroup_); // Sever JavaScript to DOM connections. this.svgGroup_ = null; this.svgRect_ = null; diff --git a/core/workspace_svg.js b/core/workspace_svg.js index 6daf03c51..c37bd489a 100644 --- a/core/workspace_svg.js +++ b/core/workspace_svg.js @@ -511,7 +511,7 @@ Blockly.WorkspaceSvg.prototype.dispose = function() { } Blockly.WorkspaceSvg.superClass_.dispose.call(this); if (this.svgGroup_) { - this.svgGroup_.parentNode.removeChild(this.svgGroup_); + Blockly.utils.removeNode(this.svgGroup_); this.svgGroup_ = null; } this.svgBlockCanvas_ = null; @@ -558,7 +558,7 @@ Blockly.WorkspaceSvg.prototype.dispose = function() { // SVG is injected into (i.e. injectionDiv). var div = this.getParentSvg().parentNode; if (div) { - div.parentNode.removeChild(div); + Blockly.utils.removeNode(div); } } if (this.resizeHandlerWrapper_) { diff --git a/core/xml.js b/core/xml.js index 8916478d6..7a8712eda 100644 --- a/core/xml.js +++ b/core/xml.js @@ -289,7 +289,7 @@ Blockly.Xml.cloneShadow_ = function(shadow) { if (textNode.nodeType == 3 && textNode.data.trim() == '' && node.firstChild != textNode) { // Prune whitespace after a tag. - textNode.parentNode.removeChild(textNode); + Blockly.utils.removeNode(textNode); } } if (node) { @@ -297,7 +297,7 @@ Blockly.Xml.cloneShadow_ = function(shadow) { node = node.nextSibling; if (textNode.nodeType == 3 && textNode.data.trim() == '') { // Prune whitespace before a tag. - textNode.parentNode.removeChild(textNode); + Blockly.utils.removeNode(textNode); } } } diff --git a/core/zoom_controls.js b/core/zoom_controls.js index ad09fbf04..09ffe934c 100644 --- a/core/zoom_controls.js +++ b/core/zoom_controls.js @@ -122,7 +122,7 @@ Blockly.ZoomControls.prototype.init = function(bottom) { */ Blockly.ZoomControls.prototype.dispose = function() { if (this.svgGroup_) { - this.svgGroup_.parentNode.removeChild(this.svgGroup_); + Blockly.utils.removeNode(this.svgGroup_); this.svgGroup_ = null; } this.workspace_ = null; From 705f06eb2c65521961e18902faff900989fd51e0 Mon Sep 17 00:00:00 2001 From: Andrew n marshall Date: Tue, 4 Sep 2018 15:49:10 -0700 Subject: [PATCH 4/4] Bumping develop branch version to 1.20180904.0-develop --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6415f74ce..11b4e3645 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blockly", - "version": "1.20180831.0-develop", + "version": "1.20180904.0-develop", "description": "Blockly is a library for building visual programming editors.", "main": "blockly_node_javascript_en.js", "keywords": [