summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNo'am Rosenthal <noam.rosenthal@nokia.com>2011-08-04 18:15:35 -0700
committerNo'am Rosenthal <noam.rosenthal@nokia.com>2011-08-04 18:15:35 -0700
commit3cb151d2373054090bd5c008ae78a69d740e3032 (patch)
treefa8c51ea33ad904fe2855259d93c05b96da82340 /src
parent12572d8caf4125f4a801db56ab0ab75da60ad728 (diff)
downloadqtwebchannel-3cb151d2373054090bd5c008ae78a69d740e3032.tar.gz
Use navigator.createWebChannel instead of a global navigator.webChannel
Diffstat (limited to 'src')
-rw-r--r--src/qwebchannel.cpp22
-rw-r--r--src/webchannel-iframe.html18
-rw-r--r--src/webchannel.js44
3 files changed, 44 insertions, 40 deletions
diff --git a/src/qwebchannel.cpp b/src/qwebchannel.cpp
index 05ec3ce..7c6e238 100644
--- a/src/qwebchannel.cpp
+++ b/src/qwebchannel.cpp
@@ -221,26 +221,31 @@ void QWebChannelPrivate::service()
}
if (method == "GET") {
- QString type = pathElements.size() == 1 ? "j" : pathElements[1];
- if (type == "e") {
+ QString type = pathElements.size() == 1 ? "webchannel.js" : pathElements[1];
+ if (type == "EXEC") {
QString message = QStringList(pathElements.mid(2)).join("/");
QWebChannelResponder* responder = new QWebChannelResponder(socket);
QString msg = QUrl::fromPercentEncoding(message.toUtf8());
emit execute(msg, responder);
- } else if (type == "j") {
+ } else if (type == "SUBSCRIBE") {
+ QString id = pathElements[2];
+ connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
+ connect(socket, SIGNAL(destroyed(QObject*)), this, SLOT(onSocketDelete(QObject*)));
+ subscribers.insert(id, socket);
+ } else if (type == "webchannel.js") {
QFile file(":/webchannel.js");
file.open(QIODevice::ReadOnly);
socket->write("HTTP/1.1 200 OK\r\n"
"Content-Type: text/javascript\r\n"
"Cache-Control: No-Cache\r\n"
"\r\n");
- socket->write("window.onload = function() {");
+ socket->write("(function() {");
socket->write(QString("baseUrl = '%1';").arg(baseUrl.toString()).toUtf8());
socket->write(file.readAll());
- socket->write("};");
+ socket->write("})();");
socket->close();
file.close();
- } else if (type == "h") {
+ } else if (type == "iframe.html") {
QFile file(":/webchannel-iframe.html");
file.open(QIODevice::ReadOnly);
socket->write("HTTP/1.1 200 OK\r\n"
@@ -250,11 +255,6 @@ void QWebChannelPrivate::service()
socket->write(file.readAll());
socket->close();
file.close();
- } else if (type == "s") {
- QString id = pathElements[2];
- connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
- connect(socket, SIGNAL(destroyed(QObject*)), this, SLOT(onSocketDelete(QObject*)));
- subscribers.insert(id, socket);
}
}
}
diff --git a/src/webchannel-iframe.html b/src/webchannel-iframe.html
index 0588c83..ad3851d 100644
--- a/src/webchannel-iframe.html
+++ b/src/webchannel-iframe.html
@@ -1,10 +1,11 @@
<html>
<head>
<script>
- function exec(data, callback)
+ function exec(data, callback, type)
{
+ type = type || 'EXEC';
var xhr = new XMLHttpRequest;
- xhr.open("GET", "../e/" + data, true);
+ xhr.open("GET", "../" + type + "/" + data, true);
xhr.onreadystatechange = function() {
if (xhr.readyState != 4 || xhr.status != 200)
return;
@@ -15,20 +16,15 @@
function poll(id, callback)
{
- var xhr = new XMLHttpRequest;
- xhr.open("GET", "../s/" + id, true);
- xhr.onreadystatechange = function() {
- if (xhr.readyState != 4 || xhr.status != 200)
- return;
- callback(xhr.responseText);
+ exec(id, function(response) {
+ callback(response);
setTimeout(function() { poll(id, callback); }, 0);
- };
- xhr.send();
+ }, 'SUBSCRIBE');
}
window.addEventListener("message", function(event) {
var data = JSON.parse(event.data);
- function callback(r) { window.parent.postMessage(JSON.stringify({ id: data.id, payload: r }), "*"); }
+ function callback(r) { window.parent.postMessage(JSON.stringify({ type: "callback", id: data.id, payload: r }), "*"); }
if (data.type == "exec")
exec(JSON.stringify(data.payload), callback);
else if (data.type == "subscribe")
diff --git a/src/webchannel.js b/src/webchannel.js
index 7b8f46d..f78f23b 100644
--- a/src/webchannel.js
+++ b/src/webchannel.js
@@ -50,27 +50,15 @@ function guid() {
// Remove the calling script from the DOM.
var iframeElement = document.createElement("iframe");
iframeElement.style.display = "none";
-iframeElement.src = baseUrl + "/h/" + guid();
-document.body.appendChild(iframeElement);
+iframeElement.src = baseUrl + "/iframe.html/" + guid();
var callbacks = {};
-
-window.addEventListener("message", function(event) {
- if (baseUrl.indexOf(event.origin))
- return;
- var data = JSON.parse(event.data);
- var callbacksForID = callbacks[data.id] || [];
-
- callbacksForID.forEach(function(callback) { (callback)(JSON.parse(data.payload)); });
-});
-
-navigator.webChannel = {
+var loadListeners = [];
+var initialized = false;
+var webChannelPrivate = {
exec: function(message, callback) {
var id = guid();
- iframeElement.contentWindow.postMessage(JSON.stringify({type: "exec", id: id, payload: message}), "*");
- callbacks[id] = [function(data) {
- (callback)(data);
- delete callbacks[id];
- }];
+ iframeElement.contentWindow.postMessage(JSON.stringify({type: "exec", id: id, payload: message}), "*");
+ callbacks[id] = [ function(data) { (callback)(data); delete callbacks[id]; }];
},
subscribe: function(id, callback) {
@@ -80,3 +68,23 @@ navigator.webChannel = {
},
};
+window.onmessage = function(event) {
+ if (baseUrl.indexOf(event.origin))
+ return;
+ var data = JSON.parse(event.data);
+ var callbacksForID = callbacks[data.id] || [];
+ callbacksForID.forEach(function(callback) { (callback)(JSON.parse(data.payload)); });
+};
+
+iframeElement.onload = function() {
+ loadListeners.forEach(function(callback) { (callback)(webChannelPrivate); });
+};
+
+navigator.createWebChannel = function(onLoad) {
+ if (initialized) {
+ onLoad(webChannelPrivate);
+ return;
+ }
+ loadListeners.push(onLoad);
+ document.body.appendChild(iframeElement);
+};