|
|
@ -30,9 +30,8 @@ var css = csjs` |
|
|
|
|
|
|
|
|
|
|
|
class DebuggerUI { |
|
|
|
class DebuggerUI { |
|
|
|
|
|
|
|
|
|
|
|
constructor (container, blockchain, fetchContractAndCompile) { |
|
|
|
constructor (debuggerModule, component, fetchContractAndCompile) { |
|
|
|
this.registry = globalRegistry |
|
|
|
this.debuggerModule = debuggerModule |
|
|
|
this.blockchain = blockchain |
|
|
|
|
|
|
|
this.fetchContractAndCompile = fetchContractAndCompile |
|
|
|
this.fetchContractAndCompile = fetchContractAndCompile |
|
|
|
this.event = new EventManager() |
|
|
|
this.event = new EventManager() |
|
|
|
|
|
|
|
|
|
|
@ -48,62 +47,62 @@ class DebuggerUI { |
|
|
|
|
|
|
|
|
|
|
|
this.view |
|
|
|
this.view |
|
|
|
|
|
|
|
|
|
|
|
container.appendChild(this.render()) |
|
|
|
component.appendChild(this.render()) |
|
|
|
|
|
|
|
|
|
|
|
this.setEditor() |
|
|
|
this.setEditor() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
setEditor () { |
|
|
|
setEditor () { |
|
|
|
const self = this |
|
|
|
this.editor = globalRegistry.get('editor').api |
|
|
|
this.editor = this.registry.get('editor').api |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.editor.event.register('breakpointCleared', (fileName, row) => { |
|
|
|
this.editor.event.register('breakpointCleared', (fileName, row) => { |
|
|
|
if (self.debugger) self.debugger.breakPointManager.remove({fileName: fileName, row: row}) |
|
|
|
if (this.debugger) this.debugger.breakPointManager.remove({fileName: fileName, row: row}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
self.editor.event.register('breakpointAdded', (fileName, row) => { |
|
|
|
this.editor.event.register('breakpointAdded', (fileName, row) => { |
|
|
|
if (self.debugger) self.debugger.breakPointManager.add({fileName: fileName, row: row}) |
|
|
|
if (this.debugger) this.debugger.breakPointManager.add({fileName: fileName, row: row}) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
self.editor.event.register('contentChanged', function () { |
|
|
|
this.editor.event.register('contentChanged', () => { |
|
|
|
if (self.debugger) self.debugger.unload() |
|
|
|
if (this.debugger) this.debugger.unload() |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
listenToEvents () { |
|
|
|
listenToEvents () { |
|
|
|
const self = this |
|
|
|
if (!this.debugger) return |
|
|
|
if (!self.debugger) return |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.debugger.event.register('debuggerStatus', function (isActive) { |
|
|
|
this.debugger.event.register('debuggerStatus', async (isActive) => { |
|
|
|
self.sourceHighlighter.currentSourceLocation(null) |
|
|
|
await this.debuggerModule.call('editor', 'discardHighlight') |
|
|
|
self.isActive = isActive |
|
|
|
this.isActive = isActive |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
this.debugger.event.register('newSourceLocation', async function (lineColumnPos, rawLocation) { |
|
|
|
this.debugger.event.register('newSourceLocation', async (lineColumnPos, rawLocation) => { |
|
|
|
const contracts = await self.fetchContractAndCompile( |
|
|
|
const contracts = await this.fetchContractAndCompile( |
|
|
|
self.currentReceipt.contractAddress || self.currentReceipt.to, |
|
|
|
this.currentReceipt.contractAddress || this.currentReceipt.to, |
|
|
|
self.currentReceipt) |
|
|
|
this.currentReceipt) |
|
|
|
if (contracts) { |
|
|
|
if (contracts) { |
|
|
|
const path = contracts.getSourceName(rawLocation.file) |
|
|
|
const path = contracts.getSourceName(rawLocation.file) |
|
|
|
if (path) self.sourceHighlighter.currentSourceLocationFromfileName(lineColumnPos, path) |
|
|
|
if (path) { |
|
|
|
|
|
|
|
await this.debuggerModule.call('editor', 'discardHighlight') |
|
|
|
|
|
|
|
await this.debuggerModule.call('editor', 'highlight', lineColumnPos, path) |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
this.debugger.event.register('debuggerUnloaded', self.unLoad.bind(this)) |
|
|
|
this.debugger.event.register('debuggerUnloaded', () => this.unLoad()) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
startTxBrowser () { |
|
|
|
startTxBrowser () { |
|
|
|
const self = this |
|
|
|
|
|
|
|
let txBrowser = new TxBrowser() |
|
|
|
let txBrowser = new TxBrowser() |
|
|
|
this.txBrowser = txBrowser |
|
|
|
this.txBrowser = txBrowser |
|
|
|
|
|
|
|
|
|
|
|
txBrowser.event.register('requestDebug', function (blockNumber, txNumber, tx) { |
|
|
|
txBrowser.event.register('requestDebug', (blockNumber, txNumber, tx) => { |
|
|
|
if (self.debugger) self.debugger.unload() |
|
|
|
if (this.debugger) this.debugger.unload() |
|
|
|
self.startDebugging(blockNumber, txNumber, tx) |
|
|
|
this.startDebugging(blockNumber, txNumber, tx) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
txBrowser.event.register('unloadRequested', this, function (blockNumber, txIndex, tx) { |
|
|
|
txBrowser.event.register('unloadRequested', this, (blockNumber, txIndex, tx) => { |
|
|
|
if (self.debugger) self.debugger.unload() |
|
|
|
if (this.debugger) this.debugger.unload() |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -113,13 +112,13 @@ class DebuggerUI { |
|
|
|
|
|
|
|
|
|
|
|
getDebugWeb3 () { |
|
|
|
getDebugWeb3 () { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
this.blockchain.detectNetwork((error, network) => { |
|
|
|
this.debuggerModule.blockchain.detectNetwork((error, network) => { |
|
|
|
let web3 |
|
|
|
let web3 |
|
|
|
if (error || !network) { |
|
|
|
if (error || !network) { |
|
|
|
web3 = init.web3DebugNode(this.blockchain.web3()) |
|
|
|
web3 = init.web3DebugNode(this.debuggerModule.blockchain.web3()) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
const webDebugNode = init.web3DebugNode(network.name) |
|
|
|
const webDebugNode = init.web3DebugNode(network.name) |
|
|
|
web3 = !webDebugNode ? this.blockchain.web3() : webDebugNode |
|
|
|
web3 = !webDebugNode ? this.debuggerModule.blockchain.web3() : webDebugNode |
|
|
|
} |
|
|
|
} |
|
|
|
init.extendWeb3(web3) |
|
|
|
init.extendWeb3(web3) |
|
|
|
resolve(web3) |
|
|
|
resolve(web3) |
|
|
@ -134,7 +133,7 @@ class DebuggerUI { |
|
|
|
this.currentReceipt = await web3.eth.getTransactionReceipt(txNumber) |
|
|
|
this.currentReceipt = await web3.eth.getTransactionReceipt(txNumber) |
|
|
|
this.debugger = new Debugger({ |
|
|
|
this.debugger = new Debugger({ |
|
|
|
web3, |
|
|
|
web3, |
|
|
|
offsetToLineColumnConverter: this.registry.get('offsettolinecolumnconverter').api, |
|
|
|
offsetToLineColumnConverter: globalRegistry.get('offsettolinecolumnconverter').api, |
|
|
|
compilationResult: async (address) => { |
|
|
|
compilationResult: async (address) => { |
|
|
|
try { |
|
|
|
try { |
|
|
|
return await this.fetchContractAndCompile(address, this.currentReceipt) |
|
|
|
return await this.fetchContractAndCompile(address, this.currentReceipt) |
|
|
@ -164,7 +163,7 @@ class DebuggerUI { |
|
|
|
this.currentReceipt = await web3.eth.getTransactionReceipt(hash) |
|
|
|
this.currentReceipt = await web3.eth.getTransactionReceipt(hash) |
|
|
|
const debug = new Debugger({ |
|
|
|
const debug = new Debugger({ |
|
|
|
web3, |
|
|
|
web3, |
|
|
|
offsetToLineColumnConverter: this.registry.get('offsettolinecolumnconverter').api, |
|
|
|
offsetToLineColumnConverter: globalRegistry.get('offsettolinecolumnconverter').api, |
|
|
|
compilationResult: async (address) => { |
|
|
|
compilationResult: async (address) => { |
|
|
|
try { |
|
|
|
try { |
|
|
|
return await this.fetchContractAndCompile(address, this.currentReceipt) |
|
|
|
return await this.fetchContractAndCompile(address, this.currentReceipt) |
|
|
@ -190,7 +189,8 @@ class DebuggerUI { |
|
|
|
this.debuggerHeadPanelsView = yo`<div class="${css.innerShift}"></div>` |
|
|
|
this.debuggerHeadPanelsView = yo`<div class="${css.innerShift}"></div>` |
|
|
|
this.stepManagerView = yo`<div class="${css.innerShift}"></div>` |
|
|
|
this.stepManagerView = yo`<div class="${css.innerShift}"></div>` |
|
|
|
|
|
|
|
|
|
|
|
var view = yo`<div>
|
|
|
|
var view = yo` |
|
|
|
|
|
|
|
<div> |
|
|
|
<div class="${css.innerShift}"> |
|
|
|
<div class="${css.innerShift}"> |
|
|
|
${this.txBrowser.render()} |
|
|
|
${this.txBrowser.render()} |
|
|
|
${this.debuggerHeadPanelsView} |
|
|
|
${this.debuggerHeadPanelsView} |
|
|
@ -198,14 +198,15 @@ class DebuggerUI { |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="${css.statusMessage}">${this.statusMessage}</div> |
|
|
|
<div class="${css.statusMessage}">${this.statusMessage}</div> |
|
|
|
${this.debuggerPanelsView} |
|
|
|
${this.debuggerPanelsView} |
|
|
|
</div>` |
|
|
|
</div> |
|
|
|
|
|
|
|
` |
|
|
|
if (!this.view) { |
|
|
|
if (!this.view) { |
|
|
|
this.view = view |
|
|
|
this.view = view |
|
|
|
} |
|
|
|
} |
|
|
|
return view |
|
|
|
return view |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
unLoad () { |
|
|
|
async unLoad () { |
|
|
|
yo.update(this.debuggerHeadPanelsView, yo`<div></div>`) |
|
|
|
yo.update(this.debuggerHeadPanelsView, yo`<div></div>`) |
|
|
|
yo.update(this.debuggerPanelsView, yo`<div></div>`) |
|
|
|
yo.update(this.debuggerPanelsView, yo`<div></div>`) |
|
|
|
yo.update(this.stepManagerView, yo`<div></div>`) |
|
|
|
yo.update(this.stepManagerView, yo`<div></div>`) |
|
|
@ -218,6 +219,10 @@ class DebuggerUI { |
|
|
|
this.event.trigger('traceUnloaded') |
|
|
|
this.event.trigger('traceUnloaded') |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async deleteHighlights () { |
|
|
|
|
|
|
|
await this.debuggerModule.call('editor', 'discardHighlight') |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
renderDebugger () { |
|
|
|
renderDebugger () { |
|
|
|
yo.update(this.debuggerHeadPanelsView, this.vmDebugger.renderHead()) |
|
|
|
yo.update(this.debuggerHeadPanelsView, this.vmDebugger.renderHead()) |
|
|
|
yo.update(this.debuggerPanelsView, this.vmDebugger.render()) |
|
|
|
yo.update(this.debuggerPanelsView, this.vmDebugger.render()) |
|
|
|