1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/places/tests/favicons/test_replaceFaviconData.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,263 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +/* 1.8 + * Tests for mozIAsyncFavicons::replaceFaviconData() 1.9 + */ 1.10 + 1.11 +let iconsvc = PlacesUtils.favicons; 1.12 +let histsvc = PlacesUtils.history; 1.13 + 1.14 +let originalFavicon = { 1.15 + file: do_get_file("favicon-normal16.png"), 1.16 + uri: uri(do_get_file("favicon-normal16.png")), 1.17 + data: readFileData(do_get_file("favicon-normal16.png")), 1.18 + mimetype: "image/png" 1.19 +}; 1.20 + 1.21 +let uniqueFaviconId = 0; 1.22 +function createFavicon(fileName) { 1.23 + let tempdir = Services.dirsvc.get("TmpD", Ci.nsILocalFile); 1.24 + 1.25 + // remove any existing file at the path we're about to copy to 1.26 + let outfile = tempdir.clone(); 1.27 + outfile.append(fileName); 1.28 + try { outfile.remove(false); } catch (e) {} 1.29 + 1.30 + originalFavicon.file.copyToFollowingLinks(tempdir, fileName); 1.31 + 1.32 + let stream = Cc["@mozilla.org/network/file-output-stream;1"] 1.33 + .createInstance(Ci.nsIFileOutputStream); 1.34 + stream.init(outfile, 0x02 | 0x08 | 0x10, 0600, 0); 1.35 + 1.36 + // append some data that sniffers/encoders will ignore that will distinguish 1.37 + // the different favicons we'll create 1.38 + uniqueFaviconId++; 1.39 + let uniqueStr = "uid:" + uniqueFaviconId; 1.40 + stream.write(uniqueStr, uniqueStr.length); 1.41 + stream.close(); 1.42 + 1.43 + do_check_eq(outfile.leafName.substr(0, fileName.length), fileName); 1.44 + 1.45 + return { 1.46 + file: outfile, 1.47 + uri: uri(outfile), 1.48 + data: readFileData(outfile), 1.49 + mimetype: "image/png" 1.50 + }; 1.51 +} 1.52 + 1.53 +function checkCallbackSucceeded(callbackMimetype, callbackData, sourceMimetype, sourceData) { 1.54 + do_check_eq(callbackMimetype, sourceMimetype); 1.55 + do_check_true(compareArrays(callbackData, sourceData)); 1.56 +} 1.57 + 1.58 +function run_test() { 1.59 + // check that the favicon loaded correctly 1.60 + do_check_eq(originalFavicon.data.length, 286); 1.61 + run_next_test(); 1.62 +}; 1.63 + 1.64 +add_task(function test_replaceFaviconData_validHistoryURI() { 1.65 + do_log_info("test replaceFaviconData for valid history uri"); 1.66 + 1.67 + let pageURI = uri("http://test1.bar/"); 1.68 + yield promiseAddVisits(pageURI); 1.69 + 1.70 + let favicon = createFavicon("favicon1.png"); 1.71 + 1.72 + iconsvc.replaceFaviconData(favicon.uri, favicon.data, favicon.data.length, 1.73 + favicon.mimetype); 1.74 + 1.75 + let deferSetAndFetchFavicon = Promise.defer(); 1.76 + iconsvc.setAndFetchFaviconForPage(pageURI, favicon.uri, true, 1.77 + PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE, 1.78 + function test_replaceFaviconData_validHistoryURI_check(aURI, aDataLen, aData, aMimeType) { 1.79 + checkCallbackSucceeded(aMimeType, aData, favicon.mimetype, favicon.data); 1.80 + checkFaviconDataForPage( 1.81 + pageURI, favicon.mimetype, favicon.data, 1.82 + function test_replaceFaviconData_validHistoryURI_callback() { 1.83 + favicon.file.remove(false); 1.84 + deferSetAndFetchFavicon.resolve(); 1.85 + }); 1.86 + }); 1.87 + yield deferSetAndFetchFavicon.promise; 1.88 + 1.89 + yield promiseClearHistory(); 1.90 +}); 1.91 + 1.92 +add_task(function test_replaceFaviconData_overrideDefaultFavicon() { 1.93 + do_log_info("test replaceFaviconData to override a later setAndFetchFaviconForPage"); 1.94 + 1.95 + let pageURI = uri("http://test2.bar/"); 1.96 + yield promiseAddVisits(pageURI); 1.97 + 1.98 + let firstFavicon = createFavicon("favicon2.png"); 1.99 + let secondFavicon = createFavicon("favicon3.png"); 1.100 + 1.101 + iconsvc.replaceFaviconData( 1.102 + firstFavicon.uri, secondFavicon.data, secondFavicon.data.length, 1.103 + secondFavicon.mimetype); 1.104 + 1.105 + let deferSetAndFetchFavicon = Promise.defer(); 1.106 + iconsvc.setAndFetchFaviconForPage( 1.107 + pageURI, firstFavicon.uri, true, 1.108 + PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE, 1.109 + function test_replaceFaviconData_overrideDefaultFavicon_check(aURI, aDataLen, aData, aMimeType) { 1.110 + checkCallbackSucceeded(aMimeType, aData, secondFavicon.mimetype, secondFavicon.data); 1.111 + checkFaviconDataForPage( 1.112 + pageURI, secondFavicon.mimetype, secondFavicon.data, 1.113 + function test_replaceFaviconData_overrideDefaultFavicon_callback() { 1.114 + firstFavicon.file.remove(false); 1.115 + secondFavicon.file.remove(false); 1.116 + deferSetAndFetchFavicon.resolve(); 1.117 + }); 1.118 + }); 1.119 + yield deferSetAndFetchFavicon.promise; 1.120 + 1.121 + yield promiseClearHistory(); 1.122 +}); 1.123 + 1.124 +add_task(function test_replaceFaviconData_replaceExisting() { 1.125 + do_log_info("test replaceFaviconData to override a previous setAndFetchFaviconForPage"); 1.126 + 1.127 + let pageURI = uri("http://test3.bar"); 1.128 + yield promiseAddVisits(pageURI); 1.129 + 1.130 + let firstFavicon = createFavicon("favicon4.png"); 1.131 + let secondFavicon = createFavicon("favicon5.png"); 1.132 + 1.133 + let deferSetAndFetchFavicon = Promise.defer(); 1.134 + iconsvc.setAndFetchFaviconForPage( 1.135 + pageURI, firstFavicon.uri, true, 1.136 + PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE, 1.137 + function test_replaceFaviconData_replaceExisting_firstSet_check(aURI, aDataLen, aData, aMimeType) { 1.138 + checkCallbackSucceeded(aMimeType, aData, firstFavicon.mimetype, firstFavicon.data); 1.139 + checkFaviconDataForPage( 1.140 + pageURI, firstFavicon.mimetype, firstFavicon.data, 1.141 + function test_replaceFaviconData_overrideDefaultFavicon_firstCallback() { 1.142 + iconsvc.replaceFaviconData( 1.143 + firstFavicon.uri, secondFavicon.data, secondFavicon.data.length, 1.144 + secondFavicon.mimetype); 1.145 + promiseAsyncUpdates().then(function() { 1.146 + checkFaviconDataForPage( 1.147 + pageURI, secondFavicon.mimetype, secondFavicon.data, 1.148 + function test_replaceFaviconData_overrideDefaultFavicon_secondCallback() { 1.149 + firstFavicon.file.remove(false); 1.150 + secondFavicon.file.remove(false); 1.151 + deferSetAndFetchFavicon.resolve(); 1.152 + }); 1.153 + }); 1.154 + }); 1.155 + }); 1.156 + yield deferSetAndFetchFavicon.promise; 1.157 + 1.158 + yield promiseClearHistory(); 1.159 +}); 1.160 + 1.161 +add_task(function test_replaceFaviconData_unrelatedReplace() { 1.162 + do_log_info("test replaceFaviconData to not make unrelated changes"); 1.163 + 1.164 + let pageURI = uri("http://test4.bar/"); 1.165 + yield promiseAddVisits(pageURI); 1.166 + 1.167 + let favicon = createFavicon("favicon6.png"); 1.168 + let unrelatedFavicon = createFavicon("favicon7.png"); 1.169 + 1.170 + iconsvc.replaceFaviconData( 1.171 + unrelatedFavicon.uri, unrelatedFavicon.data, unrelatedFavicon.data.length, 1.172 + unrelatedFavicon.mimetype); 1.173 + 1.174 + let deferSetAndFetchFavicon = Promise.defer(); 1.175 + iconsvc.setAndFetchFaviconForPage( 1.176 + pageURI, favicon.uri, true, 1.177 + PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE, 1.178 + function test_replaceFaviconData_unrelatedReplace_check(aURI, aDataLen, aData, aMimeType) { 1.179 + checkCallbackSucceeded(aMimeType, aData, favicon.mimetype, favicon.data); 1.180 + checkFaviconDataForPage( 1.181 + pageURI, favicon.mimetype, favicon.data, 1.182 + function test_replaceFaviconData_unrelatedReplace_callback() { 1.183 + favicon.file.remove(false); 1.184 + unrelatedFavicon.file.remove(false); 1.185 + deferSetAndFetchFavicon.resolve(); 1.186 + }); 1.187 + }); 1.188 + yield deferSetAndFetchFavicon.promise; 1.189 + 1.190 + yield promiseClearHistory(); 1.191 +}); 1.192 + 1.193 +add_task(function test_replaceFaviconData_badInputs() { 1.194 + do_log_info("test replaceFaviconData to throw on bad inputs"); 1.195 + 1.196 + let favicon = createFavicon("favicon8.png"); 1.197 + 1.198 + let ex = null; 1.199 + try { 1.200 + iconsvc.replaceFaviconData( 1.201 + favicon.uri, favicon.data, favicon.data.length, ""); 1.202 + } catch (e) { 1.203 + ex = e; 1.204 + } finally { 1.205 + do_check_true(!!ex); 1.206 + } 1.207 + 1.208 + ex = null; 1.209 + try { 1.210 + iconsvc.replaceFaviconData( 1.211 + null, favicon.data, favicon.data.length, favicon.mimeType); 1.212 + } catch (e) { 1.213 + ex = e; 1.214 + } finally { 1.215 + do_check_true(!!ex); 1.216 + } 1.217 + 1.218 + ex = null; 1.219 + try { 1.220 + iconsvc.replaceFaviconData( 1.221 + favicon.uri, null, 0, favicon.mimeType); 1.222 + } catch (e) { 1.223 + ex = e; 1.224 + } finally { 1.225 + do_check_true(!!ex); 1.226 + } 1.227 + 1.228 + favicon.file.remove(false); 1.229 + 1.230 + yield promiseClearHistory(); 1.231 +}); 1.232 + 1.233 +add_task(function test_replaceFaviconData_twiceReplace() { 1.234 + do_log_info("test replaceFaviconData on multiple replacements"); 1.235 + 1.236 + let pageURI = uri("http://test5.bar/"); 1.237 + yield promiseAddVisits(pageURI); 1.238 + 1.239 + let firstFavicon = createFavicon("favicon9.png"); 1.240 + let secondFavicon = createFavicon("favicon10.png"); 1.241 + 1.242 + iconsvc.replaceFaviconData( 1.243 + firstFavicon.uri, firstFavicon.data, firstFavicon.data.length, 1.244 + firstFavicon.mimetype); 1.245 + iconsvc.replaceFaviconData( 1.246 + firstFavicon.uri, secondFavicon.data, secondFavicon.data.length, 1.247 + secondFavicon.mimetype); 1.248 + 1.249 + let deferSetAndFetchFavicon = Promise.defer(); 1.250 + iconsvc.setAndFetchFaviconForPage( 1.251 + pageURI, firstFavicon.uri, true, 1.252 + PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE, 1.253 + function test_replaceFaviconData_twiceReplace_check(aURI, aDataLen, aData, aMimeType) { 1.254 + checkCallbackSucceeded(aMimeType, aData, secondFavicon.mimetype, secondFavicon.data); 1.255 + checkFaviconDataForPage( 1.256 + pageURI, secondFavicon.mimetype, secondFavicon.data, 1.257 + function test_replaceFaviconData_twiceReplace_callback() { 1.258 + firstFavicon.file.remove(false); 1.259 + secondFavicon.file.remove(false); 1.260 + deferSetAndFetchFavicon.resolve(); 1.261 + }); 1.262 + }); 1.263 + yield deferSetAndFetchFavicon.promise; 1.264 + 1.265 + yield promiseClearHistory(); 1.266 +});