Icedove-UXP

Icedove-UXP es una aplicación de correo basada en la Plataforma Unificada XUL.

Históricamente, Icedove fue un cambio de marca de Thunderbird por el proyecto Debian, con modificaciones mínimas, para resolver las disputas de marca. Debian descontinuó Icedove en febrero de 2017 después de alcanzar un acuerdo con Mozilla sobre el uso de su marca.

El equipo de Hyperbola continuó la marca Icedove en el espíritu de la libertad cultural durante varios meses. Sin embargo, se descubrieron inconsistencias, incluido el uso de fuentes no libres en el logotipo Icedove de Debian. Como Debian ya no era compatible con Icedove y alentaba a los usuarios a instalar Thunderbird con el nuevo motor Quantum, decidimos buscar la creación de un fork adecuado.

Icedove fue la segunda aplicación en ser portada con éxito a UXP por el Proyecto Hyperbola.

Información de la aplicación

Notas de portabilidad

Para preservar el conocimiento de portar una aplicación a UXP para futuros desarrolladores, esta es una guía paso a paso de cómo Icedove fue portado a la Plataforma Unificado XUL.

Obtenga la fuente y configure el entorno de compilación

Como con cualquier proyecto, lo primero que debes hacer es comenzar desde la fuente. En este caso, cualquier aplicación XUL < 52.x debería funcionar. Las versiones 60.x y superiores utilizan el llamado motor Quantum, que reemplaza a XUL en favor de las dependencias de Chromium.

Para configurar el entorno de compilación, necesitará instalar algunas dependencias. Los nombres de los paquetes pueden variar ligeramente dependiendo de su distribución de GNU/Linux. También puede consultar las notas de la LFS.

pacman -S alsa-lib dbus-glib ffmpeg gtk2 gtk3 hunspell icu libvpx libxt mime-types mozilla-common nss sqlite startup-notification ttf-font
autoconf-legacy clang diffutils gconf git imake inetutils libpulse llvm mesa pkg-config python2 quilt unzip xorg-server-xvfb yasm zip

Comenzamos con Thunderbird 52.9.1 ya que era la última versión estable en el momento de escribir este artículo. Las fuentes originales se pueden encontrar aquí: http://http.debian.net/debian/pool/main/t/thunderbird/thunderbird_52.9.1.orig.tar.xz

tar -jXf thunderbird_52.9.1.orig.tar.xz -c ~/Projects/mailclient

Una vez que haya extraído las fuentes, lo primero que debe hacer es eliminar la carpeta /mozilla. Este contiene el núcleo de mozilla-central, que reemplazaremos.

cd ~/Projects/mailclient
rm -rf mozilla

A continuación, coloque UXP como reemplazo:

git clone https://github.com/MoonchildProductions/UXP
mv UXP mozilla

Ahora prepare un mozconfig para la aplicación y colóquelo en la carpeta root. ~/Projects/mailclient en nuestro ejemplo.

Puede consultar la lista de depuración a continuación:

# Dile a UXP que compile la aplicación en la carpeta "mail"
ac_add_options --enable-application=mail


# Configuración de depuración
ac_add_options --disable-optimize
ac_add_options --enable-debug-symbols
ac_add_options --enable-debug

ac_add_options --with-pthreads

# Plataforma objetivo
ac_add_options --target=x86_64-pc-linux-gnu

# Especifique el número de núcleos de CPU
mk_add_options MOZ_MAKE_FLAGS="-j2"

# Desactive bloatware que pueda haber en la aplicación
ac_add_options --disable-accessibility
ac_add_options --disable-alsa
ac_add_options --disable-cpp-rtti
ac_add_options --disable-crashreporter
ac_add_options --disable-dbus
ac_add_options --disable-necko-wifi
ac_add_options --disable-negotiateauth
ac_add_options --disable-official-branding
ac_add_options --disable-pulseaudio
ac_add_options --disable-tests
ac_add_options --disable-updater
ac_add_options --disable-webrtc
ac_add_options --disable-safe-browsing
ac_add_options --disable-url-classifier

# Habilite algunas características útiles

# Lightning Calendar
ac_add_options --enable-calendar
# Gnome GIO
ac_add_options --enable-gio

# System Libs confirmed working:
ac_add_options --with-system-icu
ac_add_options --with-system-jpeg
ac_add_options --with-system-zlib
ac_add_options --with-system-bz2
ac_add_options --with-system-libvpx
ac_add_options --enable-system-hunspell
ac_add_options --enable-system-ffi
ac_add_options --enable-system-pixman
#ac_add_options --enable-system-sqlite # keep disabled for stability
#ac_add_options --with-system-nspr # keep disabled for stability
#ac_add_options --with-system-nss # keep disabled for stability

Desde aquí debe familiarizarse con mach build le ayudará mucho cuando comience a construir y depurar tu aplicación. Puede probar “./mozilla/mach build” en este punto, pero no se completará correctamente hasta que hayamos corregido una serie de errores de compilación.

Archivos perdidos

