WebCore/ChangeLog

 12010-11-24 Peter Hartmann <peter.hartmann@nokia.com>
 2
 3 Reviewed by NOBODY (OOPS!).
 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 * platform/network/qt/QNetworkReplyHandler.cpp:
 13 (WebCore::QNetworkReplyHandler::QNetworkReplyHandler):
 14 * platform/network/qt/QNetworkReplyHandler.h:
 15 * platform/network/qt/ResourceHandleQt.cpp:
 16 (WebCore::WebCoreSynchronousLoader::setReplyFinished):
 17 (WebCore::WebCoreSynchronousLoader::WebCoreSynchronousLoader):
 18 (WebCore::WebCoreSynchronousLoader::didFinishLoading):
 19 (WebCore::WebCoreSynchronousLoader::didFail):
 20 (WebCore::WebCoreSynchronousLoader::waitForCompletion):
 21 (WebCore::ResourceHandle::loadResourceSynchronously):
 22
1232010-11-12 Stephen White <senorblanco@chromium.org>
224
325 Reviewed by Simon Fraser.

WebCore/platform/network/qt/QNetworkReplyHandler.cpp

5353#define SIGNAL_CONN Qt::QueuedConnection
5454#endif
5555
 56const QNetworkRequest::Attribute gSynchronousNetworkRequestAttribute = static_cast<QNetworkRequest::Attribute>(QNetworkRequest::DownloadBufferAttribute + 1);
 57
5658static const int gMaxRecursionLimit = 10;
5759
5860namespace WebCore {

@@QNetworkReplyHandler::QNetworkReplyHandler(ResourceHandle* handle, LoadMode load
220222
221223 m_request = r.toNetworkRequest(originatingObject);
222224
 225 if (m_loadMode == LoadSynchronously) {
 226 m_request.setAttribute(gSynchronousNetworkRequestAttribute, true);
 227 m_loadMode = LoadNormal;
 228 }
 229
223230 if (m_loadMode == LoadNormal)
224231 start();
225232}

WebCore/platform/network/qt/QNetworkReplyHandler.h

@@public:
4242 enum LoadMode {
4343 LoadNormal,
4444 LoadDeferred,
45  LoadResuming
 45 LoadResuming,
 46 LoadSynchronously
4647 };
4748
4849 QNetworkReplyHandler(ResourceHandle *handle, LoadMode);

@@public:
5758signals:
5859 void processQueuedItems();
5960
60 private slots:
 61public slots:
6162 void finish();
6263 void sendResponseIfNeeded();
6364 void forwardData();

WebCore/platform/network/qt/ResourceHandleQt.cpp

@@public:
6767 ResourceError resourceError() const { return m_error; }
6868 Vector<char> data() const { return m_data; }
6969
 70 void setReplyFinished(bool finished) { m_replyFinished = finished; }
 71
7072private:
7173 ResourceResponse m_response;
7274 ResourceError m_error;
7375 Vector<char> m_data;
7476 QEventLoop m_eventLoop;
 77 bool m_replyFinished;
7578};
7679
7780WebCoreSynchronousLoader::WebCoreSynchronousLoader()
 81 : m_replyFinished(false)
7882{
7983}
8084

@@void WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data,
9094
9195void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double)
9296{
93  m_eventLoop.exit();
 97 if (!m_replyFinished)
 98 m_eventLoop.exit();
9499}
95100
96101void WebCoreSynchronousLoader::didFail(ResourceHandle*, const ResourceError& error)
97102{
98103 m_error = error;
99  m_eventLoop.exit();
 104 if (!m_replyFinished)
 105 m_eventLoop.exit();
100106}
101107
102108void WebCoreSynchronousLoader::waitForCompletion()
103109{
104  m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
 110 if (!m_replyFinished)
 111 m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
105112}
106113
107114ResourceHandleInternal::~ResourceHandleInternal()

@@void ResourceHandle::loadResourceSynchronously(NetworkingContext* context, const
199206 d->m_firstRequest.setURL(urlWithCredentials);
200207 }
201208 d->m_context = context;
202  d->m_job = new QNetworkReplyHandler(handle.get(), QNetworkReplyHandler::LoadNormal);
 209 d->m_job = new QNetworkReplyHandler(handle.get(), QNetworkReplyHandler::LoadSynchronously);
 210
 211 QNetworkReply* reply = d->m_job->reply();
 212 // when using synchronous calls, we are finished when reaching this point
 213 syncLoader.setReplyFinished(reply->isFinished());
 214 d->m_job->forwardData();
 215 d->m_job->finish();
203216
204217 syncLoader.waitForCompletion();
205218 error = syncLoader.resourceError();