// MozillaBrowser.cpp : Implementation of CMozillaBrowser #include "stdafx.h" #include "MozillaControl.h" #include "MozillaBrowser.h" ///////////////////////////////////////////////////////////////////////////// // CMozillaBrowser extern "C" void NS_SetupRegistry(); CMozillaBrowser::CMozillaBrowser() { m_bWindowOnly = TRUE; m_bWndLess = FALSE; m_pIWebShell = nsnull; // Create the container that handles some things for us m_pWebShellContainer = NULL; PL_InitializeEventsLib(""); // Register everything NS_SetupRegistry(); } CMozillaBrowser::~CMozillaBrowser() { } STDMETHODIMP CMozillaBrowser::InterfaceSupportsErrorInfo(REFIID riid) { static const IID* arr[] = { &IID_IMozillaBrowser, }; for (int i=0;iDestroy(); NS_RELEASE(m_pIWebShell); m_pWebShellContainer->Release(); m_pWebShellContainer = NULL; } return 0; } LRESULT CMozillaBrowser::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { /* Pass resize information down to the WebShell... */ if (m_pIWebShell) { m_pIWebShell->SetBounds(0, 0, LOWORD(lParam), HIWORD(lParam)); } return 0; } HRESULT CMozillaBrowser::OnDraw(ATL_DRAWINFO& di) { if (m_pIWebShell == nsnull) { RECT& rc = *(RECT*)di.prcBounds; Rectangle(di.hdcDraw, rc.left, rc.top, rc.right, rc.bottom); DrawText(di.hdcDraw, _T("Mozilla Browser (no window)"), -1, &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE); } return S_OK; } ///////////////////////////////////////////////////////////////////////////// static NS_DEFINE_IID(kIWebShellIID, NS_IWEB_SHELL_IID); static NS_DEFINE_IID(kWebShellCID, NS_WEB_SHELL_CID); HRESULT CMozillaBrowser::CreateWebShell() { if (m_pIWebShell != nsnull) { return E_UNEXPECTED; } RECT rcLocation; GetClientRect(&rcLocation); nsresult rv; rv = nsRepository::CreateInstance(kWebShellCID, nsnull, kIWebShellIID, (void**)&m_pIWebShell); if (NS_OK != rv) { return E_FAIL; } nsRect r; r.x = 0; r.y = 0; r.width = rcLocation.right - rcLocation.left; r.height = rcLocation.bottom - rcLocation.top; PRBool aAllowPlugins = PR_FALSE; rv = m_pIWebShell->Init(m_hWnd, r.x, r.y, r.width, r.height, nsScrollPreference_kAuto, aAllowPlugins); // Create the container object m_pWebShellContainer = new CWebShellContainer; m_pWebShellContainer->AddRef(); m_pIWebShell->SetContainer((nsIWebShellContainer*) m_pWebShellContainer); // m_pIWebShell->SetObserver((nsIStreamObserver*)this); // m_pIWebShell->SetPrefs(aPrefs); m_pIWebShell->Show(); // TODO // -- remove // Use the IWebBrowser::Navigate() method USES_CONVERSION; LPOLESTR pszUrl = T2OLE(_T("http://www.mozilla.org")); BSTR bstrUrl = ::SysAllocString(pszUrl); Navigate(bstrUrl, NULL, NULL, NULL, NULL); ::SysFreeString(bstrUrl); // -- remove return S_OK; } ///////////////////////////////////////////////////////////////////////////// // IWebBrowser HRESULT STDMETHODCALLTYPE CMozillaBrowser::GoBack(void) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } if (m_pIWebShell->CanBack()) { m_pIWebShell->Back(); } return S_OK; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::GoForward(void) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } if (m_pIWebShell->CanForward()) { m_pIWebShell->Forward(); } return S_OK; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::GoHome(void) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO find and navigate to the home page somehow USES_CONVERSION; Navigate(T2OLE(_T("http://home.netscape.com")), NULL, NULL, NULL, NULL); return S_OK; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::GoSearch(void) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO find and navigate to the search page somehow USES_CONVERSION; Navigate(T2OLE(_T("http://search.netscape.com")), NULL, NULL, NULL, NULL); return S_OK; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::Navigate(BSTR URL, VARIANT __RPC_FAR *Flags, VARIANT __RPC_FAR *TargetFrameName, VARIANT __RPC_FAR *PostData, VARIANT __RPC_FAR *Headers) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // Extract the URL parameter nsString sUrl; if (URL == NULL) { // ASSERT(0); return E_INVALIDARG; } else { USES_CONVERSION; sUrl = OLE2A(URL); } // Extract the launch flags parameter LONG lFlags = 0; if (Flags) { CComVariant vFlags; if (VariantChangeType(Flags, &vFlags, 0, VT_I4) != S_OK) { return E_INVALIDARG; } lFlags = vFlags.lVal; } // Extract the target frame parameter nsString sTargetFrame; if (TargetFrameName) { USES_CONVERSION; CComVariant vTargetFrame; if (VariantChangeType(TargetFrameName, &vTargetFrame, 0, VT_BSTR) != S_OK) { return E_INVALIDARG; } sTargetFrame = nsString(OLE2A(vTargetFrame.bstrVal)); } // Extract the post data parameter nsString sPostData; if (PostData) { USES_CONVERSION; CComVariant vPostData; if (VariantChangeType(PostData, &vPostData, 0, VT_BSTR) != S_OK) { return E_INVALIDARG; } sPostData = nsString(OLE2A(vPostData.bstrVal)); } // TODO Extract the headers parameter PRBool bModifyHistory = PR_TRUE; // Check the navigation flags if (lFlags & navOpenInNewWindow) { // TODO open in new window? } if (lFlags & navNoHistory) { // Disable history bModifyHistory = PR_FALSE; } if (lFlags & navNoReadFromCache) { // TODO disable read from cache } if (lFlags & navNoWriteToCache) { // TODO disable write to cache } // Create post data from string nsIPostData *pIPostData = nsnull; // NS_NewPostData(PR_FALSE, sPostData, &pIPostData); // TODO find the correct target frame // Load the URL m_pIWebShell->LoadURL(sUrl, pIPostData, bModifyHistory); return S_OK; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::Refresh(void) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // Reload the page CComVariant vRefreshType(REFRESH_NORMAL); return Refresh2(&vRefreshType); } HRESULT STDMETHODCALLTYPE CMozillaBrowser::Refresh2(VARIANT __RPC_FAR *Level) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO check specified type nsReloadType type = nsReload; m_pIWebShell->Reload(type); return S_OK; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::Stop() { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } m_pIWebShell->Stop(); return S_OK; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Application(IDispatch __RPC_FAR *__RPC_FAR *ppDisp) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Parent(IDispatch __RPC_FAR *__RPC_FAR *ppDisp) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Container(IDispatch __RPC_FAR *__RPC_FAR *ppDisp) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Document(IDispatch __RPC_FAR *__RPC_FAR *ppDisp) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_TopLevelContainer(VARIANT_BOOL __RPC_FAR *pBool) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Type(BSTR __RPC_FAR *Type) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Left(long __RPC_FAR *pl) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::put_Left(long Left) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Top(long __RPC_FAR *pl) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::put_Top(long Top) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Width(long __RPC_FAR *pl) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::put_Width(long Width) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Height(long __RPC_FAR *pl) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::put_Height(long Height) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_LocationName(BSTR __RPC_FAR *LocationName) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_LocationURL(BSTR __RPC_FAR *LocationURL) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE CMozillaBrowser::get_Busy(VARIANT_BOOL __RPC_FAR *pBool) { if (m_pIWebShell == nsnull) { return E_UNEXPECTED; } // TODO return E_NOTIMPL; }