diff options
author | Stephan Bergmann <stephan.bergmann@allotropia.de> | 2024-08-23 14:09:41 +0200 |
---|---|---|
committer | Stephan Bergmann <stephan.bergmann@allotropia.de> | 2024-08-23 22:06:21 +0200 |
commit | 7d37241dcb7aa20adfa7510323cfd7984ff5e911 (patch) | |
tree | dc31e523706073d41d1afa1e1a871b07d4b18597 /desktop | |
parent | 50fab30736a47754adf7d7df029551af5d4a6638 (diff) |
Emscripten: Module.uno_scripts are relative to document.baseURI
...so explicitly make them absolute, in case the WorkerGlboalScope used in
runUnoScriptUrl would make them absolute relative to a different base URL.
(See <https://github.com/mdn/content/issues/35568>
"WorkerGlobalScope.importScripts URLs relative to what base URL?" for my
confusion of what base URL should actually be used there. But at least with an
emsdk that uses recent Emscripten trunk towards 3.1.65, and where meanwhile
worker threads no longer load an soffice.worker.js but instead use some blob:
URL, a
> Module.uno_scripts = ['example.js'];
now failed with
> Error: Failed to execute 'importScripts' on 'WorkerGlobalScope': The URL 'example.js' is invalid.
on Chrome 127.)
Change-Id: I9f9b43d501a7b5d933c8506debdebe67ff1b5795
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/172325
Reviewed-by: Stephan Bergmann <stephan.bergmann@allotropia.de>
Tested-by: Jenkins
Diffstat (limited to 'desktop')
-rw-r--r-- | desktop/source/app/appinit.cxx | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/desktop/source/app/appinit.cxx b/desktop/source/app/appinit.cxx index 6253b7afe20b..1dc962e7a008 100644 --- a/desktop/source/app/appinit.cxx +++ b/desktop/source/app/appinit.cxx @@ -36,6 +36,7 @@ #include <officecfg/Setup.hxx> #include <osl/file.hxx> #include <rtl/bootstrap.hxx> +#include <rtl/uri.hxx> #include <sal/log.hxx> #include <comphelper/diagnose_ex.hxx> @@ -63,13 +64,14 @@ using namespace ::com::sun::star::ucb; namespace { -extern "C" void getUnoScriptUrls(std::vector<std::u16string> * urls) { +extern "C" void getUnoScriptUrls(std::vector<OUString> * urls) { assert(urls != nullptr); + OUString const base(emscripten::val::global("document")["baseURI"].as<std::u16string>()); auto const val = emscripten::val::module_property("uno_scripts"); if (!val.isUndefined()) { auto const len = val["length"].as<std::uint32_t>(); for (std::uint32_t i = 0; i != len; ++i) { - urls->push_back(val[i].as<std::u16string>()); + urls->push_back(rtl::Uri::convertRelToAbs(base, OUString(val[i].as<std::u16string>()))); } } } @@ -108,13 +110,13 @@ extern "C" void resolveUnoMain() { void initUno() { init_unoembind_uno(); - std::vector<std::u16string> urls; + std::vector<OUString> urls; emscripten_sync_run_in_main_runtime_thread(EM_FUNC_SIG_VI, getUnoScriptUrls, &urls); for (auto const & url: urls) { - if (url.find('\0') != std::u16string::npos) { + if (url.indexOf('\0') != -1) { throw std::invalid_argument("Module.uno_scripts element contains embedded NUL"); } - runUnoScriptUrl(url.c_str()); + runUnoScriptUrl(url.getStr()); } setupMainChannel(); EM_ASM(Module.uno_init$resolve();); |