Search code examples
javascriptc++dialogwebbrowser-controlactivex

How to disable javascript error debugging in IE WebBrowser Control


Application is using IE WebBrwoser Control. However sometimes javascript error dialogs comes up,to solve this put_silent property was used on WebBrowser element,but that disables all the dialogs.So is there a way to disable Javascript error debugging in WebBrowser control?


Solution

  • On your control do right click and click on Inspect Element. If you did not disable the IE menu, it should open the Developer window on right or bottom side. Select there the tab "Debug", click on the hexagon and check "Don't stop on exception" or "Stop on unhandled exceptions". I believe this is a global setting for the browser, so you maybe can do it just from IE.

    Debugger

    Update 1 First implement IDocHostUIHandler and wrap the external handler calls. It is declared in Mshtmhst.h so you probably have to include it. Don't forget about IUnknown members, also have to be wrapped. ATL wizards can be used to implement interfaces, but anyway you will have to understand exactly that you do:

    class MyDocHostUIHandler: public IDocHostUIHandler
    {
    public:
       IDocHostUIHandler* externalHandler;
       HRESULT EnableModeless( BOOL fEnable)
       {
          return externalHandler->EnableModeless(fEnable);
       }
       HRESULT FilterDataObject(IDataObject* pDO, IDataObject** ppDORet)
       {
          return externalHandler->FilterDataObject(pDO, ppDORet)ș
       }
       .... Wrap all the functions from External Handler like above
    };
    

    Create an instance of your class:

    MyDocHostUIHandler* myHandler = new MyDocHostUIHandler();
    

    Then in your code call like it is specified in MSDN. First you get the MSHTML object

    CComPtr<IHTMLDocument2> m_spDocument;
    hr = m_WebBrowser->get_Document(&m_spDocument);// Get the MSHTML object
    

    Then you get the existing default handler

    ComPtr<IOleObject> spOleObject;
    hr = m_spDocument.As(&spOleObject);
    ComPtr<IOleClientSite> spClientSite;//<--this will be the default handler
    hr = spOleObject->GetClientSite(&spClientSite);
    

    Save the existing handler to your class, so you will be able to wrap its functions

    //see myHandler is the instance of interface you implemented in first step
    myHandler->externalHandler = spClientSite;
    

    Get the custom doc:

    ComPtr<ICustomDoc> spCustomDoc;
    hr = m_spDocument.As(&spCustomDoc);//m_spDocument it is the pointer to your MSHTML
    

    Now replace the handler from HSMTML:

    //myHandler is the instance of class you implemented above
    spCustomDoc->SetUIHandler(myHandler); 
    

    After this step, the MSHTML should not notice anything, but you will be able to add breakpoints in your MyDocHostUIHandler class and see which function is called by your MSHTML and when.