Title: [105711] trunk/Source/WebKit2
Revision
105711
Author
[email protected]
Date
2012-01-24 02:03:54 -0800 (Tue, 24 Jan 2012)

Log Message

[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):

Modified Paths

Added Paths

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;
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to