/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): * Chak Nanga */ // File Overview.... // This is the class which implements all the interfaces // required(and optional) by the mozilla embeddable browser engine // // Note that this obj gets passed in the IBrowserFrameGlue* using the // Init() method. Many of the interface implementations use this // to get the actual task done. Ex: to update the status bar // // Look at the INTERFACE_MAP_ENTRY's below for the list of // the currently implemented interfaces // // This file currently has the implementation for all the interfaces // which are required of an app embedding Gecko // Implementation of other optional interfaces are in separate files // so as to avoid cluttering this one. For ex, implementation of // nsIPrompt is in BrowserImplPrompt.cpp etc. // // nsIWebBrowserChrome - This is a required interface to be implemented // by embeddors // // nsIWebBrowserSiteWindow - This is a required interface to be implemented // by embeddors // - SetTitle() gets called after a document // load giving us the chance to update our // titlebar // // Some points to note... // // nsIWebBrowserChrome interface's SetStatus() gets called when a user // mouses over the links on a page // // nsIWebProgressListener interface's OnStatusChange() gets called // to indicate progress when a page is being loaded // // Next suggested file(s) to look at : // Any of the BrowserImpl*.cpp files for other interface // implementation details // #ifdef _WINDOWS #include "stdafx.h" #endif #include "nsIDOMWindow.h" #include "BrowserImpl.h" CBrowserImpl::CBrowserImpl() { NS_INIT_ISUPPORTS(); m_pBrowserFrameGlue = NULL; mWebBrowser = nsnull; } CBrowserImpl::~CBrowserImpl() { } // It's very important that the creator of this CBrowserImpl object // Call on this Init() method with proper values after creation // NS_METHOD CBrowserImpl::Init(PBROWSERFRAMEGLUE pBrowserFrameGlue, nsIWebBrowser* aWebBrowser) { m_pBrowserFrameGlue = pBrowserFrameGlue; SetWebBrowser(aWebBrowser); return NS_OK; } //***************************************************************************** // CBrowserImpl::nsISupports //***************************************************************************** NS_IMPL_ADDREF(CBrowserImpl) NS_IMPL_RELEASE(CBrowserImpl) NS_INTERFACE_MAP_BEGIN(CBrowserImpl) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIWebBrowserChrome) NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor) NS_INTERFACE_MAP_ENTRY(nsIWebBrowserChrome) NS_INTERFACE_MAP_ENTRY(nsIWebBrowserSiteWindow) NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) NS_INTERFACE_MAP_ENTRY(nsIContextMenuListener) NS_INTERFACE_MAP_ENTRY(nsIPrompt) NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) NS_INTERFACE_MAP_END //***************************************************************************** // CBrowserImpl::nsIInterfaceRequestor //***************************************************************************** NS_IMETHODIMP CBrowserImpl::GetInterface(const nsIID &aIID, void** aInstancePtr) { // Note that we're wrapping our nsIPrompt impl. with the // nsISingleSignOnPrompt - if USE_SINGLE_SIGN_ON is defined // (and if single sign-on support dll's are present and enabled) // This allows the embedding app to use the password save // feature. When signing on to a host which needs authentication // the Single sign-on service will check to see if the auth. info // is already saved and if so uses it to pre-fill the sign-on form // If not, our nsIPrompt impl will be called // to present the auth UI and return the required auth info. // If we do not compile with single sign-on support or if that // service is missing we just fall back to the regular // implementation of nsIPrompt if(aIID.Equals(NS_GET_IID(nsIPrompt))) { if (!mPrompter) { #ifdef USE_SINGLE_SIGN_ON nsresult rv; nsCOMPtr siPrompt = do_CreateInstance(NS_SINGLESIGNONPROMPT_CONTRACTID, &rv); if (NS_SUCCEEDED(rv)) { siPrompt->SetPromptDialogs(NS_STATIC_CAST(nsIPrompt*, this)); mPrompter = siPrompt; } else #endif mPrompter = NS_STATIC_CAST(nsIPrompt*, this); } NS_ENSURE_TRUE(mPrompter, NS_ERROR_FAILURE); return mPrompter->QueryInterface(aIID, aInstancePtr); } if(aIID.Equals(NS_GET_IID(nsIDOMWindow))) { if (mWebBrowser) return mWebBrowser->GetContentDOMWindow((nsIDOMWindow **) aInstancePtr); return NS_ERROR_NOT_INITIALIZED; } return QueryInterface(aIID, aInstancePtr); } //***************************************************************************** // CBrowserImpl::nsIWebBrowserChrome //***************************************************************************** //Gets called when you mouseover links etc. in a web page // NS_IMETHODIMP CBrowserImpl::SetStatus(PRUint32 aType, const PRUnichar* aStatus) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->UpdateStatusBarText(aStatus); return NS_OK; } NS_IMETHODIMP CBrowserImpl::GetWebBrowser(nsIWebBrowser** aWebBrowser) { NS_ENSURE_ARG_POINTER(aWebBrowser); *aWebBrowser = mWebBrowser; NS_IF_ADDREF(*aWebBrowser); return NS_OK; } // Currently called from Init(). I'm not sure who else // calls this // NS_IMETHODIMP CBrowserImpl::SetWebBrowser(nsIWebBrowser* aWebBrowser) { NS_ENSURE_ARG_POINTER(aWebBrowser); mWebBrowser = aWebBrowser; return NS_OK; } NS_IMETHODIMP CBrowserImpl::GetChromeFlags(PRUint32* aChromeMask) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP CBrowserImpl::SetChromeFlags(PRUint32 aChromeMask) { return NS_ERROR_NOT_IMPLEMENTED; } // Gets called in response to create a new browser window. // Ex: In response to a JavaScript Window.Open() call // // NS_IMETHODIMP CBrowserImpl::CreateBrowserWindow(PRUint32 chromeMask, PRInt32 aX, PRInt32 aY, PRInt32 aCX, PRInt32 aCY, nsIWebBrowser **aWebBrowser) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; if(m_pBrowserFrameGlue->CreateNewBrowserFrame(chromeMask, aX, aY, aCX, aCY, aWebBrowser)) return NS_OK; else return NS_ERROR_FAILURE; } // Gets called in response to set the size of a window // Ex: In response to a JavaScript Window.Open() call of // the form // // window.open("http://www.mozilla.org", "theWin", "width=200, height=400"); // // First the CreateBrowserWindow() call will be made followed by a // call to this method to resize the window // NS_IMETHODIMP CBrowserImpl::SizeBrowserTo(PRInt32 aCX, PRInt32 aCY) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->SetBrowserFrameSize(aCX, aCY); return NS_OK; } NS_IMETHODIMP CBrowserImpl::ShowAsModal(void) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP CBrowserImpl::IsWindowModal(PRBool *retval) { // We're not modal *retval = PR_FALSE; return NS_OK; } NS_IMETHODIMP CBrowserImpl::ExitModalEventLoop(nsresult aStatus) { return NS_OK; } NS_IMETHODIMP CBrowserImpl::SetPersistence(PRBool aPersistX, PRBool aPersistY, PRBool aPersistCX, PRBool aPersistCY, PRBool aPersistSizeMode) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP CBrowserImpl::GetPersistence(PRBool* aPersistX, PRBool* aPersistY, PRBool* aPersistCX, PRBool* aPersistCY, PRBool* aPersistSizeMode) { return NS_ERROR_NOT_IMPLEMENTED; } //***************************************************************************** // CBrowserImpl::nsIWebBrowserSiteWindow //***************************************************************************** // Will get called in response to JavaScript window.close() // NS_IMETHODIMP CBrowserImpl::Destroy() { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->DestroyBrowserFrame(); return NS_OK; } NS_IMETHODIMP CBrowserImpl::SetPosition(PRInt32 x, PRInt32 y) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->SetBrowserFramePosition(x, y); return NS_OK; } NS_IMETHODIMP CBrowserImpl::GetPosition(PRInt32* x, PRInt32* y) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->GetBrowserFramePosition(x, y); return NS_OK; } // Gets called when using JavaScript ResizeTo()/ResizeBy() methods // NS_IMETHODIMP CBrowserImpl::SetSize(PRInt32 cx, PRInt32 cy, PRBool fRepaint) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->SetBrowserFrameSize(cx, cy); return NS_OK; } // Gets called when using JavaScript ResizeTo()/ResizeBy() methods // NS_IMETHODIMP CBrowserImpl::GetSize(PRInt32* cx, PRInt32* cy) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->GetBrowserFrameSize(cx, cy); return NS_OK; } NS_IMETHODIMP CBrowserImpl::SetPositionAndSize(PRInt32 x, PRInt32 y, PRInt32 cx, PRInt32 cy, PRBool fRepaint) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->SetBrowserFramePositionAndSize(x, y, cx, cy, fRepaint); return NS_OK; } NS_IMETHODIMP CBrowserImpl::GetPositionAndSize(PRInt32* x, PRInt32* y, PRInt32* cx, PRInt32* cy) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->GetBrowserFramePositionAndSize(x, y, cx, cy); return NS_OK; } NS_IMETHODIMP CBrowserImpl::GetSiteWindow(void** aSiteWindow) { return NS_ERROR_NOT_IMPLEMENTED; } NS_IMETHODIMP CBrowserImpl::SetFocus() { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->SetFocus(); return NS_OK; } NS_IMETHODIMP CBrowserImpl::GetTitle(PRUnichar** aTitle) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->GetBrowserFrameTitle(aTitle); return NS_OK; } NS_IMETHODIMP CBrowserImpl::SetTitle(const PRUnichar* aTitle) { if(! m_pBrowserFrameGlue) return NS_ERROR_FAILURE; m_pBrowserFrameGlue->SetBrowserFrameTitle(aTitle); return NS_OK; }