From 19722e508fcbc9600af3a87dc19457a413c34a0f Mon Sep 17 00:00:00 2001 From: kozbial Date: Mon, 2 Aug 2021 16:47:11 -0700 Subject: [PATCH] Migrate core/contextmenu.js to goog.module --- core/block_svg.js | 4 +- core/contextmenu.js | 94 ++++++++++++++++++++++++++++++--------------- tests/deps.js | 2 +- 3 files changed, 67 insertions(+), 33 deletions(-) diff --git a/core/block_svg.js b/core/block_svg.js index fd5be3212..57d20c1ba 100644 --- a/core/block_svg.js +++ b/core/block_svg.js @@ -780,7 +780,7 @@ Blockly.BlockSvg.prototype.showContextMenu = function(e) { if (menuOptions && menuOptions.length) { Blockly.ContextMenu.show(e, menuOptions, this.RTL); - Blockly.ContextMenu.currentBlock = this; + Blockly.ContextMenu.setCurrentBlock(this); } }; @@ -921,7 +921,7 @@ Blockly.BlockSvg.prototype.dispose = function(healStack, animate) { this.workspace.cancelCurrentGesture(); } // If this block has a context menu open, close it. - if (Blockly.ContextMenu.currentBlock == this) { + if (Blockly.ContextMenu.getCurrentBlock() == this) { Blockly.ContextMenu.hide(); } diff --git a/core/contextmenu.js b/core/contextmenu.js index 9af86b0c9..9bb76033a 100644 --- a/core/contextmenu.js +++ b/core/contextmenu.js @@ -14,8 +14,11 @@ * @name Blockly.ContextMenu * @namespace */ -goog.provide('Blockly.ContextMenu'); +goog.module('Blockly.ContextMenu'); +goog.module.declareLegacyNamespace(); +// TODO(#5073): Add Blockly require after fixing circular dependency. +// goog.require('Blockly'); goog.require('Blockly.browserEvents'); goog.require('Blockly.Events'); /** @suppress {extraRequire} */ @@ -39,16 +42,39 @@ goog.requireType('Blockly.WorkspaceSvg'); /** * Which block is the context menu attached to? - * @type {Blockly.Block} + * @type {?Blockly.Block} */ -Blockly.ContextMenu.currentBlock = null; +let currentBlock = null; + +/** + * Gets the block the context menu is currently attached to. + * @return {?Blockly.Block} The block the context menu is attached to. + */ +const getCurrentBlock = function() { + return currentBlock; +}; +exports.getCurrentBlock = getCurrentBlock; + +/** + * Sets the block the context menu is currently attached to. + * @param {?Blockly.Block} block The block the context menu is attached to. + */ +const setCurrentBlock = function(block) { + currentBlock = block; +}; +exports.setCurrentBlock = setCurrentBlock; + +// Ad JS accessors for backwards compatibility. +Object.defineProperty(exports, 'currentBlock', { + get: getCurrentBlock, + set: setCurrentBlock, +}); /** * Menu object. * @type {Blockly.Menu} - * @private */ -Blockly.ContextMenu.menu_ = null; +let menu_ = null; /** * Construct the menu based on the list of options and show the menu. @@ -56,21 +82,22 @@ Blockly.ContextMenu.menu_ = null; * @param {!Array} options Array of menu options. * @param {boolean} rtl True if RTL, false if LTR. */ -Blockly.ContextMenu.show = function(e, options, rtl) { - Blockly.WidgetDiv.show(Blockly.ContextMenu, rtl, Blockly.ContextMenu.dispose); +const show = function(e, options, rtl) { + Blockly.WidgetDiv.show(exports, rtl, dispose); if (!options.length) { - Blockly.ContextMenu.hide(); + hide(); return; } - const menu = Blockly.ContextMenu.populate_(options, rtl); - Blockly.ContextMenu.menu_ = menu; + const menu = populate_(options, rtl); + menu_ = menu; - Blockly.ContextMenu.position_(menu, e, rtl); + position_(menu, e, rtl); // 1ms delay is required for focusing on context menus because some other // mouse event is still waiting in the queue and clears focus. setTimeout(function() {menu.focus();}, 1); - Blockly.ContextMenu.currentBlock = null; // May be set by Blockly.Block. + currentBlock = null; // May be set by Blockly.Block. }; +exports.show = show; /** * Create the context menu object and populate it with the given options. @@ -79,7 +106,7 @@ Blockly.ContextMenu.show = function(e, options, rtl) { * @return {!Blockly.Menu} The menu that will be shown on right click. * @private */ -Blockly.ContextMenu.populate_ = function(options, rtl) { +const populate_ = function(options, rtl) { /* Here's what one option object looks like: {text: 'Make It So', enabled: true, @@ -97,7 +124,7 @@ Blockly.ContextMenu.populate_ = function(options, rtl) { if (option.enabled) { const actionHandler = function (_menuItem) { const option = this; - Blockly.ContextMenu.hide(); + hide(); option.callback(option.scope); }; menuItem.onAction(actionHandler, option); @@ -114,7 +141,7 @@ Blockly.ContextMenu.populate_ = function(options, rtl) { * @param {boolean} rtl True if RTL, false if LTR. * @private */ -Blockly.ContextMenu.position_ = function(menu, e, rtl) { +const position_ = function(menu, e, rtl) { // Record windowSize and scrollOffset before adding menu. const viewportBBox = Blockly.utils.getViewportBBox(); // This one is just a point, but we'll pretend that it's a rect so we can use @@ -126,7 +153,7 @@ Blockly.ContextMenu.position_ = function(menu, e, rtl) { e.clientX + viewportBBox.left ); - Blockly.ContextMenu.createWidget_(menu); + createWidget_(menu); const menuSize = menu.getSize(); if (rtl) { @@ -148,7 +175,7 @@ Blockly.ContextMenu.position_ = function(menu, e, rtl) { * @param {!Blockly.Menu} menu The menu to add to the widget div. * @private */ -Blockly.ContextMenu.createWidget_ = function(menu) { +const createWidget_ = function(menu) { const div = Blockly.WidgetDiv.DIV; menu.render(div); const menuDom = menu.getElement(); @@ -165,20 +192,22 @@ Blockly.ContextMenu.createWidget_ = function(menu) { /** * Hide the context menu. */ -Blockly.ContextMenu.hide = function() { - Blockly.WidgetDiv.hideIfOwner(Blockly.ContextMenu); - Blockly.ContextMenu.currentBlock = null; +const hide = function() { + Blockly.WidgetDiv.hideIfOwner(exports); + currentBlock = null; }; +exports.hide = hide; /** * Dispose of the menu. */ -Blockly.ContextMenu.dispose = function() { - if (Blockly.ContextMenu.menu_) { - Blockly.ContextMenu.menu_.dispose(); - Blockly.ContextMenu.menu_ = null; +const dispose = function() { + if (menu_) { + menu_.dispose(); + menu_ = null; } }; +exports.dispose = dispose; /** * Create a callback function that creates and configures a block, @@ -187,7 +216,7 @@ Blockly.ContextMenu.dispose = function() { * @param {!Element} xml XML representation of new block. * @return {!Function} Function that creates a block. */ -Blockly.ContextMenu.callbackFactory = function(block, xml) { +const callbackFactory = function(block, xml) { return function() { Blockly.Events.disable(); let newBlock; @@ -212,6 +241,7 @@ Blockly.ContextMenu.callbackFactory = function(block, xml) { newBlock.select(); }; }; +exports.callbackFactory = callbackFactory; // Helper functions for creating context menu options. @@ -220,9 +250,8 @@ Blockly.ContextMenu.callbackFactory = function(block, xml) { * @param {!Blockly.WorkspaceCommentSvg} comment The workspace comment where the * right-click originated. * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package */ -Blockly.ContextMenu.commentDeleteOption = function(comment) { +const commentDeleteOption = function(comment) { const deleteOption = { text: Blockly.Msg['REMOVE_COMMENT'], enabled: true, @@ -234,15 +263,16 @@ Blockly.ContextMenu.commentDeleteOption = function(comment) { }; return deleteOption; }; +/** @package */ +exports.commentDeleteOption = commentDeleteOption; /** * Make a context menu option for duplicating the current workspace comment. * @param {!Blockly.WorkspaceCommentSvg} comment The workspace comment where the * right-click originated. * @return {!Object} A menu option, containing text, enabled, and a callback. - * @package */ -Blockly.ContextMenu.commentDuplicateOption = function(comment) { +const commentDuplicateOption = function(comment) { const duplicateOption = { text: Blockly.Msg['DUPLICATE_COMMENT'], enabled: true, @@ -252,6 +282,8 @@ Blockly.ContextMenu.commentDuplicateOption = function(comment) { }; return duplicateOption; }; +/** @package */ +exports.commentDuplicateOption = commentDuplicateOption; /** * Make a context menu option for adding a comment on the workspace. @@ -263,7 +295,7 @@ Blockly.ContextMenu.commentDuplicateOption = function(comment) { * @suppress {strictModuleDepCheck,checkTypes} Suppress checks while workspace * comments are not bundled in. */ -Blockly.ContextMenu.workspaceCommentOption = function(ws, e) { +const workspaceCommentOption = function(ws, e) { if (!Blockly.WorkspaceCommentSvg) { throw Error('Missing require for Blockly.WorkspaceCommentSvg'); } @@ -317,3 +349,5 @@ Blockly.ContextMenu.workspaceCommentOption = function(ws, e) { }; return wsCommentOption; }; +/** @package */ +exports.workspaceCommentOption = workspaceCommentOption; diff --git a/tests/deps.js b/tests/deps.js index a596ec5f0..bbf289725 100644 --- a/tests/deps.js +++ b/tests/deps.js @@ -26,7 +26,7 @@ goog.addDependency('../../core/connection_checker.js', ['Blockly.ConnectionCheck goog.addDependency('../../core/connection_db.js', ['Blockly.ConnectionDB'], ['Blockly.RenderedConnection', 'Blockly.connectionTypes', 'Blockly.constants'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/connection_types.js', ['Blockly.connectionTypes'], [], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/constants.js', ['Blockly.constants'], [], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/contextmenu.js', ['Blockly.ContextMenu'], ['Blockly.Events', 'Blockly.Events.BlockCreate', 'Blockly.Menu', 'Blockly.MenuItem', 'Blockly.Msg', 'Blockly.WidgetDiv', 'Blockly.Xml', 'Blockly.browserEvents', 'Blockly.internalConstants', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.userAgent']); +goog.addDependency('../../core/contextmenu.js', ['Blockly.ContextMenu'], ['Blockly.Events', 'Blockly.Events.BlockCreate', 'Blockly.Menu', 'Blockly.MenuItem', 'Blockly.Msg', 'Blockly.WidgetDiv', 'Blockly.Xml', 'Blockly.browserEvents', 'Blockly.internalConstants', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Rect', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/contextmenu_items.js', ['Blockly.ContextMenuItems'], ['Blockly', 'Blockly.ContextMenuRegistry', 'Blockly.Events', 'Blockly.Msg', 'Blockly.clipboard', 'Blockly.inputTypes', 'Blockly.utils', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/contextmenu_registry.js', ['Blockly.ContextMenuRegistry'], [], {'lang': 'es5'}); goog.addDependency('../../core/css.js', ['Blockly.Css'], [], {'lang': 'es6', 'module': 'goog'});