From 84ced937a0f9f2874e32e16c4c6ebf72b46904c9 Mon Sep 17 00:00:00 2001
From: Jocelyn Turcotte <jocelyn.turcotte@digia.com>
Date: Mon, 7 Apr 2014 14:00:35 +0200
Subject: [PATCH] Replace uses of QWebEngineFrame with a security origin URL

This changes implemented methods. The rest of the references will go
away with the public headers cleanup.

Change-Id: I82340cd7a4488c4b463489ae98cd9c16de4e7487
Reviewed-by: Michael Bruning <michael.bruning@digia.com>
---
 src/core/javascript_dialog_controller.cpp      |  9 ++++++++-
 src/core/javascript_dialog_controller.h        |  1 +
 src/core/javascript_dialog_controller_p.h      |  4 +++-
 src/core/javascript_dialog_manager_qt.cpp      |  3 +--
 src/webenginewidgets/api/qwebenginepage.cpp    | 18 +++++++++---------
 src/webenginewidgets/api/qwebenginepage.h      |  6 +++---
 .../doc/src/qwebenginepage_lgpl.qdoc           | 12 ++++++------
 .../qwebengineframe/tst_qwebengineframe.cpp    |  5 +++--
 .../qwebenginepage/tst_qwebenginepage.cpp      |  4 ++--
 9 files changed, 36 insertions(+), 26 deletions(-)

diff --git a/src/core/javascript_dialog_controller.cpp b/src/core/javascript_dialog_controller.cpp
index ed0431084..973fa89b7 100644
--- a/src/core/javascript_dialog_controller.cpp
+++ b/src/core/javascript_dialog_controller.cpp
@@ -54,10 +54,12 @@ void JavaScriptDialogControllerPrivate::dialogFinished(bool accepted, const base
 }
 
 JavaScriptDialogControllerPrivate::JavaScriptDialogControllerPrivate(WebContentsAdapterClient::JavascriptDialogType t, const QString &msg, const QString &prompt
-                                                                     , const content::JavaScriptDialogManager::DialogClosedCallback &cb, content::WebContents *c)
+                                                                     , const QUrl &securityOrigin, const content::JavaScriptDialogManager::DialogClosedCallback &cb
+                                                                     , content::WebContents *c)
     : type(t)
     , message(msg)
     , defaultPrompt(prompt)
+    , securityOrigin(securityOrigin)
     , callback(cb)
     , contents(c)
 {
@@ -82,6 +84,11 @@ WebContentsAdapterClient::JavascriptDialogType JavaScriptDialogController::type(
     return d->type;
 }
 
+QUrl JavaScriptDialogController::securityOrigin() const
+{
+    return d->securityOrigin;
+}
+
 void JavaScriptDialogController::textProvided(const QString &text)
 {
     d->userInput = text;
diff --git a/src/core/javascript_dialog_controller.h b/src/core/javascript_dialog_controller.h
index b0d598afa..755a2712b 100644
--- a/src/core/javascript_dialog_controller.h
+++ b/src/core/javascript_dialog_controller.h
@@ -55,6 +55,7 @@ public:
     QString message() const;
     QString defaultPrompt() const;
     WebContentsAdapterClient::JavascriptDialogType type() const;
+    QUrl securityOrigin() const;
 
 public Q_SLOTS:
     void textProvided(const QString &text);
diff --git a/src/core/javascript_dialog_controller_p.h b/src/core/javascript_dialog_controller_p.h
index 9e84b31a0..0d7552ce2 100644
--- a/src/core/javascript_dialog_controller_p.h
+++ b/src/core/javascript_dialog_controller_p.h
@@ -55,11 +55,13 @@ class JavaScriptDialogControllerPrivate {
 public:
     void dialogFinished(bool accepted, const base::string16 &promptValue);
     JavaScriptDialogControllerPrivate(WebContentsAdapterClient::JavascriptDialogType, const QString &message, const QString &prompt
-                                      , const content::JavaScriptDialogManager::DialogClosedCallback &, content::WebContents *);
+                                      , const QUrl &securityOrigin, const content::JavaScriptDialogManager::DialogClosedCallback &
+                                      , content::WebContents *);
 
     WebContentsAdapterClient::JavascriptDialogType type;
     QString message;
     QString defaultPrompt;
+    QUrl securityOrigin;
     QString userInput;
     content::JavaScriptDialogManager::DialogClosedCallback callback;
     content::WebContents *contents;
diff --git a/src/core/javascript_dialog_manager_qt.cpp b/src/core/javascript_dialog_manager_qt.cpp
index 1cde76a8f..1e37481b6 100644
--- a/src/core/javascript_dialog_manager_qt.cpp
+++ b/src/core/javascript_dialog_manager_qt.cpp
@@ -58,7 +58,6 @@ JavaScriptDialogManagerQt *JavaScriptDialogManagerQt::GetInstance()
 
 void JavaScriptDialogManagerQt::RunJavaScriptDialog(content::WebContents *webContents, const GURL &originUrl, const std::string &acceptLang, content::JavaScriptMessageType javascriptMessageType, const base::string16 &messageText, const base::string16 &defaultPromptText, const content::JavaScriptDialogManager::DialogClosedCallback &callback, bool *didSuppressMessage)
 {
-    Q_UNUSED(originUrl);
     Q_UNUSED(acceptLang);
 
     WebContentsAdapterClient *client = WebContentsViewQt::from(webContents->GetView())->client();
@@ -69,7 +68,7 @@ void JavaScriptDialogManagerQt::RunJavaScriptDialog(content::WebContents *webCon
 
     WebContentsAdapterClient::JavascriptDialogType dialogType = static_cast<WebContentsAdapterClient::JavascriptDialogType>(javascriptMessageType);
     JavaScriptDialogControllerPrivate *dialogData = new JavaScriptDialogControllerPrivate(dialogType, toQt(messageText).toHtmlEscaped()
-                                                                                          , toQt(defaultPromptText).toHtmlEscaped(), callback, webContents);
+                                                                                          , toQt(defaultPromptText).toHtmlEscaped(), toQt(originUrl), callback, webContents);
     QSharedPointer<JavaScriptDialogController> dialog(new JavaScriptDialogController(dialogData));
 
     // We shouldn't get new dialogs for a given WebContents until we gave back a result.
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 80f780dde..6fcababbf 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -583,14 +583,14 @@ void QWebEnginePagePrivate::javascriptDialog(QSharedPointer<JavaScriptDialogCont
     QString promptResult;
     switch (controller->type()) {
     case AlertDialog:
-        q->javaScriptAlert(0, controller->message());
+        q->javaScriptAlert(controller->securityOrigin(), controller->message());
         accepted = true;
         break;
     case ConfirmDialog:
-        accepted = q->javaScriptConfirm(0, controller->message());
+        accepted = q->javaScriptConfirm(controller->securityOrigin(), controller->message());
         break;
     case PromptDialog:
-        accepted = q->javaScriptPrompt(0, controller->message(), controller->defaultPrompt(), &promptResult);
+        accepted = q->javaScriptPrompt(controller->securityOrigin(), controller->message(), controller->defaultPrompt(), &promptResult);
         if (accepted)
             controller->textProvided(promptResult);
         break;
@@ -810,21 +810,21 @@ QStringList QWebEnginePage::chooseFiles(FileSelectionMode mode, const QStringLis
     return ret;
 }
 
-void QWebEnginePage::javaScriptAlert(QWebEngineFrame *originatingFrame, const QString &msg)
+void QWebEnginePage::javaScriptAlert(const QUrl &securityOrigin, const QString &msg)
 {
-    Q_UNUSED(originatingFrame);
+    Q_UNUSED(securityOrigin);
     QMessageBox::information(view(), QStringLiteral("Javascript Alert - %1").arg(url().toString()), msg);
 }
 
-bool QWebEnginePage::javaScriptConfirm(QWebEngineFrame *originatingFrame, const QString &msg)
+bool QWebEnginePage::javaScriptConfirm(const QUrl &securityOrigin, const QString &msg)
 {
-    Q_UNUSED(originatingFrame);
+    Q_UNUSED(securityOrigin);
     return (QMessageBox::information(view(), QStringLiteral("Javascript Confirm - %1").arg(url().toString()), msg, QMessageBox::Ok, QMessageBox::Cancel) == QMessageBox::Ok);
 }
 
-bool QWebEnginePage::javaScriptPrompt(QWebEngineFrame *originatingFrame, const QString &msg, const QString &defaultValue, QString *result)
+bool QWebEnginePage::javaScriptPrompt(const QUrl &securityOrigin, const QString &msg, const QString &defaultValue, QString *result)
 {
-    Q_UNUSED(originatingFrame);
+    Q_UNUSED(securityOrigin);
     bool ret = false;
     if (result)
         *result = QInputDialog::getText(view(), QStringLiteral("Javascript Prompt - %1").arg(url().toString()), msg, QLineEdit::Normal, defaultValue, &ret);
diff --git a/src/webenginewidgets/api/qwebenginepage.h b/src/webenginewidgets/api/qwebenginepage.h
index eea7b52d2..29ba140bc 100644
--- a/src/webenginewidgets/api/qwebenginepage.h
+++ b/src/webenginewidgets/api/qwebenginepage.h
@@ -574,9 +574,9 @@ protected:
 
     virtual bool acceptNavigationRequest(QWebEngineFrame *frame, const QNetworkRequest &request, NavigationType type) { Q_UNUSED(frame); Q_UNUSED(&request); Q_UNUSED(type); Q_UNREACHABLE(); return false; }
     virtual QStringList chooseFiles(FileSelectionMode mode, const QStringList &oldFiles, const QStringList &acceptedMimeTypes);
-    virtual void javaScriptAlert(QWebEngineFrame *originatingFrame, const QString& msg);
-    virtual bool javaScriptConfirm(QWebEngineFrame *originatingFrame, const QString& msg);
-    virtual bool javaScriptPrompt(QWebEngineFrame *originatingFrame, const QString& msg, const QString& defaultValue, QString* result);
+    virtual void javaScriptAlert(const QUrl &securityOrigin, const QString& msg);
+    virtual bool javaScriptConfirm(const QUrl &securityOrigin, const QString& msg);
+    virtual bool javaScriptPrompt(const QUrl &securityOrigin, const QString& msg, const QString& defaultValue, QString* result);
     virtual void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID);
 
     virtual QString userAgentForUrl(const QUrl& url) const { Q_UNUSED(url); Q_UNREACHABLE(); return QString(); }
diff --git a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc
index 225ad5a48..a32406264 100644
--- a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc
+++ b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc
@@ -416,24 +416,24 @@
 */
 
 /*!
-    \fn void QWebEnginePage::javaScriptAlert(QWebEngineFrame *frame, const QString& msg)
-    This function is called whenever a JavaScript program running inside \a frame calls the alert() function with
+    \fn void QWebEnginePage::javaScriptAlert(const QUrl &securityOrigin, const QString& msg)
+    This function is called whenever a JavaScript program running in a frame affiliated with \a securityOrigin calls the alert() function with
     the message \a msg.
 
     The default implementation shows the message, \a msg, with QMessageBox::information.
 */
 
 /*!
-    \fn bool QWebEnginePage::javaScriptConfirm(QWebEngineFrame *frame, const QString& msg)
-    This function is called whenever a JavaScript program running inside \a frame calls the confirm() function
+    \fn bool QWebEnginePage::javaScriptConfirm(const QUrl &securityOrigin, const QString& msg)
+    This function is called whenever a JavaScript program running in a frame affiliated with \a securityOrigin calls the confirm() function
     with the message, \a msg. Returns true if the user confirms the message; otherwise returns false.
 
     The default implementation executes the query using QMessageBox::information with QMessageBox::Ok and QMessageBox::Cancel buttons.
 */
 
 /*!
-    \fn bool QWebEnginePage::javaScriptPrompt(QWebEngineFrame *frame, const QString& msg, const QString& defaultValue, QString* result)
-    This function is called whenever a JavaScript program running inside \a frame tries to prompt the user for input.
+    \fn bool QWebEnginePage::javaScriptPrompt(const QUrl &securityOrigin, const QString& msg, const QString& defaultValue, QString* result)
+    This function is called whenever a JavaScript program running in a frame affiliated with \a securityOrigin tries to prompt the user for input.
     The program may provide an optional message, \a msg, as well as a default value for the input in \a defaultValue.
 
     If the prompt was cancelled by the user the implementation should return false; otherwise the
diff --git a/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp b/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp
index 5e1113765..55b30459f 100644
--- a/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp
+++ b/tests/auto/widgets/qwebengineframe/tst_qwebengineframe.cpp
@@ -547,9 +547,10 @@ public:
     int alerts;
 
 protected:
-    virtual void javaScriptAlert(QWebEngineFrame*, const QString& msg)
+    virtual void javaScriptAlert(const QUrl &securityOrigin, const QString &msg)
     {
         alerts++;
+        QCOMPARE(securityOrigin, QUrl(QStringLiteral("http://test.origin.com/")));
         QCOMPARE(msg, QString("foo"));
     }
 };
@@ -558,7 +559,7 @@ void tst_QWebEngineFrame::setHtmlWithJSAlert()
 {
     QString html("<html><head></head><body><script>alert('foo');</script><p>hello world</p></body></html>");
     MyPage page;
-    page.setHtml(html);
+    page.setHtml(html, QUrl(QStringLiteral("http://test.origin.com/path#fragment")));
     waitForSignal(&page, SIGNAL(loadFinished(bool)));
     QCOMPARE(page.alerts, 1);
     QCOMPARE(toHtmlSync(&page), html);
diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
index 3c2bbb67b..edfe2153b 100644
--- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
+++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
@@ -3092,7 +3092,7 @@ public:
     JSPromptPage()
     {}
 
-    bool javaScriptPrompt(QWebEngineFrame* frame, const QString& msg, const QString& defaultValue, QString* result)
+    bool javaScriptPrompt(const QUrl &securityOrigin, const QString& msg, const QString& defaultValue, QString* result)
     {
         if (msg == QLatin1String("test1")) {
             *result = QString();
@@ -3109,7 +3109,7 @@ public:
         }
 
         qFatal("Unknown msg.");
-        return QWebEnginePage::javaScriptPrompt(frame, msg, defaultValue, result);
+        return QWebEnginePage::javaScriptPrompt(securityOrigin, msg, defaultValue, result);
     }
 };
 
-- 
GitLab