From fc8d4c90b44cf1e1827920b57057a1f1458dc8e9 Mon Sep 17 00:00:00 2001 From: Neil Fraser Date: Mon, 31 Jul 2017 17:07:41 +0100 Subject: [PATCH] Compatibility for Closure Compiler. (#1240) --- build.py | 25 ------------------------- core/block_svg.js | 19 +++++++------------ core/extensions.js | 23 +++++++++++------------ core/field_image.js | 2 +- core/trashcan.js | 5 +++-- core/utils.js | 2 +- core/workspace_svg.js | 1 - core/xml.js | 2 +- core/zoom_controls.js | 7 ++++--- i18n/create_messages.py | 6 +++--- 10 files changed, 31 insertions(+), 61 deletions(-) diff --git a/build.py b/build.py index e9f4f39e8..e70afbd36 100755 --- a/build.py +++ b/build.py @@ -377,31 +377,6 @@ class Gen_compressed(threading.Thread): code = HEADER + "\n" + json_data["compiledCode"] code = code.replace(remove, "") - - # Trim down Google's Apache licences. - # The Closure Compiler used to preserve these until August 2015. - # Delete this in a few months if the licences don't return. - LICENSE = re.compile("""/\\* - - [\w ]+ - - (Copyright \\d+ Google Inc.) - https://developers.google.com/blockly/ - - Licensed under the Apache License, Version 2.0 \(the "License"\); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -\\*/""") - code = re.sub(LICENSE, r"\n// \1 Apache License 2.0", code) - stats = json_data["statistics"] original_b = stats["originalSize"] compressed_b = stats["compressedSize"] diff --git a/core/block_svg.js b/core/block_svg.js index ac01745a2..79bfb942a 100644 --- a/core/block_svg.js +++ b/core/block_svg.js @@ -901,10 +901,8 @@ Blockly.BlockSvg.disposeUiStep_ = function(clone, rtl, start, workspaceScale) { var scale = (1 - percent) * workspaceScale; clone.setAttribute('transform', 'translate(' + x + ',' + y + ')' + ' scale(' + scale + ')'); - var closure = function() { - Blockly.BlockSvg.disposeUiStep_(clone, rtl, start, workspaceScale); - }; - setTimeout(closure, 10); + setTimeout(Blockly.BlockSvg.disposeUiStep_, 10, clone, rtl, start, + workspaceScale); } }; @@ -949,10 +947,8 @@ Blockly.BlockSvg.connectionUiStep_ = function(ripple, start, workspaceScale) { } else { ripple.setAttribute('r', percent * 25 * workspaceScale); ripple.style.opacity = 1 - percent; - var closure = function() { - Blockly.BlockSvg.connectionUiStep_(ripple, start, workspaceScale); - }; - Blockly.BlockSvg.disconnectUiStop_.pid_ = setTimeout(closure, 10); + Blockly.BlockSvg.disconnectUiStop_.pid_ = setTimeout( + Blockly.BlockSvg.connectionUiStep_, 10, ripple, start, workspaceScale); } }; @@ -996,11 +992,10 @@ Blockly.BlockSvg.disconnectUiStep_ = function(group, magnitude, start) { var skew = Math.round(Math.sin(percent * Math.PI * WIGGLES) * (1 - percent) * magnitude); group.skew_ = 'skewX(' + skew + ')'; - var closure = function() { - Blockly.BlockSvg.disconnectUiStep_(group, magnitude, start); - }; Blockly.BlockSvg.disconnectUiStop_.group = group; - Blockly.BlockSvg.disconnectUiStop_.pid = setTimeout(closure, 10); + Blockly.BlockSvg.disconnectUiStop_.pid = + setTimeout(Blockly.BlockSvg.disconnectUiStep_, 10, group, magnitude, + start); } group.setAttribute('transform', group.translate_ + group.skew_); }; diff --git a/core/extensions.js b/core/extensions.js index 666026888..101fe9267 100644 --- a/core/extensions.js +++ b/core/extensions.js @@ -55,7 +55,7 @@ Blockly.Extensions.MUTATOR_PROPERTIES_ = * handlers and mutators. These are applied using Block.applyExtension(), or * the JSON "extensions" array attribute. * @param {string} name The name of this extension. - * @param {function} initFn The function to initialize an extended block. + * @param {Function} initFn The function to initialize an extended block. * @throws {Error} if the extension name is empty, the extension is already * registered, or extensionFn is not a function. */ @@ -92,7 +92,7 @@ Blockly.Extensions.registerMixin = function(name, mixinObj) { * decompose are defined on the mixin. * @param {string} name The name of this mutator extension. * @param {!Object} mixinObj The values to mix in. - * @param {function()=} opt_helperFn An optional function to apply after mixing + * @param {(function())=} opt_helperFn An optional function to apply after mixing * in the object. * @param {Array.=} opt_blockList A list of blocks to appear in the * flyout of the mutator dialog. @@ -103,8 +103,10 @@ Blockly.Extensions.registerMutator = function(name, mixinObj, opt_helperFn, var errorPrefix = 'Error when registering mutator "' + name + '": '; // Sanity check the mixin object before registering it. - Blockly.Extensions.checkHasFunction_(errorPrefix, mixinObj, 'domToMutation'); - Blockly.Extensions.checkHasFunction_(errorPrefix, mixinObj, 'mutationToDom'); + Blockly.Extensions.checkHasFunction_(errorPrefix, mixinObj.domToMutation, + 'domToMutation'); + Blockly.Extensions.checkHasFunction_(errorPrefix, mixinObj.mutationToDom, + 'mutationToDom'); var hasMutatorDialog = Blockly.Extensions.checkMutatorDialog_(mixinObj, errorPrefix); @@ -162,20 +164,19 @@ Blockly.Extensions.apply = function(name, block, isMutator) { }; /** - * Check that the given object has a property with the given name, and that the - * property is a function. + * Check that the given value is a function. * @param {string} errorPrefix The string to prepend to any error message. - * @param {!Object} object The object to check. + * @param {*} func Function to check. * @param {string} propertyName Which property to check. * @throws {Error} if the property does not exist or is not a function. * @private */ -Blockly.Extensions.checkHasFunction_ = function(errorPrefix, object, +Blockly.Extensions.checkHasFunction_ = function(errorPrefix, func, propertyName) { - if (!object.hasOwnProperty(propertyName)) { + if (!func) { throw new Error(errorPrefix + 'missing required property "' + propertyName + '"'); - } else if (typeof object[propertyName] !== "function") { + } else if (typeof func != 'function') { throw new Error(errorPrefix + '" required property "' + propertyName + '" must be a function'); } @@ -442,5 +443,3 @@ Blockly.Extensions.extensionParentTooltip_ = function() { }; Blockly.Extensions.register('parent_tooltip_when_inline', Blockly.Extensions.extensionParentTooltip_); - - diff --git a/core/field_image.js b/core/field_image.js index ede3e2b92..4b4859da7 100644 --- a/core/field_image.js +++ b/core/field_image.js @@ -38,7 +38,7 @@ goog.require('goog.userAgent'); * @param {number} width Width of the image. * @param {number} height Height of the image. * @param {string=} opt_alt Optional alt text for when block is collapsed. - * @param {function=} opt_onClick Optional function to be called when image is clicked + * @param {Function=} opt_onClick Optional function to be called when image is clicked * @extends {Blockly.Field} * @constructor */ diff --git a/core/trashcan.js b/core/trashcan.js index 7373a0b93..7dfb600a1 100644 --- a/core/trashcan.js +++ b/core/trashcan.js @@ -166,8 +166,9 @@ Blockly.Trashcan.prototype.createDom = function() { */ this.svgGroup_ = Blockly.utils.createSvgElement('g', {'class': 'blocklyTrash'}, null); + var clip; var rnd = String(Math.random()).substring(2); - var clip = Blockly.utils.createSvgElement('clipPath', + clip = Blockly.utils.createSvgElement('clipPath', {'id': 'blocklyTrashBodyClipPath' + rnd}, this.svgGroup_); Blockly.utils.createSvgElement('rect', @@ -182,7 +183,7 @@ Blockly.Trashcan.prototype.createDom = function() { body.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', this.workspace_.options.pathToMedia + Blockly.SPRITE.url); - var clip = Blockly.utils.createSvgElement('clipPath', + clip = Blockly.utils.createSvgElement('clipPath', {'id': 'blocklyTrashLidClipPath' + rnd}, this.svgGroup_); Blockly.utils.createSvgElement('rect', diff --git a/core/utils.js b/core/utils.js index 464fd0e3a..b578e6b71 100644 --- a/core/utils.js +++ b/core/utils.js @@ -197,7 +197,7 @@ Blockly.utils.getInjectionDivXY_ = function(element) { var scale = 1; while (element) { var xy = Blockly.utils.getRelativeXY(element); - var scale = Blockly.utils.getScale_(element); + scale = Blockly.utils.getScale_(element); x = (x * scale) + xy.x; y = (y * scale) + xy.y; var classes = element.getAttribute('class') || ''; diff --git a/core/workspace_svg.js b/core/workspace_svg.js index 62df5d146..c4c783600 100644 --- a/core/workspace_svg.js +++ b/core/workspace_svg.js @@ -1777,7 +1777,6 @@ Blockly.WorkspaceSvg.prototype.cancelCurrentGesture = function() { /** * Get the audio manager for this workspace. * @return {Blockly.WorkspaceAudio} The audio manager for this workspace. - * @package */ Blockly.WorkspaceSvg.prototype.getAudioManager = function() { return this.audioManager_; diff --git a/core/xml.js b/core/xml.js index 8dd90d530..64f001560 100644 --- a/core/xml.js +++ b/core/xml.js @@ -395,7 +395,7 @@ Blockly.Xml.appendDomToWorkspace = function(xml, workspace) { var savetab = Blockly.BlockSvg.TAB_WIDTH; try { Blockly.BlockSvg.TAB_WIDTH = 0; - var bbox = workspace.getBlocksBoundingBox(); + bbox = workspace.getBlocksBoundingBox(); } finally { Blockly.BlockSvg.TAB_WIDTH = savetab; } diff --git a/core/zoom_controls.js b/core/zoom_controls.js index 0c827b31f..143680658 100644 --- a/core/zoom_controls.js +++ b/core/zoom_controls.js @@ -115,9 +115,10 @@ Blockly.ZoomControls.prototype.createDom = function() { */ this.svgGroup_ = Blockly.utils.createSvgElement('g', {'class': 'blocklyZoom'}, null); + var clip; var rnd = String(Math.random()).substring(2); - var clip = Blockly.utils.createSvgElement('clipPath', + clip = Blockly.utils.createSvgElement('clipPath', {'id': 'blocklyZoomoutClipPath' + rnd}, this.svgGroup_); Blockly.utils.createSvgElement('rect', @@ -132,7 +133,7 @@ Blockly.ZoomControls.prototype.createDom = function() { zoomoutSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', workspace.options.pathToMedia + Blockly.SPRITE.url); - var clip = Blockly.utils.createSvgElement('clipPath', + clip = Blockly.utils.createSvgElement('clipPath', {'id': 'blocklyZoominClipPath' + rnd}, this.svgGroup_); Blockly.utils.createSvgElement('rect', @@ -148,7 +149,7 @@ Blockly.ZoomControls.prototype.createDom = function() { zoominSvg.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', workspace.options.pathToMedia + Blockly.SPRITE.url); - var clip = Blockly.utils.createSvgElement('clipPath', + clip = Blockly.utils.createSvgElement('clipPath', {'id': 'blocklyZoomresetClipPath' + rnd}, this.svgGroup_); Blockly.utils.createSvgElement('rect', diff --git a/i18n/create_messages.py b/i18n/create_messages.py index 1010b05f1..dc2620a31 100755 --- a/i18n/create_messages.py +++ b/i18n/create_messages.py @@ -34,7 +34,7 @@ def string_is_ascii(s): return True except UnicodeEncodeError: return False - + def load_constants(filename): """Read in constants file, which must be output in every language.""" constant_defs = read_json_file(filename); @@ -42,7 +42,7 @@ def load_constants(filename): for key in constant_defs: value = constant_defs[key] value = value.replace('"', '\\"') - constants_text += '\nBlockly.Msg.{0} = \"{1}\";'.format(key, value) + constants_text += '\nBlockly.Msg["{0}"] = "{1}";'.format(key, value) return constants_text def main(): @@ -139,7 +139,7 @@ goog.require('Blockly.Msg'); value = source_defs[key] comment = ' // untranslated' value = value.replace('"', '\\"') - outfile.write(u'Blockly.Msg.{0} = "{1}";{2}\n'.format( + outfile.write(u'Blockly.Msg["{0}"] = "{1}";{2}\n'.format( key, value, comment)) # Announce any keys defined only for target language.