Title: [115808] trunk/Source/WebKit2
Revision
115808
Author
[email protected]
Date
2012-05-02 03:00:28 -0700 (Wed, 02 May 2012)

Log Message

[Qt][WK2] Minibrowser's progress bar should reset when WebProcess crashes while loading.
https://bugs.webkit.org/show_bug.cgi?id=84445

Patch by Zalan Bujtas <[email protected]> on 2012-05-02
Reviewed by Jocelyn Turcotte.

Progress value needs resetting, when WebProcess crashes.
This patch moves crash logic for loading to QtWebPageLoadClient. It
also simplifies the callback function names in QtWebPageLoadClient, as they
all valid only for main frames.

* UIProcess/API/qt/qquickwebview.cpp:
(QQuickWebViewPrivate::QQuickWebViewPrivate):
(QQuickWebViewPrivate::processDidCrash):
(QQuickWebViewFlickablePrivate::loadDidSucceed):
* UIProcess/API/qt/qquickwebview_p_p.h:
(QQuickWebViewPrivate::didChangeViewportProperties):
(QQuickWebViewPrivate):
* UIProcess/qt/QtWebPageLoadClient.cpp:
(WebKit::QtWebPageLoadClient::QtWebPageLoadClient):
(WebKit::QtWebPageLoadClient::completeLoadWhenProcessDidCrashIfNeeded):
(WebKit):
(WebKit::QtWebPageLoadClient::didStartProvisionalLoad):
(WebKit::QtWebPageLoadClient::didReceiveServerRedirectForProvisionalLoad):
(WebKit::QtWebPageLoadClient::didCommitLoad):
(WebKit::QtWebPageLoadClient::didSameDocumentNavigation):
(WebKit::QtWebPageLoadClient::didReceiveTitle):
(WebKit::QtWebPageLoadClient::didFirstVisuallyNonEmptyLayout):
(WebKit::QtWebPageLoadClient::didStartProvisionalLoadForFrame):
(WebKit::QtWebPageLoadClient::didReceiveServerRedirectForProvisionalLoadForFrame):
(WebKit::QtWebPageLoadClient::didCommitLoadForFrame):
(WebKit::QtWebPageLoadClient::didSameDocumentNavigationForFrame):
(WebKit::QtWebPageLoadClient::didReceiveTitleForFrame):
(WebKit::QtWebPageLoadClient::didFirstVisuallyNonEmptyLayoutForFrame):
* UIProcess/qt/QtWebPageLoadClient.h:
(WebKit):
(QtWebPageLoadClient):

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (115807 => 115808)


--- trunk/Source/WebKit2/ChangeLog	2012-05-02 09:52:19 UTC (rev 115807)
+++ trunk/Source/WebKit2/ChangeLog	2012-05-02 10:00:28 UTC (rev 115808)
@@ -1,3 +1,42 @@
+2012-05-02  Zalan Bujtas  <[email protected]>
+
+        [Qt][WK2] Minibrowser's progress bar should reset when WebProcess crashes while loading.
+        https://bugs.webkit.org/show_bug.cgi?id=84445
+
+        Reviewed by Jocelyn Turcotte.
+
+        Progress value needs resetting, when WebProcess crashes.
+        This patch moves crash logic for loading to QtWebPageLoadClient. It
+        also simplifies the callback function names in QtWebPageLoadClient, as they
+        all valid only for main frames.
+
+        * UIProcess/API/qt/qquickwebview.cpp:
+        (QQuickWebViewPrivate::QQuickWebViewPrivate):
+        (QQuickWebViewPrivate::processDidCrash):
+        (QQuickWebViewFlickablePrivate::loadDidSucceed):
+        * UIProcess/API/qt/qquickwebview_p_p.h:
+        (QQuickWebViewPrivate::didChangeViewportProperties):
+        (QQuickWebViewPrivate):
+        * UIProcess/qt/QtWebPageLoadClient.cpp:
+        (WebKit::QtWebPageLoadClient::QtWebPageLoadClient):
+        (WebKit::QtWebPageLoadClient::completeLoadWhenProcessDidCrashIfNeeded):
+        (WebKit):
+        (WebKit::QtWebPageLoadClient::didStartProvisionalLoad):
+        (WebKit::QtWebPageLoadClient::didReceiveServerRedirectForProvisionalLoad):
+        (WebKit::QtWebPageLoadClient::didCommitLoad):
+        (WebKit::QtWebPageLoadClient::didSameDocumentNavigation):
+        (WebKit::QtWebPageLoadClient::didReceiveTitle):
+        (WebKit::QtWebPageLoadClient::didFirstVisuallyNonEmptyLayout):
+        (WebKit::QtWebPageLoadClient::didStartProvisionalLoadForFrame):
+        (WebKit::QtWebPageLoadClient::didReceiveServerRedirectForProvisionalLoadForFrame):
+        (WebKit::QtWebPageLoadClient::didCommitLoadForFrame):
+        (WebKit::QtWebPageLoadClient::didSameDocumentNavigationForFrame):
+        (WebKit::QtWebPageLoadClient::didReceiveTitleForFrame):
+        (WebKit::QtWebPageLoadClient::didFirstVisuallyNonEmptyLayoutForFrame):
+        * UIProcess/qt/QtWebPageLoadClient.h:
+        (WebKit):
+        (QtWebPageLoadClient):
+
 2012-05-02  Simon Hausmann  <[email protected]>
 
         [Qt] QQuickWebView does not allow for input from virtual keyboard

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


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp	2012-05-02 09:52:19 UTC (rev 115807)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp	2012-05-02 10:00:28 UTC (rev 115808)
@@ -161,7 +161,6 @@
     , m_useDefaultContentItemSize(true)
     , m_navigatorQtObjectEnabled(false)
     , m_renderToOffscreenBuffer(false)
