From d0eba2449adcee6f1daa33426f9c9b8ebf7c28f5 Mon Sep 17 00:00:00 2001 From: Mikolaj Boc Date: Tue, 21 Jun 2022 17:50:04 +0200 Subject: Create a promise wrapper for C++ and port existing uses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently, to use a promise from C++ we either have to use an ASM block (which does not work well with dynamic linking) or declare exports in the EMSCRIPTEN_BINDINGS block, which is cumbersome and cannot be chained. This solution makes it easy to use js promises by introducing the WebPromiseManager which dispatches callbacks to appropriate callers when available. This is a preliminary patch for FileSystem support, which will heavily use async APIs. Task-number: QTBUG-99611 Change-Id: I368a8f173027eaa883a9ca18d0ea6a3e99b86071 Reviewed-by: Morten Johan Sørvig --- src/plugins/platforms/wasm/qwasmclipboard.cpp | 109 +++----------------------- 1 file changed, 11 insertions(+), 98 deletions(-) (limited to 'src/plugins/platforms') diff --git a/src/plugins/platforms/wasm/qwasmclipboard.cpp b/src/plugins/platforms/wasm/qwasmclipboard.cpp index 88043ba092..99f3e61155 100644 --- a/src/plugins/platforms/wasm/qwasmclipboard.cpp +++ b/src/plugins/platforms/wasm/qwasmclipboard.cpp @@ -19,83 +19,6 @@ QT_BEGIN_NAMESPACE using namespace emscripten; -static void pasteClipboardData(emscripten::val format, emscripten::val dataPtr) -{ - QString formatString = QWasmString::toQString(format); - QByteArray dataArray = QByteArray::fromStdString(dataPtr.as()); - - QMimeData *mMimeData = new QMimeData; - mMimeData->setData(formatString, dataArray); - - QWasmClipboard::qWasmClipboardPaste(mMimeData); -// QWasmIntegration::get()->getWasmClipboard()->isPaste = false; -} - -static void qClipboardPasteResolve(emscripten::val blob) -{ - // read Blob here - - auto fileReader = std::make_shared(); - auto _blob = qstdweb::Blob(blob); - QString formatString = QString::fromStdString(_blob.type()); - - fileReader->readAsArrayBuffer(_blob); - char *chunkBuffer = nullptr; - qstdweb::ArrayBuffer result = fileReader->result(); - qstdweb::Uint8Array(result).copyTo(chunkBuffer); - QMimeData *mMimeData = new QMimeData; - mMimeData->setData(formatString, chunkBuffer); - QWasmClipboard::qWasmClipboardPaste(mMimeData); -} - -static void qClipboardPromiseResolve(emscripten::val clipboardItems) -{ - int itemsCount = clipboardItems["length"].as(); - - for (int i = 0; i < itemsCount; i++) { - int typesCount = clipboardItems[i]["types"]["length"].as(); // ClipboardItem - - std::string mimeFormat = clipboardItems[i]["types"][0].as(); - - if (mimeFormat.find(std::string("text")) != std::string::npos) { - // simple val object, no further processing - - val navigator = val::global("navigator"); - val textPromise = navigator["clipboard"].call("readText"); - val readTextResolve = val::global("Module")["qtClipboardTextPromiseResolve"]; - textPromise.call("then", readTextResolve); - - } else { - // binary types require additional processing - for (int j = 0; j < typesCount; j++) { - val pasteResolve = emscripten::val::module_property("qtClipboardPasteResolve"); - val pasteException = emscripten::val::module_property("qtClipboardPromiseException"); - - // get the blob - clipboardItems[i] - .call("getType", clipboardItems[i]["types"][j]) - .call("then", pasteResolve) - .call("catch", pasteException); - } - } - } -} - -static void qClipboardCopyPromiseResolve(emscripten::val something) -{ - Q_UNUSED(something) - qWarning() << "copy succeeeded"; -} - - -static emscripten::val qClipboardPromiseException(emscripten::val something) -{ - qWarning() << "clipboard error" - << QString::fromStdString(something["name"].as()) - << QString::fromStdString(something["message"].as()); - return something; -} - static void commonCopyEvent(val event) { QMimeData *_mimes = QWasmIntegration::get()->getWasmClipboard()->mimeData(QClipboard::Clipboard); @@ -215,24 +138,10 @@ static void qClipboardPasteTo(val dataTransfer) QWasmIntegration::get()->getWasmClipboard()->m_isListener = false; } -static void qClipboardTextPromiseResolve(emscripten::val clipdata) -{ - pasteClipboardData(emscripten::val("text/plain"), clipdata); -} - EMSCRIPTEN_BINDINGS(qtClipboardModule) { - function("qtPasteClipboardData", &pasteClipboardData); - - function("qtClipboardTextPromiseResolve", &qClipboardTextPromiseResolve); - function("qtClipboardPromiseResolve", &qClipboardPromiseResolve); - - function("qtClipboardCopyPromiseResolve", &qClipboardCopyPromiseResolve); - function("qtClipboardPromiseException", &qClipboardPromiseException); - function("qtClipboardCutTo", &qClipboardCutTo); function("qtClipboardCopyTo", &qClipboardCopyTo); function("qtClipboardPasteTo", &qClipboardPasteTo); - function("qtClipboardPasteResolve", &qClipboardPasteResolve); } QWasmClipboard::QWasmClipboard() : @@ -419,14 +328,18 @@ void QWasmClipboard::writeToClipboardApi() // break; } - val copyResolve = emscripten::val::module_property("qtClipboardCopyPromiseResolve"); - val copyException = emscripten::val::module_property("qtClipboardPromiseException"); - val navigator = val::global("navigator"); - navigator["clipboard"] - .call("write", clipboardWriteArray) - .call("then", copyResolve) - .call("catch", copyException); + + qstdweb::Promise::make( + navigator["clipboard"], "write", + { + .catchFunc = [](emscripten::val error) { + qWarning() << "clipboard error" + << QString::fromStdString(error["name"].as()) + << QString::fromStdString(error["message"].as()); + } + }, + clipboardWriteArray); } void QWasmClipboard::writeToClipboard(const QMimeData *data) -- cgit v1.2.3