summaryrefslogtreecommitdiff
path: root/src/webchannel/qwebchannel.js
diff options
context:
space:
mode:
authorMilian Wolff <milian.wolff@kdab.com>2014-01-10 14:21:05 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2014-02-06 16:32:20 +0100
commit54f66cc7a1e17155e90a1d3b5c33f627dbd0d50f (patch)
tree6dd4b35eda74487977bfae5bb0b81a133dfc1bf4 /src/webchannel/qwebchannel.js
parent05bafd509ca302fc63465fece7cd0c33ec602e31 (diff)
downloadqtwebchannel-54f66cc7a1e17155e90a1d3b5c33f627dbd0d50f.tar.gz
Make the underlying transport mechanism of the webchannel pluggable.
This enables us to optionally use navigator.qt instead of a WebSocket, which is nicer setup-wise and is also slightly faster: navigator.qt: 284.0 msecs per iteration (total: 2,840, iterations: 10) WebSocket: 295.8 msecs per iteration (total: 2,959, iterations: 10) The baseline is ca. 203 msecs, which would mean a performance boost of ca. 12.7%. Furthermore, this sets the fundation to eventually add a WebEngine transport mechanism. The WebViewTransport should also be removed and instead the WebView itself should directly implement the WebChannelTransportInterface. Change-Id: I368bb27e38ffa2f17ffeb7f5ae695690f6f5ad21 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/webchannel/qwebchannel.js')
-rw-r--r--src/webchannel/qwebchannel.js63
1 files changed, 38 insertions, 25 deletions
diff --git a/src/webchannel/qwebchannel.js b/src/webchannel/qwebchannel.js
index 5ca051c..887c5a0 100644
--- a/src/webchannel/qwebchannel.js
+++ b/src/webchannel/qwebchannel.js
@@ -42,7 +42,7 @@
"use strict";
-var QWebChannel = function(baseUrl, initCallback, rawChannel)
+var QWebChannel = function(baseUrlOrSocket, initCallback, rawChannel)
{
var channel = this;
// support multiple channels listening to the same socket
@@ -52,34 +52,14 @@ var QWebChannel = function(baseUrl, initCallback, rawChannel)
var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
return v.toString(16);
});
- ///TODO: use ssl?
- var socketUrl = "ws://" + baseUrl;
- this.socket = new WebSocket(socketUrl, "QWebChannel");
this.send = function(data)
{
if (typeof(data) !== "string") {
data = JSON.stringify(data);
}
channel.socket.send(data);
- };
-
- this.socket.onopen = function()
- {
- if (rawChannel) {
- initCallback(channel);
- } else {
- channel.initMetaObjectPublisher(initCallback);
- }
- };
- this.socket.onclose = function()
- {
- console.error("web channel closed");
- };
- this.socket.onerror = function(error)
- {
- console.error("web channel error: " + error);
- };
- this.socket.onmessage = function(message)
+ }
+ this.messageReceived = function(message)
{
var jsonData = JSON.parse(message.data);
if (jsonData.id === undefined) {
@@ -99,7 +79,41 @@ var QWebChannel = function(baseUrl, initCallback, rawChannel)
(callback)(jsonData.data); }
);
}
- };
+ }
+
+ this.initialized = function()
+ {
+ if (rawChannel) {
+ initCallback(channel);
+ } else {
+ channel.initMetaObjectPublisher(initCallback);
+ }
+ }
+
+ if (typeof baseUrlOrSocket === 'object') {
+ this.socket = baseUrlOrSocket;
+ this.socket.send = function(data)
+ {
+ channel.socket.postMessage(data);
+ }
+ this.socket.onmessage = this.messageReceived
+ setTimeout(this.initialized, 0);
+ } else {
+ ///TODO: use ssl?
+ var socketUrl = "ws://" + baseUrlOrSocket;
+ this.socket = new WebSocket(socketUrl, "QWebChannel");
+
+ this.socket.onopen = this.initialized
+ this.socket.onclose = function()
+ {
+ console.error("web channel closed");
+ };
+ this.socket.onerror = function(error)
+ {
+ console.error("web channel error: " + error);
+ };
+ this.socket.onmessage = this.messageReceived
+ }
this.subscriptions = {};
this.subscribe = function(id, callback)
@@ -136,7 +150,6 @@ var QWebChannel = function(baseUrl, initCallback, rawChannel)
// prevent multiple initialization which might happen with multiple webchannel clients.
var initialized = false;
- console.log(channel);
channel.subscribe(
"Qt.signal",
function(payload) {