From 39b25801eedab4cbb8f2a5fc659efdb37948ba7b Mon Sep 17 00:00:00 2001 From: "blizzard%redhat.com" Date: Thu, 7 Dec 2000 21:09:43 +0000 Subject: [PATCH] Fix bug #51130. Use common dialogs for nsIPrompt in the embedding widget. r=danm, sr=brendan git-svn-id: svn://10.0.0.236/trunk@83381 18797224-902f-48f8-a5cc-f745e15eee43 --- .../browser/gtk/src/GtkMozEmbedChrome.cpp | 265 ++++++++++++++++++ .../browser/gtk/src/GtkMozEmbedChrome.h | 11 +- .../embedding/browser/gtk/src/gtkmozembed.cpp | 47 +++- 3 files changed, 319 insertions(+), 4 deletions(-) diff --git a/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.cpp b/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.cpp index 3f043c19aa6..4a194eb5d9f 100644 --- a/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.cpp +++ b/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.cpp @@ -33,6 +33,7 @@ #include "nsIDocShell.h" static NS_DEFINE_CID(kSimpleURICID, NS_SIMPLEURI_CID); +static NS_DEFINE_CID(kCommonDialogsCID, NS_CommonDialog_CID); // this is a define to make sure that we don't call certain function // before the object has been properly initialized @@ -93,6 +94,7 @@ NS_INTERFACE_MAP_BEGIN(GtkMozEmbedChrome) NS_INTERFACE_MAP_ENTRY(nsIURIContentListener) NS_INTERFACE_MAP_ENTRY(nsIDocShellTreeOwner) NS_INTERFACE_MAP_ENTRY(nsIBaseWindow) + NS_INTERFACE_MAP_ENTRY(nsIPrompt) NS_INTERFACE_MAP_END // nsIGtkEmbed interface @@ -307,6 +309,44 @@ NS_IMETHODIMP GtkMozEmbedChrome::CloseStream (void) return NS_OK; } +NS_IMETHODIMP +GtkMozEmbedChrome::EnsureCommonDialogs(void) +{ + nsresult rv = NS_OK; + if (!mCommonDialogs) + mCommonDialogs = do_GetService(kCommonDialogsCID, &rv); + return rv; +} + +NS_IMETHODIMP +GtkMozEmbedChrome::GetDOMWindowInternal (nsIDOMWindowInternal **aWindow) +{ + + // get the browser as an item + nsCOMPtr browserAsItem; + browserAsItem = do_QueryInterface(mWebBrowser); + NS_ENSURE_TRUE(browserAsItem, NS_ERROR_FAILURE); + + // get the owner for that item + nsCOMPtr treeOwner; + browserAsItem->GetTreeOwner(getter_AddRefs(treeOwner)); + NS_ENSURE_TRUE(treeOwner, NS_ERROR_FAILURE); + + // get the primary content shell as an item + nsCOMPtr contentItem; + treeOwner->GetPrimaryContentShell(getter_AddRefs(contentItem)); + NS_ENSURE_TRUE(contentItem, NS_ERROR_FAILURE); + + nsCOMPtr domWindow; + domWindow = do_GetInterface(contentItem); + NS_ENSURE_TRUE(domWindow, NS_ERROR_FAILURE); + + *aWindow = domWindow.get(); + NS_ADDREF(*aWindow); + + return NS_OK; +} + // nsIInterfaceRequestor interface NS_IMETHODIMP GtkMozEmbedChrome::GetInterface(const nsIID &aIID, void** aInstancePtr) @@ -867,3 +907,228 @@ GtkMozEmbedChrome::GetPersistence(PRBool* aPersistX, PRBool* aPersistY, { return NS_ERROR_NOT_IMPLEMENTED; } + +// nsIPrompt + +NS_IMETHODIMP +GtkMozEmbedChrome::Alert(const PRUnichar *dialogTitle, + const PRUnichar *text) +{ + nsresult rv; + rv = EnsureCommonDialogs(); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr domWindow; + rv = GetDOMWindowInternal(getter_AddRefs(domWindow)); + if (NS_FAILED(rv)) + return rv; + + return mCommonDialogs->Alert(domWindow, dialogTitle, text); + +} + +NS_IMETHODIMP +GtkMozEmbedChrome::AlertCheck(const PRUnichar *dialogTitle, + const PRUnichar *text, + const PRUnichar *checkMsg, + PRBool *checkValue) +{ + nsresult rv; + rv = EnsureCommonDialogs(); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr domWindow; + rv = GetDOMWindowInternal(getter_AddRefs(domWindow)); + if (NS_FAILED(rv)) + return rv; + + return mCommonDialogs->AlertCheck(domWindow, dialogTitle, text, checkMsg, checkValue); + +} + +NS_IMETHODIMP +GtkMozEmbedChrome::Confirm(const PRUnichar *dialogTitle, + const PRUnichar *text, PRBool *_retval) +{ + nsresult rv; + rv = EnsureCommonDialogs(); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr domWindow; + rv = GetDOMWindowInternal(getter_AddRefs(domWindow)); + if (NS_FAILED(rv)) + return rv; + + return mCommonDialogs->Confirm(domWindow, dialogTitle, text, _retval); +} + +NS_IMETHODIMP +GtkMozEmbedChrome::ConfirmCheck(const PRUnichar *dialogTitle, + const PRUnichar *text, + const PRUnichar *checkMsg, + PRBool *checkValue, PRBool *_retval) +{ + nsresult rv; + rv = EnsureCommonDialogs(); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr domWindow; + rv = GetDOMWindowInternal(getter_AddRefs(domWindow)); + if (NS_FAILED(rv)) + return rv; + + return mCommonDialogs->ConfirmCheck(domWindow, + dialogTitle, + text, + checkMsg, + checkValue, + _retval); +} + +NS_IMETHODIMP +GtkMozEmbedChrome::Prompt(const PRUnichar *dialogTitle, + const PRUnichar *text, + const PRUnichar *passwordRealm, + PRUint32 savePassword, + const PRUnichar *defaultText, + PRUnichar **result, PRBool *_retval) +{ + nsresult rv; + rv = EnsureCommonDialogs(); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr domWindow; + rv = GetDOMWindowInternal(getter_AddRefs(domWindow)); + if (NS_FAILED(rv)) + return rv; + + return mCommonDialogs->Prompt(domWindow, + dialogTitle, + text, + defaultText, + result, + _retval); + +} + +NS_IMETHODIMP +GtkMozEmbedChrome::PromptUsernameAndPassword(const PRUnichar *dialogTitle, + const PRUnichar *text, + const PRUnichar *passwordRealm, + PRUint32 savePassword, + PRUnichar **user, + PRUnichar **pwd, + PRBool *_retval) +{ + nsresult rv; + rv = EnsureCommonDialogs(); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr domWindow; + rv = GetDOMWindowInternal(getter_AddRefs(domWindow)); + if (NS_FAILED(rv)) + return rv; + + return mCommonDialogs->PromptUsernameAndPassword(domWindow, dialogTitle, + text, user, pwd, _retval); + +} + +NS_IMETHODIMP +GtkMozEmbedChrome::PromptPassword(const PRUnichar *dialogTitle, + const PRUnichar *text, + const PRUnichar *passwordRealm, + PRUint32 savePassword, PRUnichar **pwd, + PRBool *_retval) +{ + nsresult rv; + rv = EnsureCommonDialogs(); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr domWindow; + rv = GetDOMWindowInternal(getter_AddRefs(domWindow)); + if (NS_FAILED(rv)) + return rv; + + return mCommonDialogs->PromptPassword(domWindow, + dialogTitle, + text, + pwd, _retval); +} + +NS_IMETHODIMP +GtkMozEmbedChrome::Select(const PRUnichar *dialogTitle, + const PRUnichar *text, PRUint32 count, + const PRUnichar **selectList, + PRInt32 *outSelection, PRBool *_retval) +{ + nsresult rv; + rv = EnsureCommonDialogs(); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr domWindow; + rv = GetDOMWindowInternal(getter_AddRefs(domWindow)); + if (NS_FAILED(rv)) + return rv; + + return mCommonDialogs->Select(domWindow, dialogTitle, + text, count, selectList, + outSelection, _retval); +} + +NS_IMETHODIMP +GtkMozEmbedChrome::UniversalDialog(const PRUnichar *titleMessage, + const PRUnichar *dialogTitle, + const PRUnichar *text, + const PRUnichar *checkboxMsg, + const PRUnichar *button0Text, + const PRUnichar *button1Text, + const PRUnichar *button2Text, + const PRUnichar *button3Text, + const PRUnichar *editfield1Msg, + const PRUnichar *editfield2Msg, + PRUnichar **editfield1Value, + PRUnichar **editfield2Value, + const PRUnichar *iconURL, + PRBool *checkboxState, + PRInt32 numberButtons, + PRInt32 numberEditfields, + PRInt32 editField1Password, + PRInt32 *buttonPressed) +{ + nsresult rv; + rv = EnsureCommonDialogs(); + if (NS_FAILED(rv)) + return rv; + + nsCOMPtr domWindow; + rv = GetDOMWindowInternal(getter_AddRefs(domWindow)); + if (NS_FAILED(rv)) + return rv; + + return mCommonDialogs->UniversalDialog(domWindow, titleMessage, + dialogTitle, text, + checkboxMsg, button0Text, + button1Text, + button2Text, + button3Text, + editfield1Msg, + editfield2Msg, + editfield1Value, + editfield2Value, + iconURL, + checkboxState, + numberButtons, + numberEditfields, + editField1Password, + buttonPressed); + +} diff --git a/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.h b/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.h index af2cd3b7d39..ac5771ee94e 100644 --- a/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.h +++ b/mozilla/embedding/browser/gtk/src/GtkMozEmbedChrome.h @@ -40,6 +40,9 @@ #include "nsIStreamListener.h" #include "nsIDocShellTreeOwner.h" #include "nsIDocShellTreeItem.h" +#include "nsIPrompt.h" +#include "nsICommonDialogs.h" +#include "nsIDOMWindowInternal.h" // utility classes #include "nsXPIDLString.h" @@ -54,7 +57,8 @@ class GtkMozEmbedChrome : public nsIGtkEmbed, public nsIBaseWindow, public nsIURIContentListener, public nsIDocShellTreeOwner, - public nsIInterfaceRequestor + public nsIInterfaceRequestor, + public nsIPrompt { public: @@ -71,6 +75,8 @@ public: NS_IMETHOD OpenStream (const char *aBaseURI, const char *aContentType); NS_IMETHOD AppendToStream (const char *aData, gint32 aLen); NS_IMETHOD CloseStream (void); + NS_IMETHOD EnsureCommonDialogs (void); + NS_IMETHOD GetDOMWindowInternal (nsIDOMWindowInternal **aWindow); NS_DECL_ISUPPORTS @@ -84,6 +90,8 @@ public: NS_DECL_NSIBASEWINDOW + NS_DECL_NSIPROMPT + private: GtkWidget *mOwningGtkWidget; nsCOMPtr mWebBrowser; @@ -104,6 +112,7 @@ private: PRBool mDoingStream; GtkEmbedListener *mChromeListener; nsIDocShellTreeItem *mContentShell; + nsCOMPtr mCommonDialogs; }; #endif /* __GtkMozEmbedChrome_h */ diff --git a/mozilla/embedding/browser/gtk/src/gtkmozembed.cpp b/mozilla/embedding/browser/gtk/src/gtkmozembed.cpp index aebaeb4db26..af9fc2e2099 100644 --- a/mozilla/embedding/browser/gtk/src/gtkmozembed.cpp +++ b/mozilla/embedding/browser/gtk/src/gtkmozembed.cpp @@ -47,6 +47,8 @@ #include "nsWidgetsCID.h" #include "nsIAppShell.h" #include "nsIDOMDocument.h" +#include "nsIAppShellService.h" +#include "nsIXULWindow.h" // freakin X headers #ifdef Success @@ -417,7 +419,7 @@ GtkMozEmbedPrivate::LoadChrome(void) NS_ASSERTION(cx == nsnull, "JSContextStack mismatch"); } - + // and spindown... subShell->Spindown(); @@ -740,7 +742,10 @@ static GdkWindow *offscreen_window = 0; static char *component_path = 0; static gint num_widgets = 0; -nsCOMPtr gAppShell; +nsCOMPtr gAppShell; +nsCOMPtr gHiddenWindow = 0; + + /* class and instance initialization */ @@ -1551,6 +1556,15 @@ gtk_moz_embed_startup_xpcom(void) if (NS_FAILED(rv)) return FALSE; + // Start up the appshell service. We need this for chrome windows. + nsCOMPtr appShell(do_GetService(kAppShellServiceCID)); + appShell->Initialize(nsnull, nsnull); + // create a hidden window so that the appshell service doesn't try + // and Quit on us when a dialog goes away. + appShell->CreateTopLevelWindow(nsnull, nsnull, PR_FALSE, PR_FALSE, + 0, 1, 1, getter_AddRefs(gHiddenWindow)); + + // spin up an appshell gAppShell = do_CreateInstance(kAppShellCID); NS_ENSURE_TRUE(gAppShell, NS_ERROR_FAILURE); @@ -1565,8 +1579,14 @@ gtk_moz_embed_shutdown_xpcom(void) { if (gAppShell) { + // Shutdown the appshell service after deleting the hidden window + gHiddenWindow = 0; + nsCOMPtr appShell(do_GetService(kAppShellServiceCID)); + appShell->Shutdown(); + appShell = 0; + // spin down the appshell gAppShell->Spindown(); - gAppShell = nsnull; + gAppShell = 0; // shut down XPCOM NS_TermEmbedding(); } @@ -1618,6 +1638,27 @@ GtkMozEmbedListenerImpl::NewBrowser(PRUint32 chromeMask, nsIDocShellTreeItem **_retval) { GtkMozEmbed *newEmbed = NULL; + // if it's a chrome window that's being requested, don't even bother + // allowing the app to catch it. + if (chromeMask & nsIWebBrowserChrome::CHROME_OPENAS_CHROME) { + nsCOMPtr appShell(do_GetService(kAppShellServiceCID)); + NS_ENSURE_TRUE(appShell, NS_ERROR_FAILURE); + nsCOMPtr newWindow; + appShell->CreateTopLevelWindow(nsnull, nsnull, PR_FALSE, PR_FALSE, + chromeMask, NS_SIZETOCONTENT, NS_SIZETOCONTENT, + getter_AddRefs(newWindow)); + + NS_ENSURE_TRUE(newWindow, NS_ERROR_FAILURE); + nsCOMPtr browserChrome(do_GetInterface(newWindow)); + if (browserChrome) + browserChrome->SetChromeFlags(chromeMask); + + nsCOMPtr docShell; + newWindow->GetDocShell(getter_AddRefs(docShell)); + CallQueryInterface(docShell, _retval); + + return NS_OK; + } gtk_signal_emit(GTK_OBJECT(mEmbed), moz_embed_signals[NEW_WINDOW], &newEmbed, (guint)chromeMask); if (newEmbed) {