Hi again,

Another thing I'm looking into is the emerging support for JSPI in browsers, Emscripten, and Qt. And I wonder whether, in my below experiments, I'm holding anything fundamentally wrong (which might easily be the case):

I have a minimal qmake-based project that just shows a window with a button, and when the button gets clicked it opens a dialog:

$ cat dialog.pro
CONFIG += debug
HEADERS += window.h
QT += widgets
SOURCES += main.cc

$ cat window.h
#ifndef INCLUDED_window_h
#define INCLUDED_window_h

#include "QtWidgets/QPushButton"
#include "QtWidgets/QWidget"

class Window: public QWidget {
    Q_OBJECT
public:
    Window();

private slots:
    void showDialog();

private:
    QPushButton * button_;
};

#endif

$ cat main.cc
#include "QtWidgets/QApplication"
#include "QtWidgets/QDialog"
#include "QtWidgets/QPushButton"

#include "window.h"

Window::Window() {
    button_ = new QPushButton("dialog", this);
    connect(button_, SIGNAL(clicked()), this, SLOT(showDialog()));
}

void Window::showDialog() {
    QDialog dialog(this);
    dialog.exec();
}

int main(int argc, char ** argv) {
    QApplication app(argc, argv);
    Window window;
    window.show();
    return app.exec();
}

When building this for Wasm and running it in a browser, opening the dialog would give the expected

Warning: exec() is not supported on Qt for WebAssembly in this configuration. 
Please build with asyncify support, or use an asynchronous API like 
QDialog::open()
Uncaught Please compile your program with async support in order to use 
asynchronous operations like emscripten_sleep

But when I build recent Qt dev branch configured with `-feature-wasm-jspi`, and add `QMAKE_LFLAGS += -sJSPI` to dialog.pro, my understanding is that opening the dialog should then work. However, at least when I build against recent emsdk 3.1.73, and run in recent Chrome 131 with JSPI enabled in <chrome://flags>, opening the dialog causes an

Uncaught RuntimeError: attempting to suspend without a WebAssembly.promising 
export

Am I doing anything wrong?

(And a minor observation regarding the need to explicitly set `QMAKE_LFLAGS += -sJSPI` as described at <https://code.qt.io/cgit/qt/qtdoc.git/commit/?id=7516b4e74feb55a34c4d1409854ad291cafd7b3e> "wasm: document asyncify JSPI": My naive understanding is that that should no longer be necessary thanks to <https://code.qt.io/cgit/qt/qtbase.git/commit/?id=7a21ba15ed0385878ba9bf9741b8df9b61ebe3cc> "wasm: support enabling JSPI via QT_EMSCRIPTEN_ASYNCIFY=2", but only actually works when configuring Qt with the old `-device-option QT_EMSCRIPTEN_ASYNCIFY=2`, but not with the new `-feature-wasm-jspi` alternative introduced in <https://code.qt.io/cgit/qt/qtbase.git/commit/?id=92ad0f1f014909a792d157dca680fca5cff01605> "wasm: add configure option for asyncify JSPI". The latter presumably forgot to adapt mkspecs/common/wasm/wasm.conf?)
--
Development mailing list
Development@qt-project.org
https://lists.qt-project.org/listinfo/development

Reply via email to