diff --git a/src/app.js b/src/app.js index bb12028c75..73f2c21cd8 100644 --- a/src/app.js +++ b/src/app.js @@ -784,7 +784,22 @@ function run () { runCompiler() if (queryParams.get().context) { - executionContext.setContext(queryParams.get().context, queryParams.get().endpointurl) + let context = queryParams.get().context + let endPointUrl = queryParams.get().endPointUrl + executionContext.setContext(context, endPointUrl, + () => { + modalDialogCustom.confirm(null, 'Are you sure you want to connect to an ethereum node?', () => { + if (!endPointUrl) { + endPointUrl = 'http://localhost:8545' + } + modalDialogCustom.prompt(null, 'Web3 Provider Endpoint', endPointUrl, (target) => { + executionContext.setProviderFromEndpoint(target, context) + }, () => {}) + }, () => {}) + }, + (alertMsg) => { + modalDialogCustom.alert(alertMsg) + }) } if (queryParams.get().debugtx) { diff --git a/src/app/tabs/run-tab.js b/src/app/tabs/run-tab.js index 02df26e3d1..ee2837f0e9 100644 --- a/src/app/tabs/run-tab.js +++ b/src/app/tabs/run-tab.js @@ -238,13 +238,30 @@ function runTab (container, appAPI, appEvents, opts) { // DROPDOWN var selectExEnv = el.querySelector('#selectExEnvOptions') + + function setFinalContext () { + // set the final context. Cause it is possible that this is not the one we've originaly selected + selectExEnv.value = executionContext.getProvider() + fillAccountsList(appAPI, el) + events.trigger('clearInstance', []) + } + selectExEnv.addEventListener('change', function (event) { - executionContext.executionContextChange(selectExEnv.options[selectExEnv.selectedIndex].value, null, () => { - // set the final context. Cause it is possible that this is not the one we've originaly selected - selectExEnv.value = executionContext.getProvider() - fillAccountsList(appAPI, el) - events.trigger('clearInstance', []) - }) + let context = selectExEnv.options[selectExEnv.selectedIndex].value + executionContext.executionContextChange(context, null, () => { + modalDialogCustom.confirm(null, 'Are you sure you want to connect to an ethereum node?', () => { + modalDialogCustom.prompt(null, 'Web3 Provider Endpoint', 'http://localhost:8545', (target) => { + executionContext.setProviderFromEndpoint(target, context, (alertMsg) => { + if (alertMsg) { + modalDialogCustom.alert(alertMsg) + } + setFinalContext() + }) + }, setFinalContext) + }, setFinalContext) + }, (alertMsg) => { + modalDialogCustom.alert(alertMsg) + }, setFinalContext) }) selectExEnv.value = executionContext.getProvider() fillAccountsList(appAPI, el) diff --git a/src/execution-context.js b/src/execution-context.js index 72a822a734..c4e77bdba6 100644 --- a/src/execution-context.js +++ b/src/execution-context.js @@ -8,7 +8,6 @@ var ethUtil = require('ethereumjs-util') var StateManager = require('ethereumjs-vm/lib/stateManager') var Web3VMProvider = remixLib.vm.Web3VMProvider var rlp = ethUtil.rlp -var modalDialogCustom = require('./app/ui/modal-dialog-custom') var injectedProvider @@ -145,23 +144,13 @@ function ExecutionContext () { return vm } - this.setContext = function (context, endPointUrl) { + this.setContext = function (context, endPointUrl, confirmCb, infoCb) { executionContext = context - this.executionContextChange(context, endPointUrl) + this.executionContextChange(context, endPointUrl, confirmCb, infoCb) } - this.executionContextChange = function (context, endPointUrl, cb) { + this.executionContextChange = function (context, endPointUrl, confirmCb, infoCb, cb) { if (!cb) cb = () => {} - function runPrompt () { - if (!endPointUrl) { - endPointUrl = 'http://localhost:8545' - } - modalDialogCustom.prompt(null, 'Web3 Provider Endpoint', endPointUrl, (target) => { - setProviderFromEndpoint(target, context, cb) - }, () => { - cb() - }) - } if (context === 'vm') { executionContext = context @@ -169,7 +158,7 @@ function ExecutionContext () { vm.stateManager.checkpoint() }) self.event.trigger('contextChanged', ['vm']) - cb() + return cb() } if (context === 'injected') { @@ -177,20 +166,18 @@ function ExecutionContext () { var alertMsg = 'No injected Web3 provider found. ' alertMsg += 'Make sure your provider (e.g. MetaMask) is active and running ' alertMsg += '(when recently activated you may have to reload the page).' - modalDialogCustom.alert(alertMsg) - cb() + infoCb(alertMsg) + return cb() } else { executionContext = context web3.setProvider(injectedProvider) self.event.trigger('contextChanged', ['injected']) - cb() + return cb() } } if (context === 'web3') { - modalDialogCustom.confirm(null, 'Are you sure you want to connect to an ethereum node?', - () => { runPrompt(endPointUrl) }, () => { cb() } - ) + confirmCb(cb) } } @@ -213,6 +200,7 @@ function ExecutionContext () { } }, 15000) + // TODO: not used here anymore and needs to be moved function setProviderFromEndpoint (endpoint, context, cb) { var oldProvider = web3.currentProvider @@ -230,10 +218,10 @@ function ExecutionContext () { web3.setProvider(oldProvider) var alertMsg = 'Not possible to connect to the Web3 provider. ' alertMsg += 'Make sure the provider is running and a connection is open (via IPC or RPC).' - modalDialogCustom.alert(alertMsg) - cb() + cb(alertMsg) } } + this.setProviderFromEndpoint = setProviderFromEndpoint } module.exports = new ExecutionContext()