desktop/Executable_soffice_bin.mk       |    2 
 static/README.wasm.md                   |    8 -
 static/emscripten/uno.js                |   82 +++++++++++++++++++
 unotest/source/embindtest/embindtest.js |  135 ++++++++------------------------
 4 files changed, 125 insertions(+), 102 deletions(-)

New commits:
commit 887ebfd6e56069d281cd0c1ce893b794a3d854d3
Author:     Stephan Bergmann <stephan.bergm...@allotropia.de>
AuthorDate: Wed Jun 12 13:20:46 2024 +0200
Commit:     Stephan Bergmann <stephan.bergm...@allotropia.de>
CommitDate: Wed Jun 12 15:44:12 2024 +0200

    Embind: Centrally initialize via Module.initUno() in a new uno.js
    
    ...so that the unoObject function can be moved there too (so that other code
    outside embindtest.js can reuse it)
    
    Change-Id: Id3edb7cede56321db29ba435f221cb7702a3513c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/168700
    Reviewed-by: Stephan Bergmann <stephan.bergm...@allotropia.de>
    Tested-by: Jenkins

diff --git a/desktop/Executable_soffice_bin.mk 
b/desktop/Executable_soffice_bin.mk
index d6a271dec796..163bfb6409f2 100644
--- a/desktop/Executable_soffice_bin.mk
+++ b/desktop/Executable_soffice_bin.mk
@@ -73,10 +73,12 @@ endif
 
 $(call gb_Executable_get_linktarget_target,soffice_bin): \
     $(gb_CustomTarget_workdir)/static/unoembind/bindings_uno.js \
+    $(SRCDIR)/static/emscripten/uno.js \
     $(EMSCRIPTEN_EXTRA_SOFFICE_POST_JS)
 
 $(eval $(call gb_Executable_add_ldflags,soffice_bin, \
     --post-js $(gb_CustomTarget_workdir)/static/unoembind/bindings_uno.js \
+    --post-js $(SRCDIR)/static/emscripten/uno.js \
     $(foreach i,$(EMSCRIPTEN_EXTRA_SOFFICE_POST_JS),--post-js $(i)) \
 ))
 
diff --git a/static/README.wasm.md b/static/README.wasm.md
index c07c3a9a389c..7d69716e7173 100644
--- a/static/README.wasm.md
+++ b/static/README.wasm.md
@@ -210,8 +210,8 @@ improvement! ;)
 Some usage examples through javascript of the current implementation:
 ```js
 // inserts a string at the start of the Writer document.
-const uno = init_unoembind_uno(Module);
-const css = uno.com.sun.star;
+Module.initUno();
+const css = Module.uno.com.sun.star;
 const xModel = Module.getCurrentModelFromViewSh();
 const xTextDocument = css.text.XTextDocument.query(xModel);
 const xText = xTextDocument.getText();
@@ -221,8 +221,8 @@ xTextCursor.setString("string here!");
 
 ```js
 // changes each paragraph of the Writer document to a random color.
-const uno = init_unoembind_uno(Module);
-const css = uno.com.sun.star;
+Module.initUno();
+const css = Module.uno.com.sun.star;
 const xModel = Module.getCurrentModelFromViewSh();
 const xTextDocument = css.text.XTextDocument.query(xModel);
 const xText = xTextDocument.getText();
