Changeset 79795 in webkit


Ignore:
Timestamp:
Feb 26, 2011 9:12:30 AM (13 years ago)
Author:
andreas.kling@nokia.com
Message:

2011-02-26 Andreas Kling <kling@webkit.org>

Reviewed by Kenneth Rohde Christiansen.

[Qt] Enable usage of synchronous HTTP feature in Qt
https://bugs.webkit.org/show_bug.cgi?id=37191

Currently, we spin an event loop when doing synchronous calls to
wait for completion. This patch uses synchronous requests in Qt,
if available, and spins the event loop as a fallback solution.

Based on work by Simon Hausmann and Peter Hartmann.

  • platform/network/qt/QNetworkReplyHandler.cpp: (WebCore::QNetworkReplyHandler::QNetworkReplyHandler): (WebCore::QNetworkReplyHandler::start):
  • platform/network/qt/QNetworkReplyHandler.h:
  • platform/network/qt/ResourceHandleQt.cpp: (WebCore::WebCoreSynchronousLoader::setReplyFinished): (WebCore::WebCoreSynchronousLoader::WebCoreSynchronousLoader): (WebCore::WebCoreSynchronousLoader::didFinishLoading): (WebCore::WebCoreSynchronousLoader::didFail): (WebCore::ResourceHandle::loadResourceSynchronously):
Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r79794 r79795  
     12011-02-26  Andreas Kling  <kling@webkit.org>
     2
     3        Reviewed by Kenneth Rohde Christiansen.
     4
     5        [Qt] Enable usage of synchronous HTTP feature in Qt
     6        https://bugs.webkit.org/show_bug.cgi?id=37191
     7
     8        Currently, we spin an event loop when doing synchronous calls to
     9        wait for completion. This patch uses synchronous requests in Qt,
     10        if available, and spins the event loop as a fallback solution.
     11
     12        Based on work by Simon Hausmann and Peter Hartmann.
     13
     14        * platform/network/qt/QNetworkReplyHandler.cpp:
     15        (WebCore::QNetworkReplyHandler::QNetworkReplyHandler):
     16        (WebCore::QNetworkReplyHandler::start):
     17        * platform/network/qt/QNetworkReplyHandler.h:
     18        * platform/network/qt/ResourceHandleQt.cpp:
     19        (WebCore::WebCoreSynchronousLoader::setReplyFinished):
     20        (WebCore::WebCoreSynchronousLoader::WebCoreSynchronousLoader):
     21        (WebCore::WebCoreSynchronousLoader::didFinishLoading):
     22        (WebCore::WebCoreSynchronousLoader::didFail):
     23        (WebCore::ResourceHandle::loadResourceSynchronously):
     24
    1252011-02-26  Ryosuke Niwa  <rniwa@webkit.org>
    226
  • trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp

    r79668 r79795  
    5151#define SIGNAL_CONN Qt::QueuedConnection
    5252#endif
     53
     54// In Qt 4.8, the attribute for sending a request synchronously will be made public,
     55// for now, use this hackish solution for setting the internal attribute.
     56const QNetworkRequest::Attribute gSynchronousNetworkRequestAttribute = static_cast<QNetworkRequest::Attribute>(QNetworkRequest::HttpPipeliningWasUsedAttribute + 7);
    5357
    5458static const int gMaxRecursionLimit = 10;
     
    219223    m_request = r.toNetworkRequest(originatingObject);
    220224
    221     if (m_loadMode == LoadNormal)
     225    if (m_loadMode == LoadSynchronously)
     226        m_request.setAttribute(gSynchronousNetworkRequestAttribute, true);
     227
     228    if (m_loadMode == LoadNormal || m_loadMode == LoadSynchronously)
    222229        start();
     230
     231    if (m_loadMode == LoadSynchronously)
     232        m_loadMode = LoadNormal;
    223233}
    224234
     
    549559    m_reply->setParent(this);
    550560
     561    if (m_loadMode == LoadSynchronously && m_reply->isFinished()) {
     562        // If supported, a synchronous request will be finished at this point, no need to hook up the signals.
     563        return;
     564    }
     565
    551566    connect(m_reply, SIGNAL(finished()),
    552567            this, SLOT(finish()), SIGNAL_CONN);
  • trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.h

    r79668 r79795  
    4343        LoadNormal,
    4444        LoadDeferred,
    45         LoadResuming
     45        LoadResuming,
     46        LoadSynchronously
    4647    };
    4748
     
    5859    void processQueuedItems();
    5960
    60 private slots:
     61public slots:
    6162    void finish();
    6263    void sendResponseIfNeeded();
  • trunk/Source/WebCore/platform/network/qt/ResourceHandleQt.cpp

    r79668 r79795  
    7070    Vector<char> data() const { return m_data; }
    7171
     72    void setReplyFinished(bool finished) { m_replyFinished = finished; }
     73
    7274private:
    7375    ResourceResponse m_response;
     
    7577    Vector<char> m_data;
    7678    QEventLoop m_eventLoop;
     79    bool m_replyFinished;
    7780};
    7881
    7982WebCoreSynchronousLoader::WebCoreSynchronousLoader()
     83        : m_replyFinished(false)
    8084{
    8185}
     
    9397void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double)
    9498{
    95     m_eventLoop.exit();
     99    if (!m_replyFinished)
     100        m_eventLoop.exit();
    96101}
    97102
     
    99104{
    100105    m_error = error;
    101     m_eventLoop.exit();
     106    if (!m_replyFinished)
     107        m_eventLoop.exit();
    102108}
    103109
     
    202208    }
    203209    d->m_context = context;
    204     d->m_job = new QNetworkReplyHandler(handle.get(), QNetworkReplyHandler::LoadNormal);
    205 
    206     syncLoader.waitForCompletion();
     210    d->m_job = new QNetworkReplyHandler(handle.get(), QNetworkReplyHandler::LoadSynchronously);
     211
     212    QNetworkReply* reply = d->m_job->reply();
     213    // When using synchronous calls, we are finished when reaching this point.
     214    if (reply->isFinished()) {
     215        syncLoader.setReplyFinished(true);
     216        d->m_job->forwardData();
     217        d->m_job->finish();
     218    } else
     219        syncLoader.waitForCompletion();
     220
    207221    error = syncLoader.resourceError();
    208222    data = syncLoader.data();
Note: See TracChangeset for help on using the changeset viewer.