From 2780f80fae58ecd986c0695f9bc61cfb5b099dc0 Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Mon, 17 Dec 2018 13:16:40 +1000 Subject: wasm: fix blob download handling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I34a8ec05c18b15ed71787986b5b0316693235b4d Fixes: QTBUG-72105 Reviewed-by: Morten Johan Sørvig --- src/network/access/qnetworkreplywasmimpl.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) (limited to 'src/network') diff --git a/src/network/access/qnetworkreplywasmimpl.cpp b/src/network/access/qnetworkreplywasmimpl.cpp index 3bfe927c9f..df4e034d97 100644 --- a/src/network/access/qnetworkreplywasmimpl.cpp +++ b/src/network/access/qnetworkreplywasmimpl.cpp @@ -102,6 +102,8 @@ static void q_loadCallback(val event) return; } QString statusText = QString::fromStdString(xhr["statusText"].as()); + int readyState = xhr["readyState"].as(); + if (status == 200 || status == 203) { QString responseString; const std::string responseType = xhr["responseType"].as(); @@ -112,13 +114,15 @@ static void q_loadCallback(val event) QString::fromStdWString(val::global("JSON").call("stringify", xhr["response"])); } else if (responseType == "arraybuffer" || responseType == "blob") { // handle this data in the FileReader, triggered by the call to readAsArrayBuffer + val blob = xhr["response"]; + val reader = val::global("FileReader").new_(); reader.set("onload", val::module_property("QNetworkReplyWasmImplPrivate_readBinary")); reader.set("data-handler", xhr["data-handler"]); - reader.call("readAsArrayBuffer", xhr["response"]); + + reader.call("readAsArrayBuffer", blob); } - int readyState = xhr["readyState"].as(); if (readyState == 4) { // done reply->setReplyAttributes(xhr["data-handler"].as(), status, statusText); @@ -167,9 +171,9 @@ static void q_readBinary(val event) reinterpret_cast(buffer.data()), size); destinationTypedArray.call("set", sourceTypedArray); reply->dataReceived(buffer, buffer.size()); + QCoreApplication::processEvents(); } - EMSCRIPTEN_BINDINGS(network_module) { function("QNetworkReplyWasmImplPrivate_requestErrorCallback", q_requestErrorCallback); function("QNetworkReplyWasmImplPrivate_progressCallback", q_progressCallback); @@ -240,9 +244,6 @@ qint64 QNetworkReplyWasmImpl::bytesAvailable() const { Q_D(const QNetworkReplyWasmImpl); - if (!d->isFinished) - return QNetworkReply::bytesAvailable(); - return QNetworkReply::bytesAvailable() + d->downloadBufferCurrentSize - d->downloadBufferReadPosition; } @@ -357,8 +358,7 @@ void QNetworkReplyWasmImplPrivate::doSendRequest() m_xhr.set("responseType", val("json")); dataToSend = val(extraDataString.toStdString()); } - } - if (contentType.contains("form")) { //construct form data + } else if (contentType.contains("form")) { //construct form data if (!extraDataString.isEmpty()) { val formData = val::global("FormData").new_(); QStringList formList = extraDataString.split('&'); @@ -368,6 +368,8 @@ void QNetworkReplyWasmImplPrivate::doSendRequest() } dataToSend = formData; } + } else { + m_xhr.set("responseType", val("blob")); } // set request headers for (auto header : request.rawHeaderList()) { @@ -417,10 +419,13 @@ void QNetworkReplyWasmImplPrivate::dataReceived(const QByteArray &buffer, int bu downloadBuffer.append(buffer, bufferSize); + emit q->readyRead(); + if (downloadBufferCurrentSize == totalDownloadSize) { - q->setFinished(true); - emit q->finished(); - } + q->setFinished(true); + emit q->readChannelFinished(); + emit q->finished(); + } } //taken from qnetworkrequest.cpp -- cgit v1.2.3