From 06e944d6da2862888e78726ff1a5ee32796a1143 Mon Sep 17 00:00:00 2001 From: "beard%netscape.com" Date: Tue, 26 Mar 2002 15:58:26 +0000 Subject: [PATCH] External protocol handler support via preference of form "network.protocol-handler.external.scheme". bug #133386, r=gordon, sr=darin, a=valeski git-svn-id: svn://10.0.0.236/trunk@117491 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/netwerk/base/src/nsIOService.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/mozilla/netwerk/base/src/nsIOService.cpp b/mozilla/netwerk/base/src/nsIOService.cpp index e6089975ff6..86d4e4f767a 100644 --- a/mozilla/netwerk/base/src/nsIOService.cpp +++ b/mozilla/netwerk/base/src/nsIOService.cpp @@ -415,12 +415,26 @@ nsIOService::GetProtocolHandler(const char* scheme, nsIProtocolHandler* *result) rv = GetCachedProtocolHandler(scheme, result); if (NS_SUCCEEDED(rv)) return NS_OK; - nsCAutoString contractID(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX); - contractID += scheme; - ToLowerCase(contractID); + PRBool externalProtocol = PR_FALSE; + nsCOMPtr prefBranch; + GetPrefBranch(getter_AddRefs(prefBranch)); + if (prefBranch) { + nsCAutoString externalProtocolPref("network.protocol-handler.external."); + externalProtocolPref += scheme; + rv = prefBranch->GetBoolPref(externalProtocolPref.get(), &externalProtocol); + if (NS_FAILED(rv)) + externalProtocol = PR_FALSE; + } - rv = CallGetService(contractID.get(), result); - if (NS_FAILED(rv)) + if (!externalProtocol) { + nsCAutoString contractID(NS_NETWORK_PROTOCOL_CONTRACTID_PREFIX); + contractID += scheme; + ToLowerCase(contractID); + + rv = CallGetService(contractID.get(), result); + } + + if (externalProtocol || NS_FAILED(rv)) { // okay we don't have a protocol handler to handle this url type, so use the default protocol handler. // this will cause urls to get dispatched out to the OS ('cause we can't do anything with them) when