Bug 428600 - console spam from nsIHandlerService. r=dmose, sr=biesi, a1.9=damons

This commit is contained in:
dolske%mozilla.com 2008-04-30 00:21:01 +00:00
Родитель 82cbc344c8
Коммит debe3f93a2
4 изменённых файлов: 90 добавлений и 20 удалений

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

@ -905,13 +905,16 @@ nsExternalHelperAppService::GetProtocolHandlerInfo(const nsACString &aScheme,
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
rv = NS_ERROR_FAILURE;
nsCOMPtr<nsIHandlerService> handlerSvc = do_GetService(NS_HANDLERSERVICE_CONTRACTID); nsCOMPtr<nsIHandlerService> handlerSvc = do_GetService(NS_HANDLERSERVICE_CONTRACTID);
if (handlerSvc) if (handlerSvc) {
rv = handlerSvc->FillHandlerInfo(*aHandlerInfo, EmptyCString()); PRBool hasHandler = PR_FALSE;
(void) handlerSvc->Exists(*aHandlerInfo, &hasHandler);
if (NS_SUCCEEDED(rv)) if (hasHandler) {
return NS_OK; rv = handlerSvc->FillHandlerInfo(*aHandlerInfo, EmptyCString());
if (NS_SUCCEEDED(rv))
return NS_OK;
}
}
return SetProtocolHandlerDefaults(*aHandlerInfo, exists); return SetProtocolHandlerDefaults(*aHandlerInfo, exists);
} }
@ -2367,8 +2370,15 @@ NS_IMETHODIMP nsExternalHelperAppService::GetFromTypeAndExtension(const nsACStri
nsresult rv; nsresult rv;
nsCOMPtr<nsIHandlerService> handlerSvc = do_GetService(NS_HANDLERSERVICE_CONTRACTID); nsCOMPtr<nsIHandlerService> handlerSvc = do_GetService(NS_HANDLERSERVICE_CONTRACTID);
if (handlerSvc) { if (handlerSvc) {
rv = handlerSvc->FillHandlerInfo(*_retval, EmptyCString()); PRBool hasHandler = PR_FALSE;
LOG(("Data source: Via type: retval 0x%08x\n", rv)); (void) handlerSvc->Exists(*_retval, &hasHandler);
if (hasHandler) {
rv = handlerSvc->FillHandlerInfo(*_retval, EmptyCString());
LOG(("Data source: Via type: retval 0x%08x\n", rv));
} else {
rv = NS_ERROR_NOT_AVAILABLE;
}
found = found || NS_SUCCEEDED(rv); found = found || NS_SUCCEEDED(rv);
if (!found || NS_FAILED(rv)) { if (!found || NS_FAILED(rv)) {
@ -2376,7 +2386,10 @@ NS_IMETHODIMP nsExternalHelperAppService::GetFromTypeAndExtension(const nsACStri
if (!aFileExt.IsEmpty()) { if (!aFileExt.IsEmpty()) {
nsCAutoString overrideType; nsCAutoString overrideType;
rv = handlerSvc->GetTypeFromExtension(aFileExt, overrideType); rv = handlerSvc->GetTypeFromExtension(aFileExt, overrideType);
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv) && !overrideType.IsEmpty()) {
// We can't check handlerSvc->Exists() here, because we have a
// overideType. That's ok, it just results in some console noise.
// (If there's no handler for the override type, it throws)
rv = handlerSvc->FillHandlerInfo(*_retval, overrideType); rv = handlerSvc->FillHandlerInfo(*_retval, overrideType);
LOG(("Data source: Via ext: retval 0x%08x\n", rv)); LOG(("Data source: Via ext: retval 0x%08x\n", rv));
found = found || NS_SUCCEEDED(rv); found = found || NS_SUCCEEDED(rv);
@ -2455,7 +2468,7 @@ NS_IMETHODIMP nsExternalHelperAppService::GetTypeFromExtension(const nsACString&
nsCOMPtr<nsIHandlerService> handlerSvc = do_GetService(NS_HANDLERSERVICE_CONTRACTID); nsCOMPtr<nsIHandlerService> handlerSvc = do_GetService(NS_HANDLERSERVICE_CONTRACTID);
if (handlerSvc) if (handlerSvc)
rv = handlerSvc->GetTypeFromExtension(aFileExt, aContentType); rv = handlerSvc->GetTypeFromExtension(aFileExt, aContentType);
if (NS_SUCCEEDED(rv)) if (NS_SUCCEEDED(rv) && !aContentType.IsEmpty())
return NS_OK; return NS_OK;
// Ask OS. // Ask OS.

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

@ -260,13 +260,11 @@ HandlerService.prototype = {
let protoInfo = protoSvc.getProtocolHandlerInfoFromOS(scheme, let protoInfo = protoSvc.getProtocolHandlerInfoFromOS(scheme,
osDefaultHandlerFound); osDefaultHandlerFound);
try { if (this.exists(protoInfo))
this.fillHandlerInfo(protoInfo, null); this.fillHandlerInfo(protoInfo, null);
} catch (ex) { else
// pick some sane defaults
protoSvc.setProtocolHandlerDefaults(protoInfo, protoSvc.setProtocolHandlerDefaults(protoInfo,
osDefaultHandlerFound.value); osDefaultHandlerFound.value);
}
// cache the possible handlers to avoid extra xpconnect traversals. // cache the possible handlers to avoid extra xpconnect traversals.
let possibleHandlers = protoInfo.possibleApplicationHandlers; let possibleHandlers = protoInfo.possibleApplicationHandlers;
@ -404,8 +402,17 @@ HandlerService.prototype = {
}, },
exists: function HS_exists(aHandlerInfo) { exists: function HS_exists(aHandlerInfo) {
var typeID = this._getTypeID(this._getClass(aHandlerInfo), aHandlerInfo.type); var found;
return this._hasLiteralAssertion(typeID, NC_VALUE, aHandlerInfo.type);
try {
var typeID = this._getTypeID(this._getClass(aHandlerInfo), aHandlerInfo.type);
found = this._hasLiteralAssertion(typeID, NC_VALUE, aHandlerInfo.type);
} catch (e) {
// If the RDF threw (eg, corrupt file), treat as non-existent.
found = false;
}
return found;
}, },
remove: function HS_remove(aHandlerInfo) { remove: function HS_remove(aHandlerInfo) {
@ -470,7 +477,7 @@ HandlerService.prototype = {
return type; return type;
} }
throw Cr.NS_ERROR_NOT_AVAILABLE; return "";
}, },

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

@ -90,7 +90,9 @@ interface nsIHandlerService : nsISupports
* @param aOverrideType a type to use instead of aHandlerInfo::type * @param aOverrideType a type to use instead of aHandlerInfo::type
* *
* Note: if there is no information in the datastore about this type, * Note: if there is no information in the datastore about this type,
* this method throws NS_ERROR_NOT_AVAILABLE. * this method throws NS_ERROR_NOT_AVAILABLE. Callers are encouraged to
* check exists() before calling fillHandlerInfo(), to prevent spamming the
* console with XPCOM exception errors.
*/ */
void fillHandlerInfo(in nsIHandlerInfo aHandlerInfo, void fillHandlerInfo(in nsIHandlerInfo aHandlerInfo,
in ACString aOverrideType); in ACString aOverrideType);
@ -109,7 +111,8 @@ interface nsIHandlerService : nsISupports
/** /**
* Whether or not a record for the given handler info object exists * Whether or not a record for the given handler info object exists
* in the datastore. * in the datastore. If the datastore is corrupt (or some other error
* is caught in the implementation), false will be returned.
* *
* @param aHandlerInfo a handler info object * @param aHandlerInfo a handler info object
* *
@ -140,7 +143,7 @@ interface nsIHandlerService : nsISupports
* *
* @param aFileExtension the file extension * @param aFileExtension the file extension
* *
* @returns the MIME type, if any; otherwise throws NS_ERROR_NOT_AVAILABLE * @returns the MIME type, if any; otherwise returns an empty string ("").
*/ */
ACString getTypeFromExtension(in ACString aFileExtension); ACString getTypeFromExtension(in ACString aFileExtension);
}; };

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

@ -51,6 +51,9 @@ function run_test() {
const prefSvc = Cc["@mozilla.org/preferences-service;1"]. const prefSvc = Cc["@mozilla.org/preferences-service;1"].
getService(Ci.nsIPrefService); getService(Ci.nsIPrefService);
const ioService = Cc["@mozilla.org/network/io-service;1"].
getService(Ci.nsIIOService);
const rootPrefBranch = prefSvc.getBranch(""); const rootPrefBranch = prefSvc.getBranch("");
//**************************************************************************// //**************************************************************************//
@ -336,4 +339,48 @@ function run_test() {
// FIXME: test round trip integrity for a protocol. // FIXME: test round trip integrity for a protocol.
// FIXME: test round trip integrity for a handler info with a web handler. // FIXME: test round trip integrity for a handler info with a web handler.
//**************************************************************************//
// getTypeFromExtension tests
// test non-existent extension
var lolType = handlerSvc.getTypeFromExtension("lolcat");
do_check_eq(lolType, "");
// add a handler for the extension
var lolHandler = mimeSvc.getFromTypeAndExtension("application/lolcat", null);
do_check_false(lolHandler.extensionExists("lolcat"));
lolHandler.preferredAction = Ci.nsIHandlerInfo.useHelperApp;
lolHandler.preferredApplicationHandler = localHandler;
lolHandler.alwaysAskBeforeHandling = false;
// store the handler
do_check_false(handlerSvc.exists(lolHandler));
handlerSvc.store(lolHandler);
do_check_true(handlerSvc.exists(lolHandler));
// Get a file:// string pointing to mimeTypes.rdf
var rdfFile = HandlerServiceTest._dirSvc.get("UMimTyp", Ci.nsIFile);
var fileHandler = ioService.getProtocolHandler("file").QueryInterface(Ci.nsIFileProtocolHandler);
var rdfFileURI = fileHandler.getURLSpecFromFile(rdfFile);
// Assign a file extenstion to the handler. handlerSvc.store() doesn't
// actually store any file extensions added with setFileExtensions(), you
// have to wade into RDF muck to do so.
// Based on toolkit/mozapps/downloads/content/helperApps.js :: addExtension()
var gRDF = Cc["@mozilla.org/rdf/rdf-service;1"].getService(Ci.nsIRDFService);
var mimeSource = gRDF.GetUnicodeResource("urn:mimetype:application/lolcat");
var valueProperty = gRDF.GetUnicodeResource("http://home.netscape.com/NC-rdf#fileExtensions");
var mimeLiteral = gRDF.GetLiteral("lolcat");
var DS = gRDF.GetDataSourceBlocking(rdfFileURI);
DS.Assert(mimeSource, valueProperty, mimeLiteral, true);
// test now-existent extension
lolType = handlerSvc.getTypeFromExtension("lolcat");
do_check_eq(lolType, "application/lolcat");
} }