Vous êtes ici

Utiliser Chromium comme un toolkit généraliste

Objectif : compiler de petits programmes C++ avec les bibliothèques Chromium.

Chromium est la base open source du très connu navigateur Google Chrome.
Multi-plateforme, riche en fonctionnalités et écrit majoritairement en C++, il sert également de base à Chromium OS, un système d'exploitation complet que Google distribue également sous le nom Chrome OS afin d'équiper ses Chromebooks.

Il paraît donc évident que Chromium intègre tout le nécessaire pour afficher des fenêtres, jouer des fichiers multimédia, gérer des fichiers, le multi-threading et l'internationalisation... au strict minimum. Et comme la vie est bien faite, il est organisé en multiple bibliothèques et "tierces parties" : base pour les fonctions réutilisables, skia pour la gestion des canvas, views pour les widgets graphiques...

Sachant cela, pourquoi ne pas se server de Chromium comme d'un toolkit, ainsi qu'on le fait déjà avec GTK+, EFL, Qt.... ?

On peut lister au moins deux raisons à cela :
- l'énvironnement de compilation de Chromium est avant tout conçu pour produire un unique et énorme fichier binaire, l'exécutable chrome ; tout y est compilé statiquement afin de faciliter la redistribution. Ceci peut néanmoins être changé.
- Les développeurs de Google ne garantissent pas la stabilité de leur API. Et donc comme il faut s'y attendre, chaque sortie est susceptible de changer les fonctions ou la manière dont une fonctionnalité est implémentée.

Mais que cela ne nous empêche pas de chercher à connaître ce très puissant framework ! Allons-y maintenant :-) !


1) Installer la version "composant" de Chromium

Chromium peut être compilé dans un mode avec lequel, au lieu de produire un gigantesque fichier binaire chrome, on va séparer les bibliothéques et les construire individuellement sous les noms libbase.so, libviews.so... J'ai compilé tout ceci sous Linux, validé que cela fonctionnait sur les derniers snapshots de Tizen Common et la dernière Ubuntu 14.04 LTS (Debian 7.0 stable ne marchera pas, désolé), et ajouté les fichiers d'en-tête, .

a) Télécharger Chromium pour Ubuntu 14 LTS/Tizen Common :

- chromium-38.0.2067.0-cpb+oz-wl-UBUNTU14.tar.bz2 (71,3 Mo) (32-bits)
- chromium-38.0.2067.0-cpb+oz-wl-UBUNTU14-AMD64.tar.bz2 (114,0 Mo) (64-bits)

b) Extraire l'archive sur votre ordinateur :
tar xfvj chromium-38.0.2067.0-UBUNTU14.tar.bz2

Cela crééera 3 nouveaux répertoires dans le dossier courant : "bin", "include" and "lib".

2) (optionnel) Exécuter le navigateur (requiert Wayland)

Cette version de Chromium a été compilée avec Ozone-Wayland, un backend additionnel qui lui permet de s'afficher sous un compositeur Wayland supportant l'accélération EGL/GLESv2 (le mode software n'est pas encore supporté). Si vous n'avez pas une installation compatible, ne craignez rien, nos exemples n'en ont pas besoin ! Sinon, voici comment naviguer sur le web avec Wayland :

export XDG_RUNTIME_DIR=/run/user/$UID
./lib/chromium/content_shell --no-sandbox http://www.tarnyko.net

Voici une vidéo sous Weston.

3) Compiler et exécuter les exemples de code

Veuillez télécharger les exemples C++.

Vous aurez besoin du compilateur G++ ; voici comment l'installer sous Ubuntu :
sudo apt-get install g++
La commande de compilation sera :
g++ -std=c++11 program.cc -o program -I./include/chromium ./lib/chromium/lib/libbase.so
-----

Description des exemples


- chromium-1.cc : implémente des messages de log grâce à la classe base::Logging

LOG(INFO)

- chromium-2.cc : manipule des fichiers grâce à la classe base::FilePath

auto filepath = base::FilePath ("test.txt");
auto dirpath = base::FilePath ("/home/bob");
base::CopyFile (filepath, dirpath);
base::DeleteFile (filepath);


- chromium-3.cc : gère les arguments de ligne de commande grâce à la classe base::CommandLine

auto cmdline = base::CommandLine (argc, argv);
if (cmdline.HasSwitch ("help") && cmdline.GetArgs().empty()) {
// print help text
}


- chromium-4.cc : implémente des fonctions de callback grâce à la classe base::Callback

base::Callback callback = base::Bind (&my_function);
callback.Run ();


- chromium-5.cc : implémente des fonctions retardées et threadées grâce à la classe base::MessageLoop

base::Callback callback_delayed = base::Bind (&my_function);
auto duration = base::TimeDelta::FromSeconds (seconds);
main_loop.PostDelayedTask (FROM_HERE, callback_delayed, duration);


Et voilà !