-    , m_loadStartedSignalSent(false)
     , m_dialogActive(false)
 {
     viewport->setClip(true);
@@ -264,14 +263,6 @@
     setIcon(iconURL);
 }
 
-void QQuickWebViewPrivate::didChangeLoadingState(QWebLoadRequest* loadRequest)
-{
-    Q_Q(QQuickWebView);
-    ASSERT(q->loading() == (loadRequest->status() == QQuickWebView::LoadStartedStatus));
-    emit q->loadingChanged(loadRequest);
-    m_loadStartedSignalSent = loadRequest->status() == QQuickWebView::LoadStartedStatus;
-}
-
 void QQuickWebViewPrivate::didChangeBackForwardList()
 {
     navigationHistory->d->reset();
@@ -280,11 +271,9 @@
 void QQuickWebViewPrivate::processDidCrash()
 {
     pageView->eventHandler()->resetGestureRecognizers();
+    pageLoadClient->completeLoadWhenProcessDidCrashIfNeeded();
+
     QUrl url(KURL(WebCore::ParsedURLString, webPageProxy->urlAtProcessExit()));
-    if (m_loadStartedSignalSent) {
-        QWebLoadRequest loadRequest(url, QQuickWebView::LoadFailedStatus, QLatin1String("The web process crashed."), QQuickWebView::InternalErrorDomain, 0);
-        didChangeLoadingState(&loadRequest);
-    }
     qWarning("WARNING: The web process experienced a crash on '%s'.", qPrintable(url.toString(QUrl::RemoveUserInfo)));
 }
 
@@ -702,7 +691,6 @@
         QQuickWebViewPrivate::loadDidSucceed();
     else
         loadSuccessDispatchIsPending = true;
-
 }
 
 void QQuickWebViewFlickablePrivate::loadDidCommit()

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


--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h	2012-05-02 09:52:19 UTC (rev 115807)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p_p.h	2012-05-02 10:00:28 UTC (rev 115808)
@@ -78,7 +78,6 @@
     virtual void loadDidCommit() { }
     virtual void didFinishFirstNonEmptyLayout() { }
     virtual void didChangeViewportProperties(const WebCore::ViewportAttributes& attr) { }
-    void didChangeLoadingState(QWebLoadRequest* loadRequest);
     void didChangeBackForwardList();
 
     void setNeedsDisplay();
@@ -191,7 +190,6 @@
     bool m_useDefaultContentItemSize;
     bool m_navigatorQtObjectEnabled;
     bool m_renderToOffscreenBuffer;
-    bool m_loadStartedSignalSent;
     bool m_dialogActive;
     QUrl m_iconURL;
     QUrl m_deferredUrlToLoad;

Modified: trunk/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.cpp (115807 => 115808)


