src/3rdparty/webkit/WebCore/platform/network/qt/ResourceHandleQt.cpp
changeset 0 1918ee327afb
child 1 ae9c8dab0e3e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/3rdparty/webkit/WebCore/platform/network/qt/ResourceHandleQt.cpp	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2006 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
+ * Copyright (C) 2008 Holger Hans Peter Freyther
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include "Frame.h"
+#include "DocLoader.h"
+#include "ResourceHandle.h"
+#include "ResourceHandleClient.h"
+#include "ResourceHandleInternal.h"
+#include "qwebpage_p.h"
+#include "qwebframe_p.h"
+#include "ChromeClientQt.h"
+#include "FrameLoaderClientQt.h"
+#include "Page.h"
+#include "QNetworkReplyHandler.h"
+
+#include "NotImplemented.h"
+
+#if QT_VERSION >= 0x040500
+#include <QAbstractNetworkCache>
+#endif
+#include <QCoreApplication>
+#include <QUrl>
+#if QT_VERSION >= 0x040400
+#include <QNetworkAccessManager>
+#include <QNetworkRequest>
+#include <QNetworkReply>
+#else
+#include "qwebnetworkinterface_p.h"
+#endif
+
+namespace WebCore {
+
+class WebCoreSynchronousLoader : public ResourceHandleClient {
+public:
+    WebCoreSynchronousLoader();
+
+    void waitForCompletion();
+
+    virtual void didReceiveResponse(ResourceHandle*, const ResourceResponse&);
+    virtual void didReceiveData(ResourceHandle*, const char*, int, int lengthReceived);
+    virtual void didFinishLoading(ResourceHandle*);
+    virtual void didFail(ResourceHandle*, const ResourceError&);
+
+    ResourceResponse resourceResponse() const { return m_response; }
+    ResourceError resourceError() const { return m_error; }
+    Vector<char> data() const { return m_data; }
+
+private:
+    ResourceResponse m_response;
+    ResourceError m_error;
+    Vector<char> m_data;
+    QEventLoop m_eventLoop;
+};
+
+WebCoreSynchronousLoader::WebCoreSynchronousLoader()
+{
+}
+
+void WebCoreSynchronousLoader::didReceiveResponse(ResourceHandle*, const ResourceResponse& response)
+{
+    m_response = response;
+}
+
+void WebCoreSynchronousLoader::didReceiveData(ResourceHandle*, const char* data, int length, int)
+{
+    m_data.append(data, length);
+}
+
+void WebCoreSynchronousLoader::didFinishLoading(ResourceHandle*)
+{
+    m_eventLoop.exit();
+}
+
+void WebCoreSynchronousLoader::didFail(ResourceHandle*, const ResourceError& error)
+{
+    m_error = error;
+    m_eventLoop.exit();
+}
+
+void WebCoreSynchronousLoader::waitForCompletion()
+{
+    m_eventLoop.exec(QEventLoop::ExcludeUserInputEvents);
+}
+
+ResourceHandleInternal::~ResourceHandleInternal()
+{
+}
+
+ResourceHandle::~ResourceHandle()
+{
+    if (d->m_job)
+        cancel();
+}
+
+bool ResourceHandle::start(Frame* frame)
+{
+    if (!frame)
+        return false;
+
+    Page *page = frame->page();
+    // If we are no longer attached to a Page, this must be an attempted load from an
+    // onUnload handler, so let's just block it.
+    if (!page)
+        return false;
+
+    getInternal()->m_frame = static_cast<FrameLoaderClientQt*>(frame->loader()->client())->webFrame();
+#if QT_VERSION < 0x040400
+    return QWebNetworkManager::self()->add(this, getInternal()->m_frame->page()->d->networkInterface);
+#else
+    ResourceHandleInternal *d = getInternal();
+    d->m_job = new QNetworkReplyHandler(this, QNetworkReplyHandler::LoadMode(d->m_defersLoading));
+    return true;
+#endif
+}
+
+void ResourceHandle::cancel()
+{
+#if QT_VERSION < 0x040400
+    QWebNetworkManager::self()->cancel(this);
+#else
+    if (d->m_job)
+        d->m_job->abort();
+#endif
+}
+
+bool ResourceHandle::loadsBlocked()
+{
+    return false;
+}
+
+bool ResourceHandle::willLoadFromCache(ResourceRequest& request, Frame* frame)
+{
+    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()
+{
+    return false;
+}
+
+PassRefPtr<SharedBuffer> ResourceHandle::bufferedData()
+{
+    ASSERT_NOT_REACHED();
+    return 0;
+}
+
+void ResourceHandle::loadResourceSynchronously(const ResourceRequest& request, StoredCredentials /*storedCredentials*/, ResourceError& error, ResourceResponse& response, Vector<char>& data, Frame* frame)
+{
+    WebCoreSynchronousLoader syncLoader;
+    ResourceHandle handle(request, &syncLoader, true, false, true);
+
+#if QT_VERSION < 0x040400
+    if (!QWebNetworkManager::self()->add(&handle, QWebNetworkInterface::defaultInterface(), QWebNetworkManager::SynchronousJob)) {
+        // FIXME Create a sane ResourceError
+        error = ResourceError(String(), -1, String(), String());
+        return;
+    }
+#else
+    ResourceHandleInternal *d = handle.getInternal();
+    d->m_frame = static_cast<FrameLoaderClientQt*>(frame->loader()->client())->webFrame();
+    d->m_job = new QNetworkReplyHandler(&handle, QNetworkReplyHandler::LoadNormal);
+#endif
+
+    syncLoader.waitForCompletion();
+    error = syncLoader.resourceError();
+    data = syncLoader.data();
+    response = syncLoader.resourceResponse();
+}
+
+ 
+void ResourceHandle::setDefersLoading(bool defers)
+{
+    d->m_defersLoading = defers;
+
+#if QT_VERSION >= 0x040400
+    if (d->m_job)
+        d->m_job->setLoadMode(QNetworkReplyHandler::LoadMode(defers));
+#endif
+}
+
+} // namespace WebCore