Ahora que su entorno de compilación está listo, debemos incluir los archivos que faltan en su aplicación. Cuando descargó las fuentes originales, Mozilla se negó a decirle que estaban incompletas. Tendrá que encontrar e instalar los archivos que faltan.

  • Todas las aplicaciones XUL necesitan un archivo llamado application.ini, que no es incluido. La variable global @MOZ_APP_VERSION@ proviene de confvars.sh, mientras que @GRE_MILESTONE@ proviene de UXP Toolkit.
  • En nuestro caso, el programa dependía de Twemoji font que no estaba incluida. Lo agregamos a la aplicación y cambiamos la ruta a una local como se ve en el commit.

Archivos eliminados

UXP es conocido por eliminar bloatware. Como tal, pasará una buena cantidad de tiempo eliminando la información que ya no es compatible con UXP.

  • UXP no utiliza “dom_webspeechrecognition.xpt” o “dom_webspeechsynth.xpt”. Usted necesita eliminar o comentar estos en package-manifest.in.
  • UXP no utiliza Security Reporter. Usted necesita eliminar o comentar estos en package-manifest.in.
  • No hay soporte para Rust. Si su aplicación tiene dependencias de Rust (MOZ_RUST_URLPARSE), deben eliminarse. Esto se vuelve un poco más complejo, por lo que es útil pasar un tiempo aplicando commits a su aplicación durante la transición a Rust y revertirlas. En nuestro caso, tuvimos la suerte de encontrar el inticial rust commit y revertirlo.
  • No hay soporte para Chromium MOZ_SANDBOX. Deberá eliminarlo de su aplicación. Aunque puede volver a encontrar los commits que agregaron esto, luego sabrá que el patrón de “XRE_XPCShellMain” es bastante fácil de eliminar de cualquier aplicación. Suele estar dentro de bloques ifdef. Puede ver nuestra eliminación aquí.

Corrección de cambios en la API

  • UXP no usa nsIURIWithQuery (tampoco lo hace Mozilla, por lo que no debería tener esto en muchas aplicaciones no heredadas). Tuvimos que respaldar la eliminación de comm-central 1326433 ya que la fuente que estábamos usando aún no tenía este parche.
  • UXP ya no permite SEC_NORMAL por razones de seguridad (tampoco lo hace Mozilla, por lo que no debería tener esto en muchas aplicaciones no heredadas). Si esto no se resuelve, su aplicación se compilará, pero obtendrá complejos errores en la aplicación con errores extraños e informativos. Encontrar este error tomó 3 días de búsqueda y uso de gdb, por lo que nos complace informarle de este problema para que no sufra la misma suerte. El backporting comm-central 1328847 solucionó este problema.
  • El administrador de complementos de UXP usa un módulo del kit de herramientas unificado. Tienes que incluir el blocklist.manifest dentro de package-manifest.in para que trabaje TychoAM correctamente. De lo contrario, la página de complementos fallará con XPCU_serviceLambda@XPCOMUtils.jsm:230:7.

En este punto, su aplicación debería estar compilando correctamente, y puede iniciarla con “./mozilla/mach run”, pero aún quedan algunos errores.

Poner en orden el diseño

  • Nuestra aplicación no hizo referencia a la pestaña de cierre de CSS, lo que provocó que no hubiera un botón de cierre. Lo agregamos a la aplicación. Dependiendo de su aplicación, es posible que necesite usar MOZ_AUSTRALIS=1 en confvars.sh para obtener el CSS adecuado para que esto funcione. No lo necesitábamos para esta aplicación, pero era necesario en Iceweasel-UXP.
  • UXP tiene un extraño problema de CSS relacionado con la barra de búsqueda. Si no se encuentra una palabra, pintará la ventana de rojo como debería, pero también creará un bloque blanco grande sobre el texto, lo que causará frustración en los usuarios de findBar. Esto parece afectar solo a las compilaciones GNU/Linux, por lo que anulamos el archivo chrome y css en nuestra aplicacion.

Haciéndolo tuyo

El resto de tu trabajo será su marca. Debería tener un buen nombre para su nueva aplicación y un logotipo adecuado.

La marca está en la carpeta /branding respectivamente. Es posible que desee modificar las imágenes con GIMP para crear su marca.

Una vez que haya elegido un buen nombre, es el momento de revisar todo el código para cambiar el Nombre de la aplicación. También puede querer renombrar el archivo preference js para fines de marca.

Es posible que desee cambiar la estructura de construcción. Aunque no lo hicimos para esta aplicación, puede consultar este commit de UXP's para mover una aplicación y los cambios de ruta respectivos en toda la aplicación.

También eliminamos un API privativo y JavaScript ofuscado) descubierto en la aplicación. Email != Web. No podemos permitir que el correo electrónico dependa de la web, o mecanismos de autenticación privativos.

Como medida final, puede desear cambiar el GUID. Aunque esto rompe la compatibilidad de extensión de la aplicación que bifurcó, esto permite mucho más personalización más adelante.

En este punto, habrá errores triviales para corregir, o características que quizás desee crear o desactivar. La elección depende de usted.