Title: [105670] trunk/Source/WebKit2
Revision
105670
Author
[email protected]
Date
2012-01-23 17:54:37 -0800 (Mon, 23 Jan 2012)

Log Message

[Qt] Implement SSL error handling QML API.
https://bugs.webkit.org/show_bug.cgi?id=76793

Patch by Alexander Færøy <[email protected]> on 2012-01-23
Reviewed by Simon Hausmann.

This patch implements support for accepting or rejecting invalid SSL
certificates from the QML API.

* UIProcess/API/qt/qquickwebview.cpp:
(QQuickWebViewPrivate::QQuickWebViewPrivate):
(QQuickWebViewPrivate::handleCertificateVerificationRequest):
(QQuickWebViewExperimental::certificateVerificationDialog):
(QQuickWebViewExperimental::setCertificateVerificationDialog):
* UIProcess/API/qt/qquickwebview_p.h:
* UIProcess/API/qt/qquickwebview_p_p.h:
* UIProcess/PageClient.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::certificateVerificationRequest):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* UIProcess/qt/QtDialogRunner.cpp:
(CertificateVerificationDialogContextObject::CertificateVerificationDialogContextObject):
(CertificateVerificationDialogContextObject::hostname):
(CertificateVerificationDialogContextObject::accept):
(CertificateVerificationDialogContextObject::reject):
(QtDialogRunner::initForCertificateVerification):
* UIProcess/qt/QtDialogRunner.h:
* UIProcess/qt/QtPageClient.cpp:
(QtPageClient::handleCertificateVerificationRequest):
* UIProcess/qt/QtPageClient.h:
* WebProcess/qt/QtNetworkAccessManager.cpp:
(WebKit::QtNetworkAccessManager::QtNetworkAccessManager):
(WebKit::QtNetworkAccessManager::onSslErrors):
* WebProcess/qt/QtNetworkAccessManager.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (105669 => 105670)


--- trunk/Source/WebKit2/ChangeLog	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/ChangeLog	2012-01-24 01:54:37 UTC (rev 105670)
@@ -1,3 +1,40 @@
+2012-01-23  Alexander Færøy  <[email protected]>
+
+        [Qt] Implement SSL error handling QML API.
+        https://bugs.webkit.org/show_bug.cgi?id=76793
+
+        Reviewed by Simon Hausmann.
+
+        This patch implements support for accepting or rejecting invalid SSL
+        certificates from the QML API.
+
+        * UIProcess/API/qt/qquickwebview.cpp:
+        (QQuickWebViewPrivate::QQuickWebViewPrivate):
+        (QQuickWebViewPrivate::handleCertificateVerificationRequest):
+        (QQuickWebViewExperimental::certificateVerificationDialog):
+        (QQuickWebViewExperimental::setCertificateVerificationDialog):
+        * UIProcess/API/qt/qquickwebview_p.h:
+        * UIProcess/API/qt/qquickwebview_p_p.h:
+        * UIProcess/PageClient.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::certificateVerificationRequest):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * UIProcess/qt/QtDialogRunner.cpp:
+        (CertificateVerificationDialogContextObject::CertificateVerificationDialogContextObject):
+        (CertificateVerificationDialogContextObject::hostname):
+        (CertificateVerificationDialogContextObject::accept):
+        (CertificateVerificationDialogContextObject::reject):
+        (QtDialogRunner::initForCertificateVerification):
+        * UIProcess/qt/QtDialogRunner.h:
+        * UIProcess/qt/QtPageClient.cpp:
+        (QtPageClient::handleCertificateVerificationRequest):
+        * UIProcess/qt/QtPageClient.h:
+        * WebProcess/qt/QtNetworkAccessManager.cpp:
+        (WebKit::QtNetworkAccessManager::QtNetworkAccessManager):
+        (WebKit::QtNetworkAccessManager::onSslErrors):
+        * WebProcess/qt/QtNetworkAccessManager.h:
+
 2012-01-23  David Levin  <[email protected]>
 
         [windows] Convert usages of GetDC to HWndDC Part 2.

Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp	2012-01-24 01:54:37 UTC (rev 105670)
@@ -60,6 +60,7 @@
     , confirmDialog(0)
     , promptDialog(0)
     , authenticationDialog(0)
+    , certificateVerificationDialog(0)
     , itemSelector(0)
     , postTransitionState(adoptPtr(new PostTransitionState(this)))
     , isTransitioningToNewPage(false)
@@ -479,6 +480,25 @@
     password = dialogRunner.password();
 }
 
