From 2c0bc4e33cf41064b80a8013b0abaccfb8b44372 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Tue, 12 May 2026 14:17:09 +0200 Subject: [PATCH] scripting/jsprov: Define the XSCRIPTCONTEXT global variable Adds a global variable to the QuickJS context called XSCRIPTCONTEXT which holds an instance of ScriptContext. This makes the scripts more compatible with scripts written for the Rhino JS implementation and also more like Python scripts. Change-Id: I95fd86229786a37c6fff282f45f65555cbde21cf Reviewed-on: https://gerrit.libreoffice.org/c/core/+/205122 Tested-by: Jenkins Reviewed-by: Neil Roberts --- scripting/source/jsprov/loader.cxx | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/scripting/source/jsprov/loader.cxx b/scripting/source/jsprov/loader.cxx index e012351cc1f6..0336ec91307f 100644 --- a/scripting/source/jsprov/loader.cxx +++ b/scripting/source/jsprov/loader.cxx @@ -15,14 +15,17 @@ #include #include +#include namespace { class ScriptWrapper : public cppu::WeakImplHelper { public: - ScriptWrapper(const OUString& sScript) - : m_sScript(sScript) + ScriptWrapper(const css::uno::Reference& xContext, + const OUString& sScript) + : m_xScriptContext(new sf_misc::ScriptContext(xContext)) + , m_sScript(sScript) { } @@ -32,6 +35,7 @@ public: css::uno::Sequence& aOutParam) override; private: + css::uno::Reference m_xScriptContext; OUString m_sScript; }; @@ -51,10 +55,10 @@ OUString JsProvScriptFactory::getLanguageName() const { return "JavaScript"; } OUString JsProvScriptFactory::getExtension() const { return ".js"; } css::uno::Reference -JsProvScriptFactory::getScript(css::uno::Reference, const OUString&, - std::string_view sSource) const +JsProvScriptFactory::getScript(css::uno::Reference xContext, + const OUString&, std::string_view sSource) const { - return new ScriptWrapper(OStringToOUString(sSource, RTL_TEXTENCODING_UTF8)); + return new ScriptWrapper(xContext, OStringToOUString(sSource, RTL_TEXTENCODING_UTF8)); } bool JsProvScriptFactory::appMightExecute(const OUString& sAppName) const @@ -64,12 +68,7 @@ bool JsProvScriptFactory::appMightExecute(const OUString& sAppName) const OUString JsProvScriptFactory::getExampleMacro() const { - return u"let context = uno.componentContext;\n" - "let desktop = uno.idl.com.sun.star.frame.theDesktop(context);\n" - "let frame = desktop.getCurrentFrame();\n" - "let controller = frame.getController();\n" - "let model = controller.getModel();\n" - "let text = model.getText();\n" + return u"let text = XSCRIPTCONTEXT.getDocument().getText();\n" "\n" "text.getEnd().setString(\"Hello, world!\");\n"_ustr; } @@ -78,7 +77,11 @@ css::uno::Any SAL_CALL ScriptWrapper::invoke(const css::uno::Sequence&, css::uno::Sequence&) { - jsuno::execute(m_sScript); + std::pair> aGlobalVariables[] = { + { "XSCRIPTCONTEXT", m_xScriptContext }, + }; + + jsuno::execute(m_sScript, aGlobalVariables); return css::uno::Any(); }