--- trunk/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.cpp	2012-05-02 09:52:19 UTC (rev 115807)
+++ trunk/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.cpp	2012-05-02 10:00:28 UTC (rev 115808)
@@ -26,12 +26,17 @@
 #include "qquickwebview_p.h"
 #include "qquickwebview_p_p.h"
 #include "qwebloadrequest_p.h"
+#include <KURL.h>
 #include <WKFrame.h>
+#include <WebPageProxy.h>
 
+using namespace WebCore;
+
 namespace WebKit {
 
 QtWebPageLoadClient::QtWebPageLoadClient(WKPageRef pageRef, QQuickWebView* webView)
     : m_webView(webView)
+    , m_webPageProxy(toImpl(pageRef))
     , m_loadProgress(0)
 {
     WKPageLoaderClient loadClient;
@@ -54,37 +59,50 @@
     WKPageSetPageLoaderClient(pageRef, &loadClient);
 }
 
-void QtWebPageLoadClient::didStartProvisionalLoadForFrame(const QUrl& url)
+void QtWebPageLoadClient::completeLoadWhenProcessDidCrashIfNeeded()
 {
+    // Check if loading was ongoing, when process crashed.
+    if (!m_loadProgress || m_loadProgress == 100)
+        return;
+
+    QUrl url(KURL(WebCore::ParsedURLString, m_webPageProxy->urlAtProcessExit()));
+    QWebLoadRequest loadRequest(url, QQuickWebView::LoadFailedStatus, QLatin1String("The web process crashed."), QQuickWebView::InternalErrorDomain, 0);
+
+    emit m_webView->loadingChanged(&loadRequest);
+    setLoadProgress(100);
+}
+
+void QtWebPageLoadClient::didStartProvisionalLoad(const QUrl& url)
+{
     QWebLoadRequest loadRequest(url, QQuickWebView::LoadStartedStatus);
     m_webView->emitUrlChangeIfNeeded();
-    m_webView->d_func()->didChangeLoadingState(&loadRequest);
+    emit m_webView->loadingChanged(&loadRequest);
 }
 
-void QtWebPageLoadClient::didReceiveServerRedirectForProvisionalLoadForFrame(const QUrl& url)
+void QtWebPageLoadClient::didReceiveServerRedirectForProvisionalLoad(const QUrl& url)
 {
     m_webView->emitUrlChangeIfNeeded();
 }
 
-void QtWebPageLoadClient::didCommitLoadForFrame()
+void QtWebPageLoadClient::didCommitLoad()
 {
     emit m_webView->navigationHistoryChanged();
     emit m_webView->titleChanged();
     m_webView->d_func()->loadDidCommit();
 }
 
-void QtWebPageLoadClient::didSameDocumentNavigationForFrame()
+void QtWebPageLoadClient::didSameDocumentNavigation()
 {
     m_webView->emitUrlChangeIfNeeded();
     emit m_webView->navigationHistoryChanged();
 }
 
-void QtWebPageLoadClient::didReceiveTitleForFrame()
+void QtWebPageLoadClient::didReceiveTitle()
 {
     emit m_webView->titleChanged();
 }
 
-void QtWebPageLoadClient::didFirstVisuallyNonEmptyLayoutForFrame()
+void QtWebPageLoadClient::didFirstVisuallyNonEmptyLayout()
 {
     m_webView->d_func()->didFinishFirstNonEmptyLayout();
 }
@@ -147,7 +165,7 @@
     WebFrameProxy* wkframe = toImpl(frame);
     QString urlStr(wkframe->provisionalURL());
     QUrl qUrl = urlStr;
-    toQtWebPageLoadClient(clientInfo)->didStartProvisionalLoadForFrame(qUrl);
+    toQtWebPageLoadClient(clientInfo)->didStartProvisionalLoad(qUrl);
 }
 
 void QtWebPageLoadClient::didReceiveServerRedirectForProvisionalLoadForFrame(WKPageRef, WKFrameRef frame, WKTypeRef, const void* clientInfo)
@@ -157,7 +175,7 @@
     WebFrameProxy* wkframe = toImpl(frame);
     QString urlStr(wkframe->provisionalURL());
     QUrl qUrl = urlStr;
-    toQtWebPageLoadClient(clientInfo)->didReceiveServerRedirectForProvisionalLoadForFrame(qUrl);
+    toQtWebPageLoadClient(clientInfo)->didReceiveServerRedirectForProvisionalLoad(qUrl);
 }
 
 void QtWebPageLoadClient::didFailProvisionalLoadWithErrorForFrame(WKPageRef, WKFrameRef frame, WKErrorRef error, WKTypeRef, const void* clientInfo)
