bsc/mist/assets/qml/webapp.qml

418 lines
8.6 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 {
2014-09-22 15:54:27 +03:00
Rectangle {
id: window
property var title: "Browser"
property var iconSource: "../browser.png"
property var menuItem
2014-09-22 15:54:27 +03:00
property alias url: webview.url
property alias webView: webview
2014-04-30 02:44:12 +03:00
2014-09-23 18:56:35 +03:00
property var cleanPath: false
property var open: function(url) {
if(!window.cleanPath) {
var uri = url;
if(!/.*\:\/\/.*/.test(uri)) {
uri = "http://" + uri;
}
var reg = /(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.eth)(.*)/
if(reg.test(uri)) {
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;
});
}
window.cleanPath = true;
webview.url = uri;
//uriNav.text = uri.text.replace(/(^https?\:\/\/(?:www\.)?)([a-zA-Z0-9_\-]*\.\w{2,3})(.*)/, "$1$2<span style='color:#CCC'>$3</span>");
uriNav.text = uri;
} else {
// Prevent inf loop.
window.cleanPath = false;
}
}
2014-09-22 15:54:27 +03:00
Component.onCompleted: {
webview.url = "http://etherian.io"
}
2014-09-22 15:54:27 +03:00
signal messages(var messages, int id);
onMessages: {
// Bit of a cheat to get proper JSON
var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
webview.postEvent("messages", [m, id]);
}
2014-09-22 15:54:27 +03:00
Item {
objectName: "root"
id: root
anchors.fill: parent
state: "inspectorShown"
2014-09-22 15:54:27 +03:00
RowLayout {
id: navBar
height: 40
anchors {
2014-09-22 15:54:27 +03:00
left: parent.left
right: parent.right
leftMargin: 7
2014-08-13 11:52:30 +03:00
}
2014-09-22 15:54:27 +03:00
Button {
id: back
onClicked: {
webview.goBack()
}
style: ButtonStyle {
background: Image {
source: "../back.png"
width: 30
height: 30
}
}
2014-08-14 14:26:29 +03:00
}
2014-09-22 15:54:27 +03:00
TextField {
anchors {
left: back.right
right: toggleInspector.left
leftMargin: 5
rightMargin: 5
}
text: "http://etherian.io"
id: uriNav
y: parent.height / 2 - this.height / 2
Keys.onReturnPressed: {
webview.url = this.text;
}
2014-08-14 14:26:29 +03:00
}
2014-09-22 15:54:27 +03:00
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-14 14:26:29 +03:00
}
}
}
2014-08-17 13:41:23 +03:00
2014-09-22 15:54:27 +03:00
WebView {
objectName: "webView"
id: webview
anchors {
left: parent.left
right: parent.right
bottom: parent.bottom
top: navBar.bottom
}
2014-08-14 14:26:29 +03:00
2014-09-23 18:56:35 +03:00
//property var cleanPath: false
2014-09-22 15:54:27 +03:00
onNavigationRequested: {
2014-09-23 18:56:35 +03:00
window.open(request.url.toString());
2014-09-22 15:54:27 +03:00
}
2014-08-13 11:52:30 +03:00
2014-09-22 15:54:27 +03:00
function sendMessage(data) {
webview.experimental.postMessage(JSON.stringify(data))
}
2014-09-22 15:54:27 +03:00
onTitleChanged: {
var data = Messaging.HandleMessage(title);
if(data) {
sendMessage(data)
}
}
2014-08-17 13:41:23 +03:00
2014-09-22 15:54:27 +03:00
experimental.preferences.javascriptEnabled: true
experimental.preferences.navigatorQtObjectEnabled: true
experimental.preferences.developerExtrasEnabled: true
experimental.userScripts: ["../ext/qt_messaging_adapter.js", "../ext/q.js", "../ext/big.js", "../ext/string.js", "../ext/html_messaging.js"]
2014-09-22 15:54:27 +03:00
experimental.onMessageReceived: {
console.log("[onMessageReceived]: ", message.data)
// 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
2014-08-17 13:41:23 +03:00
2014-09-22 15:54:27 +03:00
case "getCoinBase":
postData(data._seed, eth.coinBase())
2014-04-30 02:44:12 +03:00
2014-09-22 15:54:27 +03:00
break
2014-09-22 15:54:27 +03:00
case "getIsListening":
postData(data._seed, eth.isListening())
2014-09-22 15:54:27 +03:00
break
2014-09-22 15:54:27 +03:00
case "getIsMining":
postData(data._seed, eth.isMining())
2014-09-22 15:54:27 +03:00
break
2014-09-22 15:54:27 +03:00
case "getPeerCount":
postData(data._seed, eth.peerCount())
2014-09-22 15:54:27 +03:00
break
2014-09-22 15:54:27 +03:00
case "getCountAt":
require(1)
postData(data._seed, eth.txCountAt(data.args[0]))
2014-09-22 15:54:27 +03:00
break
2014-09-22 15:54:27 +03:00
case "getCodeAt":
require(1)
var code = eth.codeAt(data.args[0])
postData(data._seed, code);
2014-09-22 15:54:27 +03:00
break
2014-09-22 15:54:27 +03:00
case "getBlockByNumber":
var block = eth.blockByNumber(data.args[0])
postData(data._seed, block)
2014-09-22 15:54:27 +03:00
break
2014-09-22 15:54:27 +03:00
case "getBlockByHash":
var block = eth.blockByHash(data.args[0])
postData(data._seed, block)
2014-09-22 15:54:27 +03:00
break
2014-09-22 15:54:27 +03:00
case "transact":
require(5)
2014-04-30 02:44:12 +03:00
2014-09-22 15:54:27 +03:00
var tx = eth.transact(data.args)
postData(data._seed, tx)
2014-05-02 14:35:12 +03:00
2014-09-22 15:54:27 +03:00
break
2014-04-30 02:44:12 +03:00
2014-09-22 15:54:27 +03:00
case "getStorageAt":
require(2);
2014-04-30 02:44:12 +03:00
2014-09-22 15:54:27 +03:00
var storage = eth.storageAt(data.args[0], data.args[1]);
postData(data._seed, storage)
2014-09-22 15:54:27 +03:00
break
2014-04-30 02:44:12 +03:00
2014-09-22 15:54:27 +03:00
case "call":
require(1);
var ret = eth.call(data.args)
postData(data._seed, ret)
2014-09-22 15:54:27 +03:00
break
2014-09-22 15:54:27 +03:00
case "getEachStorage":
require(1);
var storage = JSON.parse(eth.eachStorage(data.args[0]))
postData(data._seed, storage)
2014-09-22 15:54:27 +03:00
break
2014-06-25 17:12:53 +03:00
2014-09-22 15:54:27 +03:00
case "getTransactionsFor":
require(1);
var txs = eth.transactionsFor(data.args[0], true)
postData(data._seed, txs)
2014-09-22 15:54:27 +03:00
break
2014-04-30 02:44:12 +03:00
2014-09-22 15:54:27 +03:00
case "getBalanceAt":
require(1);
2014-04-30 02:44:12 +03:00
2014-09-22 15:54:27 +03:00
postData(data._seed, eth.balanceAt(data.args[0]));
2014-09-22 15:54:27 +03:00
break
2014-05-05 14:09:11 +03:00
2014-09-22 15:54:27 +03:00
case "getKey":
var key = eth.key().privateKey;
2014-09-22 15:54:27 +03:00
postData(data._seed, key)
break
2014-09-22 15:54:27 +03:00
case "watch":
require(2)
eth.watch(data.args[0], data.args[1])
2014-09-22 15:54:27 +03:00
case "disconnect":
require(1)
postData(data._seed, null)
break;
2014-09-22 15:54:27 +03:00
case "getSecretToAddress":
require(1)
2014-09-22 15:54:27 +03:00
var addr = eth.secretToAddress(data.args[0])
console.log("getsecret", addr)
postData(data._seed, addr)
2014-09-22 15:54:27 +03:00
break;
2014-09-22 15:54:27 +03:00
case "messages":
2014-08-14 18:01:37 +03:00
require(1);
var messages = JSON.parse(eth.getMessages(data.args[0]))
postData(data._seed, messages)
break
2014-09-22 15:54:27 +03:00
case "mutan":
2014-08-17 13:41:23 +03:00
require(1)
var code = eth.compileMutan(data.args[0])
postData(data._seed, "0x"+code)
break;
2014-04-30 02:44:12 +03:00
2014-09-22 15:54:27 +03:00
case "newFilterString":
require(1)
var id = eth.newFilterString(data.args[0])
postData(data._seed, id);
break;
case "newFilter":
require(1)
var id = eth.newFilter(data.args[0])
postData(data._seed, id);
break;
case "getMessages":
require(1);
var messages = eth.messages(data.args[0]);
var m = JSON.parse(JSON.parse(JSON.stringify(messages)))
postData(data._seed, m);
break;
case "deleteFilter":
require(1);
eth.uninstallFilter(data.args[0])
break;
}
} catch(e) {
console.log(data.call + ": " + e)
postData(data._seed, null);
}
2014-04-30 02:44:12 +03:00
}
2014-08-17 13:41:23 +03:00
2014-09-22 15:54:27 +03:00
function post(seed, data) {
postData(data._seed, data)
2014-04-30 02:44:12 +03:00
}
2014-09-22 15:54:27 +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}))
}
2014-09-22 15:54:27 +03:00
function onWatchedCb(data, id) {
var messages = JSON.parse(data)
postEvent("watched:"+id, messages)
}
function onNewBlockCb(block) {
postEvent("block:new", block)
}
function onObjectChangeCb(stateObject) {
postEvent("object:"+stateObject.address(), stateObject)
}
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-09-22 15:54:27 +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
}
2014-04-30 02:44:12 +03:00
}
2014-09-22 15:54:27 +03:00
WebView {
id: inspector
visible: false
anchors {
left: root.left
right: root.right
top: sizeGrip.bottom
bottom: root.bottom
}
2014-04-30 02:44:12 +03:00
}
2014-09-22 15:54:27 +03:00
states: [
State {
name: "inspectorShown"
PropertyChanges {
target: inspector
}
2014-04-30 02:44:12 +03:00
}
2014-09-22 15:54:27 +03:00
]
}
2014-04-30 02:44:12 +03:00
}