git: 4e77dee79c17 - main - www/librewolf: New port

From: Jesper Schmitz Mouridsen <jsm_at_FreeBSD.org>
Date: Sat, 21 Jan 2023 18:35:16 UTC
The branch main has been updated by jsm:

URL: https://cgit.FreeBSD.org/ports/commit/?id=4e77dee79c17245e0c3b4b98af5a718ed2c5eb81

commit 4e77dee79c17245e0c3b4b98af5a718ed2c5eb81
Author:     Martin Filla <freebsd@sysctl.cz>
AuthorDate: 2023-01-19 18:52:57 +0000
Commit:     Jesper Schmitz Mouridsen <jsm@FreeBSD.org>
CommitDate: 2023-01-21 18:34:48 +0000

    www/librewolf: New port
    
    PR:     258503
---
 www/Makefile                                       |     1 +
 www/librewolf/Makefile                             |    99 +
 www/librewolf/distinfo                             |     5 +
 www/librewolf/files/RustTabs.jsm                   |  1181 +
 www/librewolf/files/UniFFIGeneratedScaffolding.cpp |   283 +
 www/librewolf/files/patch-addon-search             |    53 +
 .../files/patch-browser-app-nsBrowserApp.cpp       |    14 +
 www/librewolf/files/patch-bug1269654_comment5      |    43 +
 www/librewolf/files/patch-bug1504834_comment10     |    36 +
 www/librewolf/files/patch-bug1504834_comment5      |    85 +
 www/librewolf/files/patch-bug1504834_comment9      |    49 +
 www/librewolf/files/patch-bug1559213               |   123 +
 www/librewolf/files/patch-bug1612181_comment1      |   191 +
 www/librewolf/files/patch-bug1626236               |    92 +
 www/librewolf/files/patch-bug1628567               |    32 +
 www/librewolf/files/patch-bug1640982               |    17 +
 www/librewolf/files/patch-bug1659612               |    35 +
 www/librewolf/files/patch-bug1680982               |   388 +
 www/librewolf/files/patch-bug1716707               |    56 +
 www/librewolf/files/patch-bug847568                |   292 +
 .../files/patch-dom_media_flac_FlacDecoder.cpp     |    23 +
 www/librewolf/files/patch-env-api-keys             |    21 +
 .../files/patch-gfx_skia_skia_src_core_SkCpu.cpp   |    32 +
 www/librewolf/files/patch-i386-protobuf-alignment  |    15 +
 www/librewolf/files/patch-libwebrtc-generated      | 89350 +++++++++++++++++++
 www/librewolf/files/patch-libwebrtc-powerpc64      |   264 +
 .../files/patch-memory_mozalloc_throw__gcc.h       |    69 +
 www/librewolf/files/patch-pipewire_init            |   120 +
 ...patch-python_mozbuild_mozbuild_gn__processor.py |    39 +
 ...rd__party_libwebrtc_build_config_BUILDCONFIG.gn |    37 +
 ...third__party_libwebrtc_rtc__base_ip__address.cc |    23 +
 ..._party_libwebrtc_third__party_pffft_src_pffft.c |    10 +
 .../files/patch-third__party_sqlite3_src_moz.build |    12 +
 .../files/patch-tools_profiler_core_patform.cpp    |    51 +
 www/librewolf/pkg-descr                            |    13 +
 www/librewolf/pkg-message                          |    50 +
 36 files changed, 93204 insertions(+)

diff --git a/www/Makefile b/www/Makefile
index 7b2d18979e1d..dd69efd4b9c4 100644
--- a/www/Makefile
+++ b/www/Makefile
@@ -297,6 +297,7 @@
     SUBDIR += libnghttp3
     SUBDIR += libresonic-standalone
     SUBDIR += librespeed
+    SUBDIR += librewolf
     SUBDIR += librtcdcpp
     SUBDIR += libwpe
     SUBDIR += libwww
