Understand How To Embed Netscape's Mozilla Browser into MFC Views

Environment: Visual C++

Sample Image

This AIN'T Bill Gates's Browser!

Introduction

This article shows how to embed the ActiveX Control created by Adam Lock for the Mozilla Browser in CViews and Dialogs in MFC applications which can easily be extended for ATL applications as well.

I have never liked Microsoft's restrictive license agreement for Internet Explorer's ActiveX Control, i.e., their WebBrowser ActiveX Control. So, if you want a browser that you can use in your applications sans Microsoft, you should consider using the Mozilla Browser because the source code is available for free and it is very easy to compile and put in any MFC or ATL project. Let me point out that both Mozilla and the ActiveX Control for Mozilla are independent projects that are not associated with either Netscape or AOL.

The source code is available free for both the ActiveX Control for Mozilla and Mozilla itself. I was able to compile the source code for both the first time I tried it with no problems whatsoever, and the binaries are available for those people who don't want to bother compiling the source code.

Anyone who looks at the source code for the native Gecko API calls will see that there are much better ways of doing things than just Microsoft's way. For example, you can use Gecko's powerful APIs which are implemented via XPCOM (COM-like) interfaces directly in your own code.

Anyone who has ever run Mozilla on Linux and experienced its lightning fast speed will find it hard to go back to ever using the very slow and often buggy Internet Explorer!

The demo project included here creates a dynamic instance of either Microsoft's WebBrowser ActiveX Control or the Mozilla ActiveX Control in a CView of an MFC SDI application. It furthers allows you to switch between these two very different browsers by setting a single variable, m_bMozilla, in the CGlobal class as follows:

CGlobal::CGlobal()
{
  ...
  // Set condition for loading either
  // Microsoft's WebBrowser ActiveX Control
  // or Mozilla's ActiveX Control
  //
  m_bMozilla = TRUE;
}

Source Code

Download Demo Project

The source code for the demo project that goes with this article does not include the binary or source code for the Mozilla ActiveX Control because the source code for the Mozilla ActiveX Control is 4.5 megs and my Web site will not bear the download traffic! But both the binary and full source code for the Mozilla ActiveX Control are available at:

http://ftp.mozilla.org/pub/mozilla/nightly/latest/embed-win32.zip
www.mozilla.org/ in subdirectory mozilla/embedding/browser/activex/src

Overview of the Mozilla ActiveX Control

The Mozilla ActiveX Control is implemented in ATL and it has a very small size of only 3-4MB for the Gecko embedding engine compared to over 10MB needed for IE. What is really cool is that the Mozilla ActiveX Control has an API that is identical to that of Internet Explorer, which makes it a breeze to implement in existing or new MFC and ATL applications because you can use your existing IE code with only a change in the CLSID. In other words, you only need to replace the CLSID_WebBrowser with CLSID_MozillaBrowser. VB developers just need to delete the IE control from their project and insert a Mozilla one with the same instance name.

The Mozilla ActiveX Control implements the IWebBrowser, IWebBrowserApp, IWebBrowser2, DWebBrowserEvents, and DWebBrowserEvents2 interfaces defined for Internet Explorer. It also implements a simple DOM, using the same COM interfaces as you find in Internet Explorer 4.0 for IHtmlDocument2, IHtmlElement, IHtmlElementCollection, and so forth. This means that you can easily parse the contents of a page programmatically and even modify the page via the the Mozilla ActiveX Control. The control works any ActiveX control-compatible container, including IE HTML pages which can contain controls. The only thing you need to do is to register the single Mozilla control, mozctlx.dll, as follows:

Type and run "regsvr32 mozctlx.dll"

Using The Mozilla Control in C++

Included in the demo project with this article is a modified wrapper class that provides stub functions for creating and calling methods from either Microsoft's WebBrowser ActivexX Control or the Mozilla ActiveX Control.

// CWebBrowser2 wrapper class for Mozilla and 
//IE WebBrowser controls 
class CWebBrowser2 : public CWnd
{
protected:
  DECLARE_DYNCREATE(CWebBrowser2)
public:
  CLSID const& GetClsid()
  {
  if ( g_Global.m_bMozilla ) {
    // For Mozilla ActiveX Control
    static CLSID const clsid
    = { 0x1339b54c, 0x3453, 0x11d2, { 0x93, 0xb9,
                                      0x0, 0x0, 
                                      0x0, 0x0, 
                                      0x0, 0x0 } };
    return clsid;
  } else {
    // For Microsoft WebBrowser ActiveX Control
    static CLSID const clsid
    = { 0x8856f961, 0x340a, 0x11d0, { 0xa9, 0x6b, 
                                      0x0, 0xc0, 
                                      0x4f, 0xd7, 
                                      0x5, 0xa2 } };
    return clsid;
  }
}

To use the Mozilla ActiveX Control requires nothing more than simply replacing the reference to CLSID_Browser with CLSID_MozillaBrowser and declaring the CLSID_MozillaBrowser as follows:

static const CLSID CLSID_MozillaBrowser=
    { 0x1339B54C, 0x3453, 0x11D2, { 0x93, 0xB9, 
                                    0x00, 0x00, 
                                    0x00, 0x00, 
                                    0x00, 0x00 } };

For ATL programmers and those who just hate MFC, you can simply use the CControlSite class that is part of the control and based on ATL and not MFC, so it is lighter and more suitable for non-MFC projects. There is a sample project called "CBrowse" on the Mozilla Web site that demonstrates how to use this class.

For Visual Basic Developers

To use the control in a Visual Basic:

