Tor Arne Vestbø <tavestbo@trolltech.com>
authorhausmann@webkit.org <hausmann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Apr 2008 15:14:38 +0000 (15:14 +0000)
committerhausmann@webkit.org <hausmann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 28 Apr 2008 15:14:38 +0000 (15:14 +0000)
Fix QWebView::loadFinished isn't always emitted

Replaced loadDone() with loadFinished(bool) and moved the signals for progress
tracking (start, progres, and finish) to the page instead of the frame. This
ensures that we emit loadFinished even when a subframe started the actual load.

This causes a few regressions in the layout tests that we for now accept for
the sake of the correct API. Layout tests we can fix any time though, including
patch release, the API however we can't change anymore in patch releases.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@32643 268f45cc-cd09-0410-ab3c-d52691b4dbfc

13 files changed:
WebKit/qt/Api/qwebframe.cpp
WebKit/qt/Api/qwebframe.h
WebKit/qt/Api/qwebpage.cpp
WebKit/qt/Api/qwebpage.h
WebKit/qt/Api/qwebview.cpp
WebKit/qt/Api/qwebview.h
WebKit/qt/ChangeLog
WebKit/qt/QtLauncher/main.cpp
WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
WebKit/qt/WebCoreSupport/FrameLoaderClientQt.h
WebKitTools/ChangeLog
WebKitTools/DumpRenderTree/qt/DumpRenderTree.cpp
WebKitTools/DumpRenderTree/qt/jsobjects.cpp

index a8a0f4e..e09272b 100644 (file)
@@ -136,14 +136,6 @@ void QWebFramePrivate::updateBackground()
     A frame can be loaded using load() or setUrl(). Alternatively, if you have
     the HTML content readily available, you can use setHtml() instead.
 
-    The loadStarted() signal is emitted when the frame begins to load.The
-    loadProgress() signal, on the other hand, is emitted whenever an element
-    of the web frame completes loading, such as an embedded image, a script,
-    etc. Finally, the loadFinished() signal is emitted when the frame has
-    loaded completely. The loadDone() signal is also emitted to indicate if
-    a frame has loaded. It's argument - either \c true or \c false - indicates
-    load success or failure.
-
     The page() function returns a pointer to the web page object. See
     \l{Elements of QWebView} for an explanation of how web
     frames are related to a web page and web view.
@@ -622,7 +614,7 @@ void QWebFrame::render(QPainter *painter, const QRegion &clip)
     GraphicsContext ctx(painter);
     QVector<QRect> vector = clip.rects();
     WebCore::FrameView* view = d->frame->view();
-    for (int i = 0; i < vector.size(); ++i) 
+    for (int i = 0; i < vector.size(); ++i)
         view->paint(&ctx, vector.at(i));
 }
 
@@ -831,7 +823,7 @@ QWebFrame* QWebFramePrivate::kit(WebCore::Frame* coreFrame)
 
     This signal is emitted whenever the global window object of the JavaScript
     environment is cleared, e.g., before starting a new load.
+
     If you intend to add QObjects to a QWebFrame using
     addToJavaScriptWindowObject(), you should add them in a slot connected
     to this signal. This ensures that your objects remain accessible when
@@ -839,15 +831,6 @@ QWebFrame* QWebFramePrivate::kit(WebCore::Frame* coreFrame)
 */
 
 /*!
-    \fn void QWebFrame::loadDone(bool ok)
-
-    This signal is emitted when the frame is completely loaded.
-    \a ok will indicate whether the load was successful or any error occurred.
-
-    \sa loadFinished(), loadStarted()
-*/
-
-/*!
     \fn void QWebFrame::provisionalLoad()
     \internal
 */
@@ -869,23 +852,6 @@ QWebFrame* QWebFramePrivate::kit(WebCore::Frame* coreFrame)
     \sa url()
 */
 