diff --git a/www/librewolf/Makefile b/www/librewolf/Makefile
new file mode 100644
index 000000000000..7741caaa7d7d
--- /dev/null
+++ b/www/librewolf/Makefile
@@ -0,0 +1,99 @@
+PORTNAME=	librewolf
+DISTVERSION=	108.0.1-1
+CATEGORIES=	www wayland
+MASTER_SITES=	https://gitlab.com/api/v4/projects/32320088/packages/generic/librewolf-source/${DISTVERSION}/
+DISTNAME=	${PORTNAME}-${DISTVERSION}.source.
+EXTRACT_SUFX=	tar.gz
+
+PATCH_SITES=	https://gitlab.com/librewolf-community/browser/source/-/raw/${DISTVERSION}/
+PATCHFILES=	patches/unity-menubar.patch?inline=false:-p1
+
+MAINTAINER=	freebsd@sysctl.cz
+COMMENT=	Custom version of Firefox, focused on privacy, security and freedom
+WWW=		https://librewolf.net/
+
+BUILD_DEPENDS=	nspr>=4.32:devel/nspr \
+		nss>=3.84:security/nss \
+		icu>=71.1:devel/icu \
+		libevent>=2.1.8:devel/libevent \
+		harfbuzz>=4.4.1:print/harfbuzz \
+		graphite2>=1.3.14:graphics/graphite2 \
+		png>=1.6.37:graphics/png \
+		dav1d>=1.0.0:multimedia/dav1d \
+		libvpx>=1.12.0:multimedia/libvpx \
+		${PYTHON_PKGNAMEPREFIX}sqlite3>0:databases/py-sqlite3@${PY_FLAVOR} \
+		v4l_compat>0:multimedia/v4l_compat \
+		autoconf2.13:devel/autoconf2.13 \
+		nasm:devel/nasm \
+		yasm:devel/yasm \
+		zip:archivers/zip
+
+.include "${.CURDIR}/../../www/firefox/Makefile.options"
+.include <bsd.port.options.mk>
+.if ${ARCH} != powerpc64
+BUILD_DEPENDS+=	${LOCALBASE}/share/wasi-sysroot/lib/wasm32-wasi/libc++abi.a:devel/wasi-libcxx \
+		${LOCALBASE}/share/wasi-sysroot/lib/wasm32-wasi/libc.a:devel/wasi-libc \
+		${LOCALBASE}/llvm${LLVM_DEFAULT}/lib/clang/${LLVM_VERSION}/lib/wasi/libclang_rt.builtins-wasm32.a:devel/wasi-compiler-rt${LLVM_DEFAULT}
+.endif
+
+USES=		tar:xz
+USE_GECKO=	gecko
+USE_MOZILLA=	-sqlite
+CFLAGS_powerpc64le=	-DSQLITE_BYTEORDER=1234
+# work around bindgen not finding ICU, e.g.
+# dist/include/mozilla/intl/ICU4CGlue.h:8:10: fatal error: 'unicode/uenum.h' file not found, err: true
+CONFIGURE_ENV+=	BINDGEN_CFLAGS="-I${LOCALBASE}/include"
+CONFIGURE_ENV+=	MOZ_REQUIRE_SIGNING=""
+MOZ_EXPORT+=	MOZ_TELEMETRY_REPORTING="" \
+		MOZILLA_OFFICIAL="1" \
+		MOZ_OFFICIAL_BRANDING="1" \
+		MOZ_APP_DISPLAYNAME="Librewolf" \
+		MOZ_APP_NAME="librewolf"
+
+MOZ_OPTIONs=	--enable-application=browser \
+		--allow-addon-sideload \
+		--disable-crashreporter \
+		--disable-debug \
+		--disable-default-browser-agent \
+		--disable-tests \
+		--disable-updater \
+		--enable-hardening \
+		--enable-optimize \
+		--enable-release \
+		--enable-rust-simd \
+		--with-app-name=librewolf \
+		--with-branding=browser/branding/librewolf \
+		--with-unsigned-addon-scopes=app,system \
+		--with-l10n-base=$PWD/browser/locales/l10n \
+		--enable-bootstrap \
+		MOZ_CRASHREPORTER=0 \
+		MOZ_DATA_REPORTING=0 \
+		MOZ_SERVICES_HEALTHREPORT=0
+
+# helpful when testing beta
+WRKSRC=		${WRKDIR}/${PORTNAME}-${DISTVERSION}
+
+FIREFOX_ICON_SRC=	${PREFIX}/lib/${MOZILLA}/browser/chrome/icons/default/default48.png
+FIREFOX_DESKTOP=	${MOZSRC}/taskcluster/docker/firefox-snap/firefox.desktop
+
+.if ${ARCH} == powerpc64
+MOZ_OPTIONS+=	--disable-webrtc --without-wasm-sandboxed-libraries
+.else
+BUILD_DEPENDS+=	${LOCALBASE}/share/wasi-sysroot/lib/wasm32-wasi/libc++abi.a:devel/wasi-libcxx \
+		${LOCALBASE}/share/wasi-sysroot/lib/wasm32-wasi/libc.a:devel/wasi-libc \
+		${LOCALBASE}/llvm${LLVM_DEFAULT}/lib/clang/${LLVM_VERSION}/lib/wasi/libclang_rt.builtins-wasm32.a:devel/wasi-compiler-rt${LLVM_DEFAULT}
+MOZ_OPTIONS+=	--with-wasi-sysroot=${LOCALBASE}/share/wasi-sysroot
+.endif
+
+post-patch:
+	@${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' \
+		${WRKSRC}/browser/app/nsBrowserApp.cpp
+	@${RM} ${WRKSRC}/mozconfig
+
+post-install:
+	${CP} ${FIREFOX_DESKTOP} ${STAGEDIR}${PREFIX}/share/applications/librewolf.desktop
+	${REINPLACE_CMD} -e 's|Firefox|Librewolf|g' ${STAGEDIR}${PREFIX}/share/applications/librewolf.desktop
+	${REINPLACE_CMD} -e 's|firefox|librewolf|g' ${STAGEDIR}${PREFIX}/share/applications/librewolf.desktop
+	${REINPLACE_CMD} -e 's|Icon=.*|Icon=${FIREFOX_ICON_SRC}|g' ${STAGEDIR}${PREFIX}/share/applications/librewolf.desktop
+
+.include <bsd.port.mk>
diff --git a/www/librewolf/distinfo b/www/librewolf/distinfo
new file mode 100644
index 000000000000..9ce5561a7db6
--- /dev/null
+++ b/www/librewolf/distinfo
@@ -0,0 +1,5 @@
+TIMESTAMP = 1671892824
+SHA256 (librewolf-108.0.1-1.source.tar.gz) = d1978f870ebddbcb71e92da9887e6de99818c4d8045642c46a5b3d2e2b970e81
+SIZE (librewolf-108.0.1-1.source.tar.gz) = 828438372
+SHA256 (patches/unity-menubar.patch?inline=false) = 84c03a4eb5dcc1bb9e2cfc343e0b98bbbc8dc791647747082d3f50ba638de965
+SIZE (patches/unity-menubar.patch?inline=false) = 163635
diff --git a/www/librewolf/files/RustTabs.jsm b/www/librewolf/files/RustTabs.jsm
new file mode 100644
index 000000000000..95b1bd035b17
--- /dev/null
+++ b/www/librewolf/files/RustTabs.jsm
@@ -0,0 +1,1181 @@
+// This file was autogenerated by the `uniffi-bindgen-gecko-js` crate.
+// Trust me, you don't want to mess with it!
+
+
+
+"use strict";
+
+var EXPORTED_SYMBOLS = [];
+
+// Write/Read data to/from an ArrayBuffer
+class ArrayBufferDataStream {
+    constructor(arrayBuffer) {
+        this.dataView = new DataView(arrayBuffer);
+        this.pos = 0;
+    }
+
+    readUint8() {
+        let rv = this.dataView.getUint8(this.pos);
+        this.pos += 1;
+        return rv;
+    }
+
+    writeUint8(value) {
+        this.dataView.setUint8(this.pos, value);
+        this.pos += 1;
+    }
+
+    readUint16() {
+        let rv = this.dataView.getUint16(this.pos);
+        this.pos += 2;
+        return rv;
+    }
+
+    writeUint16(value) {
+        this.dataView.setUint16(this.pos, value);
+        this.pos += 2;
+    }
+
+    readUint32() {
+        let rv = this.dataView.getUint32(this.pos);
+        this.pos += 4;
+        return rv;
+    }
+
+    writeUint32(value) {
+        this.dataView.setUint32(this.pos, value);
+        this.pos += 4;
+    }
+
+    readUint64() {
+        let rv = this.dataView.getBigUint64(this.pos);
+        this.pos += 8;
+        return Number(rv);
+    }
+
+    writeUint64(value) {
+        this.dataView.setBigUint64(this.pos, BigInt(value));
+        this.pos += 8;
+    }
+
+
+    readInt8() {
+        let rv = this.dataView.getInt8(this.pos);
+        this.pos += 1;
+        return rv;
+    }
+
+    writeInt8(value) {
+        this.dataView.setInt8(this.pos, value);
+        this.pos += 1;
+    }
+
+    readInt16() {
+        let rv = this.dataView.getInt16(this.pos);
+        this.pos += 2;
+        return rv;
+    }
+
+    writeInt16(value) {
+        this.dataView.setInt16(this.pos, value);
+        this.pos += 2;
+    }
+
+    readInt32() {
+        let rv = this.dataView.getInt32(this.pos);
+        this.pos += 4;
+        return rv;
+    }
+
+    writeInt32(value) {
+        this.dataView.setInt32(this.pos, value);
+        this.pos += 4;
+    }
+
+    readInt64() {
+        let rv = this.dataView.getBigInt64(this.pos);
+        this.pos += 8;
+        return Number(rv);
+    }
+
+    writeInt64(value) {
+        this.dataView.setBigInt64(this.pos, BigInt(value));
+        this.pos += 8;
+    }
+
+
+    readFloat32() {
+        let rv = this.dataView.getFloat32(this.pos);
+        this.pos += 4;
+        return rv;
+    }
+
+    writeFloat32(value) {
+        this.dataView.setFloat32(this.pos, value);
+        this.pos += 4;
+    }
+
+    readFloat64() {
+        let rv = this.dataView.getFloat64(this.pos);
+        this.pos += 8;
+        return rv;
+    }
+
+    writeFloat64(value) {
+        this.dataView.setFloat64(this.pos, value);
+        this.pos += 8;
+    }
+
+
+    writeString(value) {
+      const encoder = new TextEncoder();
+      // Note: in order to efficiently write this data, we first write the
+      // string data, reserving 4 bytes for the size.
+      const dest = new Uint8Array(this.dataView.buffer, this.pos + 4);
+      const encodeResult = encoder.encodeInto(value, dest);
+      if (encodeResult.read != value.length) {
+        throw new UniFFIError(
+            "writeString: out of space when writing to ArrayBuffer.  Did the computeSize() method returned the wrong result?"
+        );
+      }
+      const size = encodeResult.written;
+      // Next, go back and write the size before the string data
+      this.dataView.setUint32(this.pos, size);
+      // Finally, advance our position past both the size and string data
+      this.pos += size + 4;
+    }
+
+    readString() {
+      const decoder = new TextDecoder();
+      const size = this.readUint32();
+      const source = new Uint8Array(this.dataView.buffer, this.pos, size)
+      const value = decoder.decode(source);
+      this.pos += size;
+      return value;
+    }
+
+    // Reads a TabsStore pointer from the data stream
+    // UniFFI Pointers are **always** 8 bytes long. That is enforced
+    // by the C++ and Rust Scaffolding code.
+    readPointerTabsStore() {
+        const pointerId = 0; // tabs:TabsStore
+        const res = UniFFIScaffolding.readPointer(pointerId, this.dataView.buffer, this.pos);
+        this.pos += 8;
+        return res;
+    }
+
+    // Writes a TabsStore pointer into the data stream
+    // UniFFI Pointers are **always** 8 bytes long. That is enforced
+    // by the C++ and Rust Scaffolding code.
+    writePointerTabsStore(value) {
+        const pointerId = 0; // tabs:TabsStore
+        UniFFIScaffolding.writePointer(pointerId, value, this.dataView.buffer, this.pos);
+        this.pos += 8;
+    }
+    
+
+    // Reads a TabsBridgedEngine pointer from the data stream
+    // UniFFI Pointers are **always** 8 bytes long. That is enforced
+    // by the C++ and Rust Scaffolding code.
+    readPointerTabsBridgedEngine() {
+        const pointerId = 1; // tabs:TabsBridgedEngine
+        const res = UniFFIScaffolding.readPointer(pointerId, this.dataView.buffer, this.pos);
+        this.pos += 8;
+        return res;
+    }
+
+    // Writes a TabsBridgedEngine pointer into the data stream
+    // UniFFI Pointers are **always** 8 bytes long. That is enforced
+    // by the C++ and Rust Scaffolding code.
+    writePointerTabsBridgedEngine(value) {
+        const pointerId = 1; // tabs:TabsBridgedEngine
+        UniFFIScaffolding.writePointer(pointerId, value, this.dataView.buffer, this.pos);
+        this.pos += 8;
+    }
+    
+}
+
+function handleRustResult(result, liftCallback, liftErrCallback) {
+    switch (result.code) {
+        case "success":
+            return liftCallback(result.data);
+
+        case "error":
+            throw liftErrCallback(result.data);
+
+        case "internal-error":
+            let message = result.internalErrorMessage;
+            if (message) {
+                throw new UniFFIInternalError(message);
+            } else {
+                throw new UniFFIInternalError("Unknown error");
+            }
+
+        default:
+            throw new UniFFIError(`Unexpected status code: ${result.code}`);
+    }
+}
+
+class UniFFIError {
+    constructor(message) {
+        this.message = message;
+    }
+}
+
+class UniFFIInternalError extends UniFFIError {}
+
+// Base class for FFI converters
+class FfiConverter {
+    static checkType(name, value) {
+        if (value === undefined ) {
+            throw TypeError(`${name} is undefined`);
+        }
+        if (value === null ) {
+            throw TypeError(`${name} is null`);
+        }
+    }
+}
+
+// Base class for FFI converters that lift/lower by reading/writing to an ArrayBuffer
+class FfiConverterArrayBuffer extends FfiConverter {
+    static lift(buf) {
+        return this.read(new ArrayBufferDataStream(buf));
+    }
+
+    static lower(value) {
+        const buf = new ArrayBuffer(this.computeSize(value));
+        const dataStream = new ArrayBufferDataStream(buf);
+        this.write(dataStream, value);
+        return buf;
+    }
+}
+
+// Symbols that are used to ensure that Object constructors
+// can only be used with a proper UniFFI pointer
+const uniffiObjectPtr = Symbol("uniffiObjectPtr");
+const constructUniffiObject = Symbol("constructUniffiObject");
+
+class FfiConverterI64 extends FfiConverter {
+    static checkType(name, value) {
+        super.checkType(name, value);
+        if (!Number.isSafeInteger(value)) {
+            throw TypeError(`${name} exceeds the safe integer bounds (${value})`);
+        }
+    }
+    static computeSize() {
+        return 8;
+    }
+    static lift(value) {
+        return value;
+    }
+    static lower(value) {
+        return value;
+    }
+    static write(dataStream, value) {
+        dataStream.writeInt64(value)
+    }
+    static read(dataStream) {
+        return dataStream.readInt64()
+    }
+}
+
+// Export the FFIConverter object to make external types work.
+EXPORTED_SYMBOLS.push("FfiConverterI64");
+
+class FfiConverterString extends FfiConverter {
+    static lift(buf) {
+        const decoder = new TextDecoder();
+        const utf8Arr = new Uint8Array(buf);
+        return decoder.decode(utf8Arr);
+    }
+    static lower(value) {
+        const encoder = new TextEncoder();
+        return encoder.encode(value).buffer;
+    }
+
+    static write(dataStream, value) {
+        dataStream.writeString(value);
+    }
+
+    static read(dataStream) {
+        return dataStream.readString();
+    }
+
+    static computeSize(value) {
+        const encoder = new TextEncoder();
+        return 4 + encoder.encode(value).length
+    }
+}
+
+// Export the FFIConverter object to make external types work.
+EXPORTED_SYMBOLS.push("FfiConverterString");
+
+class TabsBridgedEngine {
+    // Use `init` to instantiate this class.
+    // DO NOT USE THIS CONSTRUCTOR DIRECTLY
+    constructor(opts) {
+        if (!Object.prototype.hasOwnProperty.call(opts, constructUniffiObject)) {
+            throw new UniFFIError("Attempting to construct an object using the JavaScript constructor directly" +
+            "Please use a UDL defined constructor, or the init function for the primary constructor")
+        }
+        if (!opts[constructUniffiObject] instanceof UniFFIPointer) {
+            throw new UniFFIError("Attempting to create a UniFFI object with a pointer that is not an instance of UniFFIPointer")
+        }
+        this[uniffiObjectPtr] = opts[constructUniffiObject];
+    }
+    lastSync() {
+    const liftResult = (result) => FfiConverterI64.lift(result);
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            7, // tabs:tabs_af8e_TabsBridgedEngine_last_sync
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    setLastSync(lastSync) {
+    const liftResult = (result) => undefined;
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        FfiConverterI64.checkType("lastSync", lastSync);
+        return UniFFIScaffolding.callAsync(
+            8, // tabs:tabs_af8e_TabsBridgedEngine_set_last_sync
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+            FfiConverterI64.lower(lastSync),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    syncId() {
+    const liftResult = (result) => FfiConverterOptionalstring.lift(result);
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            9, // tabs:tabs_af8e_TabsBridgedEngine_sync_id
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    resetSyncId() {
+    const liftResult = (result) => FfiConverterString.lift(result);
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            10, // tabs:tabs_af8e_TabsBridgedEngine_reset_sync_id
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    ensureCurrentSyncId(newSyncId) {
+    const liftResult = (result) => FfiConverterString.lift(result);
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        FfiConverterString.checkType("newSyncId", newSyncId);
+        return UniFFIScaffolding.callAsync(
+            11, // tabs:tabs_af8e_TabsBridgedEngine_ensure_current_sync_id
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+            FfiConverterString.lower(newSyncId),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    prepareForSync(clientData) {
+    const liftResult = (result) => undefined;
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        FfiConverterString.checkType("clientData", clientData);
+        return UniFFIScaffolding.callAsync(
+            12, // tabs:tabs_af8e_TabsBridgedEngine_prepare_for_sync
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+            FfiConverterString.lower(clientData),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    syncStarted() {
+    const liftResult = (result) => undefined;
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            13, // tabs:tabs_af8e_TabsBridgedEngine_sync_started
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    storeIncoming(incomingEnvelopesAsJson) {
+    const liftResult = (result) => undefined;
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        FfiConverterSequencestring.checkType("incomingEnvelopesAsJson", incomingEnvelopesAsJson);
+        return UniFFIScaffolding.callAsync(
+            14, // tabs:tabs_af8e_TabsBridgedEngine_store_incoming
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+            FfiConverterSequencestring.lower(incomingEnvelopesAsJson),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    apply() {
+    const liftResult = (result) => FfiConverterSequencestring.lift(result);
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            15, // tabs:tabs_af8e_TabsBridgedEngine_apply
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    setUploaded(newTimestamp,uploadedIds) {
+    const liftResult = (result) => undefined;
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        FfiConverterI64.checkType("newTimestamp", newTimestamp);
+        FfiConverterSequenceTypeTabsGuid.checkType("uploadedIds", uploadedIds);
+        return UniFFIScaffolding.callAsync(
+            16, // tabs:tabs_af8e_TabsBridgedEngine_set_uploaded
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+            FfiConverterI64.lower(newTimestamp),
+            FfiConverterSequenceTypeTabsGuid.lower(uploadedIds),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    syncFinished() {
+    const liftResult = (result) => undefined;
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            17, // tabs:tabs_af8e_TabsBridgedEngine_sync_finished
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    reset() {
+    const liftResult = (result) => undefined;
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            18, // tabs:tabs_af8e_TabsBridgedEngine_reset
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    wipe() {
+    const liftResult = (result) => undefined;
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            19, // tabs:tabs_af8e_TabsBridgedEngine_wipe
+            FfiConverterTypeTabsBridgedEngine.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+
+}
+
+class FfiConverterTypeTabsBridgedEngine extends FfiConverter {
+    static lift(value) {
+        const opts = {};
+        opts[constructUniffiObject] = value;
+        return new TabsBridgedEngine(opts);
+    }
+
+    static lower(value) {
+        return value[uniffiObjectPtr];
+    }
+
+    static read(dataStream) {
+        return this.lift(dataStream.readPointerTabsBridgedEngine());
+    }
+
+    static write(dataStream, value) {
+        dataStream.writePointerTabsBridgedEngine(value[uniffiObjectPtr]);
+    }
+
+    static computeSize(value) {
+        return 8;
+    }
+}
+
+EXPORTED_SYMBOLS.push("TabsBridgedEngine");
+
+// Export the FFIConverter object to make external types work.
+EXPORTED_SYMBOLS.push("FfiConverterTypeTabsBridgedEngine");
+
+class TabsStore {
+    // Use `init` to instantiate this class.
+    // DO NOT USE THIS CONSTRUCTOR DIRECTLY
+    constructor(opts) {
+        if (!Object.prototype.hasOwnProperty.call(opts, constructUniffiObject)) {
+            throw new UniFFIError("Attempting to construct an object using the JavaScript constructor directly" +
+            "Please use a UDL defined constructor, or the init function for the primary constructor")
+        }
+        if (!opts[constructUniffiObject] instanceof UniFFIPointer) {
+            throw new UniFFIError("Attempting to create a UniFFI object with a pointer that is not an instance of UniFFIPointer")
+        }
+        this[uniffiObjectPtr] = opts[constructUniffiObject];
+    }
+    /**
+     * An async constructor for TabsStore.
+     * 
+     * @returns {Promise<TabsStore>}: A promise that resolves
+     *      to a newly constructed TabsStore
+     */
+    static init(path) {
+    const liftResult = (result) => FfiConverterTypeTabsStore.lift(result);
+    const liftError = null;
+    const functionCall = () => {
+        FfiConverterString.checkType("path", path);
+        return UniFFIScaffolding.callAsync(
+            0, // tabs:tabs_af8e_TabsStore_new
+            FfiConverterString.lower(path),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    getAll() {
+    const liftResult = (result) => FfiConverterSequenceTypeClientRemoteTabs.lift(result);
+    const liftError = null;
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            1, // tabs:tabs_af8e_TabsStore_get_all
+            FfiConverterTypeTabsStore.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    setLocalTabs(remoteTabs) {
+    const liftResult = (result) => undefined;
+    const liftError = null;
+    const functionCall = () => {
+        FfiConverterSequenceTypeRemoteTabRecord.checkType("remoteTabs", remoteTabs);
+        return UniFFIScaffolding.callAsync(
+            2, // tabs:tabs_af8e_TabsStore_set_local_tabs
+            FfiConverterTypeTabsStore.lower(this),
+            FfiConverterSequenceTypeRemoteTabRecord.lower(remoteTabs),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    registerWithSyncManager() {
+    const liftResult = (result) => undefined;
+    const liftError = null;
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            3, // tabs:tabs_af8e_TabsStore_register_with_sync_manager
+            FfiConverterTypeTabsStore.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    reset() {
+    const liftResult = (result) => undefined;
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            4, // tabs:tabs_af8e_TabsStore_reset
+            FfiConverterTypeTabsStore.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    sync(keyId,accessToken,syncKey,tokenserverUrl,localId) {
+    const liftResult = (result) => FfiConverterString.lift(result);
+    const liftError = (data) => FfiConverterTypeTabsError.lift(data);
+    const functionCall = () => {
+        FfiConverterString.checkType("keyId", keyId);
+        FfiConverterString.checkType("accessToken", accessToken);
+        FfiConverterString.checkType("syncKey", syncKey);
+        FfiConverterString.checkType("tokenserverUrl", tokenserverUrl);
+        FfiConverterString.checkType("localId", localId);
+        return UniFFIScaffolding.callAsync(
+            5, // tabs:tabs_af8e_TabsStore_sync
+            FfiConverterTypeTabsStore.lower(this),
+            FfiConverterString.lower(keyId),
+            FfiConverterString.lower(accessToken),
+            FfiConverterString.lower(syncKey),
+            FfiConverterString.lower(tokenserverUrl),
+            FfiConverterString.lower(localId),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+    bridgedEngine() {
+    const liftResult = (result) => FfiConverterTypeTabsBridgedEngine.lift(result);
+    const liftError = null;
+    const functionCall = () => {
+        return UniFFIScaffolding.callAsync(
+            6, // tabs:tabs_af8e_TabsStore_bridged_engine
+            FfiConverterTypeTabsStore.lower(this),
+        )
+    }
+    try {
+        return functionCall().then((result) => handleRustResult(result, liftResult, liftError));
+    }  catch (error) {
+        return Promise.reject(error)
+    }}
+
+}
+
+class FfiConverterTypeTabsStore extends FfiConverter {
+    static lift(value) {
+        const opts = {};
+        opts[constructUniffiObject] = value;
+        return new TabsStore(opts);
+    }
+
+    static lower(value) {
+        return value[uniffiObjectPtr];
+    }
+
+    static read(dataStream) {
+        return this.lift(dataStream.readPointerTabsStore());
+    }
+
+    static write(dataStream, value) {
+        dataStream.writePointerTabsStore(value[uniffiObjectPtr]);
+    }
+
+    static computeSize(value) {
+        return 8;
+    }
+}
+
+EXPORTED_SYMBOLS.push("TabsStore");
+
+// Export the FFIConverter object to make external types work.
+EXPORTED_SYMBOLS.push("FfiConverterTypeTabsStore");
+
+class ClientRemoteTabs {
+    constructor(clientId,clientName,deviceType,remoteTabs) {
+        FfiConverterString.checkType("clientId", clientId);
+        FfiConverterString.checkType("clientName", clientName);
+        FfiConverterTypeTabsDeviceType.checkType("deviceType", deviceType);
+        FfiConverterSequenceTypeRemoteTabRecord.checkType("remoteTabs", remoteTabs);
+        this.clientId = clientId;
+        this.clientName = clientName;
+        this.deviceType = deviceType;
+        this.remoteTabs = remoteTabs;
+    }
+    equals(other) {
+        return (
+            this.clientId == other.clientId &&
+            this.clientName == other.clientName &&
+            this.deviceType == other.deviceType &&
+            this.remoteTabs == other.remoteTabs
+        )
+    }
+}
+
+class FfiConverterTypeClientRemoteTabs extends FfiConverter {
+    static lift(buf) {
+        return this.read(new ArrayBufferDataStream(buf));
+    }
+    static lower(value) {
+        const buf = new ArrayBuffer(this.computeSize(value));
+        const dataStream = new ArrayBufferDataStream(buf);
+        this.write(dataStream, value);
+        return buf;
+    }
+    static read(dataStream) {
+        return new ClientRemoteTabs(
+            FfiConverterString.read(dataStream), 
+            FfiConverterString.read(dataStream), 
+            FfiConverterTypeTabsDeviceType.read(dataStream), 
+            FfiConverterSequenceTypeRemoteTabRecord.read(dataStream)
+        );
+    }
+    static write(dataStream, value) {
+        FfiConverterString.write(dataStream, value.clientId);
+        FfiConverterString.write(dataStream, value.clientName);
+        FfiConverterTypeTabsDeviceType.write(dataStream, value.deviceType);
+        FfiConverterSequenceTypeRemoteTabRecord.write(dataStream, value.remoteTabs);
+    }
+
+    static computeSize(value) {
+        let totalSize = 0;
+        totalSize += FfiConverterString.computeSize(value.clientId);
+        totalSize += FfiConverterString.computeSize(value.clientName);
+        totalSize += FfiConverterTypeTabsDeviceType.computeSize(value.deviceType);
+        totalSize += FfiConverterSequenceTypeRemoteTabRecord.computeSize(value.remoteTabs);
+        return totalSize
+    }
+}
+
+EXPORTED_SYMBOLS.push("ClientRemoteTabs");
+
+// Export the FFIConverter object to make external types work.
+EXPORTED_SYMBOLS.push("FfiConverterTypeClientRemoteTabs");
+
+class RemoteTabRecord {
+    constructor(title,urlHistory,icon,lastUsed) {
+        FfiConverterString.checkType("title", title);
+        FfiConverterSequencestring.checkType("urlHistory", urlHistory);
+        FfiConverterOptionalstring.checkType("icon", icon);
+        FfiConverterI64.checkType("lastUsed", lastUsed);
+        this.title = title;
+        this.urlHistory = urlHistory;
+        this.icon = icon;
+        this.lastUsed = lastUsed;
+    }
+    equals(other) {
+        return (
+            this.title == other.title &&
+            this.urlHistory == other.urlHistory &&
+            this.icon == other.icon &&
+            this.lastUsed == other.lastUsed
+        )
+    }
+}
+
+class FfiConverterTypeRemoteTabRecord extends FfiConverter {
+    static lift(buf) {
+        return this.read(new ArrayBufferDataStream(buf));
+    }
+    static lower(value) {
+        const buf = new ArrayBuffer(this.computeSize(value));
*** 92490 LINES SKIPPED ***