diff --git a/src/blocks/scratch3_looks.js b/src/blocks/scratch3_looks.js index 7f6388b39..5fc16085c 100644 --- a/src/blocks/scratch3_looks.js +++ b/src/blocks/scratch3_looks.js @@ -153,13 +153,16 @@ class Scratch3LooksBlocks { * @private */ _renderBubble (target) { + if (!this.runtime.renderer) return; + const bubbleState = this._getBubbleState(target); const {drawableVisible, type, text, onSpriteRight} = bubbleState; // Remove the bubble if target is not visible, or text is being set to blank // without being initialized. See comment below about blank text optimization. if (!target.visible || (text === '' && !bubbleState.skinId)) { - return this._onTargetWillExit(target); + this._onTargetWillExit(target); + return; } if (bubbleState.skinId) { diff --git a/src/engine/sequencer.js b/src/engine/sequencer.js index 2db6054b7..ce65163d4 100644 --- a/src/engine/sequencer.js +++ b/src/engine/sequencer.js @@ -175,7 +175,7 @@ class Sequencer { thread.popStack(); } // Save the current block ID to notice if we did control flow. - while ((currentBlockId = thread.peekStack()) !== 0) { + while ((currentBlockId = thread.peekStack())) { let isWarpMode = thread.peekStackFrame().warpMode; if (isWarpMode && !thread.warpTimer) { // Initialize warp-mode timer if it hasn't been already. diff --git a/test/fixtures/saythink-and-wait.sb2 b/test/fixtures/saythink-and-wait.sb2 new file mode 100644 index 000000000..d9be202c4 Binary files /dev/null and b/test/fixtures/saythink-and-wait.sb2 differ diff --git a/test/integration/saythink-and-wait.js b/test/integration/saythink-and-wait.js new file mode 100644 index 000000000..abde2d978 --- /dev/null +++ b/test/integration/saythink-and-wait.js @@ -0,0 +1,37 @@ +const Worker = require('tiny-worker'); +const path = require('path'); +const test = require('tap').test; +const makeTestStorage = require('../fixtures/make-test-storage'); +const extract = require('../fixtures/extract'); +const VirtualMachine = require('../../src/index'); +const dispatch = require('../../src/dispatch/central-dispatch'); + +const uri = path.resolve(__dirname, '../fixtures/saythink-and-wait.sb2'); +const project = extract(uri); + +// By default Central Dispatch works with the Worker class built into the browser. Tell it to use TinyWorker instead. +dispatch.workerClass = Worker; + +test('say/think and wait', t => { + const vm = new VirtualMachine(); + vm.attachStorage(makeTestStorage()); + + // Start VM, load project, and run + t.doesNotThrow(() => { + vm.start(); + vm.clear(); + vm.setCompatibilityMode(false); + vm.setTurboMode(false); + vm.loadProject(project).then(() => { + vm.greenFlag(); + + // After two seconds, stop the project. + // The test will fail if the project throws. + setTimeout(() => { + vm.stopAll(); + t.end(); + process.nextTick(process.exit); + }, 2000); + }); + }); +});