--- chimera/NSBrowserView.mm 2002/02/03 05:53:12 1.2 +++ chimera/NSBrowserView.mm 2002/02/25 08:44:17 1.22 @@ -37,6 +37,7 @@ #import "NSBrowserView.h" #import "ProgressDlgController.h" +#import "FindDlgController.h" #import "nsCocoaBrowserService.h" // Embedding includes @@ -56,9 +57,15 @@ #include "nsXPIDLString.h" #include "nsCOMPtr.h" +// Printing +#include "nsIWebBrowserPrint.h" +#include "nsIPrintSettings.h" + +// Saving of links/images/docs #include "nsIWebBrowserFocus.h" #include "nsIDOMHTMLDocument.h" -#include "nsIDocument.h" +#include "nsIDOMNSDocument.h" +#include "nsIDOMLocation.h" #include "nsIURL.h" #include "nsIWebBrowserPersist.h" #include "nsIProperties.h" @@ -69,11 +76,22 @@ #include "nsIMIMEService.h" #include "nsIMIMEInfo.h" #include "nsISHistory.h" +#include "nsIHistoryEntry.h" +#include "nsISHEntry.h" +#include "nsNetUtil.h" + +// Cut/copy/paste +#include "nsIClipboardCommands.h" +#include "nsIInterfaceRequestorUtils.h" + +const char* persistContractID = "@mozilla.org/embedding/browser/nsWebBrowserPersist;1"; +const char* dirServiceContractID = "@mozilla.org/file/directory_service;1"; class nsCocoaBrowserListener : public nsSupportsWeakReference, public nsIInterfaceRequestor, - public nsIWebBrowserChrome, - public nsIEmbeddingSiteWindow, + public nsIWebBrowserChrome, + public nsIWindowCreator, + public nsIEmbeddingSiteWindow, public nsIWebProgressListener { public: @@ -83,6 +101,7 @@ public: NS_DECL_ISUPPORTS NS_DECL_NSIINTERFACEREQUESTOR NS_DECL_NSIWEBBROWSERCHROME + NS_DECL_NSIWINDOWCREATOR NS_DECL_NSIEMBEDDINGSITEWINDOW NS_DECL_NSIWEBPROGRESSLISTENER @@ -114,12 +133,13 @@ nsCocoaBrowserListener::~nsCocoaBrowserL } } -NS_IMPL_ISUPPORTS5(nsCocoaBrowserListener, +NS_IMPL_ISUPPORTS6(nsCocoaBrowserListener, nsIInterfaceRequestor, nsIWebBrowserChrome, + nsIWindowCreator, nsIEmbeddingSiteWindow, nsIWebProgressListener, - nsISupportsWeakReference) + nsISupportsWeakReference) // Implementation of nsIInterfaceRequestor NS_IMETHODIMP @@ -134,6 +154,36 @@ nsCocoaBrowserListener::GetInterface(con return QueryInterface(aIID, aInstancePtr); } +// Implementation of nsIWindowCreator. The CocoaBrowserService forwards requests +// for a new window that have a parent to us, and we take over from there. +/* nsIWebBrowserChrome createChromeWindow (in nsIWebBrowserChrome parent, in PRUint32 chromeFlags); */ +NS_IMETHODIMP +nsCocoaBrowserListener::CreateChromeWindow(nsIWebBrowserChrome *parent, + PRUint32 chromeFlags, + nsIWebBrowserChrome **_retval) +{ + if (parent != this) { + printf("Mismatch in nsCocoaBrowserListener::CreateChromeWindow. We should be the owning parent.\n"); + return NS_ERROR_FAILURE; + } + + NSBrowserView* childView = [mContainer createBrowserWindow: chromeFlags]; + if (!childView) { + printf("No NSBrowserView hooked up for a newly created window yet.\n"); + return NS_ERROR_FAILURE; + } + + nsCocoaBrowserListener* listener = [childView getCocoaBrowserListener]; + if (!listener) { + printf("Uh-oh! No listener yet for a newly created window (nsCocoaBrowserlistener)\n"); + return NS_ERROR_FAILURE; + } + + *_retval = listener; + NS_IF_ADDREF(*_retval); + return NS_OK; +} + // Implementation of nsIWebBrowserChrome /* void setStatus (in unsigned long statusType, in wstring status); */ NS_IMETHODIMP @@ -239,10 +289,10 @@ nsCocoaBrowserListener::ShowAsModal() } mIsModal = PR_TRUE; - int result = [NSApp runModalForWindow:window]; + //int result = [NSApp runModalForWindow:window]; mIsModal = PR_FALSE; - return (nsresult)result; + return NS_OK; } /* boolean isWindowModal (); */ @@ -260,7 +310,7 @@ nsCocoaBrowserListener::IsWindowModal(PR NS_IMETHODIMP nsCocoaBrowserListener::ExitModalEventLoop(nsresult aStatus) { - [NSApp stopModalWithCode:(int)aStatus]; +// [NSApp stopModalWithCode:(int)aStatus]; return NS_OK; } @@ -547,6 +597,17 @@ nsCocoaBrowserListener::OnStatusChange(n nsresult aStatus, const PRUnichar *aMessage) { + nsCAutoString msg; msg.AssignWithConversion(aMessage); + + NSString* str = [NSString stringWithCString:msg.get()]; + + NSEnumerator* enumerator = [mListeners objectEnumerator]; + id obj; + + while ((obj = [enumerator nextObject])) { + [obj onStatusChange: str]; + } + return NS_OK; } @@ -586,7 +647,7 @@ class nsHeaderSniffer : public nsIWebPr { public: nsHeaderSniffer(nsIWebBrowserPersist* aPersist, nsIFile* aFile, nsIURI* aURL, - nsIDOMDocument* aDocument, PRBool aBypassCache, + nsIDOMDocument* aDocument, nsIInputStream* aPostData, PRBool aBypassCache, NSView* aFilterView, NSPopUpButton* aFilterList) { NS_INIT_REFCNT(); @@ -594,12 +655,15 @@ public: mTmpFile = aFile; mURL = aURL; mDocument = aDocument; + mPostData = aPostData; mBypassCache = aBypassCache; mFilterView = aFilterView; mFilterList = aFilterList; } - virtual ~nsHeaderSniffer() {}; + virtual ~nsHeaderSniffer() + { + }; NS_DECL_ISUPPORTS NS_DECL_NSIWEBPROGRESSLISTENER @@ -612,6 +676,7 @@ private: nsCOMPtr mTmpFile; nsCOMPtr mURL; nsCOMPtr mDocument; + nsCOMPtr mPostData; PRBool mBypassCache; nsCString mContentType; nsCString mContentDisposition; @@ -796,14 +861,15 @@ void nsHeaderSniffer::PerformSave() else sourceData = do_QueryInterface(mURL); + nsCOMPtr webPersist(do_CreateInstance(persistContractID)); ProgressDlgController* progressDialog = [[ProgressDlgController alloc] initWithWindowNibName: @"ProgressDialog"]; - /* [progressDialog setWebPersist: mPersist + [progressDialog setWebPersist: webPersist source: sourceData.get() destination: [savePanel filename] contentType: mContentType.get() - postData: postData - */ - + postData: mPostData + bypassCache: mBypassCache]; + [progressDialog showWindow: progressDialog]; } @@ -888,12 +954,21 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb return self; } +- (void)destroyWebBrowser +{ + nsCOMPtr baseWin = do_QueryInterface(_webBrowser); + baseWin->Destroy(); +} + - (void)dealloc { NS_RELEASE(_listener); NS_IF_RELEASE(_webBrowser); - nsCocoaBrowserService::TermEmbedding(); - + + nsCocoaBrowserService::BrowserClosed(); + + printf("NSBrowserView died.\n"); + [super dealloc]; } @@ -1059,6 +1134,11 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb return url; } +- (nsCocoaBrowserListener*)getCocoaBrowserListener +{ + return _listener; +} + - (nsIWebBrowser*)getWebBrowser { NS_IF_ADDREF(_webBrowser); @@ -1085,9 +1165,6 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb } -const char* persistContractID = "@mozilla.org/embedding/browser/nsWebBrowserPersist;1"; -const char* dirServiceContractID = "@mozilla.org/file/directory_service;1"; - -(void) saveInternal: (nsIURI*)aURI withDocument: (nsIDOMDocument*)aDocument bypassCache: (BOOL)aBypassCache @@ -1118,9 +1195,17 @@ const char* dirServiceContractID = "@moz nsCOMPtr webNav(do_QueryInterface(_webBrowser)); nsCOMPtr sessionHistory; webNav->GetSessionHistory(getter_AddRefs(sessionHistory)); - + nsCOMPtr entry; + PRInt32 sindex; + sessionHistory->GetIndex(&sindex); + sessionHistory->GetEntryAtIndex(sindex, PR_FALSE, getter_AddRefs(entry)); + nsCOMPtr shEntry(do_QueryInterface(entry)); + nsCOMPtr postData; + if (shEntry) + shEntry->GetPostData(getter_AddRefs(postData)); + nsHeaderSniffer* sniffer = new nsHeaderSniffer(webPersist, tmpFile, aURI, - aDocument, aBypassCache, + aDocument, postData, aBypassCache, aFilterView, aFilterList); if (!sniffer) return; @@ -1128,6 +1213,39 @@ const char* dirServiceContractID = "@moz webPersist->SaveURI(aURI, nsnull, tmpFile); } +-(void)printDocument +{ + nsCOMPtr domWindow; + _webBrowser->GetContentDOMWindow(getter_AddRefs(domWindow)); + nsCOMPtr ir(do_QueryInterface(domWindow)); + nsCOMPtr print; + ir->GetInterface(NS_GET_IID(nsIWebBrowserPrint), getter_AddRefs(print)); + print->Print(nsnull, nsnull); +} + +-(void)findInPage +{ + FindDlgController* findDialog = [[FindDlgController alloc] initWithWindowNibName: @"FindDialog"]; + nsCOMPtr wbf(do_QueryInterface(_webBrowser)); + nsCOMPtr rootWindow; + nsCOMPtr focusedWindow; + _webBrowser->GetContentDOMWindow(getter_AddRefs(rootWindow)); + wbf->GetFocusedWindow(getter_AddRefs(focusedWindow)); + if (!focusedWindow) + focusedWindow = rootWindow; + nsCOMPtr webFind(do_GetInterface(_webBrowser)); + nsCOMPtr framesFind(do_QueryInterface(webFind)); + framesFind->SetRootSearchFrame(rootWindow); + framesFind->SetCurrentSearchFrame(focusedWindow); + + [findDialog setFind: webFind]; + [findDialog showWindow: findDialog]; +} + +-(void)findAgain +{ +} + -(void)saveDocument: (NSView*)aFilterView filterList: (NSPopUpButton*)aFilterList { nsCOMPtr wbf(do_QueryInterface(_webBrowser)); @@ -1142,11 +1260,28 @@ const char* dirServiceContractID = "@moz domWindow->GetDocument(getter_AddRefs(domDocument)); if (!domDocument) return; + nsCOMPtr nsDoc(do_QueryInterface(domDocument)); + if (!nsDoc) + return; + nsCOMPtr location; + nsDoc->GetLocation(getter_AddRefs(location)); + if (!location) + return; + nsAutoString urlStr; + location->GetHref(urlStr); + nsCAutoString urlCStr; urlCStr.AssignWithConversion(urlStr); + nsCOMPtr url; + nsresult rv = NS_NewURI(getter_AddRefs(url), urlCStr.get()); + if (NS_FAILED(rv)) + return; + +#if 0 nsCOMPtr doc(do_QueryInterface(domDocument)); if (!doc) return; nsCOMPtr url; doc->GetDocumentURL(getter_AddRefs(url)); +#endif [self saveInternal: url.get() withDocument: domDocument @@ -1155,5 +1290,70 @@ const char* dirServiceContractID = "@moz filterList: aFilterList]; } + +-(IBAction)cut:(id)aSender +{ + nsCOMPtr clipboard(do_GetInterface(_webBrowser)); + clipboard->CutSelection(); +} + +-(IBAction)copy:(id)aSender +{ + nsCOMPtr clipboard(do_GetInterface(_webBrowser)); + clipboard->CopySelection(); +} + +-(IBAction)paste:(id)aSender +{ + nsCOMPtr clipboard(do_GetInterface(_webBrowser)); + clipboard->Paste(); +} + +-(IBAction)clear:(id)aSender +{ + nsCOMPtr clipboard(do_GetInterface(_webBrowser)); + clipboard->SelectNone(); +} + +-(IBAction)selectAll:(id)aSender +{ + nsCOMPtr clipboard(do_GetInterface(_webBrowser)); + clipboard->SelectAll(); +} + +-(NSString*)getCurrentURLSpec +{ + NSString* empty = @""; + nsCOMPtr domWindow; + _webBrowser->GetContentDOMWindow(getter_AddRefs(domWindow)); + if (!domWindow) + return empty; + + nsCOMPtr domDocument; + domWindow->GetDocument(getter_AddRefs(domDocument)); + if (!domDocument) + return empty; + nsCOMPtr nsDoc(do_QueryInterface(domDocument)); + if (!nsDoc) + return empty; + nsCOMPtr location; + nsDoc->GetLocation(getter_AddRefs(location)); + if (!location) + return empty; + nsAutoString urlStr; + location->GetHref(urlStr); + nsCAutoString urlCStr; urlCStr.AssignWithConversion(urlStr); + + return [NSString stringWithCString: urlCStr.get()]; +} + +- (void)setActive: (BOOL)aIsActive +{ + nsCOMPtr wbf(do_QueryInterface(_webBrowser)); + if (aIsActive) + wbf->Activate(); + else + wbf->Deactivate(); +} @end