Merge pull request #16041 from Atlante45/fix/oom

BUGZ-830: Fix memory leak in the ESS
This commit is contained in:
Shannon Romano 2019-08-09 09:03:56 -07:00 committed by GitHub
commit 5e5c5a27ab
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 34 deletions

View file

@ -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<QByteArray>(data);
_sendData->setData(ba);
_sendData = qscriptvalue_cast<QByteArray>(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;
}
}

View file

@ -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();

View file

@ -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);
}
};