diff --git a/core/events/events.js b/core/events/events.js index 56c1b370d..adf050262 100644 --- a/core/events/events.js +++ b/core/events/events.js @@ -305,6 +305,12 @@ Blockly.Events.filter = function(queueIn, forward) { event.name == lastEvent.name) { // Merge change events. lastEvent.newValue = event.newValue; + } else if (event.type == Blockly.Events.VIEWPORT_CHANGE) { + // Merge viewport change events. + lastEvent.viewTop = event.viewTop; + lastEvent.viewLeft = event.viewLeft; + lastEvent.scale = event.scale; + lastEvent.oldScale = event.oldScale; } else if (event.type == Blockly.Events.CLICK && lastEvent.type == Blockly.Events.BUBBLE_OPEN) { // Drop click events caused by opening/closing bubbles. diff --git a/tests/mocha/event_test.js b/tests/mocha/event_test.js index c53850ebb..19776faad 100644 --- a/tests/mocha/event_test.js +++ b/tests/mocha/event_test.js @@ -910,6 +910,19 @@ suite('Events', function() { chai.assert.equal(filteredEvents[0].newValue, 'item2'); }); + test('Merge viewport change events', function() { + var events = [ + new Blockly.Events.ViewportChange(1, 2, 3, this.workspace, 4), + new Blockly.Events.ViewportChange(5, 6, 7, this.workspace, 8) + ]; + var filteredEvents = Blockly.Events.filter(events, true); + chai.assert.equal(filteredEvents.length, 1); // second change event merged into first + chai.assert.equal(filteredEvents[0].viewTop, 5); + chai.assert.equal(filteredEvents[0].viewLeft, 6); + chai.assert.equal(filteredEvents[0].scale, 7); + chai.assert.equal(filteredEvents[0].oldScale, 8); + }); + test('Merge ui events', function() { var block1 = this.workspace.newBlock('field_variable_test_block', '1'); var block2 = this.workspace.newBlock('field_variable_test_block', '2');