mirror of https://github.com/roytam1/kmeleon.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
800 lines
28 KiB
800 lines
28 KiB
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- |
|
* |
|
* The contents of this file are subject to the Netscape Public |
|
* License Version 1.1 (the "License"); you may not use this file |
|
* except in compliance with the License. You may obtain a copy of |
|
* the License at http://www.mozilla.org/NPL/ |
|
* |
|
* Software distributed under the License is distributed on an "AS |
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or |
|
* implied. See the License for the specific language governing |
|
* rights and limitations under the License. |
|
* |
|
* The Original Code is mozilla.org code. |
|
* |
|
* The Initial Developer of the Original Code is Netscape |
|
* Communications Corporation. Portions created by Netscape are |
|
* Copyright (C) 2001 Netscape Communications Corporation. All |
|
* Rights Reserved. |
|
* |
|
* Contributor(s): |
|
*/ |
|
|
|
/* PromptService is intended to override the default Mozilla PromptService, |
|
giving nsIPrompt implementations of our own design, rather than using |
|
Mozilla's. Do this by building this into a component and registering the |
|
factory with the same CID/ContractID as Mozilla's (see MfcEmbed.cpp). |
|
*/ |
|
|
|
#include "stdafx.h" |
|
#include "resource.h" |
|
#include "GenericDlg.h" |
|
#include "Dialogs.h" |
|
#include "mfcembed.h" |
|
#include "PromptService.h" |
|
#include "nsIPromptService.h" |
|
#include "nsIWindowWatcher.h" |
|
#include "nsIAuthInformation.h" |
|
|
|
#include "nsILoginManager.h" |
|
#include "MozUtils.h" |
|
#include "nsIIOService.h" |
|
#include "nsIProtocolHandler.h" |
|
#include "nsILoginInfo.h" |
|
#include "nsIStringBundle.h" |
|
|
|
extern CWnd* CWndForDOMWindow(nsIDOMWindow *aWindow); |
|
|
|
//***************************************************************************** |
|
// CPromptService |
|
//***************************************************************************** |
|
|
|
|
|
|
|
//***************************************************************************** |
|
NS_IMPL_ISUPPORTS(CPromptService, nsIPromptFactory, nsIPrompt, nsIAuthPrompt, nsIPromptService, nsIContentPermissionPrompt) |
|
//NS_IMPL_ISUPPORTS1(CPromptService, nsIPromptService/*, nsINonBlockingAlertService*/) |
|
|
|
CPromptService::CPromptService() |
|
{ |
|
} |
|
|
|
CPromptService::~CPromptService() { |
|
} |
|
|
|
NS_IMETHODIMP CPromptService::GetPrompt(nsIDOMWindow *aParent, const nsIID & iid, void **result) |
|
{ |
|
mDomWindow = aParent; |
|
return QueryInterface(iid, result); |
|
} |
|
|
|
/* boolean prompt (in wstring dialogTitle, in wstring text, in wstring passwordRealm, in uint32_t savePassword, in wstring defaultText, out wstring result); */ |
|
NS_IMETHODIMP CPromptService::Prompt(const PRUnichar * dialogTitle, const PRUnichar * text, const PRUnichar * passwordRealm, uint32_t savePassword, const PRUnichar * defaultText, PRUnichar * *result, bool *_retval) |
|
{ |
|
return NS_ERROR_NOT_IMPLEMENTED; |
|
} |
|
|
|
/* boolean promptUsernameAndPassword (in wstring dialogTitle, in wstring text, in wstring passwordRealm, in uint32_t savePassword, inout wstring user, inout wstring pwd); */ |
|
NS_IMETHODIMP CPromptService::PromptUsernameAndPassword(const PRUnichar * dialogTitle, const PRUnichar * text, const PRUnichar * passwordRealm, uint32_t savePassword, PRUnichar * *user, PRUnichar * *pwd, bool *_retval) |
|
{ |
|
nsString realm, url; |
|
url.Assign(passwordRealm); |
|
const wchar_t *start = wcsrchr(passwordRealm, '('), *stop; |
|
if (start && (stop = wcsrchr(start, ')')) && stop>start) { |
|
realm.Append(start+1, stop-start-1); |
|
url.Assign(passwordRealm, start-passwordRealm); |
|
} |
|
realm.get(); |
|
url.get(); |
|
|
|
nsCOMPtr<nsIURI> uri; |
|
NewURI(getter_AddRefs(uri), url); |
|
nsCString scheme, host, hostname; |
|
int32_t port = -1, dport; |
|
if (uri) { |
|
uri->GetHost(host); |
|
uri->GetScheme(hostname); |
|
uri->GetPort(&port); |
|
} |
|
hostname.Append(scheme); |
|
hostname.Append("://"); |
|
hostname.Append(host); |
|
if (port != -1) { |
|
nsCOMPtr<nsIIOService> ios = do_GetService("@mozilla.org/network/io-service;1"); |
|
if (ios) { |
|
nsCOMPtr<nsIProtocolHandler> handler; |
|
ios->GetProtocolHandler(scheme.get(), getter_AddRefs(handler)); |
|
handler->GetDefaultPort(&dport); |
|
if (dport != port) { |
|
hostname.Append(":"); |
|
char p[20]; |
|
_itoa_s(port, p, 10); |
|
hostname.Append(p); |
|
} |
|
} |
|
} |
|
|
|
nsString checkMsg; |
|
nsString hostname2 = NS_ConvertUTF8toUTF16(hostname); |
|
bool canSave = false; |
|
nsILoginInfo* selectedLogin = nullptr; |
|
nsCOMPtr<nsILoginManager> loginManager = do_GetService("@mozilla.org/login-manager;1"); |
|
if (loginManager) { |
|
loginManager->GetLoginSavingEnabled(hostname2, &canSave); |
|
canSave &= (savePassword == nsIAuthPrompt::SAVE_PASSWORD_PERMANENTLY); |
|
if (canSave) { |
|
uint32_t count; |
|
nsILoginInfo** logins; |
|
loginManager->FindLogins(&count, hostname2, nsString(), realm, &logins); |
|
if (count>0) { |
|
selectedLogin = logins[0]; |
|
nsString nuser,npass; |
|
selectedLogin->GetPassword(npass); |
|
selectedLogin->GetUsername(nuser); |
|
*pwd = NS_StringCloneData(npass); |
|
*user = NS_StringCloneData(nuser); |
|
} |
|
nsCOMPtr<nsIStringBundleService> bundleService = do_GetService("@mozilla.org/intl/stringbundle;1"); |
|
if (bundleService) { |
|
nsCOMPtr<nsIStringBundle> bundle; |
|
bundleService->CreateBundle("chrome://passwordmgr/locale/passwordmgr.properties", getter_AddRefs(bundle)); |
|
if (bundle) { |
|
bundle->GetStringFromName(L"rememberPassword", getter_Copies(checkMsg)); |
|
} |
|
} |
|
} |
|
} |
|
|
|
bool checkRet = true; |
|
PromptUsernameAndPassword(mDomWindow, dialogTitle, text, user, pwd, checkMsg.get(), &checkRet, _retval); |
|
|
|
if (*_retval && checkRet && canSave && *pwd) { |
|
nsString username, password; |
|
nsCOMPtr<nsILoginInfo> newLogin; |
|
if (selectedLogin) { |
|
selectedLogin->GetUsername(username); |
|
selectedLogin->GetPassword(password); |
|
if (wcscmp(username.get(), *user) == 0 && wcscmp(password.get(), *pwd) == 0) { |
|
} else { |
|
selectedLogin->Clone(getter_AddRefs(newLogin)); |
|
loginManager->RemoveLogin(selectedLogin); |
|
} |
|
} else { |
|
newLogin = do_CreateInstance("@mozilla.org/login-manager/loginInfo;1"); |
|
newLogin->SetHostname(hostname2); |
|
newLogin->SetHttpRealm(realm); |
|
newLogin->SetPasswordField(NS_LITERAL_STRING("")); |
|
newLogin->SetUsernameField(NS_LITERAL_STRING("")); |
|
} |
|
|
|
if (newLogin) { |
|
newLogin->SetPassword(nsDependentString(*pwd)); |
|
newLogin->SetUsername(nsDependentString(*user)); |
|
loginManager->AddLogin(newLogin); |
|
} |
|
} |
|
|
|
return NS_OK; |
|
} |
|
|
|
/* boolean promptPassword (in wstring dialogTitle, in wstring text, in wstring passwordRealm, in uint32_t savePassword, inout wstring pwd); */ |
|
NS_IMETHODIMP CPromptService::PromptPassword(const PRUnichar * dialogTitle, const PRUnichar * text, const PRUnichar * passwordRealm, uint32_t savePassword, PRUnichar * *pwd, bool *_retval) |
|
{ |
|
return NS_ERROR_NOT_IMPLEMENTED; |
|
} |
|
|
|
/* void alert (in wstring dialogTitle, in wstring text); */ |
|
NS_IMETHODIMP CPromptService::Alert(const PRUnichar * dialogTitle, const PRUnichar * text) |
|
{ |
|
return Alert(mDomWindow, dialogTitle, text); |
|
} |
|
|
|
/* void alertCheck (in wstring dialogTitle, in wstring text, in wstring checkMsg, inout boolean checkValue); */ |
|
NS_IMETHODIMP CPromptService::AlertCheck(const PRUnichar * dialogTitle, const PRUnichar * text, const PRUnichar * checkMsg, bool *checkValue) |
|
{ |
|
return AlertCheck(mDomWindow, dialogTitle, text, checkMsg, checkValue); |
|
} |
|
|
|
/* boolean confirm (in wstring dialogTitle, in wstring text); */ |
|
NS_IMETHODIMP CPromptService::Confirm(const PRUnichar * dialogTitle, const PRUnichar * text, bool *_retval) |
|
{ |
|
return Confirm(mDomWindow, dialogTitle, text, _retval); |
|
} |
|
|
|
/* boolean confirmCheck (in wstring dialogTitle, in wstring text, in wstring checkMsg, inout boolean checkValue); */ |
|
NS_IMETHODIMP CPromptService::ConfirmCheck(const PRUnichar * dialogTitle, const PRUnichar * text, const PRUnichar * checkMsg, bool *checkValue, bool *_retval) |
|
{ |
|
return ConfirmCheck(mDomWindow, dialogTitle, text, checkMsg, checkValue, _retval); |
|
} |
|
|
|
/* int32_t confirmEx (in wstring dialogTitle, in wstring text, in unsigned long buttonFlags, in wstring button0Title, in wstring button1Title, in wstring button2Title, in wstring checkMsg, inout boolean checkValue); */ |
|
NS_IMETHODIMP CPromptService::ConfirmEx(const PRUnichar * dialogTitle, const PRUnichar * text, uint32_t buttonFlags, const PRUnichar * button0Title, const PRUnichar * button1Title, const PRUnichar * button2Title, const PRUnichar * checkMsg, bool *checkValue, int32_t *_retval) |
|
{ |
|
return ConfirmEx(mDomWindow, dialogTitle, text, buttonFlags, button0Title, button1Title, button2Title, checkMsg, checkValue, _retval); |
|
} |
|
|
|
/* boolean prompt (in wstring dialogTitle, in wstring text, inout wstring value, in wstring checkMsg, inout boolean checkValue); */ |
|
NS_IMETHODIMP CPromptService::Prompt(const PRUnichar * dialogTitle, const PRUnichar * text, PRUnichar * *value, const PRUnichar * checkMsg, bool *checkValue, bool *_retval) |
|
{ |
|
return Prompt(mDomWindow, dialogTitle, text, value, checkMsg, checkValue, _retval); |
|
} |
|
|
|
/* boolean promptPassword (in wstring dialogTitle, in wstring text, inout wstring password, in wstring checkMsg, inout boolean checkValue); */ |
|
NS_IMETHODIMP CPromptService::PromptPassword(const PRUnichar * dialogTitle, const PRUnichar * text, PRUnichar * *password, const PRUnichar * checkMsg, bool *checkValue, bool *_retval) |
|
{ |
|
return PromptPassword(mDomWindow, dialogTitle, text, password, checkMsg, checkValue, _retval); |
|
} |
|
|
|
/* boolean promptUsernameAndPassword (in wstring dialogTitle, in wstring text, inout wstring username, inout wstring password, in wstring checkMsg, inout boolean checkValue); */ |
|
NS_IMETHODIMP CPromptService::PromptUsernameAndPassword(const PRUnichar * dialogTitle, const PRUnichar * text, PRUnichar * *username, PRUnichar * *password, const PRUnichar * checkMsg, bool *checkValue, bool *_retval) |
|
{ |
|
return PromptUsernameAndPassword(mDomWindow, dialogTitle, text, username, password, checkMsg, checkValue, _retval); |
|
} |
|
|
|
/* boolean select (in wstring dialogTitle, in wstring text, in uint32_t count, [array, size_is (count)] in wstring selectList, out long outSelection); */ |
|
NS_IMETHODIMP CPromptService::Select(const PRUnichar * dialogTitle, const PRUnichar * text, uint32_t count, const PRUnichar * *selectList, int32_t *outSelection, bool *_retval) |
|
{ |
|
return Select(mDomWindow, dialogTitle, text, count, selectList, outSelection, _retval); |
|
} |
|
|
|
|
|
NS_IMETHODIMP CPromptService::Alert(nsIDOMWindow *parent, const PRUnichar *dialogTitle, |
|
const PRUnichar *text) |
|
{ |
|
USES_CONVERSION; |
|
CWnd *wnd = CWndForDOMWindow(parent); |
|
if (wnd) |
|
wnd->MessageBox(W2CT(text), W2CT(dialogTitle), MB_OK | MB_ICONEXCLAMATION); |
|
else |
|
::MessageBox(0, W2CT(text), W2CT(dialogTitle), MB_OK | MB_ICONEXCLAMATION); |
|
|
|
return NS_OK; |
|
} |
|
|
|
NS_IMETHODIMP CPromptService::AlertCheck(nsIDOMWindow *parent, |
|
const PRUnichar *dialogTitle, |
|
const PRUnichar *text, |
|
const PRUnichar *checkboxMsg, |
|
bool *checkValue) |
|
{ |
|
USES_CONVERSION; |
|
|
|
CWnd *wnd = CWndForDOMWindow(parent); |
|
CGenericDlg dlg(wnd); |
|
dlg.SetTitle(W2CT(dialogTitle)); |
|
dlg.SetMsg(W2CT(text)); |
|
dlg.SetDlgIcon(((CMfcEmbedApp*)AfxGetApp())->GetDefaultIcon(TRUE)); |
|
dlg.AddButton(100, IDS_OK); |
|
dlg.SetDefaultButton(100); |
|
dlg.SetCancelButton(100); |
|
dlg.SetMsgIcon(AfxGetApp()->LoadStandardIcon(IDI_EXCLAMATION)); |
|
BOOL checkResult; |
|
if (checkboxMsg && checkValue) { |
|
checkResult = (*checkValue == true ? TRUE : FALSE); |
|
dlg.AddCheckBox(&checkResult, W2CT(checkboxMsg)); |
|
} |
|
|
|
dlg.DoModal(); |
|
|
|
if (checkValue) |
|
*checkValue = (checkResult == TRUE ? true : false); |
|
|
|
return NS_OK; |
|
} |
|
|
|
NS_IMETHODIMP CPromptService::Confirm(nsIDOMWindow *parent, |
|
const PRUnichar *dialogTitle, |
|
const PRUnichar *text, |
|
bool *_retval) |
|
{ |
|
USES_CONVERSION; |
|
CWnd *wnd = CWndForDOMWindow(parent); |
|
int choice; |
|
|
|
if (wnd) |
|
choice = wnd->MessageBox(W2CT(text), W2CT(dialogTitle), |
|
MB_OKCANCEL | MB_ICONEXCLAMATION); |
|
else |
|
choice = ::MessageBox(0, W2CT(text), W2CT(dialogTitle), |
|
MB_OKCANCEL | MB_ICONEXCLAMATION); |
|
|
|
*_retval = choice == IDOK ? PR_TRUE : PR_FALSE; |
|
|
|
return NS_OK; |
|
} |
|
|
|
NS_IMETHODIMP CPromptService::ConfirmCheck(nsIDOMWindow *parent, |
|
const PRUnichar *dialogTitle, |
|
const PRUnichar *text, |
|
const PRUnichar *checkboxMsg, |
|
bool *checkValue, |
|
bool *_retval) |
|
{ |
|
const int COMMAND_OFFSET = 100; |
|
|
|
USES_CONVERSION; |
|
CWnd *wnd = CWndForDOMWindow(parent); |
|
CGenericDlg dlg(wnd); |
|
dlg.SetTitle(W2CT(dialogTitle)); |
|
dlg.SetMsg(W2CT(text)); |
|
dlg.SetDlgIcon(((CMfcEmbedApp*)AfxGetApp())->GetDefaultIcon(TRUE)); |
|
BOOL checkResult; |
|
if (checkboxMsg && checkValue) { |
|
checkResult = (*checkValue == PR_TRUE ? TRUE : FALSE); |
|
dlg.AddCheckBox(&checkResult, W2CT(checkboxMsg)); |
|
} |
|
|
|
dlg.AddButton(COMMAND_OFFSET, IDS_YES); |
|
dlg.AddButton(COMMAND_OFFSET+1, IDS_NO); |
|
dlg.SetDefaultButton(COMMAND_OFFSET); |
|
dlg.SetCancelButton(COMMAND_OFFSET+1); |
|
|
|
int iBtnClicked = dlg.DoModal(); |
|
|
|
if (checkValue) |
|
*checkValue = (checkResult == TRUE ? PR_TRUE : PR_FALSE); |
|
|
|
return NS_OK; |
|
} |
|
|
|
NS_IMETHODIMP CPromptService::Prompt(nsIDOMWindow *parent, |
|
const PRUnichar *dialogTitle, |
|
const PRUnichar *text, |
|
PRUnichar **value, |
|
const PRUnichar *checkboxMsg, |
|
bool *checkValue, |
|
bool *_retval) |
|
{ |
|
USES_CONVERSION; |
|
|
|
CWnd *wnd = CWndForDOMWindow(parent); |
|
CGenericDlg dlg(wnd); |
|
dlg.SetTitle(W2CT(dialogTitle)); |
|
dlg.SetMsg(W2CT(text)); |
|
dlg.SetDlgIcon(((CMfcEmbedApp*)AfxGetApp())->GetDefaultIcon(TRUE)); |
|
dlg.AddButton(IDOK, IDS_OK); |
|
dlg.AddButton(IDCANCEL, IDS_CANCEL); |
|
dlg.SetDefaultButton(IDOK); |
|
dlg.SetCancelButton(IDCANCEL); |
|
|
|
CString csValue; |
|
if (value && *value) csValue = W2CT(*value); |
|
dlg.AddEdit(&csValue, _T(""), FALSE); |
|
|
|
BOOL checkResult; |
|
if (checkboxMsg && checkValue) { |
|
checkResult = (*checkValue == true ? TRUE : FALSE); |
|
dlg.AddCheckBox(&checkResult, W2CT(checkboxMsg)); |
|
} |
|
|
|
if (dlg.DoModal() == IDOK) { |
|
if (value) { |
|
if (*value) nsMemory::Free(*value); |
|
nsString nsPromptEditValue; |
|
nsPromptEditValue.Assign(T2CW(csValue)); |
|
*value = NS_StringCloneData(nsPromptEditValue); |
|
if (checkboxMsg && checkValue) *checkValue = checkResult; |
|
} |
|
*_retval = PR_TRUE; |
|
} |
|
else |
|
*_retval = PR_FALSE; |
|
|
|
return NS_OK; |
|
} |
|
|
|
NS_IMETHODIMP CPromptService::PromptUsernameAndPassword(nsIDOMWindow *parent, |
|
const PRUnichar *dialogTitle, |
|
const PRUnichar *text, |
|
PRUnichar **username, |
|
PRUnichar **password, |
|
const PRUnichar *checkboxMsg, |
|
bool *checkValue, |
|
bool *_retval) |
|
{ |
|
NS_ENSURE_ARG_POINTER(username); |
|
NS_ENSURE_ARG_POINTER(password); |
|
|
|
USES_CONVERSION; |
|
CWnd *wnd = CWndForDOMWindow(parent); |
|
CGenericDlg dlg(wnd); |
|
dlg.SetTitle(W2CT(dialogTitle)); |
|
dlg.SetMsg(W2CT(text)); |
|
dlg.SetDlgIcon(((CMfcEmbedApp*)AfxGetApp())->GetDefaultIcon(TRUE)); |
|
dlg.AddButton(IDOK, IDS_OK); |
|
dlg.AddButton(IDCANCEL, IDS_CANCEL); |
|
dlg.SetDefaultButton(IDOK); |
|
dlg.SetCancelButton(IDCANCEL); |
|
|
|
|
|
|
|
CString csUsername, csPassword; |
|
if (username && *username) csUsername = W2CT(*username); |
|
if (password && *password) csPassword = W2CT(*password); |
|
dlg.AddEdit(&csUsername, IDS_USERNAME, FALSE); |
|
dlg.AddEdit(&csPassword, IDS_PASSWORD, TRUE); |
|
|
|
BOOL checkResult = FALSE; |
|
if (checkboxMsg && checkValue) { |
|
checkResult = (*checkValue == true ? TRUE : FALSE); |
|
dlg.AddCheckBox(&checkResult, W2CT(checkboxMsg)); |
|
} |
|
|
|
if (dlg.DoModal() == IDOK) { |
|
if(*username) nsMemory::Free(*username); |
|
*username = NS_StringCloneData(nsString(T2CW(csUsername))); |
|
|
|
if (*password) nsMemory::Free(*password); |
|
*password = NS_StringCloneData(nsString(T2CW(csPassword))); |
|
|
|
if (checkValue) |
|
*checkValue = (checkResult == TRUE ? true : false); |
|
|
|
*_retval = true; |
|
} |
|
else |
|
*_retval = false; |
|
|
|
return NS_OK; |
|
} |
|
|
|
NS_IMETHODIMP CPromptService::PromptPassword(nsIDOMWindow *parent, |
|
const PRUnichar *dialogTitle, |
|
const PRUnichar *text, |
|
PRUnichar **password, |
|
const PRUnichar *checkboxMsg, |
|
bool *checkValue, |
|
bool *_retval) |
|
{ |
|
NS_ENSURE_ARG_POINTER(password); |
|
USES_CONVERSION; |
|
|
|
CWnd *wnd = CWndForDOMWindow(parent); |
|
CGenericDlg dlg(wnd); |
|
dlg.SetTitle(W2CT(dialogTitle)); |
|
dlg.SetMsg(W2CT(text)); |
|
dlg.SetDlgIcon(((CMfcEmbedApp*)AfxGetApp())->GetDefaultIcon(TRUE)); |
|
dlg.AddButton(IDOK, IDS_OK); |
|
dlg.AddButton(IDCANCEL, IDS_CANCEL); |
|
dlg.SetDefaultButton(IDOK); |
|
dlg.SetCancelButton(IDCANCEL); |
|
|
|
CString csValue; |
|
if (*password) csValue = W2CT(*password); |
|
dlg.AddEdit(&csValue, _T(""), TRUE); |
|
|
|
BOOL checkResult; |
|
if (checkboxMsg && checkValue) { |
|
checkResult = (*checkValue == PR_TRUE ? TRUE : FALSE); |
|
dlg.AddCheckBox(&checkResult, W2CT(checkboxMsg)); |
|
} |
|
|
|
if (dlg.DoModal() == IDOK) { |
|
if (*password) nsMemory::Free(*password); |
|
*password = NS_StringCloneData(nsString(T2CW(csValue))); |
|
*_retval = PR_TRUE; |
|
} |
|
else |
|
*_retval = PR_FALSE; |
|
|
|
return NS_OK; |
|
} |
|
|
|
NS_IMETHODIMP CPromptService::Select(nsIDOMWindow *parent, |
|
const PRUnichar *dialogTitle, |
|
const PRUnichar *text, PRUint32 count, |
|
const PRUnichar **selectList, |
|
PRInt32 *outSelection, |
|
bool *_retval) |
|
{ |
|
USES_CONVERSION; |
|
CWnd *wnd = CWndForDOMWindow(parent); |
|
CSelectDialog dlg(wnd, W2CT(dialogTitle), W2CT(text)); |
|
|
|
for (PRUint32 i = 0; i<count; i++) |
|
dlg.AddChoice(W2CT(selectList[i])); |
|
|
|
*_retval = dlg.DoModal() == IDOK ? PR_TRUE : PR_FALSE; |
|
*outSelection = dlg.GetChoice(); |
|
|
|
return NS_OK; |
|
} |
|
|
|
NS_IMETHODIMP CPromptService::ConfirmEx(nsIDOMWindow *parent, |
|
const PRUnichar *dialogTitle, |
|
const PRUnichar *text, |
|
PRUint32 buttonFlags, |
|
const PRUnichar *button0Title, |
|
const PRUnichar *button1Title, |
|
const PRUnichar *button2Title, |
|
const PRUnichar *checkMsg, |
|
bool *checkValue, |
|
PRInt32 *buttonPressed) |
|
{ |
|
const int COMMAND_OFFSET = 100; |
|
USES_CONVERSION; |
|
|
|
CWnd *wnd = CWndForDOMWindow(parent); |
|
CGenericDlg dlg(wnd); |
|
dlg.SetTitle(W2CT(dialogTitle)); |
|
dlg.SetMsg(W2CT(text)); |
|
dlg.SetDlgIcon(((CMfcEmbedApp*)AfxGetApp())->GetDefaultIcon(TRUE)); |
|
|
|
//https://bugzilla.mozilla.org/show_bug.cgi?id=329414 |
|
//Set the cancel button to 1, and the default one. |
|
dlg.SetDefaultButton(COMMAND_OFFSET + ((buttonFlags & 0x03000000) >> 24)); |
|
dlg.SetCancelButton(COMMAND_OFFSET + 1); |
|
|
|
// Determine the button titles based on buttonFlags |
|
const PRUnichar* buttonStrings[] = { button0Title, button1Title, button2Title }; |
|
|
|
for(int i=0; i<3; i++) |
|
{ |
|
switch(buttonFlags & 0xff) { |
|
case nsIPromptService::BUTTON_TITLE_OK: |
|
dlg.AddButton(COMMAND_OFFSET+i, IDS_OK); |
|
break; |
|
case nsIPromptService::BUTTON_TITLE_CANCEL: |
|
dlg.AddButton(COMMAND_OFFSET+i, IDS_CANCEL); |
|
break; |
|
case nsIPromptService::BUTTON_TITLE_YES: |
|
dlg.AddButton(COMMAND_OFFSET+i, IDS_YES); |
|
break; |
|
case nsIPromptService::BUTTON_TITLE_NO: |
|
dlg.AddButton(COMMAND_OFFSET+i, IDS_NO); |
|
break; |
|
case nsIPromptService::BUTTON_TITLE_SAVE: |
|
dlg.AddButton(COMMAND_OFFSET+i, IDS_SAVE); |
|
break; |
|
case nsIPromptService::BUTTON_TITLE_DONT_SAVE: |
|
dlg.AddButton(COMMAND_OFFSET+i, IDS_DONTSAVE); |
|
break; |
|
case nsIPromptService::BUTTON_TITLE_REVERT: |
|
dlg.AddButton(COMMAND_OFFSET+i, IDS_REVERT); |
|
break; |
|
case nsIPromptService::BUTTON_TITLE_IS_STRING: |
|
dlg.AddButton(COMMAND_OFFSET+i, W2CT(buttonStrings[i])); |
|
break; |
|
} |
|
|
|
buttonFlags >>= 8; |
|
} |
|
|
|
BOOL checkResult = false; |
|
if (checkMsg && checkValue) { |
|
checkResult = (*checkValue == true ? TRUE : FALSE); |
|
dlg.AddCheckBox(&checkResult, W2CT(checkMsg)); |
|
} |
|
|
|
*buttonPressed = dlg.DoModal() - COMMAND_OFFSET; |
|
if (checkValue) |
|
*checkValue = (checkResult == TRUE ? true : false); |
|
|
|
return NS_OK; |
|
} |
|
|
|
#include "nsIChannel.h" |
|
NS_IMETHODIMP CPromptService::PromptAuth(nsIChannel *aChannel, uint32_t level, nsIAuthInformation *authInfo, bool *_retval) |
|
{ |
|
/*nsString username, password; |
|
authInfo->GetUsername(username); |
|
authInfo->GetPassword(password); |
|
|
|
nsCOMPtr<nsIURI> uri; |
|
aChannel->GetURI(getter_AddRefs(uri)); |
|
|
|
nsCString scheme, host; |
|
nsString realm; |
|
uri->GetScheme(scheme); |
|
uri->GetHostPort(host); |
|
authInfo->GetRealm(realm); |
|
scheme.Append("://"); |
|
scheme.Append(host); |
|
host = scheme; |
|
|
|
nsString target; |
|
NS_CStringToUTF16(host, NS_CSTRING_ENCODING_UTF8,target); |
|
target.Append(L"("); |
|
target.Append(realm); |
|
target.Append(L")"); |
|
|
|
uint32_t flags; |
|
authInfo->GetFlags(&flags); |
|
|
|
nsString text; |
|
|
|
nsresult rv; |
|
bool _retval; |
|
if (flags & nsIAuthInformation::ONLY_PASSWORD) |
|
rv = PromptPassword(mDomWindow, nullptr, text.get(), password, nullptr, nullptr, &_retval); |
|
else |
|
rv = PromptUsernameAndPassword(mDomWindow, nullptr, text.get(), username, password, nullptr, nullptr, _retval); |
|
authInfo->SetUsername(username); |
|
authInfo->SetPassword(password); |
|
return rv;*/ |
|
return NS_ERROR_NOT_IMPLEMENTED; |
|
} |
|
/* |
|
NS_IMETHODIMP CPromptService::Prompt(const PRUnichar * dialogTitle, const PRUnichar * text, const PRUnichar * passwordRealm, uint32_t savePassword, const PRUnichar * defaultText, PRUnichar * *result, bool *_retval) |
|
{ |
|
return NS_ERROR_NOT_IMPLEMENTED; |
|
} |
|
|
|
// boolean promptUsernameAndPassword (in wstring dialogTitle, in wstring text, in wstring passwordRealm, in uint32_t savePassword, inout wstring user, inout wstring pwd); |
|
NS_IMETHODIMP CPromptService::PromptUsernameAndPassword(const PRUnichar * dialogTitle, const PRUnichar * text, const PRUnichar * passwordRealm, uint32_t savePassword, PRUnichar * *user, PRUnichar * *pwd, bool *_retval) |
|
{ |
|
return PromptUsernameAndPassword(mDomWindow, dialogTitle, text, user, pwd, nullptr, nullptr, _retval); |
|
} |
|
|
|
// boolean promptPassword (in wstring dialogTitle, in wstring text, in wstring passwordRealm, in uint32_t savePassword, inout wstring pwd); |
|
NS_IMETHODIMP CPromptService::PromptPassword(const PRUnichar * dialogTitle, const PRUnichar * text, const PRUnichar * passwordRealm, uint32_t savePassword, PRUnichar * *pwd, bool *_retval) |
|
{ |
|
return PromptPassword(mDomWindow, dialogTitle, text, pwd, nullptr, nullptr, _retval); |
|
}*/ |
|
|
|
/* nsICancelable asyncPromptAuth (in nsIChannel aChannel, in nsIAuthPromptCallback aCallback, in nsISupports aContext, in uint32_t level, in nsIAuthInformation authInfo); */ |
|
NS_IMETHODIMP CPromptService::AsyncPromptAuth(nsIChannel *aChannel, nsIAuthPromptCallback *aCallback, nsISupports *aContext, uint32_t level, nsIAuthInformation *authInfo, nsICancelable * *_retval) |
|
{ |
|
nsString s; |
|
authInfo->GetRealm(s); |
|
return NS_ERROR_NOT_IMPLEMENTED; |
|
} |
|
|
|
/*NS_IMETHODIMP |
|
CPromptService::ShowNonBlockingAlert(nsIDOMWindow *aParent, |
|
const PRUnichar *aDialogTitle, |
|
const PRUnichar *aText) |
|
{ |
|
BOOL result; |
|
CGenericDlg* dlg = new CGenericDlg(); |
|
CWnd *wnd = CWndForDOMWindow(aParent); |
|
|
|
USES_CONVERSION; |
|
dlg->SetTitle(W2CT(aDialogTitle)); |
|
dlg->SetMsg(W2CT(aText)); |
|
dlg->SetDlgIcon(((CMfcEmbedApp*)AfxGetApp())->GetDefaultIcon(TRUE)); |
|
dlg->SetMsgIcon(AfxGetApp()->LoadStandardIcon(IDI_EXCLAMATION)); |
|
dlg->AddButton(100, IDS_OK); |
|
dlg->SetDefaultButton(100); |
|
dlg->SetCancelButton(100); |
|
|
|
result = dlg->DoModeless(); |
|
|
|
return result ? NS_OK : NS_ERROR_FAILURE; |
|
} |
|
*/ |
|
#include "nsIArray.h" |
|
#include "nsIPrincipal.h" |
|
#include "nsIPermissionManager.h" |
|
#include "nsIScriptGlobalObject.h" |
|
#include "nsPIDOMWindow.h" |
|
#include "nsIDocShell.h" |
|
#include "nsIScriptContext.h" |
|
|
|
NS_IMETHODIMP CPromptService::Prompt(nsIContentPermissionRequest *request) |
|
{ |
|
nsCOMPtr<nsIContentPermissionType> perm; |
|
nsCOMPtr<nsIArray> types; |
|
request->GetTypes(getter_AddRefs(types)); |
|
NS_ENSURE_TRUE(types, NS_ERROR_FAILURE); |
|
|
|
types->QueryElementAt(0, NS_ICONTENTPERMISSIONTYPE_IID, getter_AddRefs(perm)); |
|
NS_ENSURE_TRUE(perm, NS_ERROR_FAILURE); |
|
|
|
nsCString type; |
|
nsDependentCString permType; |
|
perm->GetType(type); |
|
if (type.Compare("geolocation") == 0) |
|
permType.Assign("geo"); |
|
else |
|
permType.Assign(type); |
|
|
|
nsCOMPtr<nsIPrincipal> principal; |
|
request->GetPrincipal(getter_AddRefs(principal)); |
|
NS_ENSURE_TRUE(principal, NS_ERROR_FAILURE); |
|
|
|
nsCOMPtr<nsIURI> uri; |
|
principal->GetURI(getter_AddRefs(uri)); |
|
NS_ENSURE_TRUE(uri, NS_ERROR_FAILURE); |
|
|
|
nsCOMPtr<nsIPermissionManager> permManager = do_GetService(NS_PERMISSIONMANAGER_CONTRACTID); |
|
NS_ENSURE_TRUE(permManager, NS_ERROR_FAILURE); |
|
|
|
uint32_t result; |
|
nsresult rv = permManager->TestExactPermissionFromPrincipal(principal, permType.get(), &result); |
|
if (NS_FAILED(rv) || result == nsIPermissionManager::DENY_ACTION) { |
|
return NS_ERROR_FAILURE; |
|
} |
|
|
|
if (NS_FAILED(rv) || result == nsIPermissionManager::ALLOW_ACTION) { |
|
|
|
nsCOMPtr<nsIDOMWindow> dom; |
|
request->GetWindow(getter_AddRefs(dom)); |
|
NS_ENSURE_TRUE(dom, NS_ERROR_FAILURE); |
|
|
|
nsCOMPtr<nsPIDOMWindow> piWin(do_QueryInterface(dom)); |
|
if (!piWin) return NS_ERROR_FAILURE; |
|
nsIDocShell* docShell = piWin->GetDocShell(); |
|
if (!docShell) return NS_ERROR_FAILURE; |
|
|
|
nsCOMPtr<nsIScriptGlobalObject> global = docShell->GetScriptGlobalObject(); |
|
NS_ENSURE_TRUE(global, NS_ERROR_FAILURE); |
|
|
|
nsPIDOMWindow *innerWin = piWin->GetCurrentInnerWindow(); |
|
nsCOMPtr<nsIScriptGlobalObject> innerGlobal = do_QueryInterface(innerWin); |
|
nsCOMPtr<nsIScriptContext> scriptContext = global->GetContext(); |
|
NS_ENSURE_TRUE(scriptContext, NS_ERROR_FAILURE); |
|
|
|
JSContext* cx = scriptContext->GetNativeContext(); |
|
JS::Rooted<JS::Value> v(cx, JS::UndefinedValue()); |
|
request->Allow(v); |
|
return NS_OK; |
|
} |
|
|
|
return NS_ERROR_NOT_IMPLEMENTED; |
|
} |
|
|
|
//***************************************************************************** |
|
// CPromptServiceFactory |
|
//***************************************************************************** |
|
|
|
class CPromptServiceFactory : public nsIFactory { |
|
public: |
|
NS_DECL_ISUPPORTS |
|
NS_DECL_NSIFACTORY |
|
|
|
CPromptServiceFactory(); |
|
virtual ~CPromptServiceFactory(); |
|
}; |
|
/* |
|
//***************************************************************************** |
|
|
|
NS_IMPL_ISUPPORTS1(CPromptServiceFactory, nsIFactory) |
|
|
|
CPromptServiceFactory::CPromptServiceFactory() { |
|
|
|
} |
|
|
|
CPromptServiceFactory::~CPromptServiceFactory() { |
|
} |
|
|
|
NS_IMETHODIMP CPromptServiceFactory::CreateInstance(nsISupports *aOuter, const nsIID & aIID, void **aResult) |
|
{ |
|
NS_ENSURE_ARG_POINTER(aResult); |
|
|
|
*aResult = NULL; |
|
CPromptService *inst = new CPromptService; |
|
if (!inst) |
|
return NS_ERROR_OUT_OF_MEMORY; |
|
|
|
nsresult rv = inst->QueryInterface(aIID, aResult); |
|
if (rv != NS_OK) { |
|
// We didn't get the right interface, so clean up |
|
delete inst; |
|
} |
|
|
|
return rv; |
|
} |
|
|
|
NS_IMETHODIMP CPromptServiceFactory::LockFactory(PRBool lock) |
|
{ |
|
return NS_OK; |
|
} |
|
|
|
//***************************************************************************** |
|
|
|
nsresult NS_NewPromptServiceFactory(nsIFactory** aFactory) |
|
{ |
|
NS_ENSURE_ARG_POINTER(aFactory); |
|
*aFactory = nullptr; |
|
|
|
CPromptServiceFactory *result = new CPromptServiceFactory; |
|
if (!result) |
|
return NS_ERROR_OUT_OF_MEMORY; |
|
|
|
NS_ADDREF(result); |
|
*aFactory = result; |
|
|
|
return NS_OK; |
|
} |
|
*/ |