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