diff --git a/src/extension-support/extension-manager.js b/src/extension-support/extension-manager.js index 9a8f066e..11970ccc 100644 --- a/src/extension-support/extension-manager.js +++ b/src/extension-support/extension-manager.js @@ -71,7 +71,7 @@ const createExtensionService = extensionManager => { }; class ExtensionManager { - constructor (runtime) { + constructor (vm) { /** * The ID number to provide to the next extension worker. * @type {int} @@ -110,12 +110,17 @@ class ExtensionManager { */ this.securityManager = new SecurityManager(); + /** + * @type {VirtualMachine} + */ + this.vm = vm; + /** * Keep a reference to the runtime so we can construct internal extension objects. * TODO: remove this in favor of extensions accessing the runtime as a service. * @type {Runtime} */ - this.runtime = runtime; + this.runtime = vm.runtime; this.loadingAsyncExtensions = 0; this.asyncExtensionsLoadedCallbacks = []; @@ -201,7 +206,7 @@ class ExtensionManager { if (sandboxMode === 'unsandboxed') { const {load} = require('./tw-unsandboxed-extension-runner'); - const extensionObjects = await load(extensionURL); + const extensionObjects = await load(extensionURL, this.vm); const fakeWorkerId = this.nextExtensionWorker++; this.workerURLs[fakeWorkerId] = extensionURL; diff --git a/src/extension-support/tw-unsandboxed-extension-runner.js b/src/extension-support/tw-unsandboxed-extension-runner.js index e82efe32..96d540ad 100644 --- a/src/extension-support/tw-unsandboxed-extension-runner.js +++ b/src/extension-support/tw-unsandboxed-extension-runner.js @@ -3,8 +3,10 @@ const BlockType = require('../extension-support/block-type'); const TargetType = require('../extension-support/target-type'); const AsyncLimiter = require('../util/async-limiter'); -const loadUnsandboxedExtension = extensionURL => new Promise((resolve, reject) => { +const loadUnsandboxedExtension = (extensionURL, vm) => new Promise((resolve, reject) => { global.Scratch = global.Scratch || {}; + global.Scratch.vm = vm; + global.Scratch.renderer = vm.runtime.renderer; global.Scratch.ArgumentType = ArgumentType; global.Scratch.BlockType = BlockType; global.Scratch.TargetType = TargetType; @@ -31,7 +33,7 @@ const loadUnsandboxedExtension = extensionURL => new Promise((resolve, reject) = // Because loading unsandboxed extensions requires messing with global state (global.Scratch), // only let one extension load at a time. const limiter = new AsyncLimiter(loadUnsandboxedExtension, 1); -const load = extensionURL => limiter.do(extensionURL); +const load = (extensionURL, vm) => limiter.do(extensionURL, vm); module.exports = { load diff --git a/src/virtual-machine.js b/src/virtual-machine.js index b7e2cdd7..f2a95411 100644 --- a/src/virtual-machine.js +++ b/src/virtual-machine.js @@ -196,7 +196,7 @@ class VirtualMachine extends EventEmitter { this.emit(Runtime.TURBO_MODE_ON); }); - this.extensionManager = new ExtensionManager(this.runtime); + this.extensionManager = new ExtensionManager(this); this.securityManager = this.extensionManager.securityManager; this.runtime.extensionManager = this.extensionManager;