--- chimera/NSBrowserView.mm 2002/02/25 08:44:17 1.22 +++ chimera/NSBrowserView.mm 2002/04/20 00:02:55 1.34 @@ -79,6 +79,7 @@ #include "nsIHistoryEntry.h" #include "nsISHEntry.h" #include "nsNetUtil.h" +#include "nsIContextMenuListener.h" // Cut/copy/paste #include "nsIClipboardCommands.h" @@ -89,10 +90,11 @@ const char* dirServiceContractID = "@moz class nsCocoaBrowserListener : public nsSupportsWeakReference, public nsIInterfaceRequestor, - public nsIWebBrowserChrome, + public nsIWebBrowserChrome, public nsIWindowCreator, - public nsIEmbeddingSiteWindow, - public nsIWebProgressListener + public nsIEmbeddingSiteWindow, + public nsIWebProgressListener, + public nsIContextMenuListener { public: nsCocoaBrowserListener(NSBrowserView* aView); @@ -104,7 +106,8 @@ public: NS_DECL_NSIWINDOWCREATOR NS_DECL_NSIEMBEDDINGSITEWINDOW NS_DECL_NSIWEBPROGRESSLISTENER - + NS_DECL_NSICONTEXTMENULISTENER + void AddListener(id aListener); void RemoveListener(id aListener); void SetContainer(id aContainer); @@ -133,13 +136,14 @@ nsCocoaBrowserListener::~nsCocoaBrowserL } } -NS_IMPL_ISUPPORTS6(nsCocoaBrowserListener, - nsIInterfaceRequestor, - nsIWebBrowserChrome, - nsIWindowCreator, - nsIEmbeddingSiteWindow, - nsIWebProgressListener, - nsISupportsWeakReference) +NS_IMPL_ISUPPORTS7(nsCocoaBrowserListener, + nsIInterfaceRequestor, + nsIWebBrowserChrome, + nsIWindowCreator, + nsIEmbeddingSiteWindow, + nsIWebProgressListener, + nsISupportsWeakReference, + nsIContextMenuListener) // Implementation of nsIInterfaceRequestor NS_IMETHODIMP @@ -179,11 +183,21 @@ nsCocoaBrowserListener::CreateChromeWind return NS_ERROR_FAILURE; } + printf("made a chrome window.\n"); + *_retval = listener; NS_IF_ADDREF(*_retval); return NS_OK; } +// Implementation of nsIContextMenuListener +NS_IMETHODIMP +nsCocoaBrowserListener::OnShowContextMenu(PRUint32 aContextFlags, nsIDOMEvent* aEvent, nsIDOMNode* aNode) +{ + [mContainer onShowContextMenu: aContextFlags domEvent: aEvent domNode: aNode]; + return NS_OK; +} + // Implementation of nsIWebBrowserChrome /* void setStatus (in unsigned long statusType, in wstring status); */ NS_IMETHODIMP @@ -569,13 +583,11 @@ nsCocoaBrowserListener::OnLocationChange nsIRequest *aRequest, nsIURI *location) { - nsXPIDLCString spec; - - location->GetSpec(getter_Copies(spec)); - if (!spec) { + if (!location) return NS_ERROR_FAILURE; - } - + + nsCAutoString spec; + location->GetSpec(spec); const char* cstr = spec.get(); NSString* str = [NSString stringWithCString:cstr]; NSURL* url = [NSURL URLWithString:str]; @@ -647,7 +659,8 @@ class nsHeaderSniffer : public nsIWebPr { public: nsHeaderSniffer(nsIWebBrowserPersist* aPersist, nsIFile* aFile, nsIURI* aURL, - nsIDOMDocument* aDocument, nsIInputStream* aPostData, PRBool aBypassCache, + nsIDOMDocument* aDocument, nsIInputStream* aPostData, + const nsCString& aSuggestedFilename, PRBool aBypassCache, NSView* aFilterView, NSPopUpButton* aFilterList) { NS_INIT_REFCNT(); @@ -656,6 +669,7 @@ public: mURL = aURL; mDocument = aDocument; mPostData = aPostData; + mDefaultFilename = aSuggestedFilename; mBypassCache = aBypassCache; mFilterView = aFilterView; mFilterList = aFilterList; @@ -677,6 +691,7 @@ private: nsCOMPtr mURL; nsCOMPtr mDocument; nsCOMPtr mPostData; + nsCString mDefaultFilename; PRBool mBypassCache; nsCString mContentType; nsCString mContentDisposition; @@ -696,17 +711,12 @@ nsHeaderSniffer::OnStateChange(nsIWebPro { if (aStateFlags & nsIWebProgressListener::STATE_START) { nsCOMPtr channel(do_QueryInterface(aRequest)); - nsXPIDLCString contentType; - channel->GetContentType(getter_Copies(contentType)); - mContentType = contentType; - + channel->GetContentType(mContentType); + // Get the content-disposition if we're an HTTP channel. nsCOMPtr httpChannel(do_QueryInterface(channel)); - if (httpChannel) { - nsXPIDLCString disp; - httpChannel->GetResponseHeader("content-disposition", getter_Copies(disp)); - mContentDisposition = disp; - } + if (httpChannel) + httpChannel->GetResponseHeader(nsCAutoString("content-disposition"), mContentDisposition); mPersist->CancelSave(); PRBool exists; @@ -744,7 +754,6 @@ void nsHeaderSniffer::PerformSave() // We need to figure out what file name to use. nsCAutoString defaultFileName; - if (!mContentDisposition.IsEmpty()) { // (1) Use the HTTP header suggestion. PRInt32 index = mContentDisposition.Find("filename="); @@ -759,11 +768,8 @@ void nsHeaderSniffer::PerformSave() if (defaultFileName.IsEmpty()) { nsCOMPtr url(do_QueryInterface(mURL)); - if (url) { - nsXPIDLCString fileName; - url->GetFileName(getter_Copies(fileName)); - defaultFileName = fileName; // (2) For file URLs, use the file name. - } + if (url) + url->GetFileName(defaultFileName); // (2) For file URLs, use the file name. } if (defaultFileName.IsEmpty() && mDocument && isHTML) { @@ -775,15 +781,13 @@ void nsHeaderSniffer::PerformSave() } if (defaultFileName.IsEmpty()) { - // (4) Use the caller provided name. XXXdwh + // (4) Use the caller provided name. + defaultFileName = mDefaultFilename; } - if (defaultFileName.IsEmpty()) { + if (defaultFileName.IsEmpty()) // (5) Use the host. - nsXPIDLCString host; - mURL->GetHost(getter_Copies(host)); - defaultFileName = host; - } + mURL->GetHost(defaultFileName); // One last case to handle about:blank and other fruity untitled pages. if (defaultFileName.IsEmpty()) @@ -799,11 +803,10 @@ void nsHeaderSniffer::PerformSave() nsCOMPtr fileURL(do_QueryInterface(fileURI)); if (!fileURL) return; - fileURL->SetFilePath(defaultFileName.get()); + fileURL->SetFilePath(defaultFileName); - nsXPIDLCString fileEx; - fileURL->GetFileExtension(getter_Copies(fileEx)); - nsDependentCString fileExtension(fileEx.get()); + nsCAutoString fileExtension; + fileURL->GetFileExtension(fileExtension); PRBool setExtension = PR_FALSE; if (mContentType.Equals("text/html")) { @@ -916,6 +919,12 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb @implementation NSBrowserView +- (id)initWithFrame:(NSRect)frame andWindow:(NSWindow*)aWindow +{ + mWindow = aWindow; + return [self initWithFrame:frame]; +} + - (id)initWithFrame:(NSRect)frame { [super initWithFrame:frame]; @@ -962,14 +971,14 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb - (void)dealloc { + [super dealloc]; + NS_RELEASE(_listener); NS_IF_RELEASE(_webBrowser); nsCocoaBrowserService::BrowserClosed(); printf("NSBrowserView died.\n"); - - [super dealloc]; } - (void)setFrame:(NSRect)frameRect @@ -1124,8 +1133,8 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb return nsnull; } - nsXPIDLCString spec; - uri->GetSpec(getter_Copies(spec)); + nsCAutoString spec; + uri->GetSpec(spec); const char* cstr = spec.get(); NSString* str = [NSString stringWithCString:cstr]; @@ -1167,6 +1176,7 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb -(void) saveInternal: (nsIURI*)aURI withDocument: (nsIDOMDocument*)aDocument + suggestedFilename: (const char*)aFilename bypassCache: (BOOL)aBypassCache filterView: (NSView*)aFilterView filterList: (NSPopUpButton*)aFilterList @@ -1185,27 +1195,30 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb nsCOMPtr tmpFile; dirService->Get("TmpD", NS_GET_IID(nsIFile), getter_AddRefs(tmpFile)); static short unsigned int tmpRandom = 0; - nsCAutoString tmpNo; tmpNo.AssignWithConversion(tmpRandom++); + nsCAutoString tmpNo; tmpNo.AppendInt(tmpRandom++); nsCAutoString saveFile("-sav"); saveFile += tmpNo; saveFile += "tmp"; tmpFile->Append(saveFile.get()); // Get the post data if we're an HTML doc. - 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)); - + if (aDocument) { + 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)); + if (shEntry) + shEntry->GetPostData(getter_AddRefs(postData)); + } + + nsCAutoString fileName(aFilename); nsHeaderSniffer* sniffer = new nsHeaderSniffer(webPersist, tmpFile, aURI, - aDocument, postData, aBypassCache, + aDocument, postData, fileName, aBypassCache, aFilterView, aFilterList); if (!sniffer) return; @@ -1223,9 +1236,10 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb print->Print(nsnull, nsnull); } --(void)findInPage +-(BOOL)findInPage:(NSString*)inText { - FindDlgController* findDialog = [[FindDlgController alloc] initWithWindowNibName: @"FindDialog"]; + PRBool found = PR_FALSE; + nsCOMPtr wbf(do_QueryInterface(_webBrowser)); nsCOMPtr rootWindow; nsCOMPtr focusedWindow; @@ -1234,19 +1248,40 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb 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]; + if ( webFind ) { + nsCOMPtr framesFind(do_QueryInterface(webFind)); + framesFind->SetRootSearchFrame(rootWindow); + framesFind->SetCurrentSearchFrame(focusedWindow); + + PRUnichar* text = (PRUnichar*)nsMemory::Alloc(([inText length]+1)*sizeof(PRUnichar)); + if ( text ) { + [inText getCharacters:text]; + text[[inText length]] = 0; + webFind->SetSearchString(text); + webFind->FindNext(&found); + nsMemory::Free(text); + } + } + return found; } --(void)findAgain +- (void)saveURL: (NSView*)aFilterView filterList: (NSPopUpButton*)aFilterList + url: (NSURL*)aURL suggestedFilename: (NSString*)aFilename { + nsCOMPtr url; + nsresult rv = NS_NewURI(getter_AddRefs(url), [[aURL absoluteString] cString]); + if (NS_FAILED(rv)) + return; + + [self saveInternal: url.get() + withDocument: nsnull + suggestedFilename: [aFilename cString] + bypassCache: YES + filterView: aFilterView + filterList: aFilterList]; } --(void)saveDocument: (NSView*)aFilterView filterList: (NSPopUpButton*)aFilterList +- (void)saveDocument: (NSView*)aFilterView filterList: (NSPopUpButton*)aFilterList { nsCOMPtr wbf(do_QueryInterface(_webBrowser)); nsCOMPtr domWindow; @@ -1274,17 +1309,10 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb 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 + suggestedFilename: "" bypassCache: NO filterView: aFilterView filterList: aFilterList]; @@ -1321,6 +1349,11 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb clipboard->SelectAll(); } +-(IBAction)undo:(id)aSender +{ + NSLog(@"Undo not yet implemented"); +} + -(NSString*)getCurrentURLSpec { NSString* empty = @""; @@ -1355,5 +1388,28 @@ nsHeaderSniffer::OnSecurityChange(nsIWeb else wbf->Deactivate(); } + +-(NSMenu*)getContextMenu +{ + return [[self superview] getContextMenu]; +} + +-(NSWindow*)getNativeWindow +{ + NSWindow* result = [self window]; + if (result) + return result; // We're visible. Just hand the window back. + else { + // We're invisible. It's likely that we're in a Cocoa tab view. + // First see if we have a cached window. + if (mWindow) + return mWindow; + + // Finally, see if our parent responds to the getNativeWindow selector, + // and if they do, let them handle it. + return [[self superview] getNativeWindow]; + } +} + @end