Introduction

Firefox is a nice browser but it becomes really cool and powerful with its Addons. My favorites are Adblock Plus and No Script. For that reason and because I never found such a "complete" sample, I want to deliver a simple sample for extending Firefox. The main focus of the article is the integration of a XP-COM component in a Firefox Addon.

XP-COM means "Cross Platform Component Object Model" and is not COM from Microsoft which is only for Windows, but XP-COM is also for Linux and MAC-OS. For that, please refer here.

For creating the barebone Addon, I used the nice wizard from Ted Mielzarek. It can be found here.

Background

Recently, I was on a Mozilla Addon Workshop and wondered about the questions of writing a Firefox Addon with XP-COM. I remembered how this is done and now I want to share my knowledge and more, my experiences. It isn't a non-trivial task and so it may have some problems. Maybe you got to dig deep to get it to work.

Using the Code

I have included 2 zip files, the first is the code of the XP-COM DLL and the second is the Addon with this DLL and some stuff. The right use is to rename downloaded "zip" as "xpi" so Firefox can install it as Addon. Then you find a button and 2 menu items in "Extras" in the Firefox. They show the implemented interfaces of the DLL and the call of the Explorer shows a system call.

For using the code, you need to install the Gecko-SDK from your machine.

To create the XP-COM code, I used the very powerful and time and energy saving Wizard. It works only in conjunction with the English Version of Visual Studio 2005.

Points of Interest

Writing an Addon is really a pain. In comparison to the Internet Explorer, it looks a little easier. Internet Explorer is more poorly documented and the documents are from the "out of date" Internet Explorer 6.

I learned a lot about XP-COM. It is like revisiting "DLL Hell". If you create DLL with dependencies, it often won't work because firefox.exe runs in its folder and doesn't see other DLLs. That's why I strongly encourage "static linking" and using the Dependency Walker.