-
-/*!
-    \fn void QWebFrame::loadStarted()
-
-    This signal is emitted when a new load of the frame is started.
-
-    \sa loadFinished()
-*/
-
-/*!
-    \fn void QWebFrame::loadFinished()
-
-    This signal is emitted when a load of the frame is finished.
-
-    \sa loadStarted()
-*/
-
 /*!
     \fn void QWebFrame::initialLayoutCompleted()
 
index c50aeae..4e9be88 100644 (file)
@@ -163,14 +163,11 @@ public Q_SLOTS:
 
 Q_SIGNALS:
     void javaScriptWindowObjectCleared();
-    void loadDone(bool ok);
+
     void provisionalLoad();
     void titleChanged(const QString &title);
     void urlChanged(const QUrl &url);
 
-    void loadStarted();
-    void loadFinished();
-
     void initialLayoutCompleted();
 
     void iconChanged();
index 5dd844c..044036c 100644 (file)
@@ -926,6 +926,13 @@ QVariant QWebPage::inputMethodQuery(Qt::InputMethodQuery property) const
     QWebPage::mainFrame(). For example, the load(), setUrl() and setHtml()
     unctions for QWebPage can be accessed using QWebFrame.
 
+    The loadStarted() signal is emitted when the page begins to load.The
+    loadProgress() signal, on the other hand, is emitted whenever an element
+    of the web page completes loading, such as an embedded image, a script,
+    etc. Finally, the loadFinished() signal is emitted when the page has
+    loaded completely. It's argument - either \c true or \c false - indicates
+    load success or failure.
+
     \section1 Using QWebPage in a Widget-less Environment
 
     Before you begin painting a QWebPage object, you need to set the size of
@@ -937,8 +944,8 @@ QVariant QWebPage::inputMethodQuery(Qt::InputMethodQuery property) const
 
     \snippet doc/src/snippets/webkit/webpage/main.cpp 0
 
-    The \c Thumbnail's constructor takes in a \a url. We connect our QWebFrame
-    object's \l{QWebFrame::}{loadFinished()} signal to our private slot,
+    The \c Thumbnail's constructor takes in a \a url. We connect our QWebPage
+    object's \l{QWebPage::}{loadFinished()} signal to our private slot,
     \c render().
 
     \snippet doc/src/snippets/webkit/webpage/main.cpp 1
@@ -2191,6 +2198,14 @@ quint64 QWebPage::bytesReceived() const {
 }
 
 /*!
+    \fn void QWebPage::loadStarted()
+
+    This signal is emitted when a new load of the page is started.
+
+    \sa loadFinished()
+*/
+
+/*!
     \fn void QWebPage::loadProgress(int progress)
 
     This signal is emitted when the global progress status changes.
@@ -2202,6 +2217,15 @@ quint64 QWebPage::bytesReceived() const {
 */
 
 /*!
+    \fn void QWebPage::loadFinished(bool ok)
+
+    This signal is emitted when a load of the page is finished.
+    \a ok will indicate whether the load was successful or any error occurred.
+
+    \sa loadStarted()
+*/
+
+/*!
     \fn void QWebPage::linkHovered(const QString &link, const QString &title, const QString &textContent)
 
     This signal is emitted when the mouse is hovering over a link.
index 79a4ae4..002f45b 100644 (file)
@@ -234,7 +234,10 @@ public:
     virtual bool supportsExtension(Extension extension) const;
 
 Q_SIGNALS:
+    void loadStarted();
     void loadProgress(int progress);
+    void loadFinished(bool ok);
+
     void linkHovered(const QString &link, const QString &title, const QString &textContent);
     void statusBarMessage(const QString& text);
     void selectionChanged();
index 966e211..09ca6cb 100644 (file)
@@ -58,7 +58,8 @@ public:
     loadProgress() signal, on the other hand, is emitted whenever an element of
     the web view completes loading, such as an embedded image, a script, etc.
     Finally, the loadFinished() signal is emitted when the view has loaded
-    completely.
+    completely. It's argument - either \c true or \c false - indicates
+    load success or failure.
 
     The page() function returns a pointer to the web page object. See
     \l{Elements of QWebView} for an explanation of how the web page
@@ -181,10 +182,6 @@ void QWebView::setPage(QWebPage *page)
         d->page->setPalette(palette());
         // #### connect signals
         QWebFrame *mainFrame = d->page->mainFrame();
-        connect(mainFrame, SIGNAL(loadStarted()),
-                this, SIGNAL(loadStarted()));
-        connect(mainFrame, SIGNAL(loadFinished()),
-                this, SIGNAL(loadFinished()));
         connect(mainFrame, SIGNAL(titleChanged(const QString&)),
                 this, SIGNAL(titleChanged(const QString&)));
         connect(mainFrame, SIGNAL(iconChanged()),
@@ -192,8 +189,12 @@ void QWebView::setPage(QWebPage *page)
         connect(mainFrame, SIGNAL(urlChanged(const QUrl &)),
                 this, SIGNAL(urlChanged(const QUrl &)));
 
+        connect(d->page, SIGNAL(loadStarted()),
+                this, SIGNAL(loadStarted()));
         connect(d->page, SIGNAL(loadProgress(int)),
                 this, SIGNAL(loadProgress(int)));
+        connect(d->page, SIGNAL(loadFinished(bool)),
+                this, SIGNAL(loadFinished(bool)));
         connect(d->page, SIGNAL(statusBarMessage(const QString &)),
                 this, SIGNAL(statusBarMessage(const QString &)));
         connect(d->page, SIGNAL(linkClicked(const QUrl &)),
@@ -797,11 +798,12 @@ void QWebView::changeEvent(QEvent *e)
 */
 
 /*!
-    \fn void QWebView::loadFinished()
+    \fn void QWebView::loadFinished(bool ok)
 
-    This signal is emitted when a load of the frame is finished.
+    This signal is emitted when a load of the page is finished.
+    \a ok will indicate whether the load was successful or any error occurred.
 
-    \sa loadStarted(), QWebFrame::loadDone()
+    \sa loadStarted()
 */
 
 /*!
index 48d427a..9cef8a4 100644 (file)
@@ -110,7 +110,7 @@ public Q_SLOTS:
 Q_SIGNALS:
     void loadStarted();
     void loadProgress(int progress);
-    void loadFinished();
+    void loadFinished(bool);
     void titleChanged(const QString& title);
     void statusBarMessage(const QString& text);
     void linkClicked(const QUrl &url);
index 8220a59..15d6e94 100644 (file)
@@ -1,3 +1,39 @@
+2008-04-28  Tor Arne Vestbø  <tavestbo@trolltech.com>
+
+        Reviewed by Simon.
+
+        Fix QWebView::loadFinished isn't always emitted
+
+        Replaced loadDone() with loadFinished(bool) and moved the signals for progress
+        tracking (start, progres, and finish) to the page instead of the frame. This
+        ensures that we emit loadFinished even when a subframe started the actual load.
+
+        This causes a few regressions in the layout tests that we for now accept for
+        the sake of the correct API. Layout tests we can fix any time though, including
+        patch release, the API however we can't change anymore in patch releases.
+
+        * Api/qwebframe.cpp:
+        * Api/qwebframe.h:
+        * Api/qwebpage.cpp:
+        (QWebPage::totalBytes):
+        * Api/qwebpage.h:
+        * Api/qwebview.cpp:
+        (QWebView::setPage):
+        * Api/qwebview.h:
+        * QtLauncher/main.cpp:
+        (MainWindow::MainWindow):
+        * WebCoreSupport/FrameLoaderClientQt.cpp:
+        (drtDescriptionSuitableForTestResult):
+        (WebCore::FrameLoaderClientQt::FrameLoaderClientQt):
+        (WebCore::FrameLoaderClientQt::setFrame):
+        (WebCore::FrameLoaderClientQt::transitionToCommittedFromCachedPage):
+        (WebCore::FrameLoaderClientQt::transitionToCommittedForNewPage):
+        (WebCore::FrameLoaderClientQt::willChangeTitle):
+        (WebCore::FrameLoaderClientQt::createDocumentLoader):
+        (WebCore::FrameLoaderClientQt::download):
+        (WebCore::FrameLoaderClientQt::dispatchDecidePolicyForNavigationAction):
+        * WebCoreSupport/FrameLoaderClientQt.h:
+
 2008-04-28  Kavindra Devi Palaraja  <kdpalara@trolltech.com>
 
         Reviewed by Simon.
index d2cf48a..4ca7056 100644 (file)
@@ -299,9 +299,9 @@ public:
                 info, SLOT(startLoad()));
         connect(view, SIGNAL(loadProgress(int)),
                 info, SLOT(changeLoad(int)));
-        connect(view, SIGNAL(loadFinished()),
+        connect(view, SIGNAL(loadFinished(bool)),
                 info, SLOT(endLoad()));
-        connect(view, SIGNAL(loadFinished()),
+        connect(view, SIGNAL(loadFinished(bool)),
                 this, SLOT(loadFinished()));
         connect(view, SIGNAL(titleChanged(const QString&)),
                 this, SLOT(setWindowTitle(const QString&)));
index 475e558..70fbbd4 100644 (file)
@@ -86,7 +86,7 @@ static QString drtDescriptionSuitableForTestResult(WebCore::Frame* _frame)
     QWebFrame* frame = QWebFramePrivate::kit(_frame);
     QString name = frame->frameName();
 
-    bool isMainFrame = frame == frame->page()->mainFrame();  
+    bool isMainFrame = frame == frame->page()->mainFrame();
     if (isMainFrame) {
         if (!name.isEmpty())
             return QString::fromLatin1("main frame \"%1\"").arg(name);
@@ -134,6 +134,7 @@ FrameLoaderClientQt::FrameLoaderClientQt()
     , m_webFrame(0)
     , m_firstData(false)
     , m_policyFunction(0)
+    , m_loadSucceeded(false)
 {
     connect(this, SIGNAL(sigCallPolicyFunction(int)), this, SLOT(slotCallPolicyFunction(int)), Qt::QueuedConnection);
 }
@@ -153,11 +154,11 @@ void FrameLoaderClientQt::setFrame(QWebFrame* webFrame, Frame* frame)
     }
 
     connect(this, SIGNAL(loadStarted()),
-            m_webFrame, SIGNAL(loadStarted()));
+            m_webFrame->page(), SIGNAL(loadStarted()));
     connect(this, SIGNAL(loadProgress(int)),
             m_webFrame->page(), SIGNAL(loadProgress(int)));
-    connect(this, SIGNAL(loadFinished()),
-            m_webFrame, SIGNAL(loadFinished()));
+    connect(this, SIGNAL(loadFinished(bool)),
+            m_webFrame->page(), SIGNAL(loadFinished(bool)));
     connect(this, SIGNAL(titleChanged(const QString&)),
             m_webFrame, SIGNAL(titleChanged(const QString&)));
 }
@@ -204,11 +205,11 @@ void FrameLoaderClientQt::savePlatformDataToCachedPage(CachedPage*)
 }
 
 void FrameLoaderClientQt::transitionToCommittedFromCachedPage(CachedPage*)
-{ 
+{
 }
 
-void FrameLoaderClientQt::transitionToCommittedForNewPage() 
-{ 
+void FrameLoaderClientQt::transitionToCommittedForNewPage()
+{
     ASSERT(m_frame);
     ASSERT(m_webFrame);
 
@@ -389,7 +390,7 @@ void FrameLoaderClientQt::dispatchDidFinishDocumentLoad()
 
     if (m_frame->tree()->parent() || !m_webFrame)
         return;
-        
+
     m_webFrame->page()->d->updateNavigationActions();
 }
 
@@ -399,8 +400,8 @@ void FrameLoaderClientQt::dispatchDidFinishLoad()
     if (dumpFrameLoaderCallbacks)
         printf("%s - didFinishLoadForFrame\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
 
-    if (m_webFrame)
-        emit m_webFrame->loadDone(true);
+    m_loadSucceeded = true;
+
     if (m_frame->tree()->parent() || !m_webFrame)
         return;
     m_webFrame->page()->d->updateNavigationActions();
@@ -468,7 +469,7 @@ void FrameLoaderClientQt::postProgressEstimateChangedNotification()
 void FrameLoaderClientQt::postProgressFinishedNotification()
 {
     if (m_webFrame && m_frame->page())
-        emit loadFinished();
+        emit loadFinished(m_loadSucceeded);
 }
 
 void FrameLoaderClientQt::setMainFrameDocumentReady(bool b)
@@ -666,12 +667,12 @@ enum {
     WebKitErrorCannotShowMIMEType =                             100,
     WebKitErrorCannotShowURL =                                  101,
     WebKitErrorFrameLoadInterruptedByPolicyChange =             102,
-    WebKitErrorCannotUseRestrictedPort = 103, 
+    WebKitErrorCannotUseRestrictedPort = 103,
     WebKitErrorCannotFindPlugIn =                               200,
     WebKitErrorCannotLoadPlugIn =                               201,
     WebKitErrorJavaUnavailable =                                202,
 };
-    
+
 WebCore::ResourceError FrameLoaderClientQt::blockedError(const WebCore::ResourceRequest& request)
 {
     return ResourceError("Error", WebKitErrorCannotUseRestrictedPort, request.url().prettyURL(),
@@ -800,8 +801,7 @@ void FrameLoaderClientQt::dispatchDidFailProvisionalLoad(const WebCore::Resource
     if (dumpFrameLoaderCallbacks)
         printf("%s - didFailProvisionalLoadWithError\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
 
-    if (m_webFrame)
-        emit m_webFrame->loadDone(false);
+    m_loadSucceeded = false;
 }
 
 void FrameLoaderClientQt::dispatchDidFailLoad(const WebCore::ResourceError&)
@@ -809,8 +809,7 @@ void FrameLoaderClientQt::dispatchDidFailLoad(const WebCore::ResourceError&)
     if (dumpFrameLoaderCallbacks)
         printf("%s - didFailLoadWithError\n", qPrintable(drtDescriptionSuitableForTestResult(m_frame)));
 
-    if (m_webFrame)
-        emit m_webFrame->loadDone(false);
+    m_loadSucceeded = false;
 }
 
 WebCore::Frame* FrameLoaderClientQt::dispatchCreatePage()
index 8a68926..4c76410 100644 (file)
@@ -49,7 +49,7 @@ namespace WebCore {
     class NavigationAction;
     class String;
     class ResourceLoader;
-    
+
     struct LoadErrorResetToken;
 
     class FrameLoaderClientQt : public QObject, public FrameLoaderClient {
@@ -63,7 +63,7 @@ namespace WebCore {
         void sigCallPolicyFunction(int);
         void loadStarted();
         void loadProgress(int d);
-        void loadFinished();
+        void loadFinished(bool);
         void titleChanged(const QString& title);
 
     public:
@@ -204,6 +204,7 @@ namespace WebCore {
         ResourceResponse m_response;
         bool m_firstData;
         FramePolicyFunction m_policyFunction;
+        bool m_loadSucceeded;
     };
 
 }
index bd39188..424634a 100644 (file)
@@ -1,3 +1,13 @@
+2008-04-28  Tor Arne Vestbø  <tavestbo@trolltech.com>
+
+        Reviewed by Simon.
+
+        Adapt to the latest API changes in WebKit/qt/Api.
+
+        * DumpRenderTree/qt/DumpRenderTree.cpp:
+        (WebCore::DumpRenderTree::DumpRenderTree):
+        * DumpRenderTree/qt/jsobjects.cpp:
+
 2008-04-26  Robin Dunn  <robin@alldunn.com>
 
         Reviewed by Kevin Ollivier.
index c5b995c..972f236 100644 (file)
@@ -136,7 +136,9 @@ DumpRenderTree::DumpRenderTree()
     view->setPage(m_page);
     connect(m_page, SIGNAL(frameCreated(QWebFrame *)), this, SLOT(connectFrame(QWebFrame *)));
     connectFrame(m_page->mainFrame());
-    
+
+    connect(m_page, SIGNAL(loadFinished(bool)), m_controller, SLOT(maybeDump(bool)));
+
     m_page->mainFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff);
     m_page->mainFrame()->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff);
     connect(m_page->mainFrame(), SIGNAL(titleChanged(const QString&)),
@@ -292,11 +294,6 @@ void DumpRenderTree::connectFrame(QWebFrame *frame)
     connect(frame, SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(initJSObjects()));
     connect(frame, SIGNAL(provisionalLoad()),
             layoutTestController(), SLOT(provisionalLoad()));
-
-    if (frame == m_page->mainFrame()) {
-        connect(frame, SIGNAL(loadDone(bool)),
-                layoutTestController(), SLOT(maybeDump(bool)));
-    }
 }
 
 QWebPage *DumpRenderTree::createWindow()
index 6771afa..ce16ea6 100644 (file)
@@ -63,10 +63,6 @@ void LayoutTestController::reset()
 
 void LayoutTestController::maybeDump(bool ok)
 {
-    QWebFrame *frame = qobject_cast<QWebFrame*>(sender());
-    if (frame != m_topLoadingFrame)
-        return;
-
     m_topLoadingFrame = 0;
 
     if (!shouldWaitUntilDone()) {