The biggest problem we have with one codebase and our own mapping between IE and FF functions is where the interfaces differ slightly or are otherwise buggy so you cannot use a consitent approach across browsers.
You will either have a heavier helper library to make the 2 interfaces consitent for your usage, or be re writing some of the workarounds.
As we had an IE BHO first we have things like the following to map the IE stuff to FF, but depending on what you use you may find you need mappings both ways from the most detailed to the least. Here are some quick ideas for you
// Normally if you where just doing IE or FF you would use one technique for getting a different interface
// as we are mixing the code, we have macros which allows you to use a combination of code
// eg. for IE CComQIPtr<IHTMLDocument2> doc( disp );
// eg. for FF nsCOMPtr<IHTMLDocument2> doc( do_QueryInterface(disp) );
// combined in code will be CComQIPtr<IHTMLDocument2> doc( do_QueryInterface(disp) );
// FF strips off the QI, IE strips out the do_QueryInterface.
#ifdef MOZILLA
#define CComPtr nsCOMPtr
#define CComQIPtr nsCOMPtr
#define IWebBrowser2 nsIDOMWindow
#define IHTMLWindow2 nsIBrowserDOMWindow
#define IHTMLDocument2 nsIDOMHTMLDocument
#define get_Document GetDocument
#define get_type GetType
#else
// Pointer handling for nsCOMPtr vs CComPtr/CComQIPtr
#define getter_AddRefs(x) (&(x).p)
#define do_QueryInterface(x) (x)
#endif
Good Luck!