diff --git a/core/bump_objects.js b/core/bump_objects.js index efac96bf4..4c53356dc 100644 --- a/core/bump_objects.js +++ b/core/bump_objects.js @@ -12,11 +12,17 @@ goog.module('Blockly.bumpObjects'); +/* eslint-disable-next-line no-unused-vars */ +const BlockSvg = goog.requireType('Blockly.BlockSvg'); +/* eslint-disable-next-line no-unused-vars */ +const Events = goog.require('Blockly.Events'); /* eslint-disable-next-line no-unused-vars */ const IBoundedElement = goog.requireType('Blockly.IBoundedElement'); /* eslint-disable-next-line no-unused-vars */ const MetricsManager = goog.requireType('Blockly.MetricsManager'); /* eslint-disable-next-line no-unused-vars */ +const WorkspaceCommentSvg = goog.requireType('Blockly.WorkspaceCommentSvg'); +/* eslint-disable-next-line no-unused-vars */ const WorkspaceSvg = goog.requireType('Blockly.WorkspaceSvg'); const mathUtils = goog.require('Blockly.utils.math'); @@ -71,3 +77,95 @@ const bumpObjectIntoBounds = function(workspace, scrollMetrics, object) { return false; }; exports.bumpIntoBounds = bumpObjectIntoBounds; + +/** + * Creates a handler for bumping objects when they cross fixed bounds. + * @param {!WorkspaceSvg} workspace The workspace to handle. + * @return {function(Events.Abstract)} The event handler. + */ +const bumpIntoBoundsHandler = function(workspace) { + return function(e) { + const metricsManager = workspace.getMetricsManager(); + if (!metricsManager.hasFixedEdges() || workspace.isDragging()) { + return; + } + + if (Events.BUMP_EVENTS.indexOf(e.type) !== -1) { + const scrollMetricsInWsCoords = metricsManager.getScrollMetrics(true); + + // Triggered by move/create event + const object = extractObjectFromEvent(workspace, e); + if (!object) { + return; + } + // Handle undo. + const oldGroup = Events.getGroup(); + Events.setGroup(e.group); + + const wasBumped = bumpObjectIntoBounds( + workspace, scrollMetricsInWsCoords, + /** @type {!IBoundedElement} */ (object)); + + if (wasBumped && !e.group) { + console.warn( + 'Moved object in bounds but there was no' + + ' event group. This may break undo.'); + } + if (oldGroup !== null) { + Events.setGroup(oldGroup); + } + } else if (e.type === Events.VIEWPORT_CHANGE) { + const viewportEvent = /** @type {!Events.ViewportChange} */ (e); + if (viewportEvent.scale > viewportEvent.oldScale) { + bumpTopObjectsIntoBounds(workspace); + } + } + }; +}; +exports.bumpIntoBoundsHandler = bumpIntoBoundsHandler; + +/** + * Extracts the object from the given event. + * @param {!WorkspaceSvg} workspace The workspace the event originated + * from. + * @param {!Events.BumpEvent} e An event containing an object. + * @return {?BlockSvg|?WorkspaceCommentSvg} The extracted + * object. + */ +const extractObjectFromEvent = function(workspace, e) { + let object = null; + switch (e.type) { + case Events.BLOCK_CREATE: + case Events.BLOCK_MOVE: + object = workspace.getBlockById(e.blockId); + if (object) { + object = object.getRootBlock(); + } + break; + case Events.COMMENT_CREATE: + case Events.COMMENT_MOVE: + object = ( + /** @type {?WorkspaceCommentSvg} */ + (workspace.getCommentById(e.commentId))); + break; + } + return object; +}; + +/** + * Bumps the top objects in the given workspace into bounds. + * @param {!WorkspaceSvg} workspace The workspace. + */ +const bumpTopObjectsIntoBounds = function(workspace) { + const metricsManager = workspace.getMetricsManager(); + if (!metricsManager.hasFixedEdges() || workspace.isDragging()) { + return; + } + + const scrollMetricsInWsCoords = metricsManager.getScrollMetrics(true); + const topBlocks = workspace.getTopBoundedElements(); + for (let i = 0, block; (block = topBlocks[i]); i++) { + bumpObjectIntoBounds(workspace, scrollMetricsInWsCoords, block); + } +}; +exports.bumpTopObjectsIntoBounds = bumpTopObjectsIntoBounds; diff --git a/core/inject.js b/core/inject.js index 663c015be..3b807e490 100644 --- a/core/inject.js +++ b/core/inject.js @@ -10,81 +10,79 @@ */ 'use strict'; -goog.provide('Blockly.inject'); +goog.module('Blockly.inject'); +goog.module.declareLegacyNamespace(); -goog.require('Blockly.BlockDragSurfaceSvg'); -goog.require('Blockly.browserEvents'); -goog.require('Blockly.bumpObjects'); -goog.require('Blockly.common'); -goog.require('Blockly.Css'); -goog.require('Blockly.DropDownDiv'); -goog.require('Blockly.Events'); -goog.require('Blockly.Grid'); -goog.require('Blockly.Msg'); -goog.require('Blockly.Options'); -goog.require('Blockly.ScrollbarPair'); -goog.require('Blockly.Touch'); -goog.require('Blockly.Tooltip'); -goog.require('Blockly.utils'); -goog.require('Blockly.utils.aria'); -goog.require('Blockly.utils.dom'); -goog.require('Blockly.utils.Svg'); -goog.require('Blockly.utils.userAgent'); -goog.require('Blockly.Workspace'); -goog.require('Blockly.WorkspaceDragSurfaceSvg'); -goog.require('Blockly.WorkspaceSvg'); -goog.require('Blockly.WidgetDiv'); - -goog.requireType('Blockly.BlocklyOptions'); -goog.requireType('Blockly.BlockSvg'); -goog.requireType('Blockly.WorkspaceCommentSvg'); +const BlockDragSurfaceSvg = goog.require('Blockly.BlockDragSurfaceSvg'); +/* eslint-disable-next-line no-unused-vars */ +const BlocklyOptions = goog.requireType('Blockly.BlocklyOptions'); +const Css = goog.require('Blockly.Css'); +const DropDownDiv = goog.require('Blockly.DropDownDiv'); +const Grid = goog.require('Blockly.Grid'); +const Msg = goog.require('Blockly.Msg'); +const Options = goog.require('Blockly.Options'); +const ScrollbarPair = goog.require('Blockly.ScrollbarPair'); +const Touch = goog.require('Blockly.Touch'); +const Tooltip = goog.require('Blockly.Tooltip'); +const Svg = goog.require('Blockly.utils.Svg'); +const Workspace = goog.require('Blockly.Workspace'); +const WorkspaceDragSurfaceSvg = goog.require('Blockly.WorkspaceDragSurfaceSvg'); +const WorkspaceSvg = goog.require('Blockly.WorkspaceSvg'); +const WidgetDiv = goog.require('Blockly.WidgetDiv'); +const aria = goog.require('Blockly.utils.aria'); +const browserEvents = goog.require('Blockly.browserEvents'); +const bumpObjects = goog.require('Blockly.bumpObjects'); +const common = goog.require('Blockly.common'); +const dom = goog.require('Blockly.utils.dom'); +const userAgent = goog.require('Blockly.utils.userAgent'); +const utils = goog.require('Blockly.utils'); /** * Inject a Blockly editor into the specified container element (usually a div). * @param {Element|string} container Containing element, or its ID, * or a CSS selector. - * @param {Blockly.BlocklyOptions=} opt_options Optional dictionary of options. - * @return {!Blockly.WorkspaceSvg} Newly created main workspace. + * @param {BlocklyOptions=} opt_options Optional dictionary of options. + * @return {!WorkspaceSvg} Newly created main workspace. */ -Blockly.inject = function(container, opt_options) { +const inject = function(container, opt_options) { if (typeof container == 'string') { - container = document.getElementById(container) || - document.querySelector(container); + container = + document.getElementById(container) || document.querySelector(container); } // Verify that the container is in document. - if (!container || !Blockly.utils.dom.containsNode(document, container)) { + if (!container || !dom.containsNode(document, container)) { throw Error('Error: container is not in current document.'); } - var options = new Blockly.Options(opt_options || - (/** @type {!Blockly.BlocklyOptions} */ ({}))); - var subContainer = document.createElement('div'); + const options = + new Options(opt_options || (/** @type {!BlocklyOptions} */ ({}))); + const subContainer = document.createElement('div'); subContainer.className = 'injectionDiv'; subContainer.tabIndex = 0; - Blockly.utils.aria.setState(subContainer, - Blockly.utils.aria.State.LABEL, Blockly.Msg['WORKSPACE_ARIA_LABEL']); + aria.setState(subContainer, aria.State.LABEL, Msg['WORKSPACE_ARIA_LABEL']); container.appendChild(subContainer); - var svg = Blockly.createDom_(subContainer, options); + const svg = createDom(subContainer, options); // Create surfaces for dragging things. These are optimizations // so that the browser does not repaint during the drag. - var blockDragSurface = new Blockly.BlockDragSurfaceSvg(subContainer); + const blockDragSurface = new BlockDragSurfaceSvg(subContainer); - var workspaceDragSurface = new Blockly.WorkspaceDragSurfaceSvg(subContainer); + const workspaceDragSurface = new WorkspaceDragSurfaceSvg(subContainer); - var workspace = Blockly.createMainWorkspace_(svg, options, blockDragSurface, - workspaceDragSurface); + const workspace = + createMainWorkspace(svg, options, blockDragSurface, workspaceDragSurface); - Blockly.init_(workspace); + init(workspace); - // Keep focus on the first workspace so entering keyboard navigation looks correct. - Blockly.common.setMainWorkspace(workspace); + // Keep focus on the first workspace so entering keyboard navigation looks + // correct. + common.setMainWorkspace(workspace); Blockly.svgResize(workspace); subContainer.addEventListener('focusin', function() { - Blockly.common.setMainWorkspace(workspace); + common.setMainWorkspace(workspace); }); return workspace; @@ -93,18 +91,17 @@ Blockly.inject = function(container, opt_options) { /** * Create the SVG image. * @param {!Element} container Containing element. - * @param {!Blockly.Options} options Dictionary of options. + * @param {!Options} options Dictionary of options. * @return {!Element} Newly created SVG image. - * @private */ -Blockly.createDom_ = function(container, options) { +const createDom = function(container, options) { // Sadly browsers (Chrome vs Firefox) are currently inconsistent in laying // out content in RTL mode. Therefore Blockly forces the use of LTR, // then manually positions content in RTL as needed. container.setAttribute('dir', 'LTR'); // Load CSS. - Blockly.Css.inject(options.hasCss, options.pathToMedia); + Css.inject(options.hasCss, options.pathToMedia); // Build the SVG DOM. /* @@ -117,61 +114,61 @@ Blockly.createDom_ = function(container, options) { ... */ - var svg = Blockly.utils.dom.createSvgElement( - Blockly.utils.Svg.SVG, { - 'xmlns': Blockly.utils.dom.SVG_NS, - 'xmlns:html': Blockly.utils.dom.HTML_NS, - 'xmlns:xlink': Blockly.utils.dom.XLINK_NS, + const svg = dom.createSvgElement( + Svg.SVG, { + 'xmlns': dom.SVG_NS, + 'xmlns:html': dom.HTML_NS, + 'xmlns:xlink': dom.XLINK_NS, 'version': '1.1', 'class': 'blocklySvg', 'tabindex': '0' - }, container); + }, + container); /* ... filters go here ... */ - var defs = Blockly.utils.dom.createSvgElement( - Blockly.utils.Svg.DEFS, {}, svg); + const defs = dom.createSvgElement(Svg.DEFS, {}, svg); // Each filter/pattern needs a unique ID for the case of multiple Blockly // instances on a page. Browser behaviour becomes undefined otherwise. // https://neil.fraser.name/news/2015/11/01/ - var rnd = String(Math.random()).substring(2); + const rnd = String(Math.random()).substring(2); - options.gridPattern = Blockly.Grid.createDom(rnd, options.gridOptions, defs); + options.gridPattern = Grid.createDom(rnd, options.gridOptions, defs); return svg; }; /** * Create a main workspace and add it to the SVG. * @param {!Element} svg SVG element with pattern defined. - * @param {!Blockly.Options} options Dictionary of options. - * @param {!Blockly.BlockDragSurfaceSvg} blockDragSurface Drag surface SVG + * @param {!Options} options Dictionary of options. + * @param {!BlockDragSurfaceSvg} blockDragSurface Drag surface SVG * for the blocks. - * @param {!Blockly.WorkspaceDragSurfaceSvg} workspaceDragSurface Drag surface + * @param {!WorkspaceDragSurfaceSvg} workspaceDragSurface Drag surface * SVG for the workspace. - * @return {!Blockly.WorkspaceSvg} Newly created main workspace. - * @private + * @return {!WorkspaceSvg} Newly created main workspace. */ -Blockly.createMainWorkspace_ = function(svg, options, blockDragSurface, - workspaceDragSurface) { +const createMainWorkspace = function( + svg, options, blockDragSurface, workspaceDragSurface) { options.parentWorkspace = null; - var mainWorkspace = - new Blockly.WorkspaceSvg(options, blockDragSurface, workspaceDragSurface); - var wsOptions = mainWorkspace.options; + const mainWorkspace = + new WorkspaceSvg(options, blockDragSurface, workspaceDragSurface); + const wsOptions = mainWorkspace.options; mainWorkspace.scale = wsOptions.zoomOptions.startScale; svg.appendChild(mainWorkspace.createDom('blocklyMainBackground')); // Set the theme name and renderer name onto the injection div. - Blockly.utils.dom.addClass(mainWorkspace.getInjectionDiv(), + dom.addClass( + mainWorkspace.getInjectionDiv(), mainWorkspace.getRenderer().getClassName()); - Blockly.utils.dom.addClass(mainWorkspace.getInjectionDiv(), - mainWorkspace.getTheme().getClassName()); + dom.addClass( + mainWorkspace.getInjectionDiv(), mainWorkspace.getTheme().getClassName()); if (!wsOptions.hasCategories && wsOptions.languageTree) { // Add flyout as an that is a sibling of the workspace SVG. - var flyout = mainWorkspace.addFlyout(Blockly.utils.Svg.SVG); - Blockly.utils.dom.insertAfter(flyout, svg); + const flyout = mainWorkspace.addFlyout(Svg.SVG); + dom.insertAfter(flyout, svg); } if (wsOptions.hasTrashcan) { mainWorkspace.addTrashcan(); @@ -180,146 +177,54 @@ Blockly.createMainWorkspace_ = function(svg, options, blockDragSurface, mainWorkspace.addZoomControls(); } // Register the workspace svg as a UI component. - mainWorkspace.getThemeManager().subscribe(svg, 'workspaceBackgroundColour', - 'background-color'); + mainWorkspace.getThemeManager().subscribe( + svg, 'workspaceBackgroundColour', 'background-color'); // A null translation will also apply the correct initial scale. mainWorkspace.translate(0, 0); - mainWorkspace.addChangeListener(Blockly.bumpIntoBoundsHandler_(mainWorkspace)); + mainWorkspace.addChangeListener( + bumpObjects.bumpIntoBoundsHandler(mainWorkspace)); // The SVG is now fully assembled. Blockly.svgResize(mainWorkspace); - Blockly.WidgetDiv.createDom(); - Blockly.DropDownDiv.createDom(); - Blockly.Tooltip.createDom(); + WidgetDiv.createDom(); + DropDownDiv.createDom(); + Tooltip.createDom(); return mainWorkspace; }; -/** - * Extracts the object from the given event. - * @param {!Blockly.WorkspaceSvg} workspace The workspace the event originated - * from. - * @param {!Blockly.Events.BumpEvent} e An event containing an object. - * @return {?Blockly.BlockSvg|?Blockly.WorkspaceCommentSvg} The extracted - * object. - * @private - */ -Blockly.extractObjectFromEvent_ = function(workspace, e) { - var object = null; - switch (e.type) { - case Blockly.Events.BLOCK_CREATE: - case Blockly.Events.BLOCK_MOVE: - object = workspace.getBlockById(e.blockId); - if (object) { - object = object.getRootBlock(); - } - break; - case Blockly.Events.COMMENT_CREATE: - case Blockly.Events.COMMENT_MOVE: - object = ( - /** @type {?Blockly.WorkspaceCommentSvg} */ - (workspace.getCommentById(e.commentId))); - break; - } - return object; -}; - -/** - * Bumps the top objects in the given workspace into bounds. - * @param {!Blockly.WorkspaceSvg} workspace The workspace. - * @private - */ -Blockly.bumpTopObjectsIntoBounds_ = function(workspace) { - var metricsManager = workspace.getMetricsManager(); - if (!metricsManager.hasFixedEdges() || workspace.isDragging()) { - return; - } - - var scrollMetricsInWsCoords = metricsManager.getScrollMetrics(true); - var topBlocks = workspace.getTopBoundedElements(); - for (var i = 0, block; (block = topBlocks[i]); i++) { - goog.module.get('Blockly.bumpObjects').bumpIntoBounds(workspace, scrollMetricsInWsCoords, block); - } -}; - -/** - * Creates a handler for bumping objects when they cross fixed bounds. - * @param {!Blockly.WorkspaceSvg} workspace The workspace to handle. - * @return {function(Blockly.Events.Abstract)} The event handler. - * @private - */ -Blockly.bumpIntoBoundsHandler_ = function(workspace) { - return function(e) { - var metricsManager = workspace.getMetricsManager(); - if (!metricsManager.hasFixedEdges() || workspace.isDragging()) { - return; - } - - if (Blockly.Events.BUMP_EVENTS.indexOf(e.type) !== -1) { - var scrollMetricsInWsCoords = metricsManager.getScrollMetrics(true); - - // Triggered by move/create event - var object = Blockly.extractObjectFromEvent_(workspace, e); - if (!object) { - return; - } - // Handle undo. - var oldGroup = Blockly.Events.getGroup(); - Blockly.Events.setGroup(e.group); - - var wasBumped = goog.module.get('Blockly.bumpObjects') - .bumpIntoBounds( - workspace, scrollMetricsInWsCoords, - /** @type {!Blockly.IBoundedElement} */ (object)); - - if (wasBumped && !e.group) { - console.warn('Moved object in bounds but there was no' + - ' event group. This may break undo.'); - } - if (oldGroup !== null) { - Blockly.Events.setGroup(oldGroup); - } - } else if (e.type === Blockly.Events.VIEWPORT_CHANGE) { - var viewportEvent = /** @type {!Blockly.Events.ViewportChange} */ (e); - if (viewportEvent.scale > viewportEvent.oldScale) { - Blockly.bumpTopObjectsIntoBounds_(workspace); - } - } - }; -}; - /** * Initialize Blockly with various handlers. - * @param {!Blockly.WorkspaceSvg} mainWorkspace Newly created main workspace. - * @private + * @param {!WorkspaceSvg} mainWorkspace Newly created main workspace. */ -Blockly.init_ = function(mainWorkspace) { - var options = mainWorkspace.options; - var svg = mainWorkspace.getParentSvg(); +const init = function(mainWorkspace) { + const options = mainWorkspace.options; + const svg = mainWorkspace.getParentSvg(); // Suppress the browser's context menu. - Blockly.browserEvents.conditionalBind( + browserEvents.conditionalBind( /** @type {!Element} */ (svg.parentNode), 'contextmenu', null, function(e) { - if (!Blockly.utils.isTargetInput(e)) { + if (!utils.isTargetInput(e)) { e.preventDefault(); } }); - var workspaceResizeHandler = - Blockly.browserEvents.conditionalBind(window, 'resize', null, function() { + const workspaceResizeHandler = + browserEvents.conditionalBind(window, 'resize', null, function() { Blockly.hideChaff(true); Blockly.svgResize(mainWorkspace); - Blockly.bumpTopObjectsIntoBounds_(mainWorkspace); + goog.module.get('Blockly.bumpObjects') + .bumpTopObjectsIntoBounds(mainWorkspace); }); mainWorkspace.setResizeHandlerWrapper(workspaceResizeHandler); - Blockly.inject.bindDocumentEvents_(); + bindDocumentEvents(); if (options.languageTree) { - var toolbox = mainWorkspace.getToolbox(); - var flyout = mainWorkspace.getFlyout(true); + const toolbox = mainWorkspace.getToolbox(); + const flyout = mainWorkspace.getFlyout(true); if (toolbox) { toolbox.init(); } else if (flyout) { @@ -340,14 +245,13 @@ Blockly.init_ = function(mainWorkspace) { } if (options.moveOptions && options.moveOptions.scrollbars) { - var horizontalScroll = options.moveOptions.scrollbars === true || + const horizontalScroll = options.moveOptions.scrollbars === true || !!options.moveOptions.scrollbars.horizontal; - var verticalScroll = options.moveOptions.scrollbars === true || + const verticalScroll = options.moveOptions.scrollbars === true || !!options.moveOptions.scrollbars.vertical; - mainWorkspace.scrollbar = - new Blockly.ScrollbarPair( - mainWorkspace, horizontalScroll, verticalScroll, - 'blocklyMainWorkspaceScrollbar'); + mainWorkspace.scrollbar = new ScrollbarPair( + mainWorkspace, horizontalScroll, verticalScroll, + 'blocklyMainWorkspaceScrollbar'); mainWorkspace.scrollbar.resize(); } else { mainWorkspace.setMetrics({x: 0.5, y: 0.5}); @@ -355,10 +259,17 @@ Blockly.init_ = function(mainWorkspace) { // Load the sounds. if (options.hasSounds) { - Blockly.inject.loadSounds_(options.pathToMedia, mainWorkspace); + loadSounds(options.pathToMedia, mainWorkspace); } }; +/** + * Whether event handlers have been bound. Document event handlers will only + * be bound once, even if Blockly is destroyed and reinjected. + * @type {boolean} + */ +let documentEventsBound = false; + /** * Bind document events, but only once. Destroying and reinjecting Blockly * should not bind again. @@ -368,82 +279,80 @@ Blockly.init_ = function(mainWorkspace) { * out of bounds and released will know that it has been released. * Also, 'keydown' has to be on the whole document since the browser doesn't * understand a concept of focus on the SVG image. - * @private */ -Blockly.inject.bindDocumentEvents_ = function() { - if (!Blockly.documentEventsBound_) { - Blockly.browserEvents.conditionalBind(document, 'scroll', null, function() { - var workspaces = Blockly.Workspace.getAll(); - for (var i = 0, workspace; (workspace = workspaces[i]); i++) { +const bindDocumentEvents = function() { + if (!documentEventsBound) { + browserEvents.conditionalBind(document, 'scroll', null, function() { + const workspaces = Workspace.getAll(); + for (let i = 0, workspace; (workspace = workspaces[i]); i++) { if (workspace.updateInverseScreenCTM) { workspace.updateInverseScreenCTM(); } } }); - Blockly.browserEvents.conditionalBind( - document, 'keydown', null, Blockly.onKeyDown); + browserEvents.conditionalBind(document, 'keydown', null, Blockly.onKeyDown); // longStop needs to run to stop the context menu from showing up. It // should run regardless of what other touch event handlers have run. - Blockly.browserEvents.bind(document, 'touchend', null, Blockly.Touch.longStop); - Blockly.browserEvents.bind( - document, 'touchcancel', null, Blockly.Touch.longStop); + browserEvents.bind(document, 'touchend', null, Touch.longStop); + browserEvents.bind(document, 'touchcancel', null, Touch.longStop); // Some iPad versions don't fire resize after portrait to landscape change. - if (Blockly.utils.userAgent.IPAD) { - Blockly.browserEvents.conditionalBind( + if (userAgent.IPAD) { + browserEvents.conditionalBind( window, 'orientationchange', document, function() { // TODO (#397): Fix for multiple Blockly workspaces. - Blockly.svgResize(/** @type {!Blockly.WorkspaceSvg} */ - (Blockly.common.getMainWorkspace())); + Blockly.svgResize(/** @type {!WorkspaceSvg} */ + (common.getMainWorkspace())); }); } } - Blockly.documentEventsBound_ = true; + documentEventsBound = true; }; /** * Load sounds for the given workspace. * @param {string} pathToMedia The path to the media directory. - * @param {!Blockly.Workspace} workspace The workspace to load sounds for. - * @private + * @param {!Workspace} workspace The workspace to load sounds for. */ -Blockly.inject.loadSounds_ = function(pathToMedia, workspace) { - var audioMgr = workspace.getAudioManager(); +const loadSounds = function(pathToMedia, workspace) { + const audioMgr = workspace.getAudioManager(); audioMgr.load( [ - pathToMedia + 'click.mp3', - pathToMedia + 'click.wav', + pathToMedia + 'click.mp3', pathToMedia + 'click.wav', pathToMedia + 'click.ogg' - ], 'click'); + ], + 'click'); audioMgr.load( [ - pathToMedia + 'disconnect.wav', - pathToMedia + 'disconnect.mp3', + pathToMedia + 'disconnect.wav', pathToMedia + 'disconnect.mp3', pathToMedia + 'disconnect.ogg' - ], 'disconnect'); + ], + 'disconnect'); audioMgr.load( [ - pathToMedia + 'delete.mp3', - pathToMedia + 'delete.ogg', + pathToMedia + 'delete.mp3', pathToMedia + 'delete.ogg', pathToMedia + 'delete.wav' - ], 'delete'); + ], + 'delete'); // Bind temporary hooks that preload the sounds. - var soundBinds = []; - var unbindSounds = function() { + const soundBinds = []; + const unbindSounds = function() { while (soundBinds.length) { - Blockly.browserEvents.unbind(soundBinds.pop()); + browserEvents.unbind(soundBinds.pop()); } audioMgr.preload(); }; - // These are bound on mouse/touch events with Blockly.bindEventWithChecks_, so - // they restrict the touch identifier that will be recognized. But this is - // really something that happens on a click, not a drag, so that's not - // necessary. + // These are bound on mouse/touch events with + // Blockly.browserEvents.conditionalBind, so they restrict the touch + // identifier that will be recognized. But this is really something that + // happens on a click, not a drag, so that's not necessary. // Android ignores any sound not loaded as a result of a user action. - soundBinds.push(Blockly.browserEvents.conditionalBind( + soundBinds.push(browserEvents.conditionalBind( document, 'mousemove', null, unbindSounds, true)); - soundBinds.push(Blockly.browserEvents.conditionalBind( + soundBinds.push(browserEvents.conditionalBind( document, 'touchstart', null, unbindSounds, true)); }; + +exports = inject; diff --git a/tests/deps.js b/tests/deps.js index 5d66d0cb3..0366481cc 100644 --- a/tests/deps.js +++ b/tests/deps.js @@ -18,7 +18,7 @@ goog.addDependency('../../core/blocks.js', ['Blockly.Blocks'], [], {'lang': 'es6 goog.addDependency('../../core/browser_events.js', ['Blockly.browserEvents'], ['Blockly.Touch', 'Blockly.utils.global'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/bubble.js', ['Blockly.Bubble'], ['Blockly.Scrollbar', 'Blockly.Touch', 'Blockly.Workspace', 'Blockly.browserEvents', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.math', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/bubble_dragger.js', ['Blockly.BubbleDragger'], ['Blockly.Bubble', 'Blockly.ComponentManager', 'Blockly.Events', 'Blockly.Events.CommentMove', 'Blockly.constants', 'Blockly.utils', 'Blockly.utils.Coordinate'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/bump_objects.js', ['Blockly.bumpObjects'], ['Blockly.utils.math'], {'lang': 'es6', 'module': 'goog'}); +goog.addDependency('../../core/bump_objects.js', ['Blockly.bumpObjects'], ['Blockly.Events', 'Blockly.utils.math'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/clipboard.js', ['Blockly.clipboard'], ['Blockly.Events'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/comment.js', ['Blockly.Comment'], ['Blockly.Bubble', 'Blockly.Css', 'Blockly.Events', 'Blockly.Events.BlockChange', 'Blockly.Events.BubbleOpen', 'Blockly.Icon', 'Blockly.Warning', 'Blockly.browserEvents', 'Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.object', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/common.js', ['Blockly.common'], [], {'lang': 'es6', 'module': 'goog'}); @@ -87,7 +87,7 @@ goog.addDependency('../../core/generator.js', ['Blockly.Generator'], ['Blockly.c goog.addDependency('../../core/gesture.js', ['Blockly.Gesture'], ['Blockly.BlockDragger', 'Blockly.BubbleDragger', 'Blockly.Events', 'Blockly.Events.Click', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.Workspace', 'Blockly.WorkspaceDragger', 'Blockly.blockAnimations', 'Blockly.browserEvents', 'Blockly.internalConstants', 'Blockly.registry', 'Blockly.utils', 'Blockly.utils.Coordinate'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/grid.js', ['Blockly.Grid'], ['Blockly.utils.Svg', 'Blockly.utils.dom', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/icon.js', ['Blockly.Icon'], ['Blockly.browserEvents', 'Blockly.utils', 'Blockly.utils.Coordinate', 'Blockly.utils.Size', 'Blockly.utils.Svg', 'Blockly.utils.dom'], {'lang': 'es6', 'module': 'goog'}); -goog.addDependency('../../core/inject.js', ['Blockly.inject'], ['Blockly.BlockDragSurfaceSvg', 'Blockly.Css', 'Blockly.DropDownDiv', 'Blockly.Events', 'Blockly.Grid', 'Blockly.Msg', 'Blockly.Options', 'Blockly.ScrollbarPair', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.WidgetDiv', 'Blockly.Workspace', 'Blockly.WorkspaceDragSurfaceSvg', 'Blockly.WorkspaceSvg', 'Blockly.browserEvents', 'Blockly.bumpObjects', 'Blockly.common', 'Blockly.utils', 'Blockly.utils.Svg', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.userAgent']); +goog.addDependency('../../core/inject.js', ['Blockly.inject'], ['Blockly.BlockDragSurfaceSvg', 'Blockly.Css', 'Blockly.DropDownDiv', 'Blockly.Grid', 'Blockly.Msg', 'Blockly.Options', 'Blockly.ScrollbarPair', 'Blockly.Tooltip', 'Blockly.Touch', 'Blockly.WidgetDiv', 'Blockly.Workspace', 'Blockly.WorkspaceDragSurfaceSvg', 'Blockly.WorkspaceSvg', 'Blockly.browserEvents', 'Blockly.bumpObjects', 'Blockly.common', 'Blockly.utils', 'Blockly.utils.Svg', 'Blockly.utils.aria', 'Blockly.utils.dom', 'Blockly.utils.userAgent'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/input.js', ['Blockly.Input'], ['Blockly.FieldLabel', 'Blockly.constants', 'Blockly.fieldRegistry', 'Blockly.inputTypes'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/input_types.js', ['Blockly.inputTypes'], ['Blockly.connectionTypes'], {'lang': 'es6', 'module': 'goog'}); goog.addDependency('../../core/insertion_marker_manager.js', ['Blockly.InsertionMarkerManager'], ['Blockly.ComponentManager', 'Blockly.Events', 'Blockly.blockAnimations', 'Blockly.connectionTypes', 'Blockly.constants', 'Blockly.internalConstants'], {'lang': 'es6', 'module': 'goog'});