Here is a summary on how to run a xulrunner application on an headless
computer, or more commonly just launch xulrunner in a command line with no
windows.
By default, xulrunner try to open a XUL window defined in the
""toolkit.defaultChromeURI"" preference, so you have to set this one to an
empty value.
Then you need to have a running X server, even if it never open any window …
one simple and lightweight solution is running Xvfb. But any other X server
will do the work!
Finally, I suggest you to take the
1.9.0.14 xulrunner release which has less painfull dependencies like
libalsa (due to ogg support) and libdbus-glib.
This will avoid this kind of errors :
./xulrunner-bin: error while loading shared libraries: libasound.so.2: cannot open shared object file: No such file or directory
./xulrunner-bin: error while loading shared libraries: libdbus-glib-1.so.2: cannot open shared object file: No such file or directory
How to write such a tutorial without a complete working out of the box hello
world ?
Here is a sample command line application with linux xulrunner binaries :
headless-runner.tar.gz
$ tar zxvf headless-runner.tar.gz $ cd headless-runner $ Xvfb :2 $ export DISPLAY=:2 $ ./headless -ls -filesize application.ini LS : - application.ini - a.out - tests - components - defaults - updates - extensions - xulrunner-1.9.2a2pre.en-US.linux-x86_64.tar.bz2 - xulrunner - headless $ ./headless -filesize application.ini File size of : application.ini 243
The main code is in the file components/nsCommandLineHandler.js
CommandLineHandler.prototype.handle = function(aCmdLine){ var toggle = aCmdLine.handleFlag("ls", false); if (toggle) { dump("LS : "); var list = aCmdLine.workingDirectory.directoryEntries; while(list.hasMoreElements()) { var file = list.getNext().QueryInterface(Components.interfaces.nsIFile); dump(" - "+file.leafName+" "); } dump(" "); } var filesize = aCmdLine.handleFlagWithParam("filesize", false); if (filesize) { dump("File size of : "+filesize+" "); var file = aCmdLine.resolveFile(filesize); if (!file) return dump("Unable to find this file "); dump(" "+file.fileSize+" "); } }
For more information, check the
nsICommandLine interface of the aCmdLine object.
Last but not least, why do I try to use Xulrunner in command line whereas xpcshell and "js" commands exists?!
- First: Some tools like Mccoy are bundled as xulrunner application. And you may launch these tools on headless servers in order to build, for example, continuous integration tools!
- Second: JS shell allow you tu use only pure Javascript; Xpcshell expose all XPCOM but some part of Mozilla environnement are disabled! I was unabled to create a <canvas> element in xpcshell. There is no way to create a XUL/HTML document/element with XPCOM and hiddenWindow is disabled … So the only solution to build a tool which takes website screenshots with <canvas> was using xulrunner!