[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

commit-queue at webkit.org commit-queue at webkit.org
Wed Dec 22 16:32:38 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit 211313e49999cfc34393a2329e48f8d62ca2e6cb
Author: commit-queue at webkit.org <commit-queue at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Nov 25 16:19:32 2010 +0000

    2010-11-25  Peter Hartmann  <peter.hartmann at nokia.com>
    
            Reviewed by Andreas Kling.
    
            [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.
            Patch by Simon Hausmann and Peter Hartmann.
    
            * platform/network/qt/QNetworkReplyHandler.cpp:
            (WebCore::QNetworkReplyHandler::QNetworkReplyHandler):
            * platform/network/qt/QNetworkReplyHandler.h:
            * platform/network/qt/ResourceHandleQt.cpp:
            (WebCore::WebCoreSynchronousLoader::setReplyFinished):
            (WebCore::WebCoreSynchronousLoader::WebCoreSynchronousLoader):
            (WebCore::WebCoreSynchronousLoader::didFinishLoading):
            (WebCore::WebCoreSynchronousLoader::didFail):
            (WebCore::WebCoreSynchronousLoader::waitForCompletion):
            (WebCore::ResourceHandle::loadResourceSynchronously):
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72732 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 800722d..c3a19ef 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,26 @@
+2010-11-25  Peter Hartmann  <peter.hartmann at nokia.com>
+
+        Reviewed by Andreas Kling.
+
+        [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.
+        Patch by Simon Hausmann and Peter Hartmann.
+
+        * platform/network/qt/QNetworkReplyHandler.cpp:
+        (WebCore::QNetworkReplyHandler::QNetworkReplyHandler):
+        * platform/network/qt/QNetworkReplyHandler.h:
+        * platform/network/qt/ResourceHandleQt.cpp:
+        (WebCore::WebCoreSynchronousLoader::setReplyFinished):
+        (WebCore::WebCoreSynchronousLoader::WebCoreSynchronousLoader):
+        (WebCore::WebCoreSynchronousLoader::didFinishLoading):
+        (WebCore::WebCoreSynchronousLoader::didFail):
+        (WebCore::WebCoreSynchronousLoader::waitForCompletion):
+        (WebCore::ResourceHandle::loadResourceSynchronously):
+
 2010-11-25  Hans Wennborg  <hans at chromium.org>
 
         Reviewed by Jeremy Orlow.
diff --git a/WebCore/platform/network/qt/QNetworkReplyHandler.cpp b/WebCore/platform/network/qt/QNetworkReplyHandler.cpp
index 01e624e..0ee5c0b 100644
--- a/WebCore/platform/network/qt/QNetworkReplyHandler.cpp
+++ b/WebCore/platform/network/qt/QNetworkReplyHandler.cpp
@@ -51,6 +51,10 @@
 #define SIGNAL_CONN Qt::QueuedConnection
 #endif
 
+// In Qt 4.8, the attribute for sending a request synchronously will be made public,
+// for now, use this hackish solution for setting the internal attribute.
+const QNetworkRequest::Attribute gSynchronousNetworkRequestAttribute = static_cast<QNetworkRequest::Attribute>(QNetworkRequest::HttpPipeliningWasUsedAttribute + 7);
+
 static const int gMaxRecursionLimit = 10;
 
 namespace WebCore {
@@ -218,6 +222,11 @@ QNetworkReplyHandler::QNetworkReplyHandler(ResourceHandle* handle, LoadMode load
 
     m_request = r.toNetworkRequest(originatingObject);
 
+    if (m_loadMode == LoadSynchronously) {
+        m_request.setAttribute(gSynchronousNetworkRequestAttribute, true);
+        m_loadMode = LoadNormal;
+    }
+
     if (m_loadMode == LoadNormal)
         start();
 }
diff --git a/WebCore/platform/network/qt/QNetworkReplyHandler.h b/WebCore/platform/network/qt/QNetworkReplyHandler.h
index 884a1a4..c0c2630 100644
--- a/WebCore/platform/network/qt/QNetworkReplyHandler.h
+++ b/WebCore/platform/network/qt/QNetworkReplyHandler.h
@@ -42,7 +42,8 @@ public:
     enum LoadMode {
         LoadNormal,
         LoadDeferred,
-        LoadResuming
+        LoadResuming,
+        LoadSynchronously
     };
 
     QNetworkReplyHandler(ResourceHandle *handle, LoadMode);
@@ -57,7 +58,7 @@ public:
 signals:
     void processQueuedItems();
 
-private slots:
+public slots:
     void finish();
     void sendResponseIfNeeded();
     void forwardData();
diff --git a/WebCore/platform/network/qt/ResourceHandleQt.cpp b/WebCore/platform/network/qt/ResourceHandleQt.cpp
index a5ac4c3..46d544d 100644
--- a/WebCore/platform/network/qt/ResourceHandleQt.cpp
+++ b/WebCore/platform/network/qt/ResourceHandleQt.cpp
@@ -69,14 +69,18 @@ public:
     ResourceError resourceError() const { return m_error; }
     Vector<char> data() const { return m_data; }
 
+    void setReplyFinished(bool finished) { m_replyFinished = finished; }
+
 private:
     ResourceResponse m_response;
     ResourceError m_error;
     Vector<char> m_data;
     QEventLoop m_eventLoop;
+    bool m_replyFinished;
 };
 
 WebCoreSynchronousLoader::WebCoreSynchronousLoader()
+        : m_replyFinished(false)
 {
 }
 
@@ -92,13 +96,15 @@ void WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data,
 
 void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double)
 {
-    m_eventLoop.exit();
+    if (!m_replyFinished)
+        m_eventLoop.exit();
 }
 
 void WebCoreSynchronousLoader::didFail(ResourceHandle*, const ResourceError& error)
 {
     m_error = error;
-    m_eventLoop.exit();
+    if (!m_replyFinished)
+        m_eventLoop.exit();
 }
 
 void WebCoreSynchronousLoader::waitForCompletion()
@@ -201,9 +207,17 @@ void ResourceHandle::loadResourceSynchronously(NetworkingContext* context, const
         d->m_firstRequest.setURL(urlWithCredentials);
     }
     d->m_context = context;
-    d->m_job = new QNetworkReplyHandler(handle.get(), QNetworkReplyHandler::LoadNormal);
-
-    syncLoader.waitForCompletion();
+    d->m_job = new QNetworkReplyHandler(handle.get(), QNetworkReplyHandler::LoadSynchronously);
+
+    QNetworkReply* reply = d->m_job->reply();
+    // When using synchronous calls, we are finished when reaching this point.
+    if (reply->isFinished()) {
+        syncLoader.setReplyFinished(true);
+        d->m_job->forwardData();
+        d->m_job->finish();
+    } else {
+        syncLoader.waitForCompletion();
+    }
     error = syncLoader.resourceError();
     data = syncLoader.data();
     response = syncLoader.resourceResponse();

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list