webapp.qml 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. import QtQuick 2.0
  2. import QtWebKit 3.0
  3. import QtWebKit.experimental 1.0
  4. import QtQuick.Controls 1.0;
  5. import QtQuick.Layouts 1.0;
  6. import QtQuick.Window 2.1;
  7. import Ethereum 1.0
  8. ApplicationWindow {
  9. id: window
  10. title: "Ethereum"
  11. width: 900
  12. height: 600
  13. minimumHeight: 300
  14. property alias url: webview.url
  15. property alias webView: webview
  16. Item {
  17. objectName: "root"
  18. id: root
  19. anchors.fill: parent
  20. state: "inspectorShown"
  21. WebView {
  22. objectName: "webView"
  23. id: webview
  24. anchors.fill: parent
  25. /*
  26. anchors {
  27. left: parent.left
  28. right: parent.right
  29. bottom: sizeGrip.top
  30. top: parent.top
  31. }
  32. */
  33. onTitleChanged: { window.title = title }
  34. experimental.preferences.javascriptEnabled: true
  35. experimental.preferences.navigatorQtObjectEnabled: true
  36. experimental.preferences.developerExtrasEnabled: true
  37. experimental.userScripts: [ui.assetPath("ext/pre.js"), ui.assetPath("ext/big.js"), ui.assetPath("ext/string.js"), ui.assetPath("ext/ethereum.js")]
  38. experimental.onMessageReceived: {
  39. console.log("[onMessageReceived]: ", message.data)
  40. // TODO move to messaging.js
  41. var data = JSON.parse(message.data)
  42. try {
  43. switch(data.call) {
  44. case "getCoinBase":
  45. postData(data._seed, eth.getCoinBase())
  46. break
  47. case "getIsListening":
  48. postData(data._seed, eth.getIsListening())
  49. break
  50. case "getIsMining":
  51. postData(data._seed, eth.getIsMining())
  52. break
  53. case "getPeerCount":
  54. postData(data._seed, eth.getPeerCount())
  55. break
  56. case "getTxCountAt":
  57. require(1)
  58. postData(data._seed, eth.getTxCountAt(data.args[0]))
  59. break
  60. case "getBlockByNumber":
  61. var block = eth.getBlock(data.args[0])
  62. postData(data._seed, block)
  63. break
  64. case "getBlockByHash":
  65. var block = eth.getBlock(data.args[0])
  66. postData(data._seed, block)
  67. break
  68. case "transact":
  69. require(5)
  70. var tx = eth.transact(data.args[0], data.args[1], data.args[2],data.args[3],data.args[4],data.args[5])
  71. postData(data._seed, tx)
  72. break
  73. case "create":
  74. postData(data._seed, null)
  75. break
  76. case "getStorage":
  77. require(2);
  78. var stateObject = eth.getStateObject(data.args[0])
  79. var storage = stateObject.getStorage(data.args[1])
  80. postData(data._seed, storage)
  81. break
  82. case "getStateKeyVals":
  83. require(1);
  84. var stateObject = eth.getStateObject(data.args[0]).stateKeyVal(true)
  85. postData(data._seed,stateObject)
  86. break
  87. case "getTransactionsFor":
  88. require(1);
  89. var txs = eth.getTransactionsFor(data.args[0], true)
  90. postData(data._seed, txs)
  91. break
  92. case "getBalance":
  93. require(1);
  94. postData(data._seed, eth.getStateObject(data.args[0]).value());
  95. break
  96. case "getKey":
  97. var key = eth.getKey().privateKey;
  98. postData(data._seed, key)
  99. break
  100. case "watch":
  101. require(1)
  102. eth.watch(data.args[0], data.args[1]);
  103. break
  104. case "disconnect":
  105. require(1)
  106. postData(data._seed, null)
  107. break;
  108. case "set":
  109. console.log("'Set' has been depcrecated")
  110. /*
  111. for(var key in data.args) {
  112. if(webview.hasOwnProperty(key)) {
  113. window[key] = data.args[key];
  114. }
  115. }
  116. */
  117. break;
  118. case "getSecretToAddress":
  119. require(1)
  120. postData(data._seed, eth.secretToAddress(data.args[0]))
  121. break;
  122. case "debug":
  123. console.log(data.args[0]);
  124. break;
  125. }
  126. } catch(e) {
  127. console.log(data.call + ": " + e)
  128. postData(data._seed, null);
  129. }
  130. }
  131. function require(args, num) {
  132. if(args.length < num) {
  133. throw("required argument count of "+num+" got "+args.length);
  134. }
  135. }
  136. function postData(seed, data) {
  137. webview.experimental.postMessage(JSON.stringify({data: data, _seed: seed}))
  138. }
  139. function postEvent(event, data) {
  140. webview.experimental.postMessage(JSON.stringify({data: data, _event: event}))
  141. }
  142. function onNewBlockCb(block) {
  143. postEvent("block:new", block)
  144. }
  145. function onObjectChangeCb(stateObject) {
  146. postEvent("object:"+stateObject.address(), stateObject)
  147. }
  148. function onStorageChangeCb(storageObject) {
  149. var ev = ["storage", storageObject.stateAddress, storageObject.address].join(":");
  150. postEvent(ev, [storageObject.address, storageObject.value])
  151. }
  152. }
  153. Rectangle {
  154. id: toggleInspector
  155. color: "#bcbcbc"
  156. visible: true
  157. height: 12
  158. width: 12
  159. anchors {
  160. right: root.right
  161. }
  162. MouseArea {
  163. onClicked: {
  164. if(inspector.visible == true){
  165. inspector.visible = false
  166. }else{
  167. inspector.visible = true
  168. }
  169. }
  170. onDoubleClicked: {
  171. console.log('refreshing')
  172. webView.reload()
  173. }
  174. anchors.fill: parent
  175. }
  176. }
  177. Rectangle {
  178. id: sizeGrip
  179. color: "gray"
  180. visible: false
  181. height: 10
  182. anchors {
  183. left: root.left
  184. right: root.right
  185. }
  186. y: Math.round(root.height * 2 / 3)
  187. MouseArea {
  188. anchors.fill: parent
  189. drag.target: sizeGrip
  190. drag.minimumY: 0
  191. drag.maximumY: root.height
  192. drag.axis: Drag.YAxis
  193. }
  194. }
  195. WebView {
  196. id: inspector
  197. visible: false
  198. url: webview.experimental.remoteInspectorUrl
  199. anchors {
  200. left: root.left
  201. right: root.right
  202. top: sizeGrip.bottom
  203. bottom: root.bottom
  204. }
  205. }
  206. states: [
  207. State {
  208. name: "inspectorShown"
  209. PropertyChanges {
  210. target: inspector
  211. url: webview.experimental.remoteInspectorUrl
  212. }
  213. }
  214. ]
  215. }
  216. }