[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