r=rpotts. 14696. We now throw dialogs when dns fails, and when a protocol isn't avail for protocols *entered in the url bar*.

This commit is contained in:
valeski%netscape.com 2000-01-11 23:11:32 +00:00
Родитель 3bcdb951b8
Коммит 1880626278
2 изменённых файлов: 164 добавлений и 2 удалений

Просмотреть файл

@ -31,6 +31,7 @@
#include "nsIDeviceContext.h"
#include "nsILinkHandler.h"
#include "nsIStreamListener.h"
#include "nsIPrompt.h"
#include "nsNetUtil.h"
#include "nsIProtocolHandler.h"
#include "nsIDNSService.h"
@ -83,8 +84,10 @@
#include "nsCURILoader.h"
#include "nsILocaleService.h"
#include "nsIStringBundle.h"
static NS_DEFINE_CID(kLocaleServiceCID, NS_LOCALESERVICE_CID);
static NS_DEFINE_CID(kPrefServiceCID, NS_PREF_CID);
static NS_DEFINE_CID(kCStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID);
#ifdef XP_PC
#include <windows.h>
@ -391,6 +394,7 @@ protected:
void InitFrameData(PRBool aCompleteInitScrolling);
nsresult CheckForTrailingSlash(nsIURI* aURL);
nsresult GetViewManager(nsIViewManager* *viewManager);
nsresult InitDialogVars(void);
nsIEventQueue* mThreadEventQueue;
nsIScriptGlobalObject *mScriptGlobal;
@ -402,6 +406,9 @@ protected:
nsIWidget* mWindow;
nsIDocumentLoader* mDocLoader;
nsCOMPtr<nsIPrompt> mPrompter;
nsCOMPtr<nsIStringBundle> mStringBundle;
nsString mDefaultCharacterSet;
@ -1975,8 +1982,9 @@ nsWebShell::LoadURL(const PRUnichar *aURLSpec,
rv = NS_NewURI(getter_AddRefs(uri), keywordSpec, nsnull);
}
PRInt32 colon = -1;
if (NS_FAILED(rv)) {
PRInt32 colon, fSlash = urlSpec.FindChar('/');
PRInt32 fSlash = urlSpec.FindChar('/');
PRUnichar port;
// if no scheme (protocol) is found, assume http.
if ( ((colon=urlSpec.FindChar(':')) == -1) // no colon at all
@ -2002,6 +2010,30 @@ nsWebShell::LoadURL(const PRUnichar *aURLSpec,
}
} // end if colon
rv = NS_NewURI(getter_AddRefs(uri), urlSpec, nsnull);
if (NS_FAILED(rv)) {
// we weren't able to find a protocol handler
rv = InitDialogVars();
if (NS_FAILED(rv)) return rv;
NS_ASSERTION(mPrompter && mStringBundle, "webshell is unable to throw dialogs");
nsXPIDLString messageStr;
nsAutoString name("protocolNotFound");
rv = mStringBundle->GetStringFromName(name.GetUnicode(), getter_Copies(messageStr));
if (NS_FAILED(rv)) return rv;
NS_ASSERTION(colon != -1, "we shouldn't have gotten this far if we didn't have a colon");
// extract the scheme
nsAutoString scheme;
urlSpec.Left(scheme, colon);
nsAutoString dnsMsg(messageStr);
dnsMsg.Insert(' ', 0);
dnsMsg.Insert(scheme, 0);
mPrompter->Alert(dnsMsg.GetUnicode());
}
nsAutoString url(aURLSpec);
if (((url.Find("mailto:", PR_TRUE))<0) && (NS_FAILED(rv))) {
@ -3104,6 +3136,25 @@ nsWebShell::OnEndDocumentLoad(nsIDocumentLoader* loader,
rv = LoadURL(newURL.GetUnicode(), "view");
} // retry
} // end keyword load failure
} else {
rv = InitDialogVars();
if (NS_FAILED(rv)) {
nsAllocator::Free(host);
return rv;
}
NS_ASSERTION(mPrompter && mStringBundle, "webshell is unable to throw dialogs");
nsXPIDLString messageStr;
nsAutoString name("dnsNotFound");
rv = mStringBundle->GetStringFromName(name.GetUnicode(), getter_Copies(messageStr));
if (NS_FAILED(rv)) return rv;
nsAutoString dnsMsg(messageStr);
dnsMsg.Insert(' ', 0);
dnsMsg.Insert(host, 0);
mPrompter->Alert(dnsMsg.GetUnicode());
} // end !*tmp
nsAllocator::Free(host);
} // unknown host
@ -3581,6 +3632,36 @@ nsresult nsWebShell::GetViewManager(nsIViewManager* *viewManager)
}
#define DIALOG_STRING_URI "chrome://global/locale/appstrings.properties"
nsresult nsWebShell::InitDialogVars(void)
{
nsresult rv = NS_OK;
if (!mPrompter) {
// Get an nsIPrompt so we can throw dialogs.
nsCOMPtr<nsIWebShellContainer> topLevelWindow;
GetTopLevelWindow(getter_AddRefs(topLevelWindow));
if (topLevelWindow)
mPrompter = do_QueryInterface(topLevelWindow);
}
if (!mStringBundle) {
// Get a string bundle so we can retrieve dialog strings
nsCOMPtr<nsILocale> locale;
NS_WITH_SERVICE(nsILocaleService, localeServ, kLocaleServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = localeServ->GetSystemLocale(getter_AddRefs(locale));
if (NS_FAILED(rv)) return rv;
NS_WITH_SERVICE(nsIStringBundleService, service, kCStringBundleServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = service->CreateBundle(DIALOG_STRING_URI, locale, getter_AddRefs(mStringBundle));
}
return rv;
}
//*****************************************************************************
// nsWebShell::nsIBaseWindow
//*****************************************************************************

Просмотреть файл

@ -31,6 +31,7 @@
#include "nsIDeviceContext.h"
#include "nsILinkHandler.h"
#include "nsIStreamListener.h"
#include "nsIPrompt.h"
#include "nsNetUtil.h"
#include "nsIProtocolHandler.h"
#include "nsIDNSService.h"
@ -83,8 +84,10 @@
#include "nsCURILoader.h"
#include "nsILocaleService.h"
#include "nsIStringBundle.h"
static NS_DEFINE_CID(kLocaleServiceCID, NS_LOCALESERVICE_CID);
static NS_DEFINE_CID(kPrefServiceCID, NS_PREF_CID);
static NS_DEFINE_CID(kCStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID);
#ifdef XP_PC
#include <windows.h>
@ -391,6 +394,7 @@ protected:
void InitFrameData(PRBool aCompleteInitScrolling);
nsresult CheckForTrailingSlash(nsIURI* aURL);
nsresult GetViewManager(nsIViewManager* *viewManager);
nsresult InitDialogVars(void);
nsIEventQueue* mThreadEventQueue;
nsIScriptGlobalObject *mScriptGlobal;
@ -402,6 +406,9 @@ protected:
nsIWidget* mWindow;
nsIDocumentLoader* mDocLoader;
nsCOMPtr<nsIPrompt> mPrompter;
nsCOMPtr<nsIStringBundle> mStringBundle;
nsString mDefaultCharacterSet;
@ -1975,8 +1982,9 @@ nsWebShell::LoadURL(const PRUnichar *aURLSpec,
rv = NS_NewURI(getter_AddRefs(uri), keywordSpec, nsnull);
}
PRInt32 colon = -1;
if (NS_FAILED(rv)) {
PRInt32 colon, fSlash = urlSpec.FindChar('/');
PRInt32 fSlash = urlSpec.FindChar('/');
PRUnichar port;
// if no scheme (protocol) is found, assume http.
if ( ((colon=urlSpec.FindChar(':')) == -1) // no colon at all
@ -2002,6 +2010,30 @@ nsWebShell::LoadURL(const PRUnichar *aURLSpec,
}
} // end if colon
rv = NS_NewURI(getter_AddRefs(uri), urlSpec, nsnull);
if (NS_FAILED(rv)) {
// we weren't able to find a protocol handler
rv = InitDialogVars();
if (NS_FAILED(rv)) return rv;
NS_ASSERTION(mPrompter && mStringBundle, "webshell is unable to throw dialogs");
nsXPIDLString messageStr;
nsAutoString name("protocolNotFound");
rv = mStringBundle->GetStringFromName(name.GetUnicode(), getter_Copies(messageStr));
if (NS_FAILED(rv)) return rv;
NS_ASSERTION(colon != -1, "we shouldn't have gotten this far if we didn't have a colon");
// extract the scheme
nsAutoString scheme;
urlSpec.Left(scheme, colon);
nsAutoString dnsMsg(messageStr);
dnsMsg.Insert(' ', 0);
dnsMsg.Insert(scheme, 0);
mPrompter->Alert(dnsMsg.GetUnicode());
}
nsAutoString url(aURLSpec);
if (((url.Find("mailto:", PR_TRUE))<0) && (NS_FAILED(rv))) {
@ -3104,6 +3136,25 @@ nsWebShell::OnEndDocumentLoad(nsIDocumentLoader* loader,
rv = LoadURL(newURL.GetUnicode(), "view");
} // retry
} // end keyword load failure
} else {
rv = InitDialogVars();
if (NS_FAILED(rv)) {
nsAllocator::Free(host);
return rv;
}
NS_ASSERTION(mPrompter && mStringBundle, "webshell is unable to throw dialogs");
nsXPIDLString messageStr;
nsAutoString name("dnsNotFound");
rv = mStringBundle->GetStringFromName(name.GetUnicode(), getter_Copies(messageStr));
if (NS_FAILED(rv)) return rv;
nsAutoString dnsMsg(messageStr);
dnsMsg.Insert(' ', 0);
dnsMsg.Insert(host, 0);
mPrompter->Alert(dnsMsg.GetUnicode());
} // end !*tmp
nsAllocator::Free(host);
} // unknown host
@ -3581,6 +3632,36 @@ nsresult nsWebShell::GetViewManager(nsIViewManager* *viewManager)
}
#define DIALOG_STRING_URI "chrome://global/locale/appstrings.properties"
nsresult nsWebShell::InitDialogVars(void)
{
nsresult rv = NS_OK;
if (!mPrompter) {
// Get an nsIPrompt so we can throw dialogs.
nsCOMPtr<nsIWebShellContainer> topLevelWindow;
GetTopLevelWindow(getter_AddRefs(topLevelWindow));
if (topLevelWindow)
mPrompter = do_QueryInterface(topLevelWindow);
}
if (!mStringBundle) {
// Get a string bundle so we can retrieve dialog strings
nsCOMPtr<nsILocale> locale;
NS_WITH_SERVICE(nsILocaleService, localeServ, kLocaleServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = localeServ->GetSystemLocale(getter_AddRefs(locale));
if (NS_FAILED(rv)) return rv;
NS_WITH_SERVICE(nsIStringBundleService, service, kCStringBundleServiceCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = service->CreateBundle(DIALOG_STRING_URI, locale, getter_AddRefs(mStringBundle));
}
return rv;
}
//*****************************************************************************
// nsWebShell::nsIBaseWindow
//*****************************************************************************