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