online icon indicating copy to clipboard operation
online copied to clipboard

Revive COWASM

Open stbergmann opened this issue 5 months ago • 2 comments

  • Target version: master

Summary

This series of commits tries to get COWASM building and working again on recent master. (But it doesn't quite yet work for me, see below.)

I've tried to get it working against recent versions of COOL, emsdk, LibreOffice, and zstd. Only for POCO did I use the exact same patched version as described in wasm/README.no-container.md:

#!/bin/sh
set -ex -o pipefail

mkdir "${HOME?}"/cowasm

git -C "${HOME?}"/cowasm clone https://github.com/emscripten-core/emsdk.git # e.g., 62a853cd3b3134398ce85cde8bb5cbb2ef0194cb "Release 4.0.10 (#1565)"
"${HOME?}"/cowasm/emsdk/emsdk install latest
"${HOME?}"/cowasm/emsdk/emsdk activate latest

git -C "${HOME?}"/cowasm clone https://git.libreoffice.org/core # e.g., 7359e9c742d35c999eb9add524052887805e7b26

mkdir "${HOME?}"/cowasm/lo-cool
(
cd "${HOME?}"/cowasm/lo-cool
"${HOME?}"/cowasm/core/autogen.sh
)
make -C "${HOME?}"/cowasm/lo-cool

mkdir "${HOME?}"/cowasm/lo-wasm
(
cd "${HOME?}"/cowasm/lo-wasm
. "${HOME?}"/cowasm/emsdk/emsdk_env.sh
"${HOME?}"/cowasm/core/autogen.sh --host=wasm32-local-emscripten --disable-gui --disable-scripting --with-package-format=emscripten
make
)

git -C "${HOME?}"/cowasm clone https://github.com/CollaboraOnline/online.git # e.g., 89db258ccdde925848109a01a2af242102c52e9c, plus the commits from this PR
patch -d "${HOME?}"/cowasm/online -p0 <<\EOF
--- coolwsd.xml.in
+++ coolwsd.xml.in
@@ -386,1 +386,1 @@
-        <enable desc="Enable WASM support" type="bool" default="false">false</enable>
+        <enable desc="Enable WASM support" type="bool" default="false">true</enable>
EOF
(
cd "${HOME?}"/cowasm/online
./autogen.sh
)

curl -L https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz | tar xz -C "${HOME?}"/cowasm
(
. "${HOME?}"/cowasm/emsdk/emsdk_env.sh
emmake make -C "${HOME?}"/cowasm/zstd-1.5.7 lib-mt ZSTD_NO_ASM=1 PREFIX="${HOME?}"/cowasm/zstd
emmake make -C "${HOME?}"/cowasm/zstd-1.5.7/lib install-static install-includes ZSTD_NO_ASM=1 PREFIX="${HOME?}"/cowasm/zstd
)

curl -L https://github.com/pocoproject/poco/archive/refs/tags/poco-1.12.4-release.tar.gz | tar xz -C "${HOME?}"/cowasm
patch -d "${HOME?}"/cowasm/poco-poco-1.12.4-release -p1 <"${HOME?}"/cowasm/online/wasm/poco-1.12.4-emscripten.patch
mv "${HOME?}"/cowasm/poco-poco-1.12.4-release/XML/src/xmlparse.cpp "${HOME?}"/cowasm/poco-poco-1.12.4-release/XML/src/xmlparse.c
patch -d "${HOME?}"/cowasm/poco-poco-1.12.4-release -p0 <"${HOME?}"/cowasm/online/wasm/poco-no-special-expat-sauce.diff
(
cd "${HOME?}"/cowasm/poco-poco-1.12.4-release
. "${HOME?}"/cowasm/emsdk/emsdk_env.sh
emconfigure ./configure --static --no-samples --no-tests --omit=Crypto,NetSSL_OpenSSL,JWT,Data,Data/SQLite,Data/ODBC,Data/MySQL,Data/PostgreSQL,Zip,PageCompiler,PageCompiler/File2Page,MongoDB,Redis,ActiveRecord,ActiveRecord/Compiler,Prometheus
emmake make CC=emcc CXX=em++ CXXFLAGS="-DPOCO_NO_LINUX_IF_PACKET_H -DPOCO_NO_INOTIFY -pthread -s USE_PTHREADS=1 -fwasm-exceptions"
)
make -C "${HOME?}"/cowasm/poco-poco-1.12.4-release install INSTALLDIR="${HOME?}"/cowasm/poco

mkdir "${HOME?}"/cowasm/wasm-additional-files
ln -s "${HOME?}"/cowasm/online/cypress_test/data/desktop/writer/testfile.docx "${HOME?}"/cowasm/wasm-additional-files/sample.docx

mkdir "${HOME?}"/cowasm/cool-wasm
(
cd "${HOME?}"/cowasm/cool-wasm
. "${HOME?}"/cowasm/emsdk/emsdk_env.sh
emconfigure "${HOME?}"/cowasm/online/configure --disable-werror --with-lokit-path="${HOME?}"/cowasm/core/include --with-lo-path="${HOME?}"/cowasm/lo-wasm/instdir --with-lo-builddir="${HOME?}"/cowasm/lo-wasm --with-zstd-includes="${HOME?}"/cowasm/zstd/include --with-zstd-libs="${HOME?}"/cowasm/zstd/lib --with-poco-includes="${HOME?}"/cowasm/poco/include --with-poco-libs="${HOME?}"/cowasm/poco/lib --host=wasm32-local-emscripten --with-wasm-additional-files="${HOME?}"/cowasm/wasm-additional-files
emmake make
)

mkdir "${HOME?}"/cowasm/cool-cowasm
(
cd "${HOME?}"/cowasm/cool-cowasm
"${HOME?}"/cowasm/online/configure --with-lokit-path="${HOME?}"/cowasm/core/include --with-lo-path="${HOME?}"/cowasm/lo-cool/instdir --enable-debug
)
make -C "${HOME?}"/cowasm/cool-cowasm
ln -s "${HOME?}"/cowasm/cool-wasm/browser/dist "${HOME?}"/cowasm/cool-cowasm/browser/dist/wasm

COOL_SERVE_FROM_FS= make -C "${HOME?}"/cowasm/cool-cowasm run

But then opening the resulting https://localhost:9980/browser/dc1f861633/wasm.html?file_path=/some/unused/path (in Chrome, at least) only shows a spinner and "Collabora Online Development Edition Loading..." and a progress bar with no progress, and hangs there. In the console you get

cool.html:41 GET https://localhost:9980/browser/dc1f861633//wasm/branding.css net::ERR_ABORTED 404 ((Not Found))
cool.html:38 GET https://localhost:9980/browser/dc1f861633/branding.css net::ERR_ABORTED 404 ((Not Found))
cool.html:201 GET https://localhost:9980/browser/dc1f861633//wasm/branding.js net::ERR_ABORTED 404 ((Not Found))
global.js:1 GET https://localhost:9980/browser/dc1f861633//wasm/branding-desktop.css net::ERR_ABORTED 404 ((Not Found))
global.js:1 L.Map.SlideShow: Cypress in window: false
global.js:1 explicitly hiding: 
global.js:1 explicitly showing: 
favicon.ico:1 GET https://localhost:9980/favicon.ico 400 (Bad Request)
bundle.js:69990 ================ Here is main()
bundle.js:69990 ================ main() is returning
bundle.js:69990 isWOPI is true: Fetching from url /wasm/https%3A%2F%2Flocalhost%3A9980%2Fwopi%2Ffiles%2Fsome%2Funused%2Fpath%3Faccess_token%3Dtest%26access_token_ttl%3D0%26no_auth_header%3D
bundle.js:69990 Downloading /wasm/https%3A%2F%2Flocalhost%3A9980%2Fwopi%2Ffiles%2Fsome%2Funused%2Fpath%3Faccess_token%3Dtest%26access_token_ttl%3D0%26no_auth_header%3D failed, HTTP failure status code: 401.
bundle.js:69990 ================ handle_cool_message(): 'HULLO'
bundle.js:69990 Loading file [file:///sample.docx]
bundle.js:69990 ================ handle_cool_message(): 'coolclient 0.1 1749794188165 2338.8849999904633'
bundle.js:69990 ================ handle_cool_message(): 'load url=https%3A%2F%2Flocalhost%3A9980%2Fwopi%2Ffiles%2Fsome%2Funused%2Fpath lang=en-US deviceFormFactor=desktop timezone=Europe/Berlin darkTheme=false darkBackground=false accessibilityState=false clientvisiblearea=0;0;18150;15660'
bundle.js:69991 Fontconfig warning: ignoring C.UTF-8;C;C;C;C;C: not a valid language tag

@tml1024 Not sure if I'm doing anything wrong with the above, missing the obvious, or how best to proceed?

TODO

  • [ ] ...

Checklist

  • [ ] I have run make prettier-write and formatted the code.
  • [ ] All commits have Change-Id
  • [ ] I have run tests with make check
  • [ ] I have issued make run and manually verified that everything looks okay
  • [ ] Documentation (manuals or wiki) has been updated or is not required

stbergmann avatar Jun 13 '25 07:06 stbergmann

Thanks for opening this pull request!

Things that will help get your PR across the finish line:

  • Check out our contributing guidelines.
  • Connect with us through one of our communication channels.
  • Click on the details link next to the failing CI checks, if any, to see an explanation on how to fix it.
  • Feel free to ping @pedropintosilva or the mentor of the easyHack you are solving if you need help.

welcome[bot] avatar Jun 13 '25 07:06 welcome[bot]

So things now work with the updated commits from this PR plus the pending LO change https://gerrit.libreoffice.org/c/core/+/186665 "Emscripten --disable-gui: Improve waiting yield":

#!/bin/sh
set -ex -o pipefail

mkdir "${HOME?}"/cowasm

git -C "${HOME?}"/cowasm clone https://github.com/emscripten-core/emsdk.git # e.g., 62a853cd3b3134398ce85cde8bb5cbb2ef0194cb "Release 4.0.10 (#1565)"
"${HOME?}"/cowasm/emsdk/emsdk install latest
"${HOME?}"/cowasm/emsdk/emsdk activate latest

git -C "${HOME?}"/cowasm clone https://git.libreoffice.org/core # e.g., 7359e9c742d35c999eb9add524052887805e7b26, plus <https://gerrit.libreoffice.org/c/core/+/186665> "Emscripten --disable-gui: Improve waiting yield"

mkdir "${HOME?}"/cowasm/lo-cool
(
cd "${HOME?}"/cowasm/lo-cool
"${HOME?}"/cowasm/core/autogen.sh
)
make -C "${HOME?}"/cowasm/lo-cool

mkdir "${HOME?}"/cowasm/lo-wasm
(
cd "${HOME?}"/cowasm/lo-wasm
. "${HOME?}"/cowasm/emsdk/emsdk_env.sh
"${HOME?}"/cowasm/core/autogen.sh --host=wasm32-local-emscripten --disable-gui --disable-scripting --with-package-format=emscripten
make
)

git -C "${HOME?}"/cowasm clone https://github.com/CollaboraOnline/online.git # e.g., 89db258ccdde925848109a01a2af242102c52e9c, plus the commits from this PR
patch -d "${HOME?}"/cowasm/online -p0 <<\EOF
--- coolwsd.xml.in
+++ coolwsd.xml.in
@@ -386,1 +386,1 @@
-        <enable desc="Enable WASM support" type="bool" default="false">false</enable>
+        <enable desc="Enable WASM support" type="bool" default="false">true</enable>
EOF
(
cd "${HOME?}"/cowasm/online
./autogen.sh
)

curl -L https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz | tar xz -C "${HOME?}"/cowasm
(
. "${HOME?}"/cowasm/emsdk/emsdk_env.sh
emmake make -C "${HOME?}"/cowasm/zstd-1.5.7 lib-mt ZSTD_NO_ASM=1 PREFIX="${HOME?}"/cowasm/zstd
emmake make -C "${HOME?}"/cowasm/zstd-1.5.7/lib install-static install-includes ZSTD_NO_ASM=1 PREFIX="${HOME?}"/cowasm/zstd
)

curl -L https://github.com/pocoproject/poco/archive/refs/tags/poco-1.12.4-release.tar.gz | tar xz -C "${HOME?}"/cowasm
patch -d "${HOME?}"/cowasm/poco-poco-1.12.4-release -p1 <"${HOME?}"/cowasm/online/wasm/poco-1.12.4-emscripten.patch
mv "${HOME?}"/cowasm/poco-poco-1.12.4-release/XML/src/xmlparse.cpp "${HOME?}"/cowasm/poco-poco-1.12.4-release/XML/src/xmlparse.c
patch -d "${HOME?}"/cowasm/poco-poco-1.12.4-release -p0 <"${HOME?}"/cowasm/online/wasm/poco-no-special-expat-sauce.diff
(
cd "${HOME?}"/cowasm/poco-poco-1.12.4-release
. "${HOME?}"/cowasm/emsdk/emsdk_env.sh
emconfigure ./configure --static --no-samples --no-tests --omit=Crypto,NetSSL_OpenSSL,JWT,Data,Data/SQLite,Data/ODBC,Data/MySQL,Data/PostgreSQL,Zip,PageCompiler,PageCompiler/File2Page,MongoDB,Redis,ActiveRecord,ActiveRecord/Compiler,Prometheus
emmake make CC=emcc CXX=em++ CXXFLAGS="-DPOCO_NO_LINUX_IF_PACKET_H -DPOCO_NO_INOTIFY -pthread -s USE_PTHREADS=1 -fwasm-exceptions"
)
make -C "${HOME?}"/cowasm/poco-poco-1.12.4-release install INSTALLDIR="${HOME?}"/cowasm/poco

mkdir "${HOME?}"/cowasm/wasm-additional-files
ln -s "${HOME?}"/cowasm/online/cypress_test/data/desktop/writer/testfile.docx "${HOME?}"/cowasm/wasm-additional-files/sample.docx

mkdir "${HOME?}"/cowasm/cool-wasm
(
cd "${HOME?}"/cowasm/cool-wasm
. "${HOME?}"/cowasm/emsdk/emsdk_env.sh
emconfigure "${HOME?}"/cowasm/online/configure --disable-werror --with-lokit-path="${HOME?}"/cowasm/core/include --with-lo-path="${HOME?}"/cowasm/lo-wasm/instdir --with-lo-builddir="${HOME?}"/cowasm/lo-wasm --with-zstd-includes="${HOME?}"/cowasm/zstd/include --with-zstd-libs="${HOME?}"/cowasm/zstd/lib --with-poco-includes="${HOME?}"/cowasm/poco/include --with-poco-libs="${HOME?}"/cowasm/poco/lib --host=wasm32-local-emscripten --with-wasm-additional-files="${HOME?}"/cowasm/wasm-additional-files
emmake make
)

mkdir "${HOME?}"/cowasm/cool-cowasm
(
cd "${HOME?}"/cowasm/cool-cowasm
"${HOME?}"/cowasm/online/configure --with-lokit-path="${HOME?}"/cowasm/core/include --with-lo-path="${HOME?}"/cowasm/lo-cool/instdir --enable-debug
)
make -C "${HOME?}"/cowasm/cool-cowasm
ln -s "${HOME?}"/cowasm/cool-wasm/browser/dist "${HOME?}"/cowasm/cool-cowasm/browser/dist/wasm

COOL_SERVE_FROM_FS= make -C "${HOME?}"/cowasm/cool-cowasm run
# browse <https://localhost:9980/browser/dc1f861633/wasm.html?file_path=/some/unused/path>

stbergmann avatar Jun 18 '25 14:06 stbergmann

Please rebase writer/jsdialog_widgets_spec.js fails but was fixed in https://github.com/CollaboraOnline/online/commit/7f2b1987cf6fc1a983d7cee018cb36dcbea8483d

eszkadev avatar Jul 05 '25 16:07 eszkadev

Please rebase writer/jsdialog_widgets_spec.js fails but was fixed in 7f2b198

done

@eszkadev would you be OK being the reviewer here?

stbergmann avatar Jul 08 '25 09:07 stbergmann