wasm: fix crash in case network js event becomes null or undefined

also fix data progress

Task-number: QTBUG-75489
Change-Id: I5222fda64d258a6ae78ba0ca20194b81c289c27e
Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
This commit is contained in:
Lorn Potter 2019-05-27 11:08:47 +10:00
parent 83dccf00cc
commit 762d4afdc1

View File

@ -59,6 +59,9 @@ using namespace emscripten;
static void q_requestErrorCallback(val event)
{
if (event.isNull() || event.isUndefined())
return;
val xhr = event["target"];
quintptr func = xhr["data-handler"].as<quintptr>();
@ -77,19 +80,24 @@ static void q_requestErrorCallback(val event)
static void q_progressCallback(val event)
{
if (event.isNull() || event.isUndefined())
return;
val xhr = event["target"];
QNetworkReplyWasmImplPrivate *reply =
reinterpret_cast<QNetworkReplyWasmImplPrivate*>(xhr["data-handler"].as<quintptr>());
Q_ASSERT(reply);
if (xhr["lengthComputable"].as<bool>() && xhr["status"].as<int>() < 400)
reply->emitDataReadProgress(xhr["loaded"].as<qint64>(), xhr["total"].as<qint64>());
if (xhr["status"].as<int>() < 400)
reply->emitDataReadProgress(event["loaded"].as<int>(), event["total"].as<int>());
}
static void q_loadCallback(val event)
{
if (event.isNull() || event.isUndefined())
return;
val xhr = event["target"];
QNetworkReplyWasmImplPrivate *reply =
@ -121,6 +129,7 @@ static void q_loadCallback(val event)
reader.set("data-handler", xhr["data-handler"]);
reader.call<void>("readAsArrayBuffer", blob);
val::global("Module").delete_(reader);
}
@ -136,6 +145,9 @@ static void q_loadCallback(val event)
static void q_responseHeadersCallback(val event)
{
if (event.isNull() || event.isUndefined())
return;
val xhr = event["target"];
if (xhr["readyState"].as<int>() == 2) { // HEADERS_RECEIVED
@ -152,12 +164,18 @@ static void q_responseHeadersCallback(val event)
static void q_readBinary(val event)
{
if (event.isNull() || event.isUndefined())
return;
val fileReader = event["target"];
QNetworkReplyWasmImplPrivate *reply =
reinterpret_cast<QNetworkReplyWasmImplPrivate*>(fileReader["data-handler"].as<quintptr>());
Q_ASSERT(reply);
if (reply->state == QNetworkReplyPrivate::Finished || reply->state == QNetworkReplyPrivate::Aborted)
return;
// Set up source typed array
val result = fileReader["result"]; // ArrayBuffer
val Uint8Array = val::global("Uint8Array");
@ -171,6 +189,10 @@ static void q_readBinary(val event)
reinterpret_cast<quintptr>(buffer.data()), size);
destinationTypedArray.call<void>("set", sourceTypedArray);
reply->dataReceived(buffer, buffer.size());
event.delete_(fileReader);
Uint8Array.delete_(sourceTypedArray);
QCoreApplication::processEvents();
}
@ -194,14 +216,21 @@ QNetworkReplyWasmImplPrivate::QNetworkReplyWasmImplPrivate()
QNetworkReplyWasmImplPrivate::~QNetworkReplyWasmImplPrivate()
{
}
QNetworkReplyWasmImpl::~QNetworkReplyWasmImpl()
{
m_xhr.set("onerror", val::null());
m_xhr.set("onload", val::null());
m_xhr.set("onprogress", val::null());
m_xhr.set("onreadystatechange", val::null());
m_xhr.set("data-handler", val::null());
}
QNetworkReplyWasmImpl::QNetworkReplyWasmImpl(QObject *parent)
: QNetworkReply(*new QNetworkReplyWasmImplPrivate(), parent)
{
Q_D( QNetworkReplyWasmImpl);
d->state = QNetworkReplyPrivate::Idle;
}
QNetworkReplyWasmImpl::~QNetworkReplyWasmImpl()
{
}
@ -226,19 +255,23 @@ QByteArray QNetworkReplyWasmImpl::methodName() const
void QNetworkReplyWasmImpl::close()
{
QNetworkReply::close();
setFinished(true);
emit finished();
QNetworkReply::close();
}
void QNetworkReplyWasmImpl::abort()
{
Q_D(const QNetworkReplyWasmImpl);
setError( QNetworkReply::OperationCanceledError, QStringLiteral("Operation canceled"));
Q_D( QNetworkReplyWasmImpl);
if (d->state == QNetworkReplyPrivate::Finished || d->state == QNetworkReplyPrivate::Aborted)
return;
setError(QNetworkReply::OperationCanceledError, QStringLiteral("Operation canceled"));
d->doAbort();
close();
d->state = QNetworkReplyPrivate::Aborted;
}
qint64 QNetworkReplyWasmImpl::bytesAvailable() const