From e263449d32e9392985c1587f2a0b4e0e77e605a2 Mon Sep 17 00:00:00 2001 From: Pierre Rossi <pierre.rossi@theqtcompany.com> Date: Wed, 18 Feb 2015 18:08:14 +0100 Subject: [PATCH] WebChannel: don't mess with the navigator object The navigator object is actually exposed later on from WebCore using a different mechanism, so the V8 extension approach won't work with it. Better take the chrome extensions approach and expose our own. This should "un-break" the part of the web that was broken by eee482929a. Change-Id: I991be2e12bb9ebcf60ace02721497c3fcd923c7f Reviewed-by: Peter Varga <pvarga@inf.u-szeged.hu> Reviewed-by: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> Reviewed-by: Andras Becsi <andras.becsi@theqtcompany.com> --- .../renderer/web_channel_ipc_transport.cpp | 24 +++++++++---------- src/core/renderer/web_channel_ipc_transport.h | 6 ++--- src/webengine/api/qquickwebengineview.cpp | 2 +- src/webenginewidgets/api/qwebenginepage.cpp | 4 ++-- .../quick/qmltests/data/webchannel-test.html | 2 +- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/core/renderer/web_channel_ipc_transport.cpp b/src/core/renderer/web_channel_ipc_transport.cpp index 6adff45d5..ebebb01e9 100644 --- a/src/core/renderer/web_channel_ipc_transport.cpp +++ b/src/core/renderer/web_channel_ipc_transport.cpp @@ -51,11 +51,11 @@ static const char kWebChannelTransportExtensionName[] = "v8/WebChannelTransport"; static const char kWebChannelTransportApi[] = - "if (typeof(navigator) === 'undefined')" \ - " navigator = {};" \ - "if (typeof(navigator.qtWebChannelTransport) === 'undefined')" \ - " navigator.qtWebChannelTransport = {};" \ - "navigator.qtWebChannelTransport.send = function(message) {" \ + "if (typeof(qt) === 'undefined')" \ + " qt = {};" \ + "if (typeof(qt.webChannelTransport) === 'undefined')" \ + " qt.webChannelTransport = {};" \ + "qt.webChannelTransport.send = function(message) {" \ " native function NativeQtSendMessage();" \ " NativeQtSendMessage(message);" \ "};"; @@ -135,15 +135,15 @@ void WebChannelIPCTransport::dispatchWebChannelMessage(const std::vector<char> & v8::Context::Scope contextScope(context); v8::Handle<v8::Object> global(context->Global()); - v8::Handle<v8::Value> navigatorValue(global->Get(v8::String::NewFromUtf8(isolate, "navigator"))); - if (!navigatorValue->IsObject()) + v8::Handle<v8::Value> qtObjectValue(global->Get(v8::String::NewFromUtf8(isolate, "qt"))); + if (!qtObjectValue->IsObject()) return; - v8::Handle<v8::Value> navigatorQtValue(navigatorValue->ToObject()->Get(v8::String::NewFromUtf8(isolate, "qtWebChannelTransport"))); - if (!navigatorQtValue->IsObject()) + v8::Handle<v8::Value> webChannelObjectValue(qtObjectValue->ToObject()->Get(v8::String::NewFromUtf8(isolate, "webChannelTransport"))); + if (!webChannelObjectValue->IsObject()) return; - v8::Handle<v8::Value> onmessageCallbackValue(navigatorQtValue->ToObject()->Get(v8::String::NewFromUtf8(isolate, "onmessage"))); + v8::Handle<v8::Value> onmessageCallbackValue(webChannelObjectValue->ToObject()->Get(v8::String::NewFromUtf8(isolate, "onmessage"))); if (!onmessageCallbackValue->IsFunction()) { - qWarning("onmessage is not a callable property of navigator.qtWebChannelTransport. Some things might not work as expected."); + qWarning("onmessage is not a callable property of qt.webChannelTransport. Some things might not work as expected."); return; } @@ -156,7 +156,7 @@ void WebChannelIPCTransport::dispatchWebChannelMessage(const std::vector<char> & const int argc = 1; v8::Handle<v8::Value> argv[argc]; argv[0] = messageObject; - frame->callFunctionEvenIfScriptDisabled(callback, navigatorQtValue->ToObject(), argc, argv); + frame->callFunctionEvenIfScriptDisabled(callback, webChannelObjectValue->ToObject(), argc, argv); } v8::Extension *WebChannelIPCTransport::getV8Extension() diff --git a/src/core/renderer/web_channel_ipc_transport.h b/src/core/renderer/web_channel_ipc_transport.h index 71886f4b2..8074c2302 100644 --- a/src/core/renderer/web_channel_ipc_transport.h +++ b/src/core/renderer/web_channel_ipc_transport.h @@ -34,8 +34,8 @@ ** ****************************************************************************/ -#ifndef NAVIGATOR_QT_EXTENSION_H -#define NAVIGATOR_QT_EXTENSION_H +#ifndef WEB_CHANNEL_IPC_TRANSPORT_H +#define WEB_CHANNEL_IPC_TRANSPORT_H #include "base/values.h" #include "content/public/renderer/render_view_observer.h" @@ -56,4 +56,4 @@ private: virtual bool OnMessageReceived(const IPC::Message &message) Q_DECL_OVERRIDE; }; -#endif // NAVIGATOR_QT_EXTENSION_H +#endif // WEB_CHANNEL_IPC_TRANSPORT diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index 9bcb7d326..acae4a11b 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -819,7 +819,7 @@ QQuickWebEngineHistory *QQuickWebEngineView::navigationHistory() const * * The web channel instance used by this view. * This channel is automatically using the internal QtWebEngine transport mechanism over Chromium IPC, - * and exposed in the javascript context of the page it is rendering as \c navigator.qtWebChannelTransport. + * and exposed in the javascript context of the page it is rendering as \c qt.webChannelTransport. * This transport object is used when instantiating the JavaScript counterpart of QWebChannel using * the \l{Qt WebChannel JavaScript API}. * diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 7db20fe89..f2cc7e304 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -485,7 +485,7 @@ QWebEngineSettings *QWebEnginePage::settings() const /*! * Returns a pointer to the web channel instance used by this page, or a null pointer if none was set. * This channel is automatically using the internal QtWebEngine transport mechanism over Chromium IPC, - * and exposed in the javascript context of this page as \c navigator.qtWebChannelTransport + * and exposed in the javascript context of this page as \c qt.webChannelTransport * * \since 5.5 * \sa {QtWebChannel::QWebChannel}{QWebChannel} @@ -499,7 +499,7 @@ QWebChannel *QWebEnginePage::webChannel() const /*! * Sets the web channel instance to be used by this page and connects it to QtWebEngine's transport * using Chromium IPC messages. That transport is exposed in the javascript context of this page as - * \c navigator.qtWebChannelTransport, which should be used when using the \l{Qt WebChannel JavaScript API}. + * \c qt.webChannelTransport, which should be used when using the \l{Qt WebChannel JavaScript API}. * * \note The page does not take ownership of the \a channel object. * diff --git a/tests/auto/quick/qmltests/data/webchannel-test.html b/tests/auto/quick/qmltests/data/webchannel-test.html index 940821209..92966b24a 100644 --- a/tests/auto/quick/qmltests/data/webchannel-test.html +++ b/tests/auto/quick/qmltests/data/webchannel-test.html @@ -5,7 +5,7 @@ <script type="text/javascript" src="qrc:///qtwebchannel/qwebchannel.js"></script> <script type="text/javascript"> //BEGIN SETUP - var channel = new QWebChannel(navigator.qtWebChannelTransport, function(channel) { + var channel = new QWebChannel(qt.webChannelTransport, function(channel) { window.testObject = channel.objects.testObject; testObject.runTest.connect(function(foo) { testObject.foo = foo; -- GitLab