@@ -172,7 +190,7 @@
 {
     if (!WKFrameIsMainFrame(frame))
         return;
-    toQtWebPageLoadClient(clientInfo)->didCommitLoadForFrame();
+    toQtWebPageLoadClient(clientInfo)->didCommitLoad();
 }
 
 void QtWebPageLoadClient::didFinishLoadForFrame(WKPageRef, WKFrameRef frame, WKTypeRef, const void* clientInfo)
@@ -189,16 +207,18 @@
     toQtWebPageLoadClient(clientInfo)->dispatchLoadFailed(frame, error);
 }
 
-void QtWebPageLoadClient::didSameDocumentNavigationForFrame(WKPageRef page, WKFrameRef frame, WKSameDocumentNavigationType type, WKTypeRef userData, const void* clientInfo)
+void QtWebPageLoadClient::didSameDocumentNavigationForFrame(WKPageRef, WKFrameRef frame, WKSameDocumentNavigationType type, WKTypeRef userData, const void* clientInfo)
 {
-    toQtWebPageLoadClient(clientInfo)->didSameDocumentNavigationForFrame();
+    if (!WKFrameIsMainFrame(frame))
+        return;
+    toQtWebPageLoadClient(clientInfo)->didSameDocumentNavigation();
 }
 
 void QtWebPageLoadClient::didReceiveTitleForFrame(WKPageRef, WKStringRef title, WKFrameRef frame, WKTypeRef, const void* clientInfo)
 {
     if (!WKFrameIsMainFrame(frame))
         return;
-    toQtWebPageLoadClient(clientInfo)->didReceiveTitleForFrame();
+    toQtWebPageLoadClient(clientInfo)->didReceiveTitle();
 }
 
 void QtWebPageLoadClient::didStartProgress(WKPageRef, const void* clientInfo)
@@ -222,7 +242,7 @@
 {
     if (!WKFrameIsMainFrame(frame))
         return;
-    toQtWebPageLoadClient(clientInfo)->didFirstVisuallyNonEmptyLayoutForFrame();
+    toQtWebPageLoadClient(clientInfo)->didFirstVisuallyNonEmptyLayout();
 }
 
 void QtWebPageLoadClient::didChangeBackForwardList(WKPageRef, WKBackForwardListItemRef, WKArrayRef, const void *clientInfo)

Modified: trunk/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.h (115807 => 115808)


--- trunk/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.h	2012-05-02 09:52:19 UTC (rev 115807)
+++ trunk/Source/WebKit2/UIProcess/qt/QtWebPageLoadClient.h	2012-05-02 10:00:28 UTC (rev 115808)
@@ -32,23 +32,27 @@
 
 namespace WebKit {
 
+class WebPageProxy;
+
 class QtWebPageLoadClient {
 public:
     QtWebPageLoadClient(WKPageRef, QQuickWebView*);
 
     int loadProgress() const { return m_loadProgress; }
+    void completeLoadWhenProcessDidCrashIfNeeded();
 
 private:
-    void didStartProvisionalLoadForFrame(const QUrl&);
-    void didReceiveServerRedirectForProvisionalLoadForFrame(const QUrl&);
-    void didCommitLoadForFrame();
-    void didSameDocumentNavigationForFrame();
-    void didReceiveTitleForFrame();
-    void didFirstVisuallyNonEmptyLayoutForFrame();
+    void didStartProvisionalLoad(const QUrl&);
+    void didReceiveServerRedirectForProvisionalLoad(const QUrl&);
+    void didCommitLoad();
+    void didSameDocumentNavigation();
+    void didReceiveTitle();
+    void didFirstVisuallyNonEmptyLayout();
     void didChangeBackForwardList();
 
     void dispatchLoadSucceeded();
     void dispatchLoadFailed(WKFrameRef, WKErrorRef);
+
     void setLoadProgress(int);
 
     // WKPageLoadClient callbacks.
@@ -67,6 +71,7 @@
     static void didChangeBackForwardList(WKPageRef, WKBackForwardListItemRef, WKArrayRef, const void *clientInfo);
 
     QQuickWebView* m_webView;
+    WebPageProxy* m_webPageProxy;
     int m_loadProgress;
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to