Getting a Firefox extension’s directory from within the extension
When creating a Firefox extension recently, I was surprised how much pain is involved simply in finding out, from within an extension, where that extension’s files are installed.
You have to create a ‘component’, which entails a fair chunk of unintelligible boilerplate code (well, unintelligible unless you’re much better acquainted with Firefox’s innards than developing a basic extension generally requires you to be).
Plenty of places will tell you roughly how to do it. But, after some experimentation, let me show you exactly how.
- Copy this JavaScript file into your extension’s /components directory (if that directory doesn’t exist yet, create it).
- Add these lines to your
chrome.manifest
:
component {723079F5-F880-40BB-8283-8266DEA93960} components/getExtDir.js contract @mackerron.com/getExtDir;1 {723079F5-F880-40BB-8283-8266DEA93960}
- Use it from elsewhere in your extension like so:
var own_path = Components.classes["@mackerron.com/getExtDir;1"] .createInstance().wrappedJSObject.getExtDir(); |
Update, August 2011 — Firefox 3 made this a bit less hairy, and Firefox 4 introduced a small but incompatible change. The updated code above works in Firefox 3 – 6, and most likely beyond. However, to make knowing your own directory useful (e.g. in order to locate and run an AppleScript there) you may have also to set <em:unpack>true</em:unpack>
in install.rdf
. This activates the old extension unpacking behaviour, which is deprecated because it increases load time.