diff --git a/src/ui/DropdownPanel.js b/src/ui/DropdownPanel.js index 8791cde742..0a3a6ac7f7 100644 --- a/src/ui/DropdownPanel.js +++ b/src/ui/DropdownPanel.js @@ -20,11 +20,32 @@ function DropdownPanel (_name, _opts) { this.view } +DropdownPanel.prototype.setMessage = function (message) { + if (this.view) { + this.view.querySelector('.dropdownpanel .dropdownrawcontent').style.display = 'none' + this.view.querySelector('.dropdownpanel .dropdowncontent').style.display = 'none' + this.view.querySelector('.dropdownpanel .fa-refresh').style.display = 'none' + this.message(message) + } +} + +DropdownPanel.prototype.setLoading = function () { + if (this.view) { + this.view.querySelector('.dropdownpanel .dropdownrawcontent').style.display = 'none' + this.view.querySelector('.dropdownpanel .dropdowncontent').style.display = 'none' + this.view.querySelector('.dropdownpanel .fa-refresh').style.display = 'inline-block' + this.message('') + } +} + DropdownPanel.prototype.update = function (_data, _header) { if (this.view) { + this.view.querySelector('.dropdownpanel .fa-refresh').style.display = 'none' + this.view.querySelector('.dropdownpanel .dropdowncontent').style.display = 'block' this.view.querySelector('.dropdownpanel .dropdownrawcontent').innerText = JSON.stringify(_data, null, '\t') this.view.querySelector('.dropdownpanel button.btn').style.display = 'block' this.view.querySelector('.title span').innerText = _header || ' ' + this.message('') if (this.json) { this.treeView.update(_data) } @@ -32,8 +53,10 @@ DropdownPanel.prototype.update = function (_data, _header) { } DropdownPanel.prototype.setContent = function (node) { - var parent = this.view.querySelector('.dropdownpanel div.dropdowncontent') - parent.replaceChild(node, parent.firstElementChild) + if (this.view) { + var parent = this.view.querySelector('.dropdownpanel div.dropdowncontent') + parent.replaceChild(node, parent.firstElementChild) + } } DropdownPanel.prototype.render = function (overridestyle) { @@ -43,7 +66,19 @@ DropdownPanel.prototype.render = function (overridestyle) { } overridestyle === undefined ? {} : overridestyle var self = this - var view = yo`
+ var view = yo` +
+
${this.name}
@@ -51,8 +86,10 @@ DropdownPanel.prototype.render = function (overridestyle) {
` if (!this.view) { @@ -102,4 +139,12 @@ DropdownPanel.prototype.show = function () { } } +DropdownPanel.prototype.message = function (message) { + if (this.view) { + var mes = this.view.querySelector('.dropdownpanel .message') + mes.innerText = message + mes.style.display = (message === '') ? 'none' : 'block' + } +} + module.exports = DropdownPanel diff --git a/src/ui/SolidityState.js b/src/ui/SolidityState.js index 5c59215c88..7bcd345eef 100644 --- a/src/ui/SolidityState.js +++ b/src/ui/SolidityState.js @@ -24,54 +24,63 @@ function SolidityState (_parent, _traceManager, _codeManager, _solidityProxy) { } SolidityState.prototype.render = function () { - this.view = yo`
-
+ if (!this.view) { + this.view = yo`
${this.basicPanel.render()}
` + } return this.view } SolidityState.prototype.init = function () { var self = this + var decodeTimeout = null this.parent.event.register('indexChanged', this, function (index) { - var warningDiv = this.view.querySelector('#warning') - warningDiv.innerHTML = '' + self.basicPanel.setMessage('') if (index < 0) { - warningDiv.innerHTML = 'invalid step index' + self.basicPanel.setMessage('invalid step index') return } if (self.parent.currentStepIndex !== index) return - if (!this.solidityProxy.loaded()) { - warningDiv.innerHTML = 'no source has been specified' + if (!self.solidityProxy.loaded()) { + self.basicPanel.setMessage('no source has been specified') return } if (!self.storageResolver) { - warningDiv.innerHTML = 'storage not ready' return } + if (decodeTimeout) { + window.clearTimeout(decodeTimeout) + } + self.basicPanel.setLoading() + decodeTimeout = setTimeout(() => { + decode(self, index) + }, 500) + }) +} - self.traceManager.getCurrentCalledAddressAt(self.parent.currentStepIndex, (error, address) => { - if (error) { - self.basicPanel.update({}) - console.log(error) +function decode (self, index) { + self.traceManager.getCurrentCalledAddressAt(self.parent.currentStepIndex, (error, address) => { + if (error) { + self.basicPanel.update({}) + console.log(error) + } else { + if (self.stateVariablesByAddresses[address]) { + extractStateVariables(self, self.stateVariablesByAddresses[address], address) } else { - if (self.stateVariablesByAddresses[address]) { - extractStateVariables(self, self.stateVariablesByAddresses[address], address) - } else { - self.solidityProxy.extractStateVariablesAt(index, function (error, stateVars) { - if (error) { - self.basicPanel.update({}) - console.log(error) - } else { - self.stateVariablesByAddresses[address] = stateVars - extractStateVariables(self, stateVars, address) - } - }) - } + self.solidityProxy.extractStateVariablesAt(index, function (error, stateVars) { + if (error) { + self.basicPanel.update({}) + console.log(error) + } else { + self.stateVariablesByAddresses[address] = stateVars + extractStateVariables(self, stateVars, address) + } + }) } - }) + } }) } @@ -82,8 +91,11 @@ function extractStateVariables (self, stateVars, address) { address: address }, self.storageResolver, self.traceManager) stateDecoder.decodeState(stateVars, storageViewer).then((result) => { + self.basicPanel.setMessage('') if (!result.error) { self.basicPanel.update(result) + } else { + self.basicPanel.setMessage(result.error) } }) }