  • Compile the control and ensure it is registered.
  • Right mouse over the VB control bar and select "Components...".
  • Choose "MozillaControl 1.0 Type Library" from the list of controls.
  • Voila! The Mozilla ActiveX Control will appear in the toolbar and can be directly inserted into a project.
  • You can simply replace Microsoft's WebBrowser control now with the Mozilla control. That's it!

For Really Lazy Programmers

For really lazy programmers, there is even a tool on the Mozilla Web site, called "IEPatcher", that will scan an executable or DLL and patch it to replace instances of the IE control with the Mozilla control. Just use the IEPatcher tool on an existing binary and that binary will then run using the Mozilla control instead of Microsoft's WebBrowser ActiveX control.

Remember, guys and gals, think for yourself! Don't let Microsoft sell you a bill of goods that there way is the only way or the best way...

Anyone interested in new digital production techniques for shooting 35mm movies and new methods of syndicating television programming should call me or visit my Web site.

Downloads

Download Demo Project - 124 kb



Comments

  • Proxy setting

    Posted by sanpkul on 10/06/2006 05:59am

    Is it possible to set proxy setting using xpcom for mozilla?If yse how..? Thanks in advance, Sanjay

    Reply
  • How to bypass intermediate html pages when using browser controls

    Posted by Legacy on 06/13/2003 12:00am

    Originally posted by: Shivsun

    I have specific requirement to write the html(response) pages obtained using the WebBrowser controls.So, I wrote a event handler to the OnDocumentComplete event.Inside the handler, I am caling the getDocument function and obtained the html page.When doing like this, the intermediate pages are also stored.I mean the pages which contain meta http-equvi=refresh.I need only the final response page that is diaplayed on the browser window.:-(Is there any way to do this. Please help me. Can any of you tell me the usage and significance of the option OLECMDID_HTTPEQUIV in execWB()call.Will this be helpful to solve my issue.If so, please give me some ideas on its usage.:-((

    Reply
  • CRC error

    Posted by Legacy on 05/15/2003 12:00am

    Originally posted by: yixiaolong

    Please fix it.
    

    Reply
  • how response WM_KEYDOWN message

    Posted by Legacy on 12/12/2002 12:00am

    Originally posted by: sosjudy

    i want to overloading WM_KEYDOWN message
    
    

    thand you very much

    Reply
  • CRC error

    Posted by Legacy on 11/07/2002 12:00am

    Originally posted by: Ping

    Please fix it

    Reply
  • ANGRY PROGRAMMER

    Posted by Legacy on 09/14/2002 12:00am

    Originally posted by: WHAT ARE YOU TALKING ABOUT?

    FIRST LEARN HOW TO ZIP UP A FILE SO WE DONT GET YOUR CRC ERROR MESSAGE. THEY YOU MAY COMMENT ON MICROSOFT!!!!

    Reply
  • What about security?

    Posted by Legacy on 06/08/2002 12:00am

    Originally posted by: Peter da Silva

    What about security? The biggest security problem today is that IE (that is, Microsoft's HTML control) uses a single set of type and extension "helper" bindings (they don't call it that, but that's what it is) for all applications, and uses "zones" to restrict access to 'dangerous' bindings (like, say, cmd.exe) from being used when they're encountered in "untrusted" documents.

    This seems to be inherent to Microsoft's API... that is, the API doesn't have any way to provide the table of bindings or a callback mechanism to ask the calling program what the bindings should be.

    If you duplicate Microsoft's API, aren't you opening up the possibility of cross-frame attacks again?

    Reply
  • Not MS fan, but Mozzilla is incompatible, no one eve tries to compatible with it.

    Posted by Legacy on 05/21/2002 12:00am

    Originally posted by: yoyoma

    Its said, but when someone creates a webpage these days they try to make it compatible to IE and dont care anymore about Mozzilla/Netscape/Whatever. This is the fact, its sad but true. Its not as it used to be 3-5 years ago which was the opposite, first make compatible to Netscape and then with IE ...

    Netscape is dead, MS has killed them and thats a sad fact.
    and these days IE is MUCH more compatible then Mozzilla, and thats not cause MS write "better" code or something, its cause world is driven by MS and they break standards and this way make others uncompatible/irrelevant ...

    Reply
  • How can we enumerate Netscape browsers to grab CWebBrowser of it?

    Posted by Legacy on 05/20/2002 12:00am

    Originally posted by: Chris

    There is a sample here on codeguru to grab a CWebBrowser2 from an active IE browser on the desktop. Here, you provide the control for the mozilla (netscape) WebBrowser2, but do you know how we could similarly grab the Netscape browser CWebBrowser2 pointer? Any help, thanks.

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Stories about devastating cyberattacks are plaguing the news. Why? The DNS protocol is easy to exploit. See your network the way hackers do—as an easy target. Learn how you can effectively secure your DNS infrastructure today.

  • The explosion in mobile devices and applications has generated a great deal of interest in APIs. Today's businesses are under increased pressure to make it easy to build apps, supply tools to help developers work more quickly, and deploy operational analytics so they can track users, developers, application performance, and more. Apigee Edge provides comprehensive API delivery tools and both operational and business-level analytics in an integrated platform. It is available as on-premise software or through …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds