Changeset 79795 in webkit
- Timestamp:
- Feb 26, 2011 9:12:30 AM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r79794 r79795 1 2011-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 1 25 2011-02-26 Ryosuke Niwa <rniwa@webkit.org> 2 26 -
trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp
r79668 r79795 51 51 #define SIGNAL_CONN Qt::QueuedConnection 52 52 #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. 56 const QNetworkRequest::Attribute gSynchronousNetworkRequestAttribute = static_cast<QNetworkRequest::Attribute>(QNetworkRequest::HttpPipeliningWasUsedAttribute + 7); 53 57 54 58 static const int gMaxRecursionLimit = 10; … … 219 223 m_request = r.toNetworkRequest(originatingObject); 220 224 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) 222 229 start(); 230 231 if (m_loadMode == LoadSynchronously) 232 m_loadMode = LoadNormal; 223 233 } 224 234 … … 549 559 m_reply->setParent(this); 550 560 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 551 566 connect(m_reply, SIGNAL(finished()), 552 567 this, SLOT(finish()), SIGNAL_CONN); -
trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.h
r79668 r79795 43 43 LoadNormal, 44 44 LoadDeferred, 45 LoadResuming 45 LoadResuming, 46 LoadSynchronously 46 47 }; 47 48 … … 58 59 void processQueuedItems(); 59 60 60 p rivateslots:61 public slots: 61 62 void finish(); 62 63 void sendResponseIfNeeded(); -
trunk/Source/WebCore/platform/network/qt/ResourceHandleQt.cpp
r79668 r79795 70 70 Vector<char> data() const { return m_data; } 71 71 72 void setReplyFinished(bool finished) { m_replyFinished = finished; } 73 72 74 private: 73 75 ResourceResponse m_response; … … 75 77 Vector<char> m_data; 76 78 QEventLoop m_eventLoop; 79 bool m_replyFinished; 77 80 }; 78 81 79 82 WebCoreSynchronousLoader::WebCoreSynchronousLoader() 83 : m_replyFinished(false) 80 84 { 81 85 } … … 93 97 void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*, double) 94 98 { 95 m_eventLoop.exit(); 99 if (!m_replyFinished) 100 m_eventLoop.exit(); 96 101 } 97 102 … … 99 104 { 100 105 m_error = error; 101 m_eventLoop.exit(); 106 if (!m_replyFinished) 107 m_eventLoop.exit(); 102 108 } 103 109 … … 202 208 } 203 209 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 207 221 error = syncLoader.resourceError(); 208 222 data = syncLoader.data();
Note: See TracChangeset
for help on using the changeset viewer.