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 :
How to write such a tutorial without a complete working out of the box hello world ?./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
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 - headlessThe main code is in the file components/nsCommandLineHandler.js$ ./headless -filesize application.ini File size of : application.ini 243
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!
Comments
You can use your Fediverse (i.e. Mastodon, among many others) account to reply to this post
(Note that comments from locked accounts won't be visible on the blog, but only to me)