+bool QQuickWebViewPrivate::handleCertificateVerificationRequest(const QString& hostname)
+{
+    if (!certificateVerificationDialog)
+        return false;
+
+    Q_Q(QQuickWebView);
+    QtDialogRunner dialogRunner;
+    if (!dialogRunner.initForCertificateVerification(certificateVerificationDialog, q, hostname))
+        return false;
+
+    setViewInAttachedProperties(dialogRunner.dialog());
+
+    disableMouseEvents();
+    dialogRunner.exec();
+    enableMouseEvents();
+
+    return dialogRunner.wasAccepted();
+}
+
 void QQuickWebViewPrivate::chooseFiles(WKOpenPanelResultListenerRef listenerRef, const QStringList& selectedFileNames, QtWebPageUIClient::FileChooserType type)
 {
 #ifndef QT_NO_FILEDIALOG
@@ -725,6 +745,21 @@
     emit authenticationDialogChanged();
 }
 
+QDeclarativeComponent* QQuickWebViewExperimental::certificateVerificationDialog() const
+{
+    Q_D(const QQuickWebView);
+    return d->certificateVerificationDialog;
+}
+
+void QQuickWebViewExperimental::setCertificateVerificationDialog(QDeclarativeComponent* certificateVerificationDialog)
+{
+    Q_D(QQuickWebView);
+    if (d->certificateVerificationDialog == certificateVerificationDialog)
+        return;
+    d->certificateVerificationDialog = certificateVerificationDialog;
+    emit certificateVerificationDialogChanged();
+}
+
 QDeclarativeComponent* QQuickWebViewExperimental::itemSelector() const
 {
     Q_D(const QQuickWebView);

Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h	2012-01-24 01:54:37 UTC (rev 105670)
@@ -209,6 +209,7 @@
     Q_PROPERTY(QDeclarativeComponent* confirmDialog READ confirmDialog WRITE setConfirmDialog NOTIFY confirmDialogChanged)
     Q_PROPERTY(QDeclarativeComponent* promptDialog READ promptDialog WRITE setPromptDialog NOTIFY promptDialogChanged)
     Q_PROPERTY(QDeclarativeComponent* authenticationDialog READ authenticationDialog WRITE setAuthenticationDialog NOTIFY authenticationDialogChanged)
+    Q_PROPERTY(QDeclarativeComponent* certificateVerificationDialog READ certificateVerificationDialog WRITE setCertificateVerificationDialog NOTIFY certificateVerificationDialogChanged)
     Q_PROPERTY(QDeclarativeComponent* itemSelector READ itemSelector WRITE setItemSelector NOTIFY itemSelectorChanged)
     Q_PROPERTY(QWebPreferences* preferences READ preferences CONSTANT FINAL)
     Q_PROPERTY(bool useTraditionalDesktopBehaviour READ useTraditionalDesktopBehaviour WRITE setUseTraditionalDesktopBehaviour)
@@ -232,6 +233,8 @@
     void setPromptDialog(QDeclarativeComponent*);
     QDeclarativeComponent* authenticationDialog() const;
     void setAuthenticationDialog(QDeclarativeComponent*);
+    QDeclarativeComponent* certificateVerificationDialog() const;
+    void setCertificateVerificationDialog(QDeclarativeComponent*);
     QDeclarativeComponent* itemSelector() const;
     void setItemSelector(QDeclarativeComponent*);
     
@@ -261,6 +264,7 @@
     void confirmDialogChanged();
     void promptDialogChanged();
     void authenticationDialogChanged();
+    void certificateVerificationDialogChanged();
     void itemSelectorChanged();
     void downloadRequested(QWebDownloadItem* downloadItem);
     void permissionRequested(QWebPermissionRequest* permission);

Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h	2012-01-24 01:54:37 UTC (rev 105670)
@@ -98,6 +98,7 @@
     QString runJavaScriptPrompt(const QString&, const QString& defaultValue, bool& ok);
 
     void handleAuthenticationRequiredRequest(const QString& hostname, const QString& realm, const QString& prefilledUsername, QString& username, QString& password);
+    bool handleCertificateVerificationRequest(const QString& hostname);
 
     void setUseTraditionalDesktopBehaviour(bool enable);
     void setViewInAttachedProperties(QObject*);
@@ -154,6 +155,7 @@
     QDeclarativeComponent* confirmDialog;
     QDeclarativeComponent* promptDialog;
     QDeclarativeComponent* authenticationDialog;
+    QDeclarativeComponent* certificateVerificationDialog;
     QDeclarativeComponent* itemSelector;
 
     WebCore::ViewportArguments viewportArguments;

Modified: trunk/Source/WebKit2/UIProcess/PageClient.h (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/PageClient.h	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/PageClient.h	2012-01-24 01:54:37 UTC (rev 105670)
@@ -110,7 +110,8 @@
     virtual void handleDownloadRequest(DownloadProxy*) = 0;
     virtual void updateTextInputState() = 0;
     virtual void handleAuthenticationRequiredRequest(const String& hostname, const String& realm, const String& prefilledUsername, String& username, String& password) = 0;
-#endif
+    virtual void handleCertificateVerificationRequest(const String& hostname, bool& ignoreErrors) = 0;
+#endif // PLATFORM(QT).
 
 #if PLATFORM(QT) || PLATFORM(GTK)
     virtual void startDrag(const WebCore::DragData&, PassRefPtr<ShareableBitmap> dragImage) = 0;

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp	2012-01-24 01:54:37 UTC (rev 105670)
@@ -2367,6 +2367,11 @@
 {
     m_pageClient->handleAuthenticationRequiredRequest(hostname, realm, prefilledUsername, username, password);
 }
+
+void WebPageProxy::certificateVerificationRequest(const String& hostname, bool& ignoreErrors)
+{
+    m_pageClient->handleCertificateVerificationRequest(hostname, ignoreErrors);
+}
 #endif // PLATFORM(QT).
 
 #if ENABLE(TOUCH_EVENTS)

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h	2012-01-24 01:54:37 UTC (rev 105670)
@@ -321,7 +321,8 @@
     void resolveApplicationSchemeRequest(QtNetworkRequestData);
     void sendApplicationSchemeReply(const QQuickNetworkReply*);
     void authenticationRequiredRequest(const String& hostname, const String& realm, const String& prefilledUsername, String& username, String& password);
-#endif
+    void certificateVerificationRequest(const String& hostname, bool& ignoreErrors);
+#endif // PLATFORM(QT).
 
 #if PLATFORM(QT)
     void setComposition(const String& text, Vector<WebCore::CompositionUnderline> underlines, uint64_t selectionStart, uint64_t selectionEnd, uint64_t replacementRangeStart, uint64_t replacementRangeEnd);

Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in	2012-01-24 01:54:37 UTC (rev 105670)
@@ -75,6 +75,7 @@
     DidChangeContentsSize(WebCore::IntSize newSize)
     DidFindZoomableArea(WebCore::IntPoint target, WebCore::IntRect area)
     AuthenticationRequiredRequest(WTF::String hostname, WTF::String realm, WTF::String prefilledUsername) -> (WTF::String username, WTF::String password)
+    CertificateVerificationRequest(WTF::String hostname) -> (bool ignoreErrors)
 #endif
 #if ENABLE(TOUCH_EVENTS)
     NeedTouchEvents(bool needTouchEvents)

Modified: trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.cpp (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.cpp	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.cpp	2012-01-24 01:54:37 UTC (rev 105670)
@@ -102,6 +102,31 @@
     QString m_prefilledUsername;
 };
 
+class CertificateVerificationDialogContextObject : public QObject {
+    Q_OBJECT
+    Q_PROPERTY(QString hostname READ hostname CONSTANT)
+
+public:
+    CertificateVerificationDialogContextObject(const QString& hostname)
+        : QObject()
+        , m_hostname(hostname)
+    {
+    }
+
+    QString hostname() const { return m_hostname; }
+
+public slots:
+    void accept() { emit accepted(); }
+    void reject() { emit rejected(); }
+
+signals:
+    void accepted();
+    void rejected();
+
+private:
+    QString m_hostname;
+};
+
 bool QtDialogRunner::initForAlert(QDeclarativeComponent* component, QQuickItem* dialogParent, const QString& message)
 {
     DialogContextObject* contextObject = new DialogContextObject(message);
@@ -149,6 +174,19 @@
     return true;
 }
 
+bool QtDialogRunner::initForCertificateVerification(QDeclarativeComponent* component, QQuickItem* dialogParent, const QString& hostname)
+{
+    CertificateVerificationDialogContextObject* contextObject = new CertificateVerificationDialogContextObject(hostname);
+    if (!createDialog(component, dialogParent, contextObject))
+        return false;
+
+    connect(contextObject, SIGNAL(accepted()), SLOT(onAccepted()));
+    connect(contextObject, SIGNAL(accepted()), SLOT(quit()));
+    connect(contextObject, SIGNAL(rejected()), SLOT(quit()));
+
+    return true;
+}
+
 bool QtDialogRunner::createDialog(QDeclarativeComponent* component, QQuickItem* dialogParent, QObject* contextObject)
 {
     QDeclarativeContext* baseContext = component->creationContext();

Modified: trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.h (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.h	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/qt/QtDialogRunner.h	2012-01-24 01:54:37 UTC (rev 105670)
@@ -39,6 +39,7 @@
     bool initForConfirm(QDeclarativeComponent*, QQuickItem* dialogParent, const QString& message);
     bool initForPrompt(QDeclarativeComponent*, QQuickItem* dialogParent, const QString& message, const QString& defaultValue);
     bool initForAuthentication(QDeclarativeComponent*, QQuickItem* dialogParent, const QString& hostname, const QString& realm, const QString& prefilledUsername);
+    bool initForCertificateVerification(QDeclarativeComponent*, QQuickItem*, const QString& hostname);
 
     QQuickItem* dialog() const { return m_dialog.get(); }
 

Modified: trunk/Source/WebKit2/UIProcess/qt/QtPageClient.cpp (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/qt/QtPageClient.cpp	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/qt/QtPageClient.cpp	2012-01-24 01:54:37 UTC (rev 105670)
@@ -118,6 +118,11 @@
     password = qPassword;
 }
 
+void QtPageClient::handleCertificateVerificationRequest(const String& hostname, bool& ignoreErrors)
+{
+    ignoreErrors = QQuickWebViewPrivate::get(m_webView)->handleCertificateVerificationRequest(hostname);
+}
+
 void QtPageClient::setCursor(const WebCore::Cursor& cursor)
 {
     // FIXME: This is a temporary fix until we get cursor support in QML items.

Modified: trunk/Source/WebKit2/UIProcess/qt/QtPageClient.h (105669 => 105670)


--- trunk/Source/WebKit2/UIProcess/qt/QtPageClient.h	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/UIProcess/qt/QtPageClient.h	2012-01-24 01:54:37 UTC (rev 105670)
@@ -55,6 +55,7 @@
     virtual void handleDownloadRequest(DownloadProxy*);
     virtual void handleApplicationSchemeRequest(PassRefPtr<QtNetworkRequestData>);
     virtual void handleAuthenticationRequiredRequest(const String& hostname, const String& realm, const String& prefilledUsername, String& username, String& password);
+    virtual void handleCertificateVerificationRequest(const String& hostname, bool& ignoreErrors);
 
     virtual void displayView();
     virtual void scrollView(const WebCore::IntRect& scrollRect, const WebCore::IntSize& scrollOffset);

Modified: trunk/Source/WebKit2/WebProcess/qt/QtNetworkAccessManager.cpp (105669 => 105670)


--- trunk/Source/WebKit2/WebProcess/qt/QtNetworkAccessManager.cpp	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/WebProcess/qt/QtNetworkAccessManager.cpp	2012-01-24 01:54:37 UTC (rev 105670)
@@ -43,6 +43,7 @@
     , m_webProcess(webProcess)
 {
     connect(this, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), SLOT(onAuthenticationRequired(QNetworkReply*, QAuthenticator*)));
+    connect(this, SIGNAL(sslErrors(QNetworkReply*, QList<QSslError>)), SLOT(onSslErrors(QNetworkReply*, QList<QSslError>)));
 }
 
 WebPage* QtNetworkAccessManager::obtainOriginatingWebPage(const QNetworkRequest& request)
@@ -96,6 +97,25 @@
     }
 }
 
+void QtNetworkAccessManager::onSslErrors(QNetworkReply* reply, const QList<QSslError>& qSslErrors)
+{
+    WebPage* webPage = obtainOriginatingWebPage(reply->request());
+
+    // FIXME: This check can go away once our Qt version is up-to-date. See: QTBUG-23512.
+    if (!webPage)
+        return;
+
+    String hostname = reply->url().host();
+    bool ignoreErrors = false;
+
+    if (webPage->sendSync(
+        Messages::WebPageProxy::CertificateVerificationRequest(hostname),
+        Messages::WebPageProxy::CertificateVerificationRequest::Reply(ignoreErrors))) {
+        if (ignoreErrors)
+            reply->ignoreSslErrors(qSslErrors);
+    }
 }
 
+}
+
 #include "moc_QtNetworkAccessManager.cpp"

Modified: trunk/Source/WebKit2/WebProcess/qt/QtNetworkAccessManager.h (105669 => 105670)


--- trunk/Source/WebKit2/WebProcess/qt/QtNetworkAccessManager.h	2012-01-24 01:47:29 UTC (rev 105669)
+++ trunk/Source/WebKit2/WebProcess/qt/QtNetworkAccessManager.h	2012-01-24 01:54:37 UTC (rev 105670)
@@ -47,6 +47,7 @@
 
 private Q_SLOTS:
     void onAuthenticationRequired(QNetworkReply *, QAuthenticator *);
+    void onSslErrors(QNetworkReply*, const QList<QSslError>&);
 
 private:
     WebPage* obtainOriginatingWebPage(const QNetworkRequest&);
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to