From 8003041739f2ec101bf8198f6a53375ce0112eb1 Mon Sep 17 00:00:00 2001 From: Aaron Kennedy Date: Wed, 3 Feb 2010 18:00:53 +1000 Subject: Don't create one QNetworkAccessManager per XMLHttpRequest --- src/declarative/qml/qmlengine.cpp | 42 ++++++++++++++++++++----------- src/declarative/qml/qmlengine_p.h | 7 ++++-- src/declarative/qml/qmlworkerscript.cpp | 13 +++++++++- src/declarative/qml/qmlxmlhttprequest.cpp | 18 ++++--------- 4 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/declarative/qml/qmlengine.cpp b/src/declarative/qml/qmlengine.cpp index a33aea7..04274ba 100644 --- a/src/declarative/qml/qmlengine.cpp +++ b/src/declarative/qml/qmlengine.cpp @@ -221,6 +221,11 @@ QScriptValue QmlScriptEngine::resolvedUrl(QScriptContext *ctxt, QScriptEngine *e return QScriptValue(r.toString()); } +QNetworkAccessManager *QmlScriptEngine::networkAccessManager() +{ + return p->getNetworkAccessManager(); +} + QmlEnginePrivate::~QmlEnginePrivate() { while (cleanup) { @@ -418,6 +423,27 @@ void QmlEngine::namInvalidated() d->accessManagerValid = false; } +QNetworkAccessManager *QmlEnginePrivate::getNetworkAccessManager() const +{ + Q_Q(const QmlEngine); + + if (!accessManagerValid) { + delete networkAccessManagerFactory; + networkAccessManagerFactory = 0; + } + if (!networkAccessManager) { + if (networkAccessManagerFactory) { + QObject::connect(networkAccessManagerFactory, SIGNAL(invalidated()), + q, SLOT(namInvalidated()), Qt::UniqueConnection); + networkAccessManager = networkAccessManagerFactory->create(const_cast(q)); + } else { + networkAccessManager = new QNetworkAccessManager(const_cast(q)); + } + accessManagerValid = true; + } + return networkAccessManager; +} + /*! Returns a common QNetworkAccessManager which can be used by any QML element instantiated by this engine. @@ -432,21 +458,7 @@ void QmlEngine::namInvalidated() QNetworkAccessManager *QmlEngine::networkAccessManager() const { Q_D(const QmlEngine); - if (!d->accessManagerValid) { - delete d->networkAccessManagerFactory; - d->networkAccessManagerFactory = 0; - } - if (!d->networkAccessManager) { - if (d->networkAccessManagerFactory) { - connect(d->networkAccessManagerFactory, SIGNAL(invalidated()) - , this, SLOT(namInvalidated()), Qt::UniqueConnection); - d->networkAccessManager = d->networkAccessManagerFactory->create(const_cast(this)); - } else { - d->networkAccessManager = new QNetworkAccessManager(const_cast(this)); - } - d->accessManagerValid = true; - } - return d->networkAccessManager; + return d->getNetworkAccessManager(); } /*! diff --git a/src/declarative/qml/qmlengine_p.h b/src/declarative/qml/qmlengine_p.h index 6f62b40..113a11e 100644 --- a/src/declarative/qml/qmlengine_p.h +++ b/src/declarative/qml/qmlengine_p.h @@ -108,8 +108,7 @@ class QmlScriptEngine : public QScriptEngine { public: QmlScriptEngine(QmlEnginePrivate *priv); - - ~QmlScriptEngine(); + virtual ~QmlScriptEngine(); QUrl resolvedUrl(QScriptContext *context, const QUrl& url); // resolved against p's context, or baseUrl if no p static QScriptValue resolvedUrl(QScriptContext *ctxt, QScriptEngine *engine); @@ -127,6 +126,8 @@ public: QScriptClass *nodeListClass; QUrl baseUrl; + + virtual QNetworkAccessManager *networkAccessManager(); }; class Q_AUTOTEST_EXPORT QmlEnginePrivate : public QObjectPrivate @@ -209,6 +210,8 @@ public: QmlComponentAttached *componentAttacheds; bool inBeginCreate; + + QNetworkAccessManager *getNetworkAccessManager() const; mutable QNetworkAccessManager *networkAccessManager; mutable QmlNetworkAccessManagerFactory *networkAccessManagerFactory; mutable bool accessManagerValid; diff --git a/src/declarative/qml/qmlworkerscript.cpp b/src/declarative/qml/qmlworkerscript.cpp index 75c5179..f58aa8b 100644 --- a/src/declarative/qml/qmlworkerscript.cpp +++ b/src/declarative/qml/qmlworkerscript.cpp @@ -51,6 +51,7 @@ #include #include #include +#include #include QT_BEGIN_NAMESPACE @@ -107,7 +108,14 @@ public: struct ScriptEngine : public QmlScriptEngine { ScriptEngine(QmlWorkerScriptEnginePrivate *parent) : QmlScriptEngine(0), p(parent) {} + ~ScriptEngine() { delete manager; }; QmlWorkerScriptEnginePrivate *p; + QNetworkAccessManager *manager; + + virtual QNetworkAccessManager *networkAccessManager() { + if (!manager) manager = new QNetworkAccessManager; + return manager; + } }; ScriptEngine *workerEngine; static QmlWorkerScriptEnginePrivate *get(QScriptEngine *e) { @@ -128,6 +136,9 @@ public: QScriptValue callback; }; + QNetworkAccessManager *networkAccessManager; + QNetworkAccessManager *getNetworkAccessManager(); + QHash workers; QScriptValue getWorker(int); @@ -224,7 +235,7 @@ private: Q_DECLARE_METATYPE(QmlWorkerListModelAgent::VariantRef); QmlWorkerScriptEnginePrivate::QmlWorkerScriptEnginePrivate() -: workerEngine(0), m_nextId(0) +: workerEngine(0), networkAccessManager(0), m_nextId(0) { } diff --git a/src/declarative/qml/qmlxmlhttprequest.cpp b/src/declarative/qml/qmlxmlhttprequest.cpp index 2c35ebf..86bec20 100644 --- a/src/declarative/qml/qmlxmlhttprequest.cpp +++ b/src/declarative/qml/qmlxmlhttprequest.cpp @@ -940,7 +940,7 @@ public: Opened = 1, HeadersReceived = 2, Loading = 3, Done = 4 }; - QmlXMLHttpRequest(); + QmlXMLHttpRequest(QNetworkAccessManager *manager); virtual ~QmlXMLHttpRequest(); QScriptValue callback() const; @@ -993,26 +993,18 @@ private: void destroyNetwork(); QNetworkAccessManager *m_nam; - QNetworkAccessManager *networkAccessManager() - { - if (!m_nam) { - m_nam = new QNetworkAccessManager; - // XXX proxy, etc... - } - return m_nam; - } + QNetworkAccessManager *networkAccessManager() { return m_nam; } }; -QmlXMLHttpRequest::QmlXMLHttpRequest() +QmlXMLHttpRequest::QmlXMLHttpRequest(QNetworkAccessManager *manager) : m_state(Unsent), m_errorFlag(false), m_sendFlag(false), - m_redirectCount(0), m_network(0), m_nam(0) + m_redirectCount(0), m_network(0), m_nam(manager) { } QmlXMLHttpRequest::~QmlXMLHttpRequest() { destroyNetwork(); - delete m_nam; } QScriptValue QmlXMLHttpRequest::callback() const @@ -1568,7 +1560,7 @@ static QScriptValue qmlxmlhttprequest_onreadystatechange(QScriptContext *context static QScriptValue qmlxmlhttprequest_new(QScriptContext *context, QScriptEngine *engine) { if (context->isCalledAsConstructor()) { - context->thisObject().setData(engine->newQObject(new QmlXMLHttpRequest(), QScriptEngine::ScriptOwnership)); + context->thisObject().setData(engine->newQObject(new QmlXMLHttpRequest(QmlScriptEngine::get(engine)->networkAccessManager()), QScriptEngine::ScriptOwnership)); } return engine->undefinedValue(); } -- cgit v0.12