Changes to unify nsINetPrompt with nsIPrompt, making single sign-on work. Single sign-on API changes. Fixes bugs 34583, 34720, 34725, 24746, 33094. r=sspitzer,morse

git-svn-id: svn://10.0.0.236/trunk@69998 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
warren%netscape.com
2000-05-16 05:35:23 +00:00
parent db806b4238
commit 1958638f6c
54 changed files with 971 additions and 505 deletions

View File

@@ -256,8 +256,6 @@ NS_INTERFACE_MAP_BEGIN(nsWebShellWindow)
NS_INTERFACE_MAP_ENTRY(nsIWebShellWindow)
NS_INTERFACE_MAP_ENTRY(nsIWebShellContainer)
NS_INTERFACE_MAP_ENTRY(nsIDocumentLoaderObserver)
NS_INTERFACE_MAP_ENTRY(nsIPrompt)
NS_INTERFACE_MAP_ENTRY(nsINetPrompt)
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
NS_INTERFACE_MAP_ENTRY(nsIXULWindow)
NS_INTERFACE_MAP_ENTRY(nsIBaseWindow)
@@ -1432,7 +1430,7 @@ void nsWebShellWindow::LoadContentAreas() {
char *urlChar;
nsIWebShell *contentShell;
nsresult rv;
for (endPos = 0; endPos < searchSpec.Length(); ) {
for (endPos = 0; endPos < (PRInt32)searchSpec.Length(); ) {
// extract contentAreaID and URL substrings
begPos = endPos;
eqPos = searchSpec.FindChar('=', PR_FALSE,begPos);
@@ -1729,9 +1727,265 @@ NS_IMETHODIMP nsWebShellWindow::Destroy()
return nsXULWindow::Destroy();
}
////////////////////////////////////////////////////////////////////////////////
// XXX What a mess we have here w.r.t. our prompting interfaces. As far as I
// can tell, the situation looks something like this:
//
// - clients get the nsIPrompt from the web shell window
// - the web shell window passes control to nsCommonDialogs
// - nsCommonDialogs calls into js with the current dom window
// - the dom window gets the nsIPrompt of its tree owner
// - somewhere along the way a real dialog comes up
//
// This little transducer maps the nsIPrompt interface to the nsICommonDialogs
// interface. Ideally, nsIPrompt would be implemented by nsIDOMWindow which
// would eliminate the need for this.
class nsDOMWindowPrompter : public nsIPrompt
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIPROMPT
nsDOMWindowPrompter(nsIDOMWindow* window);
virtual ~nsDOMWindowPrompter() {}
nsresult Init();
protected:
nsCOMPtr<nsIDOMWindow> mDOMWindow;
nsCOMPtr<nsICommonDialogs> mCommonDialogs;
};
static nsresult
NS_NewDOMWindowPrompter(nsIPrompt* *result, nsIDOMWindow* window)
{
nsresult rv;
nsDOMWindowPrompter* prompter = new nsDOMWindowPrompter(window);
if (prompter == nsnull)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(prompter);
rv = prompter->Init();
if (NS_FAILED(rv)) {
NS_RELEASE(prompter);
return rv;
}
*result = prompter;
return NS_OK;
}
NS_IMPL_THREADSAFE_ISUPPORTS1(nsDOMWindowPrompter, nsIPrompt)
nsDOMWindowPrompter::nsDOMWindowPrompter(nsIDOMWindow* window)
: mDOMWindow(window)
{
NS_INIT_REFCNT();
}
nsresult
nsDOMWindowPrompter::Init()
{
nsresult rv;
mCommonDialogs = do_GetService(kCommonDialogsCID, &rv);
return rv;
}
NS_IMETHODIMP
nsDOMWindowPrompter::Alert(const PRUnichar* dialogTitle,
const PRUnichar* text)
{
nsresult rv;
nsAutoString title(dialogTitle);
if (title == nsnull)
title.AssignWithConversion("Alert"); // XXX i18n
rv = mCommonDialogs->Alert(mDOMWindow, title.GetUnicode(), text);
return rv;
}
NS_IMETHODIMP
nsDOMWindowPrompter::Confirm(const PRUnichar* dialogTitle,
const PRUnichar* text,
PRBool *_retval)
{
nsresult rv;
nsAutoString title(dialogTitle);
if (title == nsnull)
title.AssignWithConversion("Confirm"); // XXX i18n
rv = mCommonDialogs->Confirm(mDOMWindow, title.GetUnicode(), text, _retval);
return rv;
}
NS_IMETHODIMP
nsDOMWindowPrompter::ConfirmCheck(const PRUnichar* dialogTitle,
const PRUnichar* text,
const PRUnichar* checkMsg,
PRBool *checkValue,
PRBool *_retval)
{
nsresult rv;
nsAutoString title(dialogTitle);
if (title == nsnull)
title.AssignWithConversion("Confirm"); // XXX i18n
rv = mCommonDialogs->ConfirmCheck(mDOMWindow, title.GetUnicode(), text,
checkMsg, checkValue, _retval);
return rv;
}
NS_IMETHODIMP
nsDOMWindowPrompter::Prompt(const PRUnichar* dialogTitle,
const PRUnichar* text,
const PRUnichar* passwordRealm,
const PRUnichar* defaultText,
PRUnichar* *result,
PRBool *_retval)
{
// ignore passwordRealm here?
nsresult rv;
nsAutoString title(dialogTitle);
if (title == nsnull)
title.AssignWithConversion("Prompt"); // XXX i18n
rv = mCommonDialogs->Prompt(mDOMWindow, title.GetUnicode(), text,
defaultText, result, _retval);
return rv;
}
NS_IMETHODIMP
nsDOMWindowPrompter::PromptUsernameAndPassword(const PRUnichar* dialogTitle,
const PRUnichar* text,
const PRUnichar* passwordRealm,
PRBool persistPassword,
PRUnichar* *user,
PRUnichar* *pwd,
PRBool *_retval)
{
// ignore passwordRealm and persistPassword here?
nsresult rv;
nsAutoString title(dialogTitle);
if (title == nsnull)
title.AssignWithConversion("Prompt"); // XXX i18n
rv = mCommonDialogs->PromptUsernameAndPassword(mDOMWindow, title.GetUnicode(), text,
user, pwd, _retval);
return rv;
}
NS_IMETHODIMP
nsDOMWindowPrompter::PromptPassword(const PRUnichar* dialogTitle,
const PRUnichar* text,
const PRUnichar* passwordRealm,
PRBool persistPassword,
PRUnichar* *pwd,
PRBool *_retval)
{
// ignore passwordRealm and persistPassword here?
nsresult rv;
nsAutoString title(dialogTitle);
if (title == nsnull)
title.AssignWithConversion("Prompt"); // XXX i18n
rv = mCommonDialogs->PromptPassword(mDOMWindow, title.GetUnicode(), text,
pwd, _retval);
return rv;
}
NS_IMETHODIMP
nsDOMWindowPrompter::Select(const PRUnichar *dialogTitle,
const PRUnichar* inMsg,
PRUint32 inCount,
const PRUnichar **inList,
PRInt32 *outSelection,
PRBool *_retval)
{
nsresult rv;
nsAutoString title(dialogTitle);
if (title == nsnull)
title.AssignWithConversion("Select"); // XXX i18n
rv = mCommonDialogs->Select(mDOMWindow, title.GetUnicode(), inMsg,
inCount, inList, outSelection, _retval);
return rv;
}
NS_IMETHODIMP
nsDOMWindowPrompter::UniversalDialog(const PRUnichar *inTitleMessage,
const PRUnichar *inDialogTitle, /* e.g., alert, confirm, prompt, prompt password */
const PRUnichar *inMsg, /* main message for dialog */
const PRUnichar *inCheckboxMsg, /* message for checkbox */
const PRUnichar *inButton0Text, /* text for first button */
const PRUnichar *inButton1Text, /* text for second button */
const PRUnichar *inButton2Text, /* text for third button */
const PRUnichar *inButton3Text, /* text for fourth button */
const PRUnichar *inEditfield1Msg, /*message for first edit field */
const PRUnichar *inEditfield2Msg, /* message for second edit field */
PRUnichar **inoutEditfield1Value, /* initial and final value for first edit field */
PRUnichar **inoutEditfield2Value, /* initial and final value for second edit field */
const PRUnichar *inIConURL, /* url of icon to be displayed in dialog */
/* examples are
"chrome://global/skin/question-icon.gif" for question mark,
"chrome://global/skin/alert-icon.gif" for exclamation mark
*/
PRBool *inoutCheckboxState, /* initial and final state of check box */
PRInt32 inNumberButtons, /* total number of buttons (0 to 4) */
PRInt32 inNumberEditfields, /* total number of edit fields (0 to 2) */
PRInt32 inEditField1Password, /* is first edit field a password field */
PRInt32 *outButtonPressed) /* number of button that was pressed (0 to 3) */
{
nsresult rv;
rv = mCommonDialogs->UniversalDialog(mDOMWindow,
inTitleMessage,
inDialogTitle,
inMsg,
inCheckboxMsg,
inButton0Text,
inButton1Text,
inButton2Text,
inButton3Text,
inEditfield1Msg,
inEditfield2Msg,
inoutEditfield1Value,
inoutEditfield2Value,
inIConURL,
inoutCheckboxState,
inNumberButtons,
inNumberEditfields,
inEditField1Password,
outButtonPressed);
return rv;
}
////////////////////////////////////////////////////////////////////////////////
NS_IMETHODIMP
nsWebShellWindow::GetPrompter(nsIPrompt* *result)
{
nsresult rv;
if (mPrompter == nsnull) {
nsIWebShell* tempWebShell;
GetWebShell(tempWebShell);
nsCOMPtr<nsIWebShell> webShell(dont_AddRef(tempWebShell));
nsCOMPtr<nsIDOMWindow> domWindow;
rv = ConvertWebShellToDOMWindow(webShell, getter_AddRefs(domWindow));
if (NS_FAILED(rv)) {
NS_ERROR("Unable to retrieve the DOM window from the new web shell.");
return rv;
}
nsCOMPtr<nsIPrompt> prompt;
rv = NS_NewDOMWindowPrompter(getter_AddRefs(prompt), domWindow);
if (NS_FAILED(rv)) return rv;
// wrap the nsDOMWindowPrompter in a nsISingleSignOnPrompt:
rv = NS_NewSingleSignOnPrompt(getter_AddRefs(mPrompter), prompt);
if (NS_FAILED(rv)) return rv;
}
*result = mPrompter;
NS_ADDREF(*result);
return NS_OK;
}
#if 0
////////////////////////////////////////////////////////////////////////////////
// nsIPrompt
NS_IMETHODIMP nsWebShellWindow::Alert(const PRUnichar *text)
NS_IMETHODIMP nsWebShellWindow::Alert(const PRUnichar* dialogTitle,
const PRUnichar* text)
{
nsresult rv;
nsCOMPtr<nsIDOMWindow> domWindow;
@@ -1752,7 +2006,9 @@ NS_IMETHODIMP nsWebShellWindow::Alert(const PRUnichar *text)
return rv;
}
NS_IMETHODIMP nsWebShellWindow::Confirm(const PRUnichar *text, PRBool *_retval)
NS_IMETHODIMP nsWebShellWindow::Confirm(const PRUnichar* dialogTitle,
const PRUnichar* text,
PRBool *_retval)
{
nsresult rv;
nsCOMPtr<nsIDOMWindow> domWindow;
@@ -1772,7 +2028,11 @@ NS_IMETHODIMP nsWebShellWindow::Confirm(const PRUnichar *text, PRBool *_retval)
return rv;
}
NS_IMETHODIMP nsWebShellWindow::ConfirmCheck(const PRUnichar *text, const PRUnichar *checkMsg, PRBool *checkValue, PRBool *_retval)
NS_IMETHODIMP nsWebShellWindow::ConfirmCheck(const PRUnichar* dialogTitle,
const PRUnichar* text,
const PRUnichar* checkMsg,
PRBool *checkValue,
PRBool *_retval)
{
nsresult rv;
nsCOMPtr<nsIDOMWindow> domWindow;
@@ -1841,7 +2101,12 @@ NS_IMETHODIMP nsWebShellWindow::UniversalDialog
NS_IMETHODIMP nsWebShellWindow::Prompt(const PRUnichar *text, const PRUnichar *defaultText, PRUnichar **result, PRBool *_retval)
NS_IMETHODIMP nsWebShellWindow::Prompt(const PRUnichar* dialogTitle,
const PRUnichar* text,
const PRUnichar* passwordRealm,
const PRUnichar* defaultText,
PRUnichar* *result,
PRBool *_retval)
{
nsresult rv;
nsCOMPtr<nsIDOMWindow> domWindow;
@@ -1862,7 +2127,13 @@ NS_IMETHODIMP nsWebShellWindow::Prompt(const PRUnichar *text, const PRUnichar *d
return rv;
}
NS_IMETHODIMP nsWebShellWindow::PromptUsernameAndPassword(const PRUnichar *text, PRUnichar **user, PRUnichar **pwd, PRBool *_retval)
NS_IMETHODIMP nsWebShellWindow::PromptUsernameAndPassword(const PRUnichar* dialogTitle,
const PRUnichar* text,
const PRUnichar* passwordRealm,
PRBool persistPassword,
PRUnichar* *user,
PRUnichar* *pwd,
PRBool *_retval)
{
nsresult rv;
nsCOMPtr<nsIDOMWindow> domWindow;
@@ -1884,7 +2155,12 @@ nsString defaultTitle; defaultTitle.AssignWithConversion("Prompt Username and Pa
return rv;
}
NS_IMETHODIMP nsWebShellWindow::PromptPassword(const PRUnichar *text, const PRUnichar *title, PRUnichar **pwd, PRBool *_retval)
NS_IMETHODIMP nsWebShellWindow::PromptPassword(const PRUnichar* dialogTitle,
const PRUnichar* text,
const PRUnichar* passwordRealm,
PRBool persistPassword,
PRUnichar* *pwd,
PRBool *_retval)
{
nsresult rv;
nsCOMPtr<nsIDOMWindow> domWindow;
@@ -1899,7 +2175,7 @@ NS_IMETHODIMP nsWebShellWindow::PromptPassword(const PRUnichar *text, const PRUn
NS_WITH_SERVICE(nsICommonDialogs, dialog, kCommonDialogsCID, &rv);
if ( NS_SUCCEEDED( rv ) )
rv = dialog->PromptPassword( domWindow, title, text, pwd, _retval );
rv = dialog->PromptPassword( domWindow, dialogTitle, text, pwd, _retval );
return rv;
}
@@ -1922,30 +2198,30 @@ NS_IMETHODIMP nsWebShellWindow::Select( const PRUnichar *inDialogTitle, const PR
return rv;
}
NS_IMETHODIMP nsWebShellWindow::Alert(const char *url, PRBool stripUrl, const PRUnichar *title, const PRUnichar *text)
NS_IMETHODIMP nsWebShellWindow::Alert(const char *key, const PRUnichar *title, const PRUnichar *text)
{
return Alert( text );
}
NS_IMETHODIMP nsWebShellWindow::Confirm(const char *url, PRBool stripUrl, const PRUnichar *title, const PRUnichar *text, PRBool *_retval)
NS_IMETHODIMP nsWebShellWindow::Confirm(const char *key, const PRUnichar *title, const PRUnichar *text, PRBool *_retval)
{
return Confirm( text, _retval );
}
NS_IMETHODIMP nsWebShellWindow::PromptUsernameAndPassword(const char *url, PRBool stripUrl, const PRUnichar *title, const PRUnichar *text, PRUnichar **user, PRUnichar **pwd, PRBool *_retval)
NS_IMETHODIMP nsWebShellWindow::PromptUsernameAndPassword(const char *key, const PRUnichar *title, const PRUnichar *text, PRUnichar **user, PRUnichar **pwd, PRBool *_retval)
{
nsresult res;
NS_WITH_SERVICE(nsIWalletService, wallet, kWalletServiceCID, &res);
if (NS_FAILED(res)) {
return PromptUsernameAndPassword(text,user, pwd, _retval);
return PromptUsernameAndPassword(text, user, pwd, _retval);
}
nsCOMPtr<nsIPrompt> prompter = this;
return wallet->PromptUsernameAndPasswordURL(text,user, pwd, url, stripUrl, prompter, _retval);
return wallet->PromptUsernameAndPassword(text, user, pwd, key, prompter, PR_TRUE, _retval);
}
NS_IMETHODIMP nsWebShellWindow::PromptPassword(const char *url, PRBool stripUrl, const PRUnichar *title, const PRUnichar *text, PRUnichar **pwd, PRBool *_retval)
NS_IMETHODIMP nsWebShellWindow::PromptPassword(const char *key, const PRUnichar *title, const PRUnichar *text, PRUnichar **pwd, PRBool *_retval)
{
nsresult res;
NS_WITH_SERVICE(nsIWalletService, wallet, kWalletServiceCID, &res);
@@ -1953,10 +2229,10 @@ NS_IMETHODIMP nsWebShellWindow::PromptPassword(const char *url, PRBool stripUrl,
return PromptPassword(text, title, pwd, _retval);
}
nsCOMPtr<nsIPrompt> prompter = this;
return wallet->PromptPasswordURL(text, pwd, url, stripUrl, prompter, _retval);
return wallet->PromptPassword(text, pwd, key, prompter, PR_TRUE, _retval);
}
NS_IMETHODIMP nsWebShellWindow::Prompt(const char *url, PRBool stripUrl, const PRUnichar *title, const PRUnichar *text, PRUnichar **value, PRBool *_retval)
NS_IMETHODIMP nsWebShellWindow::Prompt(const char *key, const PRUnichar *title, const PRUnichar *text, PRUnichar **value, PRBool *_retval)
{
nsresult res;
NS_WITH_SERVICE(nsIWalletService, wallet, kWalletServiceCID, &res);
@@ -1964,5 +2240,11 @@ NS_IMETHODIMP nsWebShellWindow::Prompt(const char *url, PRBool stripUrl, const P
return Prompt(text, title, value, _retval);
}
nsCOMPtr<nsIPrompt> prompter = this;
return wallet->PromptURL(text, nsnull, value, url, stripUrl, prompter, _retval);
return wallet->Prompt(text, nsnull, value, key, prompter, _retval);
}
#endif