From 971dce35c25a1bdb095e88c7fa06695ae825ab21 Mon Sep 17 00:00:00 2001 From: "locka%iol.ie" Date: Tue, 22 May 2001 21:31:01 +0000 Subject: [PATCH] Removed nsIDocShellTreeOwner impl in control's chrome object because it was causing clicked links to open in new window. Cleaned up web browser creation and initialisation. b=82116 r=ccarlen@netscape.com sr=blizzard@mozilla.org --- .../activex/src/control/MozillaBrowser.cpp | 78 ++++------ .../src/control/WebBrowserContainer.cpp | 147 ++++++------------ .../activex/src/control/WebBrowserContainer.h | 2 - 3 files changed, 82 insertions(+), 145 deletions(-) diff --git a/embedding/browser/activex/src/control/MozillaBrowser.cpp b/embedding/browser/activex/src/control/MozillaBrowser.cpp index e653dae65b1..449b8db4c34 100644 --- a/embedding/browser/activex/src/control/MozillaBrowser.cpp +++ b/embedding/browser/activex/src/control/MozillaBrowser.cpp @@ -844,8 +844,19 @@ BOOL CMozillaBrowser::IsValid() // Initialises the web shell engine HRESULT CMozillaBrowser::Initialize() { - // Extract the bin directory path from the control's filename +#ifdef HACK_NON_REENTRANCY + // Attempt to open a named event for this process. If it's not there we + // know this is the first time the control has run in this process, so create + // the named event and do the initialisation. Otherwise do nothing. + TCHAR szHackEvent[255]; + _stprintf(szHackEvent, _T("MozCtlEvent%d"), (int) GetCurrentProcessId()); + s_hHackedNonReentrancy = OpenEvent(EVENT_ALL_ACCESS, FALSE, szHackEvent); + if (s_hHackedNonReentrancy == NULL) + { + s_hHackedNonReentrancy = CreateEvent(NULL, FALSE, FALSE, szHackEvent); +#endif + // Extract the bin directory path from the control's filename TCHAR szMozCtlPath[MAX_PATH]; memset(szMozCtlPath, 0, sizeof(szMozCtlPath)); GetModuleFileName(_Module.m_hInst, szMozCtlPath, sizeof(szMozCtlPath) / sizeof(szMozCtlPath[0])); @@ -859,35 +870,25 @@ HRESULT CMozillaBrowser::Initialize() _tsplitpath(szMozCtlPath, szTmpDrive, szTmpDir, szTmpFname, szTmpExt); memset(szBinDirPath, 0, sizeof(szBinDirPath)); _tmakepath(szBinDirPath, szTmpDrive, szTmpDir, NULL, NULL); - -#ifdef HACK_NON_REENTRANCY - // Attempt to open a named event for this process. If it's not there we - // know this is the first time the control has run in this process, so create - // the named event and do the initialisation. Otherwise do nothing. - TCHAR szHackEvent[255]; - _stprintf(szHackEvent, _T("MozCtlEvent%d"), (int) GetCurrentProcessId()); - s_hHackedNonReentrancy = OpenEvent(EVENT_ALL_ACCESS, FALSE, szHackEvent); - if (s_hHackedNonReentrancy == NULL) + if (_tcslen(szBinDirPath) == 0) { - s_hHackedNonReentrancy = CreateEvent(NULL, FALSE, FALSE, szHackEvent); -#endif - - // Create an object to represent the path - if (_tcslen(szBinDirPath) > 0) - { - nsCOMPtr binDir; - - USES_CONVERSION; - NS_NewLocalFile(T2A(szBinDirPath), TRUE, getter_AddRefs(binDir)); - nsresult res = NS_InitEmbedding(binDir, nsnull); - } - else - { - NS_InitEmbedding(nsnull, nsnull); + return E_FAIL; } + nsresult rv; + + // Create a directory file loc object + nsCOMPtr provider; // nsnull for the moment + // TODO put alternative directory service provider here at some point + + // Create an object to represent the path + nsCOMPtr binDir; + USES_CONVERSION; + NS_NewLocalFile(T2A(szBinDirPath), TRUE, getter_AddRefs(binDir)); + rv = NS_InitEmbedding(binDir, provider); + // Load preferences service - nsresult rv = nsServiceManager::GetService(kPrefCID, + rv = nsServiceManager::GetService(kPrefCID, NS_GET_IID(nsIPref), (nsISupports **)&mPrefs); if (NS_FAILED(rv)) @@ -946,7 +947,6 @@ HRESULT CMozillaBrowser::Initialize() return S_OK; } - // Terminates the web shell engine HRESULT CMozillaBrowser::Terminate() { @@ -999,7 +999,6 @@ HRESULT CMozillaBrowser::CreateBrowser() return rv; } - // Configure what the web browser can and cannot do nsCOMPtr webBrowserAsSetup(do_QueryInterface(mWebBrowser)); // webBrowserAsSetup->SetProperty(nsIWebBrowserSetup::SETUP_ALLOW_PLUGINS, aAllowPlugins); @@ -1021,29 +1020,18 @@ HRESULT CMozillaBrowser::CreateBrowser() } mWebBrowserContainer->AddRef(); - // Set up the web shell - mWebBrowser->SetParentURIContentListener(mWebBrowserContainer); - - // XXX delete when tree owner is not necessary (to receive context menu events) - nsCOMPtr browserAsItem = do_QueryInterface(mWebBrowser); - browserAsItem->SetTreeOwner(NS_STATIC_CAST(nsIDocShellTreeOwner *, mWebBrowserContainer)); - - // XXX delete when docshell becomes inaccessible - nsCOMPtr rootDocShell = do_GetInterface(mWebBrowser); - if (rootDocShell == nsnull) - { - NG_ASSERT(0); - NG_TRACE_ALWAYS(_T("Could not get root docshell object rv=%08x\n"), (int) rv); - SetStartupErrorMessage(IDS_CANNOTCREATEPREFS); - return rv; - } - mWebBrowserAsWin->SetVisibility(PR_TRUE); + // Set up the browser with its chrome + mWebBrowser->SetContainerWindow(NS_STATIC_CAST(nsIWebBrowserChrome*, mWebBrowserContainer)); + mWebBrowser->SetParentURIContentListener(mWebBrowserContainer); // Subscribe for progress notifications nsCOMPtr listener( dont_AddRef(NS_GetWeakReference(NS_STATIC_CAST(nsIWebProgressListener*, mWebBrowserContainer)))); mWebBrowser->AddWebBrowserListener(listener, NS_GET_IID(nsIWebProgressListener)); + // Visible + mWebBrowserAsWin->SetVisibility(PR_TRUE); + // Append browser to browser list sBrowserList.AppendElement(this); diff --git a/embedding/browser/activex/src/control/WebBrowserContainer.cpp b/embedding/browser/activex/src/control/WebBrowserContainer.cpp index 8a6f3ee5fab..7ca9fe3bd13 100644 --- a/embedding/browser/activex/src/control/WebBrowserContainer.cpp +++ b/embedding/browser/activex/src/control/WebBrowserContainer.cpp @@ -30,6 +30,8 @@ #include "WebBrowserContainer.h" +#include "nsICategoryManager.h" + CWebBrowserContainer::CWebBrowserContainer(CMozillaBrowser *pOwner) { NS_INIT_REFCNT(); @@ -56,7 +58,6 @@ NS_INTERFACE_MAP_BEGIN(CWebBrowserContainer) NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor) NS_INTERFACE_MAP_ENTRY(nsIWebBrowserChrome) NS_INTERFACE_MAP_ENTRY(nsIURIContentListener) - NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeOwner) NS_INTERFACE_MAP_ENTRY(nsIEmbeddingSiteWindow) NS_INTERFACE_MAP_ENTRY(nsIRequestObserver) NS_INTERFACE_MAP_ENTRY(nsIWebProgressListener) @@ -367,7 +368,7 @@ NS_IMETHODIMP CWebBrowserContainer::OnStartURIOpen(nsIURI *pURI, PRBool *aAbortO m_pEvents1->Fire_DownloadComplete(); m_pEvents2->Fire_DownloadComplete(); - return NS_ERROR_NOT_IMPLEMENTED; + return NS_OK; } /* void getProtocolHandler (in nsIURI aURI, out nsIProtocolHandler aProtocolHandler); */ @@ -387,14 +388,34 @@ NS_IMETHODIMP CWebBrowserContainer::DoContent(const char *aContentType, nsURILoa /* boolean isPreferred (in string aContentType, in nsURILoadCommand aCommand, out string aDesiredContentType); */ NS_IMETHODIMP CWebBrowserContainer::IsPreferred(const char *aContentType, nsURILoadCommand aCommand, char **aDesiredContentType, PRBool *_retval) { - return NS_ERROR_NOT_IMPLEMENTED; + return CanHandleContent(aContentType, aCommand, aDesiredContentType, _retval); } /* boolean canHandleContent (in string aContentType, in nsURILoadCommand aCommand, out string aDesiredContentType); */ NS_IMETHODIMP CWebBrowserContainer::CanHandleContent(const char *aContentType, nsURILoadCommand aCommand, char **aDesiredContentType, PRBool *_retval) { - return NS_ERROR_NOT_IMPLEMENTED; + if (aContentType) + { + nsCOMPtr catMgr; + nsresult rv; + catMgr = do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv); + nsXPIDLCString value; + rv = catMgr->GetCategoryEntry("Gecko-Content-Viewers", + aContentType, + getter_Copies(value)); + + // If the category manager can't find what we're looking for + // it returns NS_ERROR_NOT_AVAILABLE, we don't wanto propagate + // that to the caller since it's really not a failure + + if (NS_FAILED(rv) && rv != NS_ERROR_NOT_AVAILABLE) + return rv; + + if (value && *value) + *_retval = PR_TRUE; + } + return NS_OK; } @@ -424,100 +445,6 @@ NS_IMETHODIMP CWebBrowserContainer::SetParentContentListener(nsIURIContentListen } -/////////////////////////////////////////////////////////////////////////////// -// nsIDocShellTreeOwner - - -NS_IMETHODIMP -CWebBrowserContainer::FindItemWithName(const PRUnichar* aName, - nsIDocShellTreeItem* aRequestor, nsIDocShellTreeItem** aFoundItem) -{ - return NS_ERROR_FAILURE; -/* - nsCOMPtr docShellAsItem(do_QueryInterface(m_pOwner->mWebBrowser)); - NS_ENSURE_TRUE(docShellAsItem, NS_ERROR_FAILURE); - return docShellAsItem->FindItemWithName(aName, NS_STATIC_CAST(nsIWebBrowserChrome*, this), aFoundItem); - */ -} - -static nsIDocShellTreeItem* contentShell = nsnull; -NS_IMETHODIMP -CWebBrowserContainer::ContentShellAdded(nsIDocShellTreeItem* aContentShell, - PRBool aPrimary, const PRUnichar* aID) -{ - if (aPrimary) - contentShell = aContentShell; - return NS_OK; -} - - -NS_IMETHODIMP -CWebBrowserContainer::GetPrimaryContentShell(nsIDocShellTreeItem** aShell) -{ - // NS_ERROR("Haven't Implemented this yet"); - NS_IF_ADDREF(contentShell); - *aShell = contentShell; - return NS_OK; -} - - -NS_IMETHODIMP -CWebBrowserContainer::SizeShellTo(nsIDocShellTreeItem* aShell, - PRInt32 aCX, PRInt32 aCY) -{ - // Ignore request to be resized - return NS_OK; -} - - -NS_IMETHODIMP CWebBrowserContainer::GetNewWindow(PRInt32 aChromeFlags, - nsIDocShellTreeItem** aDocShellTreeItem) -{ - IDispatch *pDispNew = NULL; - VARIANT_BOOL bCancel = VARIANT_FALSE; - - *aDocShellTreeItem = nsnull; - - // Test if the event sink can give us a new window to navigate into - m_pEvents2->Fire_NewWindow2(&pDispNew, &bCancel); - - if ((bCancel == VARIANT_FALSE) && pDispNew) - { - CComQIPtr cpBridge = pDispNew; - if (cpBridge) - { - nsIWebBrowser *browser = nsnull; - cpBridge->GetWebBrowser((void **) &browser); - if (browser) - { - nsCOMPtr docshell = do_GetInterface(browser); - docshell->QueryInterface(NS_GET_IID(nsIDocShellTreeItem), (void **) aDocShellTreeItem); - NS_RELEASE(browser); - } - } - pDispNew->Release(); - } - - return (*aDocShellTreeItem) ? NS_OK : NS_ERROR_FAILURE; -} - - -NS_IMETHODIMP -CWebBrowserContainer::SetPersistence(PRBool aPersistPosition, - PRBool aPersistSize, - PRBool aPersistSizeMode) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - -NS_IMETHODIMP -CWebBrowserContainer::GetPersistence(PRBool* aPersistPosition, - PRBool* aPersistSize, - PRBool* aPersistSizeMode) -{ - return NS_ERROR_NOT_IMPLEMENTED; -} - /////////////////////////////////////////////////////////////////////////////// // nsIEmbeddingSiteWindow @@ -622,6 +549,30 @@ CWebBrowserContainer::SetChromeFlags(PRUint32 aChromeFlags) NS_IMETHODIMP CWebBrowserContainer::CreateBrowserWindow(PRUint32 chromeFlags, PRInt32 aX, PRInt32 aY, PRInt32 aCX, PRInt32 aCY, nsIWebBrowser **_retval) { + IDispatch *pDispNew = NULL; + VARIANT_BOOL bCancel = VARIANT_FALSE; + + *_retval = nsnull; + + // Test if the event sink can give us a new window to navigate into + m_pEvents2->Fire_NewWindow2(&pDispNew, &bCancel); + + if ((bCancel == VARIANT_FALSE) && pDispNew) + { + CComQIPtr cpBridge = pDispNew; + if (cpBridge) + { + nsIWebBrowser *browser = nsnull; + cpBridge->GetWebBrowser((void **) &browser); + if (browser) + { + *_retval = browser; + return NS_OK; + } + } + pDispNew->Release(); + } + return NS_ERROR_FAILURE; } diff --git a/embedding/browser/activex/src/control/WebBrowserContainer.h b/embedding/browser/activex/src/control/WebBrowserContainer.h index 00b966c92de..97fb37d3f92 100644 --- a/embedding/browser/activex/src/control/WebBrowserContainer.h +++ b/embedding/browser/activex/src/control/WebBrowserContainer.h @@ -40,7 +40,6 @@ class CWebBrowserContainer : public nsIWebProgressListener, public nsIRequestObserver, public nsIURIContentListener, - public nsIDocShellTreeOwner, public nsIInterfaceRequestor, public nsIContextMenuListener, public nsICommandHandler, @@ -67,7 +66,6 @@ public: NS_DECL_ISUPPORTS NS_DECL_NSIEMBEDDINGSITEWINDOW NS_DECL_NSIWEBBROWSERCHROME - NS_DECL_NSIDOCSHELLTREEOWNER NS_DECL_NSIURICONTENTLISTENER NS_DECL_NSIREQUESTOBSERVER NS_DECL_NSIINTERFACEREQUESTOR