Changeset 70044 in webkit


Ignore:
Timestamp:
Oct 19, 2010 3:34:56 AM (14 years ago)
Author:
jocelyn.turcotte@nokia.com
Message:

[Qt] QtTestBrowser: Prevent calling load() directly from loadFinished() in robot mode.
https://bugs.webkit.org/show_bug.cgi?id=47809

Reviewed by Andreas Kling.

Connecting a call to load from the loadFinished signal can cause
re-entrance crashes in WebCore. This patch uses a timer to do so,
also giving some time to subsequent frames to finish loading.

  • QtTestBrowser/urlloader.cpp:

(UrlLoader::UrlLoader):
(UrlLoader::loadNext):
(UrlLoader::checkIfFinished):
(UrlLoader::frameLoadStarted):
(UrlLoader::frameLoadFinished):

  • QtTestBrowser/urlloader.h:
Location:
trunk/WebKitTools
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKitTools/ChangeLog

    r70039 r70044  
     12010-10-18  Jocelyn Turcotte  <jocelyn.turcotte@nokia.com>
     2
     3        Reviewed by Andreas Kling.
     4
     5        [Qt] QtTestBrowser: Prevent calling load() directly from loadFinished() in robot mode.
     6        https://bugs.webkit.org/show_bug.cgi?id=47809
     7
     8        Connecting a call to load from the loadFinished signal can cause
     9        re-entrance crashes in WebCore. This patch uses a timer to do so,
     10        also giving some time to subsequent frames to finish loading.
     11
     12        * QtTestBrowser/urlloader.cpp:
     13        (UrlLoader::UrlLoader):
     14        (UrlLoader::loadNext):
     15        (UrlLoader::checkIfFinished):
     16        (UrlLoader::frameLoadStarted):
     17        (UrlLoader::frameLoadFinished):
     18        * QtTestBrowser/urlloader.h:
     19
    1202010-10-19  Sergio Villar Senín  <svillar@igalia.com>
    221
  • trunk/WebKitTools/QtTestBrowser/urlloader.cpp

    r67942 r70044  
    3131#include <QFile>
    3232#include <QDebug>
     33#include <QWebPage>
    3334
    3435UrlLoader::UrlLoader(QWebFrame* frame, const QString& inputFileName, int timeoutSeconds, int extraTimeSeconds)
     
    3637    , m_stdOut(stdout)
    3738    , m_loaded(0)
     39    , m_numFramesLoading(0)
    3840{
     41    m_checkIfFinishedTimer.setInterval(200);
     42    m_checkIfFinishedTimer.setSingleShot(true);
     43    connect(&m_checkIfFinishedTimer, SIGNAL(timeout()), this, SLOT(checkIfFinished()));
     44    // loadStarted and loadFinished on QWebPage is emitted for each frame/sub-frame
     45    connect(m_frame->page(), SIGNAL(loadStarted()), this, SLOT(frameLoadStarted()));
     46    connect(m_frame->page(), SIGNAL(loadFinished(bool)), this, SLOT(frameLoadFinished()));
     47
    3948    if (timeoutSeconds) {
    4049        m_timeoutTimer.setInterval(timeoutSeconds * 1000);
     
    4655        m_extraTimeTimer.setInterval(extraTimeSeconds * 1000);
    4756        m_extraTimeTimer.setSingleShot(true);
    48         connect(frame, SIGNAL(loadFinished(bool)), &m_extraTimeTimer, SLOT(start()));
     57        connect(this, SIGNAL(pageLoadFinished()), &m_extraTimeTimer, SLOT(start()));
    4958        connect(&m_extraTimeTimer, SIGNAL(timeout()), this, SLOT(loadNext()));
    5059    } else
    51         connect(frame, SIGNAL(loadFinished(bool)), this, SLOT(loadNext()));
     60        connect(this, SIGNAL(pageLoadFinished()), this, SLOT(loadNext()));
    5261    loadUrlList(inputFileName);
    5362}
     
    5766    m_timeoutTimer.stop();
    5867    m_extraTimeTimer.stop();
     68    m_checkIfFinishedTimer.stop();
     69    m_numFramesLoading = 0;
    5970    QString qstr;
    6071    if (getUrl(qstr)) {
     
    6778    } else
    6879        disconnect(m_frame, 0, this, 0);
     80}
     81
     82void UrlLoader::checkIfFinished()
     83{
     84    if (!m_numFramesLoading)
     85        emit pageLoadFinished();
     86}
     87
     88void UrlLoader::frameLoadStarted()
     89{
     90    ++m_numFramesLoading;
     91    m_checkIfFinishedTimer.stop();
     92}
     93
     94void UrlLoader::frameLoadFinished()
     95{
     96    Q_ASSERT(m_numFramesLoading > 0);
     97    --m_numFramesLoading;
     98    // Once our frame has finished loading, wait a moment to call loadNext for cases
     99    // where a sub-frame starts loading or another frame is loaded through JavaScript.
     100    m_checkIfFinishedTimer.start();
    69101}
    70102
  • trunk/WebKitTools/QtTestBrowser/urlloader.h

    r67942 r70044  
    4545    void loadNext();
    4646
     47private slots:
     48    void checkIfFinished();
     49    void frameLoadStarted();
     50    void frameLoadFinished();
     51
     52signals:
     53    void pageLoadFinished();
     54
    4755private:
    4856    void loadUrlList(const QString& inputFileName);
     
    5765    QTimer m_timeoutTimer;
    5866    QTimer m_extraTimeTimer;
     67    QTimer m_checkIfFinishedTimer;
     68    int m_numFramesLoading;
    5969};
    6070
Note: See TracChangeset for help on using the changeset viewer.