summaryrefslogtreecommitdiffstats
path: root/WebCore/platform/network/qt
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/platform/network/qt')
-rw-r--r--WebCore/platform/network/qt/QNetworkReplyHandler.cpp42
-rw-r--r--WebCore/platform/network/qt/QNetworkReplyHandler.h8
-rw-r--r--WebCore/platform/network/qt/ResourceHandleQt.cpp36
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()