Porting/Zoom
Problem
In Debian ppc64le Chromium as of October 2023, video fails in the Zoom web client. To replicate the issue, click the "Join from Your Browser" link on the Zoom test meeting page (after clicking the "Join" button and dismissing the "xdg-open" pop-up).
The user-visible symptom is the Stop Video spinner spins indefinitely:
With some user-agent string testing, I determined that the Zoom JavaScript code checks the Chrome version. If that version is less than or equal to 100.0, video works.
Workaround
The workaround is to modify the user-agent string to reduce the Chrome version to 100.0.0.0. For example, copy the User Agent value from chrome://version and use Chromium's undocumented command line switch to set the user agent:
chromium --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.0.0 Safari/537.36"
Analysis
Here is the console log when video fails, with the Chrome version at its default 117.0.0.0.
Here is the console log when video succeeds, with the Chrome version reduced to 100.0.0.0.
I encountered this exception while stepping through the JavaScript debugger in the failing case:
"Error from video decode worker: Failed to instantiate WASM https://st1.zoom.us/web-media/mtxkwfl/video.mtsimd.wasm Message: WebAssembly.instantiate(): Compiling function #7437 failed: Wasm SIMD unsupported @+1486482 Stack: CompileError: WebAssembly.instantiate(): Compiling function #7437 failed: Wasm SIMD unsupported @+1486482 Name: Error"
I think what is happening is: the Zoom JavaScript code checks the Chrome version, and if it is greater than 100.0.0.0, it assumes that WASM-SIMD is supported, and so tries to load the WASM version of the video library. However, ppc64le Chromium does not have support for WASM SIMD yet. This WASM feature detect page shows:
I didn't debug further, but I suspect the failure to load this library is what results in the "Uncaught TypeError: video_set_websocket_speed is not a function". That exception repeats and results in the video spinner spinning indefinitely.
Next Steps
- ppc64le Chromium needs to implement WASM SIMD.
- Zoom could do a finer-grained check, perhaps the same one that https://wasm-feature-detect.surma.technology/ uses, to determine whether to load the WASM-SIMD version of the video library.
Firefox
I also tested Debian ppc64le Firefox-ESR. It hangs on the "Joining Meeting..." spinner with a JavaScript exception about r.ZP.callOutCountry. I have a nightly version of Firefox with some in-development JIT patches from https://talospace.com that gets much farther, but then the tab crashes. I will add Zoom to my Firefox-JIT testing list as I follow along with its development.
Test Details
Tested October 4, 2023. Test browser details:
Chromium | 117.0.5938.132 (Official Build) built on Debian 12.1, running on Debian 12.1 (64-bit) |
Revision | fa569fb226df361d676b60404623b17b16dddc8a-refs/branch-heads/5938@{#1462} |
OS | Linux |
JavaScript | V8 11.7.439.19 |
User Agent | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 |
Command Line | /usr/lib/chromium/chromium --desktop-startup-id=xfce4-panel/,usr,bin,chromium/4029293-82-localhost_TIME851498275 --disable-nacl --disable-pings --enable-gpu-rasterization --enable-remote-extensions --load-extension --media-router=0 --no-default-browser-check --origin-trial-disabled-features=WebGPU --show-component-extension-options --restart --flag-switches-begin --flag-switches-end --disable-nacl |
Executable Path | /usr/lib/chromium/chromium |
Profile Path | ~/.config/chromium/Default |