diff options
Diffstat (limited to 'WebCore/platform/network/qt')
-rw-r--r-- | WebCore/platform/network/qt/QNetworkReplyHandler.cpp | 42 | ||||
-rw-r--r-- | WebCore/platform/network/qt/QNetworkReplyHandler.h | 8 | ||||
-rw-r--r-- | WebCore/platform/network/qt/ResourceHandleQt.cpp | 36 |
3 files changed, 64 insertions, 22 deletions
diff --git a/WebCore/platform/network/qt/QNetworkReplyHandler.cpp b/WebCore/platform/network/qt/QNetworkReplyHandler.cpp index 06b60bf..898e5f4 100644 --- a/WebCore/platform/network/qt/QNetworkReplyHandler.cpp +++ b/WebCore/platform/network/qt/QNetworkReplyHandler.cpp @@ -162,9 +162,21 @@ QNetworkReplyHandler::QNetworkReplyHandler(ResourceHandle* handle, LoadMode load void QNetworkReplyHandler::setLoadMode(LoadMode mode) { - m_loadMode = mode; - if (m_loadMode == LoadNormal) - sendQueuedItems(); + // https://bugs.webkit.org/show_bug.cgi?id=26556 + // We cannot call sendQueuedItems() from here, because the signal that + // caused us to get into deferred mode, might not be processed yet. + switch (mode) { + case LoadNormal: + m_loadMode = LoadResuming; + emit processQueuedItems(); + break; + case LoadDeferred: + m_loadMode = LoadDeferred; + break; + case LoadResuming: + Q_ASSERT(0); // should never happen + break; + }; } void QNetworkReplyHandler::abort() @@ -194,8 +206,8 @@ QNetworkReply* QNetworkReplyHandler::release() void QNetworkReplyHandler::finish() { - m_shouldFinish = (m_loadMode == LoadDeferred); - if (m_loadMode == LoadDeferred) + m_shouldFinish = (m_loadMode != LoadNormal); + if (m_shouldFinish) return; sendResponseIfNeeded(); @@ -213,9 +225,11 @@ void QNetworkReplyHandler::finish() resetState(); start(); } else if (m_reply->error() != QNetworkReply::NoError - // a web page that returns 403/404 can still have content + // a web page that returns 401/403/404 can still have content && m_reply->error() != QNetworkReply::ContentOperationNotPermittedError - && m_reply->error() != QNetworkReply::ContentNotFoundError) { + && m_reply->error() != QNetworkReply::ContentNotFoundError + && m_reply->error() != QNetworkReply::AuthenticationRequiredError + && m_reply->error() != QNetworkReply::ProxyAuthenticationRequiredError) { QUrl url = m_reply->url(); ResourceError error(url.host(), m_reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(), url.toString(), m_reply->errorString()); @@ -230,8 +244,8 @@ void QNetworkReplyHandler::finish() void QNetworkReplyHandler::sendResponseIfNeeded() { - m_shouldSendResponse = (m_loadMode == LoadDeferred); - if (m_loadMode == LoadDeferred) + m_shouldSendResponse = (m_loadMode != LoadNormal); + if (m_shouldSendResponse) return; if (m_responseSent || !m_resourceHandle) @@ -314,8 +328,8 @@ void QNetworkReplyHandler::sendResponseIfNeeded() void QNetworkReplyHandler::forwardData() { - m_shouldForwardData = (m_loadMode == LoadDeferred); - if (m_loadMode == LoadDeferred) + m_shouldForwardData = (m_loadMode != LoadNormal); + if (m_shouldForwardData) return; sendResponseIfNeeded(); @@ -399,6 +413,8 @@ void QNetworkReplyHandler::start() connect(m_reply, SIGNAL(readyRead()), this, SLOT(forwardData()), Qt::QueuedConnection); + connect(this, SIGNAL(processQueuedItems()), + this, SLOT(sendQueuedItems()), Qt::QueuedConnection); } void QNetworkReplyHandler::resetState() @@ -413,7 +429,9 @@ void QNetworkReplyHandler::resetState() void QNetworkReplyHandler::sendQueuedItems() { - Q_ASSERT(m_loadMode == LoadNormal); + if (m_loadMode != LoadResuming) + return; + m_loadMode = LoadNormal; if (m_shouldStart) start(); diff --git a/WebCore/platform/network/qt/QNetworkReplyHandler.h b/WebCore/platform/network/qt/QNetworkReplyHandler.h index 3de6d88..f88ce8a 100644 --- a/WebCore/platform/network/qt/QNetworkReplyHandler.h +++ b/WebCore/platform/network/qt/QNetworkReplyHandler.h @@ -43,7 +43,8 @@ class QNetworkReplyHandler : public QObject public: enum LoadMode { LoadNormal, - LoadDeferred + LoadDeferred, + LoadResuming }; QNetworkReplyHandler(ResourceHandle *handle, LoadMode); @@ -55,15 +56,18 @@ public: QNetworkReply* release(); +signals: + void processQueuedItems(); + private slots: void finish(); void sendResponseIfNeeded(); void forwardData(); + void sendQueuedItems(); private: void start(); void resetState(); - void sendQueuedItems(); QNetworkReply* m_reply; ResourceHandle* m_resourceHandle; diff --git a/WebCore/platform/network/qt/ResourceHandleQt.cpp b/WebCore/platform/network/qt/ResourceHandleQt.cpp index c5816a4..f4c30c9 100644 --- a/WebCore/platform/network/qt/ResourceHandleQt.cpp +++ b/WebCore/platform/network/qt/ResourceHandleQt.cpp @@ -35,6 +35,7 @@ #include "ResourceHandleClient.h" #include "ResourceHandleInternal.h" #include "qwebpage_p.h" +#include "qwebframe_p.h" #include "ChromeClientQt.h" #include "FrameLoaderClientQt.h" #include "Page.h" @@ -42,6 +43,9 @@ #include "NotImplemented.h" +#if QT_VERSION >= 0x040500 +#include <QAbstractNetworkCache> +#endif #include <QCoreApplication> #include <QUrl> #if QT_VERSION >= 0x040400 @@ -73,11 +77,10 @@ private: ResourceResponse m_response; ResourceError m_error; Vector<char> m_data; - bool m_finished; + QEventLoop m_eventLoop; }; WebCoreSynchronousLoader::WebCoreSynchronousLoader() - : m_finished(false) { } @@ -93,19 +96,18 @@ void WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data, void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*) { - m_finished = true; + m_eventLoop.exit(); } void WebCoreSynchronousLoader::didFail(ResourceHandle*, const ResourceError& error) { m_error = error; - m_finished = true; + m_eventLoop.exit(); } void WebCoreSynchronousLoader::waitForCompletion() { - while (!m_finished) - QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents); + m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents); } ResourceHandleInternal::~ResourceHandleInternal() @@ -154,10 +156,28 @@ bool ResourceHandle::loadsBlocked() return false; } -bool ResourceHandle::willLoadFromCache(ResourceRequest& request) +bool ResourceHandle::willLoadFromCache(ResourceRequest& request, Frame* frame) { - notImplemented(); + if (!frame) + return false; + +#if QT_VERSION >= 0x040500 + QNetworkAccessManager* manager = QWebFramePrivate::kit(frame)->page()->networkAccessManager(); + QAbstractNetworkCache* cache = manager->cache(); + + if (!cache) + return false; + + QNetworkCacheMetaData data = cache->metaData(request.url()); + if (data.isValid()) { + request.setCachePolicy(ReturnCacheDataDontLoad); + return true; + } + return false; +#else + return false; +#endif } bool ResourceHandle::supportsBufferedData() |