diff --git a/libraries/script-engine/src/XMLHttpRequestClass.cpp b/libraries/script-engine/src/XMLHttpRequestClass.cpp index a74d185c6a..51e3ef0759 100644 --- a/libraries/script-engine/src/XMLHttpRequestClass.cpp +++ b/libraries/script-engine/src/XMLHttpRequestClass.cpp @@ -30,34 +30,18 @@ Q_DECLARE_METATYPE(QByteArray*) XMLHttpRequestClass::XMLHttpRequestClass(QScriptEngine* engine) : _engine(engine), - _async(true), - _url(), - _method(""), - _responseType(""), - _request(), - _reply(NULL), - _sendData(NULL), - _rawResponseData(), - _responseData(""), - _onTimeout(QScriptValue::NullValue), - _onReadyStateChange(QScriptValue::NullValue), - _readyState(XMLHttpRequestClass::UNSENT), - _errorCode(QNetworkReply::NoError), - _timeout(0), - _timer(this), - _numRedirects(0) { + _timer(this) { _request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true); _timer.setSingleShot(true); } XMLHttpRequestClass::~XMLHttpRequestClass() { - if (_reply) { delete _reply; } - if (_sendData) { delete _sendData; } + if (_reply) { _reply->deleteLater(); } } QScriptValue XMLHttpRequestClass::constructor(QScriptContext* context, QScriptEngine* engine) { - return engine->newQObject(new XMLHttpRequestClass(engine)); + return engine->newQObject(new XMLHttpRequestClass(engine), QScriptEngine::ScriptOwnership); } QScriptValue XMLHttpRequestClass::getStatus() const { @@ -169,13 +153,12 @@ void XMLHttpRequestClass::send() { void XMLHttpRequestClass::send(const QScriptValue& data) { if (_readyState == OPENED && !_reply) { + if (!data.isNull()) { - _sendData = new QBuffer(this); if (data.isObject()) { - QByteArray ba = qscriptvalue_cast(data); - _sendData->setData(ba); + _sendData = qscriptvalue_cast(data); } else { - _sendData->setData(data.toString().toUtf8()); + _sendData = data.toString().toUtf8(); } } @@ -235,6 +218,10 @@ void XMLHttpRequestClass::requestFinished() { } } + disconnectFromReply(_reply); + _reply->deleteLater(); + _reply = nullptr; + setReadyState(DONE); emit requestComplete(); } @@ -246,7 +233,7 @@ void XMLHttpRequestClass::abortRequest() { disconnectFromReply(_reply); _reply->abort(); _reply->deleteLater(); - _reply = NULL; + _reply = nullptr; } } diff --git a/libraries/script-engine/src/XMLHttpRequestClass.h b/libraries/script-engine/src/XMLHttpRequestClass.h index c79859e895..d7f3c2e059 100644 --- a/libraries/script-engine/src/XMLHttpRequestClass.h +++ b/libraries/script-engine/src/XMLHttpRequestClass.h @@ -98,23 +98,23 @@ private: void disconnectFromReply(QNetworkReply* reply); void abortRequest(); - QScriptEngine* _engine; - bool _async; + QScriptEngine* _engine { nullptr }; + bool _async { true }; QUrl _url; QString _method; QString _responseType; QNetworkRequest _request; - QNetworkReply* _reply; - QBuffer* _sendData; + QNetworkReply* _reply { nullptr }; + QByteArray _sendData; QByteArray _rawResponseData; QScriptValue _responseData; - QScriptValue _onTimeout; - QScriptValue _onReadyStateChange; - ReadyState _readyState; - QNetworkReply::NetworkError _errorCode; - int _timeout; + QScriptValue _onTimeout { QScriptValue::NullValue }; + QScriptValue _onReadyStateChange { QScriptValue::NullValue }; + ReadyState _readyState { XMLHttpRequestClass::UNSENT }; + QNetworkReply::NetworkError _errorCode { QNetworkReply::NoError }; + int _timeout { 0 }; QTimer _timer; - int _numRedirects; + int _numRedirects { 0 }; private slots: void requestFinished(); diff --git a/scripts/modules/request.js b/scripts/modules/request.js index 37f3ac0d7b..48c9913bd6 100644 --- a/scripts/modules/request.js +++ b/scripts/modules/request.js @@ -39,6 +39,10 @@ module.exports = { if (error) { response = { statusCode: httpRequest.status }; } + + // Break circular reference to httpRequest so the engine can garbage collect it. + httpRequest.onreadystatechange = null; + callback(error, response, optionalCallbackParameter); } };