Démarrer un projet

Information de base

  • Vendeur (compagnie ou nom du développer): ($app_vendor)
  • Nom de l'application: ($app_name)
  • Répertoire de l'application (minuscule): ($app_metaname)
  • Version: ($app_version)
  • Date de livraison (YYYYMMDD): ($app_buildid)
  • Copyright: ($app_copyright)
  • Courriel pour l'application: ($app_id)
#!/bin/bash
app_vendor=""
app_name=""
app_metaname=
app_id=
app_copyright="Copyright (C) $(date +%Y) $app_vendor"
app_version=1.0
app_buildid=$(date +%Y%m%d)

# create this hierarchy
#/$app_metaname
# /chrome
#  /content
#   main.xul
#  chrome.manifest
# /defaults
#  /preferences
#   prefs.js
# application.ini

if [ -d $app_metaname -o "x$app_metaname" = "x" ]; then
  echo "Directory \`$app_metaname' already exists"
  exit;
fi

mkdir -p $app_metaname/{chrome/content,defaults/preferences}
# touch $app_metaname/{chrome/content/main.xul,chrome/chrome.manifest,defaults/preferences/prefs.js,application.ini}

cat <<EOF > $app_metaname/application.ini
[App]
Vendor=$app_vendor
Name=$app_name
Version=$app_version
BuildID=$app_buildid
Copyright=$app_copyright
ID=$app_id

[Gecko]
MinVersion=1.8
MaxVersion=1.9.0.*
EOF

cat <<EOF > $app_metaname/chrome/chrome.manifest
content $app_metaname file:content/
EOF

cat <<EOF > $app_metaname/defaults/preferences/pref.js 
pref("toolkit.defaultChromeURI", "chrome://$app_metaname/content/main.xul");
// see window.open on MDC for chrome features (centerscreen, ...)
// pref("toolkit.defaultChromeFeatures", "chrome,dialog=no,all");
EOF

cat <<EOF > $app_metaname/chrome/content/main.xul
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>

<window id="main" title="$app_name" width="300" height="300"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <caption label="Hello World"/>
</window>
EOF

# end of create xulrunner project

Lancement de l'application

La commande xulrunner est utilisé pour lancer l'application. 

xulrunner application.ini # lancement
xulrunner application.ini -jsconsole # lancement et affichage des erreurs javascript/css

Sur debian [20080905], on retrouve xulrunner et xulrunner-1.9. Si on veut utiliser la version 1.9, on doit écrire:
xulrunner-1.9 application.ini

Fichiers modifiés lors du lancement

Lors du lancement de l'application, xulrunner ajoutera automatiquement des répertoires et des fichiers. Parmi ces répertoires et fichiers:

Dans la racine du programme:
+ extensions/
+ updates/0/

Dans le répertoire de l'usager (préférence): ~/.{$app_vendor}/{$app_name}/
Notez bien que {$app_vendor} et {$app_name} utilise les valeurs spécifiés dans le fichier application.ini 

- profiles.ini        : fichier texte contenant des informations sur le profil utilisé pour lancer l'application
+ repertoire.default/ : répertoire du profil (le premier profil a un nom automatiquement généré et est 
                        inscrit dans le profiles.ini, section Profile0, variable Path).
  - compreg.dat       : fichier texte, enregistrement des bibliothèques (XPCOM .so). On doit supprimer le 
                        fichier compreg.dat lorsqu'on modifie une bibliothèque (.so) du répertoire components/.
  - xpti.dat          : fichier texte, enregistrement des interfaces typelib (XPCOM .xpt). On doit le 
                        supprimer lorsqu'on modifie un composant (.xpt) du répertoire components/.
  - prefs.js          : autres préférences spécifiques au profil de l'utilisateurs. user_pref("nom_preference", "valeur");

Ajouter un composant XPCOM

Voir mon article sur XPCOM pour une aide sur comment compiler un composant et l'intégrer dans un projet xulrunner.

application.ini

Le fichier application.ini permet de démarrer l'application en spécifiant des informations de démarrage comme la version minimale ou maximal de Gecko (xulrunner).

Exemple

[App]
Vendor=Progysm
Name=Mon App
Version=1.0
BuildID=20090101
Copyright=Yan Morin 
ID=monapp@progysm.no-ip.org

[Gecko]
MinVersion=1.8
MaxVersion=1.9.0.*

Récupérer en Javascript application.ini

var appInfo = Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULAppInfo);
appInfo.vendor;          // [App] Vendor
appInfo.name;            // [App] Name
appInfo.ID;              // [App] ID
appInfo.version;         // [App] Version
appInfo.appBuildID;      // [App] BuildID
appInfo.platformVersion; // dépend de gecko (xulrunner)
appInfo.platformBuildID; // dépend de gecko (xulrunner)

chrome.manifest

Note: if your chrome.manifest is inside chrome/ folder, don't put chrome/ in url token.

content

content     templatechooser    content/                  # for chrome://templatechooser/content/

skin

skin myApp classic/1.0 skin/classic/myapp/                      # for chrome://myApp/skin/  (where theme is classic)

locale

Note: si on oublie le / à la fin des répertoires, il faut utiliser la syntaxe "chrome://cle/locale/dernierrepertoire/fichier.dtd".

locale branding fr-FR locale/branding/                          # for chrome://branding/locale/
locale myApp en-US locale/en-US/myapp/                          # for chrome://myApp/locale/

overlay

overlay chrome://messenger/content/messengercompose/messengercompose.xul chrome://templatechooser/content/templatechooser_overlay.xul