diff options
author | No'am Rosenthal <noam.rosenthal@nokia.com> | 2011-08-04 18:15:35 -0700 |
---|---|---|
committer | No'am Rosenthal <noam.rosenthal@nokia.com> | 2011-08-04 18:15:35 -0700 |
commit | 3cb151d2373054090bd5c008ae78a69d740e3032 (patch) | |
tree | fa8c51ea33ad904fe2855259d93c05b96da82340 /src | |
parent | 12572d8caf4125f4a801db56ab0ab75da60ad728 (diff) | |
download | qtwebchannel-3cb151d2373054090bd5c008ae78a69d740e3032.tar.gz |
Use navigator.createWebChannel instead of a global navigator.webChannel
Diffstat (limited to 'src')
-rw-r--r-- | src/qwebchannel.cpp | 22 | ||||
-rw-r--r-- | src/webchannel-iframe.html | 18 | ||||
-rw-r--r-- | src/webchannel.js | 44 |
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); +}; |