Diff
Modified: trunk/Source/WebKit2/ChangeLog (105710 => 105711)
--- trunk/Source/WebKit2/ChangeLog 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/ChangeLog 2012-01-24 10:03:54 UTC (rev 105711)
@@ -1,3 +1,73 @@
+2012-01-24 Zeno Albisser <[email protected]>
+
+ [Qt][WK2] Application URL schemes cause asserts when using debug.
+ https://bugs.webkit.org/show_bug.cgi?id=76700
+
+ Instances of QtNetworkRequestData / QtNetworkReplyData are meant
+ to be used for transfering data over IPC. To allow transferring
+ instances of these classes over IPC they need to be copyable,
+ and it must be possible to create such instances on the stack.
+ Because classes that inherit from RefCounted always need to be
+ used in connection with RefPtr, QtNetworkRequestData and
+ QtNetworkReplyData cannot inherit directly from RefCounted.
+
+ Deleting an object that inherits from RefCounted, without
+ the proper sequence of ref()/deref() being called by it's
+ RefPtr, causes asserts when running a debug version.
+
+ Reviewed by Simon Hausmann.
+
+ * Shared/qt/QtNetworkReplyData.h:
+ (WebKit::QtRefCountedNetworkReplyData::data):
+ * Shared/qt/QtNetworkRequestData.cpp:
+ (WebKit::QtRefCountedNetworkRequestData::QtRefCountedNetworkRequestData):
+ * Shared/qt/QtNetworkRequestData.h:
+ (WebKit::QtRefCountedNetworkRequestData::data):
+ * Target.pri:
+ * UIProcess/API/qt/qquicknetworkreply.cpp:
+ (QQuickNetworkReply::QQuickNetworkReply):
+ (QQuickNetworkReply::contentType):
+ (QQuickNetworkReply::setContentType):
+ (QQuickNetworkReply::operation):
+ (QQuickNetworkReply::setOperation):
+ (QQuickNetworkReply::contentDisposition):
+ (QQuickNetworkReply::setContentDisposition):
+ (QQuickNetworkReply::location):
+ (QQuickNetworkReply::setLocation):
+ (QQuickNetworkReply::lastModified):
+ (QQuickNetworkReply::setLastModified):
+ (QQuickNetworkReply::cookie):
+ (QQuickNetworkReply::setCookie):
+ (QQuickNetworkReply::userAgent):
+ (QQuickNetworkReply::setUserAgent):
+ (QQuickNetworkReply::server):
+ (QQuickNetworkReply::setServer):
+ (QQuickNetworkReply::data):
+ (QQuickNetworkReply::setData):
+ (QQuickNetworkReply::send):
+ (QQuickNetworkReply::networkRequestData):
+ (QQuickNetworkReply::setNetworkRequestData):
+ (QQuickNetworkReply::networkReplyData):
+ * UIProcess/API/qt/qquicknetworkreply_p.h:
+ * UIProcess/API/qt/qquicknetworkrequest.cpp:
+ (QQuickNetworkRequest::QQuickNetworkRequest):
+ (QQuickNetworkRequest::setNetworkRequestData):
+ (QQuickNetworkRequest::url):
+ * UIProcess/API/qt/qquicknetworkrequest_p.h:
+ * UIProcess/API/qt/qquickwebview.cpp:
+ (QQuickWebViewExperimental::invokeApplicationSchemeHandler):
+ * UIProcess/API/qt/qquickwebview_p.h:
+ * UIProcess/WebPageProxy.h:
+ * UIProcess/qt/QtPageClient.cpp:
+ (QtPageClient::handleApplicationSchemeRequest):
+ * UIProcess/qt/QtPageClient.h:
+ * UIProcess/qt/WebPageProxyQt.cpp:
+ (WebKit::WebPageProxy::resolveApplicationSchemeRequest):
+ (WebKit::WebPageProxy::sendApplicationSchemeReply):
+ * WebProcess/qt/QtNetworkReply.cpp:
+ (WebKit::QtNetworkReply::setData):
+ (WebKit::QtNetworkReply::readData):
+
2012-01-24 Carlos Garcia Campos <[email protected]>
[GTK] Implement DownloadClient in WebKit2 GTK+ API
Modified: trunk/Source/WebKit2/Shared/qt/QtNetworkReplyData.h (105710 => 105711)
--- trunk/Source/WebKit2/Shared/qt/QtNetworkReplyData.h 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/Shared/qt/QtNetworkReplyData.h 2012-01-24 10:03:54 UTC (rev 105711)
@@ -39,9 +39,7 @@
namespace WebKit {
-struct QtNetworkReplyData : public WTF::RefCounted<QtNetworkReplyData> {
- WTF_MAKE_NONCOPYABLE(QtNetworkReplyData);
-public:
+struct QtNetworkReplyData {
QtNetworkReplyData();
void encode(CoreIPC::ArgumentEncoder*) const;
@@ -63,6 +61,13 @@
SharedMemory::Handle m_dataHandle;
};
+struct QtRefCountedNetworkReplyData : public WTF::RefCounted<QtRefCountedNetworkReplyData> {
+ QtNetworkReplyData& data() { return m_data; }
+private:
+ QtNetworkReplyData m_data;
+};
+
+
} // namespace WebKit
#endif // QtNetworkReplyData_h
Modified: trunk/Source/WebKit2/Shared/qt/QtNetworkRequestData.cpp (105710 => 105711)
--- trunk/Source/WebKit2/Shared/qt/QtNetworkRequestData.cpp 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/Shared/qt/QtNetworkRequestData.cpp 2012-01-24 10:03:54 UTC (rev 105711)
@@ -36,6 +36,10 @@
namespace WebKit {
+QtRefCountedNetworkRequestData::QtRefCountedNetworkRequestData(const QtNetworkRequestData& data)
+ : m_data(data)
+{ }
+
QtNetworkRequestData::QtNetworkRequestData()
{ }
@@ -46,14 +50,6 @@
m_replyUuid = QUuid::createUuid().toString();
}
-QtNetworkRequestData::QtNetworkRequestData(const QtNetworkRequestData& origin)
- : RefCounted<QtNetworkRequestData>(),
- m_scheme(origin.m_scheme),
- m_urlString(origin.m_urlString),
- m_replyUuid(origin.m_replyUuid)
-{
-}
-
void QtNetworkRequestData::encode(CoreIPC::ArgumentEncoder* encoder) const
{
encoder->encode(m_scheme);
Modified: trunk/Source/WebKit2/Shared/qt/QtNetworkRequestData.h (105710 => 105711)
--- trunk/Source/WebKit2/Shared/qt/QtNetworkRequestData.h 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/Shared/qt/QtNetworkRequestData.h 2012-01-24 10:03:54 UTC (rev 105711)
@@ -39,11 +39,9 @@
namespace WebKit {
-struct QtNetworkRequestData : public WTF::RefCounted<QtNetworkRequestData> {
+struct QtNetworkRequestData {
QtNetworkRequestData();
QtNetworkRequestData(const QNetworkRequest&, QNetworkReply*);
- QtNetworkRequestData(const QtNetworkRequestData&);
-
void encode(CoreIPC::ArgumentEncoder*) const;
static bool decode(CoreIPC::ArgumentDecoder*, QtNetworkRequestData&);
@@ -52,6 +50,13 @@
String m_replyUuid;
};
+struct QtRefCountedNetworkRequestData : public WTF::RefCounted<QtRefCountedNetworkRequestData> {
+ QtRefCountedNetworkRequestData(const QtNetworkRequestData&);
+ QtNetworkRequestData& data() { return m_data; }
+private:
+ QtNetworkRequestData m_data;
+};
+
} // namespace WebKit
#endif // QtNetworkRequestData_h
Modified: trunk/Source/WebKit2/Target.pri (105710 => 105711)
--- trunk/Source/WebKit2/Target.pri 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/Target.pri 2012-01-24 10:03:54 UTC (rev 105711)
@@ -507,6 +507,7 @@
UIProcess/API/qt/qquickwebview.cpp \
UIProcess/API/qt/qwebiconimageprovider.cpp \
UIProcess/API/qt/qquicknetworkreply.cpp \
+ UIProcess/API/qt/qquicknetworkrequest.cpp \
UIProcess/API/qt/qquickurlschemedelegate.cpp \
UIProcess/API/qt/qwebpreferences.cpp \
UIProcess/API/qt/qwebviewportinfo.cpp \
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkreply.cpp (105710 => 105711)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkreply.cpp 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkreply.cpp 2012-01-24 10:03:54 UTC (rev 105711)
@@ -30,128 +30,127 @@
QQuickNetworkReply::QQuickNetworkReply(QObject* parent)
: QObject(parent)
- , m_networkReplyData(adoptRef(new WebKit::QtNetworkReplyData))
+ , m_networkReplyData(adoptRef(new WebKit::QtRefCountedNetworkReplyData))
+ , m_dataLength(0)
{
Q_ASSERT(parent);
}
QString QQuickNetworkReply::contentType() const
{
- return m_networkReplyData->m_contentType;
+ return m_networkReplyData->data().m_contentType;
}
void QQuickNetworkReply::setContentType(const QString& contentType)
{
- m_networkReplyData->m_contentType = contentType;
+ m_networkReplyData->data().m_contentType = contentType;
}
QNetworkAccessManager::Operation QQuickNetworkReply::operation() const
{
- return m_networkReplyData->m_operation;
+ return m_networkReplyData->data().m_operation;
}
void QQuickNetworkReply::setOperation(QNetworkAccessManager::Operation operation)
{
- m_networkReplyData->m_operation = operation;
+ m_networkReplyData->data().m_operation = operation;
}
QString QQuickNetworkReply::contentDisposition() const
{
- return m_networkReplyData->m_contentDisposition;
+ return m_networkReplyData->data().m_contentDisposition;
}
void QQuickNetworkReply::setContentDisposition(const QString& disposition)
{
- m_networkReplyData->m_contentDisposition = disposition;
+ m_networkReplyData->data().m_contentDisposition = disposition;
}
QString QQuickNetworkReply::location() const
{
- return m_networkReplyData->m_location;
+ return m_networkReplyData->data().m_location;
}
void QQuickNetworkReply::setLocation(const QString& location)
{
- m_networkReplyData->m_location = location;
+ m_networkReplyData->data().m_location = location;
}
QString QQuickNetworkReply::lastModified() const
{
- return QDateTime::fromMSecsSinceEpoch(m_networkReplyData->m_lastModified).toString(Qt::ISODate);
+ return QDateTime::fromMSecsSinceEpoch(m_networkReplyData->data().m_lastModified).toString(Qt::ISODate);
}
void QQuickNetworkReply::setLastModified(const QString& lastModified)
{
- m_networkReplyData->m_lastModified = QDateTime::fromString(lastModified, Qt::ISODate).toMSecsSinceEpoch();
+ m_networkReplyData->data().m_lastModified = QDateTime::fromString(lastModified, Qt::ISODate).toMSecsSinceEpoch();
}
QString QQuickNetworkReply::cookie() const
{
- return m_networkReplyData->m_cookie;
+ return m_networkReplyData->data().m_cookie;
}
void QQuickNetworkReply::setCookie(const QString& cookie)
{
- m_networkReplyData->m_cookie = cookie;
+ m_networkReplyData->data().m_cookie = cookie;
}
QString QQuickNetworkReply::userAgent() const
{
- return m_networkReplyData->m_userAgent;
+ return m_networkReplyData->data().m_userAgent;
}
void QQuickNetworkReply::setUserAgent(const QString& userAgent)
{
- m_networkReplyData->m_userAgent = userAgent;
+ m_networkReplyData->data().m_userAgent = userAgent;
}
QString QQuickNetworkReply::server() const
{
- return m_networkReplyData->m_server;
+ return m_networkReplyData->data().m_server;
}
void QQuickNetworkReply::setServer(const QString& server)
{
- m_networkReplyData->m_server = server;
+ m_networkReplyData->data().m_server = server;
}
QString QQuickNetworkReply::data() const
{
- if (m_networkReplyData->m_dataHandle.isNull())
+ if (!m_sharedMemory)
return QString();
- RefPtr<SharedMemory> sm = SharedMemory::create(m_networkReplyData->m_dataHandle, SharedMemory::ReadOnly);
- if (!sm)
- return QString();
- uint64_t stringLength = m_networkReplyData->m_contentLength / sizeof(UChar);
- return QString(reinterpret_cast<const QChar*>(sm->data()), stringLength);
+ uint64_t stringLength = m_dataLength / sizeof(QChar);
+ return QString(reinterpret_cast<const QChar*>(m_sharedMemory->data()), stringLength);
}
void QQuickNetworkReply::setData(const QString& data)
{
- // This function can be called several times. In this case the previous SharedMemory handles
- // will be overwritten and the previously allocated SharedMemory will die with the last handle.
- m_networkReplyData->m_contentLength = 0;
+ // This function can be called several times. In this case the previously allocated SharedMemory
+ // will be released automatically and new memory will be allocated.
+ m_dataLength = 0;
if (data.isNull())
return;
- const UChar* ucharData = reinterpret_cast<const UChar*>(data.constData());
- uint64_t smLength = sizeof(UChar) * data.length();
- RefPtr<SharedMemory> sm = SharedMemory::create(smLength);
- if (!sm)
+ uint64_t smLength = sizeof(QChar) * data.length();
+ m_sharedMemory = SharedMemory::create(smLength);
+ if (!m_sharedMemory)
return;
+
// The size of the allocated shared memory can be bigger than requested.
// Usually the size will be rounded up to the next multiple of a page size.
- memcpy(sm->data(), ucharData, smLength);
-
- if (!sm->createHandle(m_networkReplyData->m_dataHandle, SharedMemory::ReadOnly))
- return;
- m_networkReplyData->m_contentLength = smLength;
+ memcpy(m_sharedMemory->data(), data.constData(), smLength);
+ m_dataLength = smLength;
}
void QQuickNetworkReply::send()
{
+ if (!m_sharedMemory || !m_sharedMemory->createHandle(m_networkReplyData->data().m_dataHandle, SharedMemory::ReadOnly))
+ return;
+ m_networkReplyData->data().m_contentLength = m_dataLength;
+
QObject* schemeParent = parent()->parent();
if (!schemeParent)
return;
@@ -159,22 +158,26 @@
if (!webViewExperimental)
return;
webViewExperimental->sendApplicationSchemeReply(this);
+
+ // After sending the reply data, we have to reinitialize the m_networkReplyData,
+ // to make sure we have a fresh SharesMemory::Handle.
+ m_networkReplyData = adoptRef(new WebKit::QtRefCountedNetworkReplyData);
}
-WTF::RefPtr<WebKit::QtNetworkRequestData> QQuickNetworkReply::networkRequestData() const
+WebKit::QtRefCountedNetworkRequestData* QQuickNetworkReply::networkRequestData() const
{
- return m_networkRequestData;
+ return m_networkRequestData.get();
}
-void QQuickNetworkReply::setNetworkRequestData(WTF::RefPtr<WebKit::QtNetworkRequestData> data)
+void QQuickNetworkReply::setNetworkRequestData(WTF::PassRefPtr<WebKit::QtRefCountedNetworkRequestData> data)
{
m_networkRequestData = data;
- m_networkReplyData->m_replyUuid = data->m_replyUuid;
+ m_networkReplyData->data().m_replyUuid = m_networkRequestData->data().m_replyUuid;
}
-WTF::RefPtr<WebKit::QtNetworkReplyData> QQuickNetworkReply::networkReplyData() const
+WebKit::QtRefCountedNetworkReplyData* QQuickNetworkReply::networkReplyData() const
{
- return m_networkReplyData;
+ return m_networkReplyData.get();
}
#include "moc_qquicknetworkreply_p.cpp"
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkreply_p.h (105710 => 105711)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkreply_p.h 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkreply_p.h 2012-01-24 10:03:54 UTC (rev 105711)
@@ -23,6 +23,7 @@
#include "QtNetworkReplyData.h"
#include "QtNetworkRequestData.h"
+#include "SharedMemory.h"
#include "qwebkitglobal.h"
#include <QNetworkAccessManager>
#include <QObject>
@@ -57,16 +58,18 @@
QString data() const;
void setData(const QString& data);
- WTF::RefPtr<WebKit::QtNetworkRequestData> networkRequestData() const;
- void setNetworkRequestData(WTF::RefPtr<WebKit::QtNetworkRequestData> data);
- WTF::RefPtr<WebKit::QtNetworkReplyData> networkReplyData() const;
+ WebKit::QtRefCountedNetworkRequestData* networkRequestData() const;
+ void setNetworkRequestData(WTF::PassRefPtr<WebKit::QtRefCountedNetworkRequestData> data);
+ WebKit::QtRefCountedNetworkReplyData* networkReplyData() const;
public Q_SLOTS:
void send();
private:
- WTF::RefPtr<WebKit::QtNetworkRequestData> m_networkRequestData;
- WTF::RefPtr<WebKit::QtNetworkReplyData> m_networkReplyData;
+ WTF::RefPtr<WebKit::QtRefCountedNetworkRequestData> m_networkRequestData;
+ WTF::RefPtr<WebKit::QtRefCountedNetworkReplyData> m_networkReplyData;
+ WTF::RefPtr<WebKit::SharedMemory> m_sharedMemory;
+ uint64_t m_dataLength;
};
QML_DECLARE_TYPE(QQuickNetworkReply)
Copied: trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkrequest.cpp (from rev 105710, trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkrequest_p.h) (0 => 105711)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkrequest.cpp (rev 0)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkrequest.cpp 2012-01-24 10:03:54 UTC (rev 105711)
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2011 Zeno Albisser <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this program; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "qquicknetworkrequest_p.h"
+
+#include "QtNetworkRequestData.h"
+#include "qquickwebview_p.h"
+
+using namespace WebKit;
+
+QQuickNetworkRequest::QQuickNetworkRequest(QObject* parent)
+ : QObject(parent)
+{
+ Q_ASSERT(parent);
+}
+
+void QQuickNetworkRequest::setNetworkRequestData(WTF::PassRefPtr<WebKit::QtRefCountedNetworkRequestData> data)
+{
+ m_networkRequestData = data;
+}
+
+QUrl QQuickNetworkRequest::url() const
+{
+ if (m_networkRequestData)
+ return QUrl(m_networkRequestData->data().m_urlString);
+ return QUrl();
+}
+
+#include "moc_qquicknetworkrequest_p.cpp"
+
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkrequest_p.h (105710 => 105711)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkrequest_p.h 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquicknetworkrequest_p.h 2012-01-24 10:03:54 UTC (rev 105711)
@@ -21,6 +21,8 @@
#ifndef qquicknetworkrequest_p_h
#define qquicknetworkrequest_p_h
+#include "QtNetworkRequestData.h"
+#include "RefPtr.h"
#include "qwebkitglobal.h"
#include <QObject>
#include <QtDeclarative/qdeclarativelist.h>
@@ -28,20 +30,17 @@
class QWEBKIT_EXPORT QQuickNetworkRequest : public QObject {
Q_OBJECT
- Q_PROPERTY(QString url READ url)
+ Q_PROPERTY(QUrl url READ url)
public:
- QQuickNetworkRequest(QObject* parent)
- : QObject(parent)
- {
- Q_ASSERT(parent);
- }
+ QQuickNetworkRequest(QObject* parent);
- QString url() const { return m_url; }
- void setUrl(const QString& url) { m_url = url; }
+ void setNetworkRequestData(WTF::PassRefPtr<WebKit::QtRefCountedNetworkRequestData> data);
+ QUrl url() const;
+
private:
- QString m_url;
+ WTF::RefPtr<WebKit::QtRefCountedNetworkRequestData> m_networkRequestData;
};
QML_DECLARE_TYPE(QQuickNetworkRequest)
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp (105710 => 105711)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp 2012-01-24 10:03:54 UTC (rev 105711)
@@ -34,6 +34,7 @@
#include "WebPreferences.h"
#include "qquicknetworkreply_p.h"
+#include "qquicknetworkrequest_p.h"
#include "qquickwebpage_p_p.h"
#include "qquickwebview_p_p.h"
#include "qwebdownloaditem_p_p.h"
@@ -824,15 +825,17 @@
QQuickWebViewExperimental::schemeDelegates_Clear);
}
-void QQuickWebViewExperimental::invokeApplicationSchemeHandler(PassRefPtr<QtNetworkRequestData> request)
+void QQuickWebViewExperimental::invokeApplicationSchemeHandler(PassRefPtr<QtRefCountedNetworkRequestData> request)
{
+ RefPtr<QtRefCountedNetworkRequestData> req = request;
const QObjectList children = schemeParent->children();
for (int index = 0; index < children.count(); index++) {
QQuickUrlSchemeDelegate* delegate = qobject_cast<QQuickUrlSchemeDelegate*>(children.at(index));
if (!delegate)
continue;
- if (!delegate->scheme().compare(QString(request->m_scheme), Qt::CaseInsensitive)) {
- delegate->reply()->setNetworkRequestData(request);
+ if (!delegate->scheme().compare(QString(req->data().m_scheme), Qt::CaseInsensitive)) {
+ delegate->request()->setNetworkRequestData(req);
+ delegate->reply()->setNetworkRequestData(req);
emit delegate->receivedRequest();
return;
}
Modified: trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h (105710 => 105711)
--- trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/UIProcess/API/qt/qquickwebview_p.h 2012-01-24 10:03:54 UTC (rev 105711)
@@ -44,7 +44,7 @@
}
namespace WebKit {
-class QtNetworkRequestData;
+class QtRefCountedNetworkRequestData;
}
namespace WTF {
@@ -250,7 +250,7 @@
static int schemeDelegates_Count(QDeclarativeListProperty<QQuickUrlSchemeDelegate>*);
static void schemeDelegates_Clear(QDeclarativeListProperty<QQuickUrlSchemeDelegate>*);
QDeclarativeListProperty<QQuickUrlSchemeDelegate> schemeDelegates();
- void invokeApplicationSchemeHandler(WTF::PassRefPtr<WebKit::QtNetworkRequestData>);
+ void invokeApplicationSchemeHandler(WTF::PassRefPtr<WebKit::QtRefCountedNetworkRequestData>);
void sendApplicationSchemeReply(QQuickNetworkReply*);
public Q_SLOTS:
Modified: trunk/Source/WebKit2/UIProcess/WebPageProxy.h (105710 => 105711)
--- trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/UIProcess/WebPageProxy.h 2012-01-24 10:03:54 UTC (rev 105711)
@@ -1018,7 +1018,7 @@
float m_mediaVolume;
#if PLATFORM(QT)
- WTF::HashSet<RefPtr<QtNetworkRequestData> > m_applicationSchemeRequests;
+ WTF::HashSet<RefPtr<QtRefCountedNetworkRequestData> > m_applicationSchemeRequests;
#endif
};
Modified: trunk/Source/WebKit2/UIProcess/qt/QtPageClient.cpp (105710 => 105711)
--- trunk/Source/WebKit2/UIProcess/qt/QtPageClient.cpp 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/UIProcess/qt/QtPageClient.cpp 2012-01-24 10:03:54 UTC (rev 105711)
@@ -100,11 +100,11 @@
QQuickWebViewPrivate::get(m_webView)->handleDownloadRequest(download);
}
-void QtPageClient::handleApplicationSchemeRequest(PassRefPtr<QtNetworkRequestData> requestData)
+void QtPageClient::handleApplicationSchemeRequest(PassRefPtr<QtRefCountedNetworkRequestData> requestData)
{
if (!m_webView || !m_webView->experimental())
return;
- m_webView->experimental()->invokeApplicationSchemeHandler(requestData.get());
+ m_webView->experimental()->invokeApplicationSchemeHandler(requestData);
}
void QtPageClient::handleAuthenticationRequiredRequest(const String& hostname, const String& realm, const String& prefilledUsername, String& username, String& password)
Modified: trunk/Source/WebKit2/UIProcess/qt/QtPageClient.h (105710 => 105711)
--- trunk/Source/WebKit2/UIProcess/qt/QtPageClient.h 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/UIProcess/qt/QtPageClient.h 2012-01-24 10:03:54 UTC (rev 105711)
@@ -53,7 +53,7 @@
virtual void didRelaunchProcess();
virtual PassOwnPtr<DrawingAreaProxy> createDrawingAreaProxy();
virtual void handleDownloadRequest(DownloadProxy*);
- virtual void handleApplicationSchemeRequest(PassRefPtr<QtNetworkRequestData>);
+ virtual void handleApplicationSchemeRequest(PassRefPtr<QtRefCountedNetworkRequestData>);
virtual void handleAuthenticationRequiredRequest(const String& hostname, const String& realm, const String& prefilledUsername, String& username, String& password);
virtual void handleCertificateVerificationRequest(const String& hostname, bool& ignoreErrors);
Modified: trunk/Source/WebKit2/UIProcess/qt/WebPageProxyQt.cpp (105710 => 105711)
--- trunk/Source/WebKit2/UIProcess/qt/WebPageProxyQt.cpp 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/UIProcess/qt/WebPageProxyQt.cpp 2012-01-24 10:03:54 UTC (rev 105711)
@@ -87,17 +87,17 @@
void WebPageProxy::resolveApplicationSchemeRequest(QtNetworkRequestData request)
{
- RefPtr<QtNetworkRequestData> requestData = adoptRef(new QtNetworkRequestData(request));
+ RefPtr<QtRefCountedNetworkRequestData> requestData = adoptRef(new QtRefCountedNetworkRequestData(request));
m_applicationSchemeRequests.add(requestData);
static_cast<QtPageClient*>(m_pageClient)->handleApplicationSchemeRequest(requestData);
}
void WebPageProxy::sendApplicationSchemeReply(const QQuickNetworkReply* reply)
{
- RefPtr<QtNetworkRequestData> requestData = reply->networkRequestData();
+ RefPtr<QtRefCountedNetworkRequestData> requestData = reply->networkRequestData();
if (m_applicationSchemeRequests.contains(requestData)) {
- RefPtr<QtNetworkReplyData> replyData = reply->networkReplyData();
- process()->send(Messages::WebPage::ApplicationSchemeReply(*replyData), pageID());
+ RefPtr<QtRefCountedNetworkReplyData> replyData = reply->networkReplyData();
+ process()->send(Messages::WebPage::ApplicationSchemeReply(replyData->data()), pageID());
m_applicationSchemeRequests.remove(requestData);
}
}
Modified: trunk/Source/WebKit2/WebProcess/qt/QtNetworkReply.cpp (105710 => 105711)
--- trunk/Source/WebKit2/WebProcess/qt/QtNetworkReply.cpp 2012-01-24 10:02:32 UTC (rev 105710)
+++ trunk/Source/WebKit2/WebProcess/qt/QtNetworkReply.cpp 2012-01-24 10:03:54 UTC (rev 105711)
@@ -50,6 +50,8 @@
void QtNetworkReply::setData(const SharedMemory::Handle& handle, qint64 dataSize)
{
+ if (handle.isNull())
+ return;
m_sharedMemory = SharedMemory::create(handle, SharedMemory::ReadOnly);
if (!m_sharedMemory)
return;
@@ -82,6 +84,9 @@
qint64 QtNetworkReply::readData(char* data, qint64 maxlen)
{
+ if (!m_sharedMemory)
+ return 0;
+
qint64 bytesRead = maxlen < m_bytesAvailable ? maxlen : m_bytesAvailable;
if (qMemCopy(data, static_cast<char*>(m_sharedMemory->data()) + m_sharedMemorySize - m_bytesAvailable, bytesRead)) {
m_bytesAvailable -= bytesRead;