Creating a Firefox extension is nothing short of an adventure. I was able to get started pretty quickly, thanks to this web-based quick-start wizard, all the boilerplate code was generated in literally no time.
Now, onto the actual functionality of the extension. I have to implement a protocol handler for the 9P protocol, which essentially means you type in
ninep://sources.cs.bell-labs.com/ and start reading files right off the browser window. (
ninep:// because a URL can’t start with a number)
This page provides some useful insights and code snippets on the subject of adding a new protocol handler. I was able to get as far as displaying a Glenda image whenever you type in a URL beginning with
The way this works is you create an XPCOM component that implements a standard interface. Specifically, the
newChannel() method is where all the action is. It receives a URL and you do something and return an nsIChannel. Mozilla provides standard nsIChannel implementations for popular protocols such as http, ftp and even the ubiquitous
The intuitive thing to do here would be to do all my 9P processing in the
newChannel() implementation and return a stream in a standard channel. However, that’s not going to work, since
newChannel() would then block and the UI would actually freeze until the 9P transaction completes. Sub-optimal.
The “proper” way to do this would be to create my own implementation of
nsIChannel. That way I just create a new