bsc/mist/assets/qml/webapp.qml

370 lines
7.3 KiB
QML
Raw Normal View History

import QtQuick 2.0
import QtWebKit 3.0
import QtWebKit.experimental 1.0
import QtQuick.Controls 1.0;
2014-08-14 14:26:29 +03:00
import QtQuick.Controls.Styles 1.0
import QtQuick.Layouts 1.0;
import QtQuick.Window 2.1;
import Ethereum 1.0
import "../ext/qml_messaging.js" as Messaging
//ApplicationWindow {
Rectangle {
2014-04-30 02:44:12 +03:00
id: window
property var title: "Browser"
property var iconSource: "../browser.png"
property var menuItem
2014-04-30 02:44:12 +03:00
property alias url: webview.url
property alias webView: webview
Component.onCompleted: {
webview.url = "http://etherian.io"
}
2014-04-30 02:44:12 +03:00
Item {
objectName: "root"
id: root
anchors.fill: parent
state: "inspectorShown"
RowLayout {
id: navBar
2014-08-14 14:26:29 +03:00
height: 40
anchors {
left: parent.left
right: parent.right
2014-08-14 14:26:29 +03:00
leftMargin: 7
}
Button {
id: back
onClicked: {
webview.goBack()
}
2014-08-14 14:26:29 +03:00
style: ButtonStyle {
background: Image {
source: "../back.png"
width: 30
height: 30
}
}
}
TextField {
anchors {
left: back.right
2014-08-14 14:26:29 +03:00
right: toggleInspector.left
leftMargin: 5
rightMargin: 5
2014-08-13 11:52:30 +03:00
}
text: "http://etherian.io"
id: uriNav
2014-08-14 14:26:29 +03:00
y: parent.height / 2 - this.height / 2
Keys.onReturnPressed: {
2014-08-14 14:26:29 +03:00
webview.url = this.text;
}
}
Button {
id: toggleInspector
anchors {
right: parent.right
}
iconSource: "../bug.png"
onClicked: {
if(inspector.visible == true){
inspector.visible = false
}else{
inspector.visible = true
inspector.url = webview.experimental.remoteInspectorUrl
}
}
}
}
2014-08-17 13:41:23 +03:00
2014-08-14 14:26:29 +03:00
WebView {
objectName: "webView"
id: webview
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
top: navBar.bottom
}
property var cleanPath: false
onNavigationRequested: {
if(!this.cleanPath) {
var uri = request.url.toString();
if(!/.*\:\/\/.*/.test(uri)) {
uri = "http://" + uri;
}
2014-08-13 11:52:30 +03:00
var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/
if(reg.test(uri)) {
2014-08-14 14:26:29 +03:00
uri.replace(reg, function(match, pre, domain, path) {
uri = pre;
var lookup = eth.lookupDomain(domain.substring(0, domain.length - 4));
var ip = [];
for(var i = 0, l = lookup.length; i < l; i++) {
ip.push(lookup.charCodeAt(i))
}
if(ip.length != 0) {
uri += lookup;
} else {
uri += domain;
}
uri += path;
});
}
2014-08-14 14:26:29 +03:00
this.cleanPath = true;
webview.url = uri;
2014-08-14 14:26:29 +03:00
} else {
// Prevent inf loop.
this.cleanPath = false;
}
}
2014-08-17 13:41:23 +03:00
function sendMessage(data) {
//this.experimental.evaluateJavaScript("window.____returnData="+JSON.stringify(data));
webview.experimental.postMessage(JSON.stringify(data))
}
onTitleChanged: {
var data = Messaging.HandleMessage(title);
if(data) {
sendMessage(data)
}
}
2014-08-17 13:41:23 +03:00
2014-04-30 02:44:12 +03:00
experimental.preferences.javascriptEnabled: true
experimental.preferences.navigatorQtObjectEnabled: true
experimental.preferences.developerExtrasEnabled: true
experimental.userScripts: ["../ext/q.js", "../ext/pre.js", "../ext/big.js", "../ext/string.js", "../ext/html_messaging.js"]
2014-04-30 02:44:12 +03:00
experimental.onMessageReceived: {
2014-05-05 12:56:05 +03:00
console.log("[onMessageReceived]: ", message.data)
2014-04-30 02:44:12 +03:00
// TODO move to messaging.js
var data = JSON.parse(message.data)
try {
switch(data.call) {
case "compile":
postData(data._seed, eth.compile(data.args[0]))
break
case "getCoinBase":
2014-08-18 02:35:42 +03:00
postData(data._seed, eth.coinBase())
2014-08-14 14:26:29 +03:00
break
case "getIsListening":
2014-08-18 02:35:42 +03:00
postData(data._seed, eth.isListening())
2014-08-14 14:26:29 +03:00
break
case "getIsMining":
2014-08-18 02:35:42 +03:00
postData(data._seed, eth.isMining())
2014-08-14 14:26:29 +03:00
break
case "getPeerCount":
2014-08-18 02:35:42 +03:00
postData(data._seed, eth.peerCount())
2014-08-14 14:26:29 +03:00
break
case "getTxCountAt":
2014-08-14 14:26:29 +03:00
require(1)
2014-08-18 02:35:42 +03:00
postData(data._seed, eth.txCountAt(data.args[0]))
2014-08-14 14:26:29 +03:00
break
case "getBlockByNumber":
2014-08-18 02:35:42 +03:00
var block = eth.blockByNumber(data.args[0])
2014-08-14 14:26:29 +03:00
postData(data._seed, block)
2014-08-14 14:26:29 +03:00
break
case "getBlockByHash":
2014-08-18 02:35:42 +03:00
var block = eth.blockByHash(data.args[0])
2014-08-14 14:26:29 +03:00
postData(data._seed, block)
2014-08-14 14:26:29 +03:00
break
case "transact":
2014-08-14 14:26:29 +03:00
require(5)
2014-04-30 02:44:12 +03:00
var tx = eth.transact(data.args)
console.log("transactx", tx)
2014-08-14 14:26:29 +03:00
postData(data._seed, tx)
2014-05-02 14:35:12 +03:00
2014-08-14 14:26:29 +03:00
break
2014-04-30 02:44:12 +03:00
case "getStorage":
2014-08-14 14:26:29 +03:00
require(2);
2014-04-30 02:44:12 +03:00
2014-08-18 02:35:42 +03:00
var stateObject = eth.stateObject(data.args[0])
var storage = stateObject.storageAt(data.args[1])
2014-08-14 14:26:29 +03:00
postData(data._seed, storage)
2014-08-14 14:26:29 +03:00
break
2014-04-30 02:44:12 +03:00
case "getEachStorage":
2014-08-14 14:26:29 +03:00
require(1);
2014-08-18 02:35:42 +03:00
var storage = JSON.parse(eth.eachStorage(data.args[0]))
2014-08-15 14:16:07 +03:00
postData(data._seed, storage)
2014-08-14 14:26:29 +03:00
break
case "getTransactionsFor":
2014-08-14 14:26:29 +03:00
require(1);
2014-08-18 02:35:42 +03:00
var txs = eth.transactionsFor(data.args[0], true)
2014-08-14 14:26:29 +03:00
postData(data._seed, txs)
2014-08-14 14:26:29 +03:00
break
2014-06-25 17:12:53 +03:00
case "getBalance":
2014-08-14 14:26:29 +03:00
require(1);
2014-08-18 02:35:42 +03:00
postData(data._seed, eth.stateObject(data.args[0]).value());
2014-04-30 02:44:12 +03:00
2014-08-14 14:26:29 +03:00
break
2014-04-30 02:44:12 +03:00
case "getKey":
2014-08-18 02:35:42 +03:00
var key = eth.key().privateKey;
2014-08-14 14:26:29 +03:00
postData(data._seed, key)
break
2014-05-05 14:09:11 +03:00
/*
case "watch":
require(1)
eth.watch(data.args[0], data.args[1]);
break
*/
case "watch":
require(2)
eth.watch(data.args[0], data.args[1])
case "disconnect":
2014-08-14 14:26:29 +03:00
require(1)
postData(data._seed, null)
2014-08-14 14:26:29 +03:00
break;
case "getSecretToAddress":
2014-08-14 14:26:29 +03:00
require(1)
postData(data._seed, eth.secretToAddress(data.args[0]))
2014-08-14 14:26:29 +03:00
break;
2014-08-14 18:01:37 +03:00
case "messages":
require(1);
var messages = JSON.parse(eth.getMessages(data.args[0]))
postData(data._seed, messages)
break
2014-08-17 13:41:23 +03:00
case "mutan":
require(1)
var code = eth.compileMutan(data.args[0])
postData(data._seed, "0x"+code)
break;
2014-04-30 02:44:12 +03:00
}
} catch(e) {
console.log(data.call + ": " + e)
postData(data._seed, null);
}
}
2014-08-17 13:41:23 +03:00
function post(seed, data) {
console.log("data", data)
postData(data._seed, data)
}
2014-04-30 02:44:12 +03:00
function require(args, num) {
if(args.length < num) {
throw("required argument count of "+num+" got "+args.length);
}
}
function postData(seed, data) {
webview.experimental.postMessage(JSON.stringify({data: data, _seed: seed}))
}
function postEvent(event, data) {
webview.experimental.postMessage(JSON.stringify({data: data, _event: event}))
}
function onWatchedCb(data, id) {
var messages = JSON.parse(data)
postEvent("watched:"+id, messages)
}
2014-04-30 02:44:12 +03:00
function onNewBlockCb(block) {
postEvent("block:new", block)
}
function onObjectChangeCb(stateObject) {
2014-04-30 15:42:57 +03:00
postEvent("object:"+stateObject.address(), stateObject)
2014-04-30 02:44:12 +03:00
}
2014-05-05 12:56:05 +03:00
function onStorageChangeCb(storageObject) {
var ev = ["storage", storageObject.stateAddress, storageObject.address].join(":");
postEvent(ev, [storageObject.address, storageObject.value])
}
2014-04-30 02:44:12 +03:00
}
2014-04-30 02:44:12 +03:00
Rectangle {
id: sizeGrip
color: "gray"
visible: false
height: 10
anchors {
left: root.left
right: root.right
}
y: Math.round(root.height * 2 / 3)
MouseArea {
anchors.fill: parent
drag.target: sizeGrip
drag.minimumY: 0
drag.maximumY: root.height
drag.axis: Drag.YAxis
}
}
WebView {
id: inspector
visible: false
2014-04-30 02:44:12 +03:00
anchors {
left: root.left
right: root.right
top: sizeGrip.bottom
bottom: root.bottom
}
}
states: [
State {
name: "inspectorShown"
PropertyChanges {
target: inspector
}
}
]
}
}