diff --git a/core/serialization/blocks.ts b/core/serialization/blocks.ts index 053d523a2..e53f30944 100644 --- a/core/serialization/blocks.ts +++ b/core/serialization/blocks.ts @@ -399,9 +399,13 @@ export function appendInternal( } eventUtils.disable(); - const block = appendPrivate(state, workspace, {parentConnection, isShadow}); + let block; + try { + block = appendPrivate(state, workspace, {parentConnection, isShadow}); + } finally { + eventUtils.enable(); + } - eventUtils.enable(); if (eventUtils.isEnabled()) { eventUtils.fire(new (eventUtils.get(eventUtils.BLOCK_CREATE))(block)); } diff --git a/tests/mocha/jso_deserialization_test.js b/tests/mocha/jso_deserialization_test.js index fa6590cb7..d58e208fb 100644 --- a/tests/mocha/jso_deserialization_test.js +++ b/tests/mocha/jso_deserialization_test.js @@ -23,6 +23,25 @@ suite('JSO Deserialization', function () { }); suite('Events', function () { + test('bad JSON does not leave events disabled', function () { + const state = { + 'blocks': { + 'blocks': [ + { + 'type': 'undefined_block', + }, + ], + }, + }; + chai.assert.throws(() => { + Blockly.serialization.workspaces.load(state, this.workspace); + }); + chai.assert.isTrue( + Blockly.Events.isEnabled(), + 'Expected events to be enabled', + ); + }); + suite('Finished loading', function () { test('Just var', function () { const state = {