diff --git a/toolkit/components/places/AsyncFaviconHelpers.cpp b/toolkit/components/places/AsyncFaviconHelpers.cpp index c01e5faf05cc..3bdb96ee7c67 100644 --- a/toolkit/components/places/AsyncFaviconHelpers.cpp +++ b/toolkit/components/places/AsyncFaviconHelpers.cpp @@ -635,9 +635,21 @@ AsyncFetchAndSetIconFromNetwork::OnStopRequest(nsIRequest* aRequest, return NS_OK; } - NS_SniffContent(NS_DATA_SNIFFER_CATEGORY, aRequest, - TO_INTBUFFER(mIcon.data), mIcon.data.Length(), - mIcon.mimeType); + nsCOMPtr channel = do_QueryInterface(aRequest); + // aRequest should always QI to nsIChannel. + // See AsyncFetchAndSetIconFromNetwork::Run() + MOZ_ASSERT(channel); + + nsAutoCString contentType; + channel->GetContentType(contentType); + // Bug 366324 - can't sniff SVG yet, so rely on server-specified type + if (contentType.EqualsLiteral("image/svg+xml")) { + mIcon.mimeType.AssignLiteral("image/svg+xml"); + } else { + NS_SniffContent(NS_DATA_SNIFFER_CATEGORY, aRequest, + TO_INTBUFFER(mIcon.data), mIcon.data.Length(), + mIcon.mimeType); + } // If the icon does not have a valid MIME type, add it to the failed cache. if (mIcon.mimeType.IsEmpty()) { @@ -649,10 +661,6 @@ AsyncFetchAndSetIconFromNetwork::OnStopRequest(nsIRequest* aRequest, return NS_OK; } - nsCOMPtr channel = do_QueryInterface(aRequest); - // aRequest should always QI to nsIChannel. - // See AsyncFetchAndSetIconFromNetwork::Run() - MOZ_ASSERT(channel); mIcon.expiration = GetExpirationTimeFromChannel(channel); // Telemetry probes to measure the favicon file sizes for each different file type. diff --git a/toolkit/components/places/tests/head_common.js b/toolkit/components/places/tests/head_common.js index e5320846d9d1..f2f216c5e2b8 100644 --- a/toolkit/components/places/tests/head_common.js +++ b/toolkit/components/places/tests/head_common.js @@ -57,6 +57,16 @@ XPCOMUtils.defineLazyGetter(this, "SMALLPNG_DATA_URI", function() { "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAA" + "AAAA6fptVAAAACklEQVQI12NgAAAAAgAB4iG8MwAAAABJRU5ErkJggg=="); }); +XPCOMUtils.defineLazyGetter(this, "SMALLSVG_DATA_URI", function() { + return NetUtil.newURI( + "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy5" + + "3My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDAgMTAwIiBmaWxs" + + "PSIjNDI0ZTVhIj4NCiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iN" + + "DQiIHN0cm9rZT0iIzQyNGU1YSIgc3Ryb2tlLXdpZHRoPSIxMSIgZmlsbD" + + "0ibm9uZSIvPg0KICA8Y2lyY2xlIGN4PSI1MCIgY3k9IjI0LjYiIHI9IjY" + + "uNCIvPg0KICA8cmVjdCB4PSI0NSIgeT0iMzkuOSIgd2lkdGg9IjEwLjEi" + + "IGhlaWdodD0iNDEuOCIvPg0KPC9zdmc%2BDQo%3D"); +}); let gTestDir = do_get_cwd(); diff --git a/toolkit/components/places/tests/unit/test_svg_favicon.js b/toolkit/components/places/tests/unit/test_svg_favicon.js new file mode 100644 index 000000000000..98b2e76a5e39 --- /dev/null +++ b/toolkit/components/places/tests/unit/test_svg_favicon.js @@ -0,0 +1,30 @@ +const PAGEURI = NetUtil.newURI("http://deliciousbacon.com/"); + +add_task(function* () { + // First, add a history entry or else Places can't save a favicon. + yield PlacesTestUtils.addVisits({ + uri: PAGEURI, + transition: TRANSITION_LINK, + visitDate: Date.now() * 1000 + }); + + yield new Promise(resolve => { + function onSetComplete(aURI, aDataLen, aData, aMimeType) { + equal(aURI.spec, SMALLSVG_DATA_URI.spec, "setFavicon aURI check"); + equal(aDataLen, 263, "setFavicon aDataLen check"); + equal(aMimeType, "image/svg+xml", "setFavicon aMimeType check"); + resolve(); + } + + PlacesUtils.favicons.setAndFetchFaviconForPage(PAGEURI, SMALLSVG_DATA_URI, + false, + PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE, + onSetComplete); + }); + + let data = yield PlacesUtils.promiseFaviconData(PAGEURI.spec); + equal(data.uri.spec, SMALLSVG_DATA_URI.spec, "getFavicon aURI check"); + equal(data.dataLen, 263, "getFavicon aDataLen check"); + equal(data.mimeType, "image/svg+xml", "getFavicon aMimeType check"); +}); + diff --git a/toolkit/components/places/tests/unit/xpcshell.ini b/toolkit/components/places/tests/unit/xpcshell.ini index 72a910008ab5..eb96a097a320 100644 --- a/toolkit/components/places/tests/unit/xpcshell.ini +++ b/toolkit/components/places/tests/unit/xpcshell.ini @@ -138,6 +138,7 @@ skip-if = os == "android" [test_resolveNullBookmarkTitles.js] [test_result_sort.js] [test_sql_guid_functions.js] +[test_svg_favicon.js] [test_tag_autocomplete_search.js] [test_tagging.js] [test_telemetry.js]