diff --git a/static/emscripten/uno.js b/static/emscripten/uno.js
new file mode 100644
index 000000000000..4f3b2e69849d
--- /dev/null
+++ b/static/emscripten/uno.js
@@ -0,0 +1,82 @@
+/* -*- Mode: JS; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; 
fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+Module.initUno = function() {
+    if (Module.uno === undefined) {
+        Module.uno = init_unoembind_uno(Module);
+    }
+};
+
+Module.unoObject = function(interfaces, obj) {
+    Module.initUno();
+    interfaces = ['com.sun.star.lang.XTypeProvider'].concat(interfaces);
+    obj.impl_refcount = 0;
+    obj.impl_types = new Module.uno_Sequence_type(interfaces.length, 
Module.uno_Sequence.FromSize);
+    for (let i = 0; i !== interfaces.length; ++i) {
+        obj.impl_types.set(i, Module.uno_Type.Interface(interfaces[i]));
+    }
+    obj.impl_implementationId = new Module.uno_Sequence_byte([]);
+    obj.queryInterface = function(type) {
+        for (const i in obj._types) {
+            if (i === type.toString()) {
+                return new Module.uno_Any(
+                    type,
+                    Module['uno_Type_' + i.replace(/\./g, '$')].reference(
+                        obj._impl[obj._types[i]]));
+            }
+        }
+        return new Module.uno_Any(Module.uno_Type.Void(), undefined);
+    };
+    obj.acquire = function() { ++obj.impl_refcount; };
+    obj.release = function() {
+        if (--obj.impl_refcount === 0) {
+            for (const i in obj._impl) {
+                i.delete();
+            }
+            obj.impl_types.delete();
+            obj.impl_implementationId.delete();
+        }
+    };
+    obj.getTypes = function() { return obj.impl_types; };
+    obj.getImplementationId = function() { return obj.impl_implementationId; };
+    obj._impl = {};
+    interfaces.forEach((i) => {
+        obj._impl[i] = Module['uno_Type_' + i.replace(/\./g, 
'$')].implement(obj);
+    });
+    obj._types = {};
+    const walk = function(td, impl) {
+        const name = td.getName();
+        if (!Object.hasOwn(obj._types, name)) {
+            if (td.getTypeClass() != 
Module.uno.com.sun.star.uno.TypeClass.INTERFACE) {
+                throw new Error('not a UNO interface type: ' + name);
+            }
+            obj._types[name] = impl;
+            const bases = 
Module.uno.com.sun.star.reflection.XInterfaceTypeDescription2.query(td)
+                  .getBaseTypes();
+            for (let i = 0; i !== bases.size(); ++i) {
+                walk(bases.get(i), impl)
+            }
+            bases.delete();
+        }
+    };
+    const tdmAny = Module.getUnoComponentContext().getValueByName(
+        '/singletons/com.sun.star.reflection.theTypeDescriptionManager');
+    const tdm = 
Module.uno.com.sun.star.container.XHierarchicalNameAccess.query(tdmAny.get());
+    interfaces.forEach((i) => {
+        const td = tdm.getByHierarchicalName(i);
+        
walk(Module.uno.com.sun.star.reflection.XTypeDescription.query(td.get()), i);
+        td.delete();
+    })
+    tdmAny.delete();
+    obj._types['com.sun.star.uno.XInterface'] = 
'com.sun.star.lang.XTypeProvider';
+    obj.acquire();
+    return obj;
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s 
cinkeys+=0=break: */
diff --git a/unotest/source/embindtest/embindtest.js 
b/unotest/source/embindtest/embindtest.js
index c320fd321687..db6876a4d7c8 100644
--- a/unotest/source/embindtest/embindtest.js
+++ b/unotest/source/embindtest/embindtest.js
@@ -9,9 +9,9 @@
 
 Module.addOnPostRun(function() {
     console.log('Running embindtest');
-    let uno = init_unoembind_uno(Module);
-    let css = uno.com.sun.star;
-    let test = 
uno.org.libreoffice.embindtest.Test(Module.getUnoComponentContext());
+    Module.initUno();
+    let css = Module.uno.com.sun.star;
+    let test = 
Module.uno.org.libreoffice.embindtest.Test(Module.getUnoComponentContext());
     console.assert(typeof test === 'object');
     {
         let v = test.getBoolean();
@@ -95,7 +95,7 @@ Module.addOnPostRun(function() {
     {
         let v = test.getEnum();
         console.log(v);
-        console.assert(v === uno.org.libreoffice.embindtest.Enum.E_2);
+        console.assert(v === Module.uno.org.libreoffice.embindtest.Enum.E_2);
         console.assert(test.isEnum(v));
     }
     {
@@ -266,12 +266,12 @@ Module.addOnPostRun(function() {
     {
         let v = test.getAnyEnum();
         console.log(v);
-        console.assert(v.get() === uno.org.libreoffice.embindtest.Enum.E_2);
+        console.assert(v.get() === 
Module.uno.org.libreoffice.embindtest.Enum.E_2);
         console.assert(test.isAnyEnum(v));
         v.delete();
         let a = new Module.uno_Any(
             Module.uno_Type.Enum('org.libreoffice.embindtest.Enum'),
-            uno.org.libreoffice.embindtest.Enum.E_2);
+            Module.uno.org.libreoffice.embindtest.Enum.E_2);
         console.assert(test.isAnyEnum(a));
         a.delete();
     }
@@ -464,9 +464,9 @@ Module.addOnPostRun(function() {
         let e2 = v.get(2);
         let s = e2.get();
         console.assert(s.size() === 3);
-        console.assert(s.get(0) === uno.org.libreoffice.embindtest.Enum.E_2);
-        console.assert(s.get(1) === uno.org.libreoffice.embindtest.Enum.E3);
-        console.assert(s.get(2) === uno.org.libreoffice.embindtest.Enum.E_10);
+        console.assert(s.get(0) === 
Module.uno.org.libreoffice.embindtest.Enum.E_2);
+        console.assert(s.get(1) === 
Module.uno.org.libreoffice.embindtest.Enum.E3);
+        console.assert(s.get(2) === 
Module.uno.org.libreoffice.embindtest.Enum.E_10);
         s.delete();
         e2.delete();
         console.assert(test.isSequenceAny(v));
@@ -495,9 +495,9 @@ Module.addOnPostRun(function() {
         let v = test.getSequenceEnum();
         console.log(v);
         console.assert(v.size() === 3);
-        console.assert(v.get(0) === uno.org.libreoffice.embindtest.Enum.E_2);
-        console.assert(v.get(1) === uno.org.libreoffice.embindtest.Enum.E3);
-        console.assert(v.get(2) === uno.org.libreoffice.embindtest.Enum.E_10);
+        console.assert(v.get(0) === 
Module.uno.org.libreoffice.embindtest.Enum.E_2);
+        console.assert(v.get(1) === 
Module.uno.org.libreoffice.embindtest.Enum.E3);
+        console.assert(v.get(2) === 
Module.uno.org.libreoffice.embindtest.Enum.E_10);
         console.assert(test.isSequenceEnum(v));
         v.delete();
     }
@@ -585,7 +585,7 @@ Module.addOnPostRun(function() {
         console.assert(v15.val.get(0) === 'foo');
         console.assert(v15.val.get(1) === 'barr');
         console.assert(v15.val.get(2) === 'bazzz');
-        console.assert(v16.val === uno.org.libreoffice.embindtest.Enum.E_2);
+        console.assert(v16.val === 
Module.uno.org.libreoffice.embindtest.Enum.E_2);
         console.assert(v17.val.m1 === -123456);
         console.assert(v17.val.m2 === 100.5);
         console.assert(v17.val.m3 === 'hä');
@@ -611,26 +611,29 @@ Module.addOnPostRun(function() {
         v17.delete();
         v18.delete();
     }
-    console.assert(uno.org.libreoffice.embindtest.Constants.Boolean === true);
-    
console.assert(test.isBoolean(uno.org.libreoffice.embindtest.Constants.Boolean));
-    console.assert(uno.org.libreoffice.embindtest.Constants.Byte === -12);
-    console.assert(test.isByte(uno.org.libreoffice.embindtest.Constants.Byte));
-    console.assert(uno.org.libreoffice.embindtest.Constants.Short === -1234);
-    
console.assert(test.isShort(uno.org.libreoffice.embindtest.Constants.Short));
-    console.assert(uno.org.libreoffice.embindtest.Constants.UnsignedShort === 
54321);
-    
console.assert(test.isUnsignedShort(uno.org.libreoffice.embindtest.Constants.UnsignedShort));
-    console.assert(uno.org.libreoffice.embindtest.Constants.Long === -123456);
-    console.assert(test.isLong(uno.org.libreoffice.embindtest.Constants.Long));
-    console.assert(uno.org.libreoffice.embindtest.Constants.UnsignedLong === 
3456789012);
-    
console.assert(test.isUnsignedLong(uno.org.libreoffice.embindtest.Constants.UnsignedLong));
-    console.assert(uno.org.libreoffice.embindtest.Constants.Hyper === 
-123456789n);
-    
console.assert(test.isHyper(uno.org.libreoffice.embindtest.Constants.Hyper));
-    console.assert(uno.org.libreoffice.embindtest.Constants.UnsignedHyper === 
9876543210n);
-    
console.assert(test.isUnsignedHyper(uno.org.libreoffice.embindtest.Constants.UnsignedHyper));
-    console.assert(uno.org.libreoffice.embindtest.Constants.Float === -10.25);
-    
console.assert(test.isFloat(uno.org.libreoffice.embindtest.Constants.Float));
-    console.assert(uno.org.libreoffice.embindtest.Constants.Double === 100.5);
-    
console.assert(test.isDouble(uno.org.libreoffice.embindtest.Constants.Double));
+    console.assert(Module.uno.org.libreoffice.embindtest.Constants.Boolean === 
true);
+    
console.assert(test.isBoolean(Module.uno.org.libreoffice.embindtest.Constants.Boolean));
+    console.assert(Module.uno.org.libreoffice.embindtest.Constants.Byte === 
-12);
+    
console.assert(test.isByte(Module.uno.org.libreoffice.embindtest.Constants.Byte));
+    console.assert(Module.uno.org.libreoffice.embindtest.Constants.Short === 
-1234);
+    
console.assert(test.isShort(Module.uno.org.libreoffice.embindtest.Constants.Short));
+    
console.assert(Module.uno.org.libreoffice.embindtest.Constants.UnsignedShort 
=== 54321);
+    console.assert(
+        
test.isUnsignedShort(Module.uno.org.libreoffice.embindtest.Constants.UnsignedShort));
+    console.assert(Module.uno.org.libreoffice.embindtest.Constants.Long === 
-123456);
+    
console.assert(test.isLong(Module.uno.org.libreoffice.embindtest.Constants.Long));
+    
console.assert(Module.uno.org.libreoffice.embindtest.Constants.UnsignedLong === 
3456789012);
+    console.assert(
+        
test.isUnsignedLong(Module.uno.org.libreoffice.embindtest.Constants.UnsignedLong));
+    console.assert(Module.uno.org.libreoffice.embindtest.Constants.Hyper === 
-123456789n);
+    
console.assert(test.isHyper(Module.uno.org.libreoffice.embindtest.Constants.Hyper));
+    
console.assert(Module.uno.org.libreoffice.embindtest.Constants.UnsignedHyper 
=== 9876543210n);
+    console.assert(
+        
test.isUnsignedHyper(Module.uno.org.libreoffice.embindtest.Constants.UnsignedHyper));
+    console.assert(Module.uno.org.libreoffice.embindtest.Constants.Float === 
-10.25);
+    
console.assert(test.isFloat(Module.uno.org.libreoffice.embindtest.Constants.Float));
+    console.assert(Module.uno.org.libreoffice.embindtest.Constants.Double === 
100.5);
+    
console.assert(test.isDouble(Module.uno.org.libreoffice.embindtest.Constants.Double));
     try {
         test.throwRuntimeException();
         console.assert(false);
@@ -641,71 +644,7 @@ Module.addOnPostRun(function() {
         //TODO: verify css.uno.RuntimeException's Message startsWith('test')
         decrementExceptionRefcount(e);
     }
-    const unoObject = function(interfaces, obj) {
-        interfaces = ['com.sun.star.lang.XTypeProvider'].concat(interfaces);
-        obj.impl_refcount = 0;
-        obj.impl_types = new Module.uno_Sequence_type(
-            interfaces.length, Module.uno_Sequence.FromSize);
-        for (let i = 0; i !== interfaces.length; ++i) {
-            obj.impl_types.set(i, Module.uno_Type.Interface(interfaces[i]));
-        }
-        obj.impl_implementationId = new Module.uno_Sequence_byte([]);
-        obj.queryInterface = function(type) {
-            for (const i in obj._types) {
-                if (i === type.toString()) {
-                    return new Module.uno_Any(
-                        type,
-                        Module['uno_Type_' + i.replace(/\./g, '$')].reference(
-                            obj._impl[obj._types[i]]));
-                }
-            }
-            return new Module.uno_Any(Module.uno_Type.Void(), undefined);
-        };
-        obj.acquire = function() { ++obj.impl_refcount; };
-        obj.release = function() {
-            if (--obj.impl_refcount === 0) {
-                for (const i in obj._impl) {
-                    i.delete();
-                }
-                obj.impl_types.delete();
-                obj.impl_implementationId.delete();
-            }
-        };
-        obj.getTypes = function() { return obj.impl_types; };
-        obj.getImplementationId = function() { return 
obj.impl_implementationId; };
-        obj._impl = {};
-        interfaces.forEach((i) => {
-            obj._impl[i] = Module['uno_Type_' + i.replace(/\./g, 
'$')].implement(obj);
-        });
-        obj._types = {};
-        const walk = function(td, impl) {
-            const name = td.getName();
-            if (!Object.hasOwn(obj._types, name)) {
-                if (td.getTypeClass() != css.uno.TypeClass.INTERFACE) {
-                    throw new Error('not a UNO interface type: ' + name);
-                }
-                obj._types[name] = impl;
-                const bases = 
css.reflection.XInterfaceTypeDescription2.query(td).getBaseTypes();
-                for (let i = 0; i !== bases.size(); ++i) {
-                    walk(bases.get(i), impl)
-                }
-                bases.delete();
-            }
-        };
-        const tdmAny = Module.getUnoComponentContext().getValueByName(
-            '/singletons/com.sun.star.reflection.theTypeDescriptionManager');
-        const tdm = css.container.XHierarchicalNameAccess.query(tdmAny.get());
-        interfaces.forEach((i) => {
-            const td = tdm.getByHierarchicalName(i);
-            walk(css.reflection.XTypeDescription.query(td.get()), i);
-            td.delete();
-        })
-        tdmAny.delete();
-        obj._types['com.sun.star.uno.XInterface'] = 
'com.sun.star.lang.XTypeProvider';
-        obj.acquire();
-        return obj;
-    };
-    const obj = unoObject(
+    const obj = Module.unoObject(
         ['com.sun.star.task.XJob', 'com.sun.star.task.XJobExecutor'],
         {
             execute(args) {

Reply via email to