toolkit/components/places/tests/favicons/test_replaceFaviconData.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 /* Any copyright is dedicated to the Public Domain.
michael@0 2 * http://creativecommons.org/publicdomain/zero/1.0/ */
michael@0 3
michael@0 4 /*
michael@0 5 * Tests for mozIAsyncFavicons::replaceFaviconData()
michael@0 6 */
michael@0 7
michael@0 8 let iconsvc = PlacesUtils.favicons;
michael@0 9 let histsvc = PlacesUtils.history;
michael@0 10
michael@0 11 let originalFavicon = {
michael@0 12 file: do_get_file("favicon-normal16.png"),
michael@0 13 uri: uri(do_get_file("favicon-normal16.png")),
michael@0 14 data: readFileData(do_get_file("favicon-normal16.png")),
michael@0 15 mimetype: "image/png"
michael@0 16 };
michael@0 17
michael@0 18 let uniqueFaviconId = 0;
michael@0 19 function createFavicon(fileName) {
michael@0 20 let tempdir = Services.dirsvc.get("TmpD", Ci.nsILocalFile);
michael@0 21
michael@0 22 // remove any existing file at the path we're about to copy to
michael@0 23 let outfile = tempdir.clone();
michael@0 24 outfile.append(fileName);
michael@0 25 try { outfile.remove(false); } catch (e) {}
michael@0 26
michael@0 27 originalFavicon.file.copyToFollowingLinks(tempdir, fileName);
michael@0 28
michael@0 29 let stream = Cc["@mozilla.org/network/file-output-stream;1"]
michael@0 30 .createInstance(Ci.nsIFileOutputStream);
michael@0 31 stream.init(outfile, 0x02 | 0x08 | 0x10, 0600, 0);
michael@0 32
michael@0 33 // append some data that sniffers/encoders will ignore that will distinguish
michael@0 34 // the different favicons we'll create
michael@0 35 uniqueFaviconId++;
michael@0 36 let uniqueStr = "uid:" + uniqueFaviconId;
michael@0 37 stream.write(uniqueStr, uniqueStr.length);
michael@0 38 stream.close();
michael@0 39
michael@0 40 do_check_eq(outfile.leafName.substr(0, fileName.length), fileName);
michael@0 41
michael@0 42 return {
michael@0 43 file: outfile,
michael@0 44 uri: uri(outfile),
michael@0 45 data: readFileData(outfile),
michael@0 46 mimetype: "image/png"
michael@0 47 };
michael@0 48 }
michael@0 49
michael@0 50 function checkCallbackSucceeded(callbackMimetype, callbackData, sourceMimetype, sourceData) {
michael@0 51 do_check_eq(callbackMimetype, sourceMimetype);
michael@0 52 do_check_true(compareArrays(callbackData, sourceData));
michael@0 53 }
michael@0 54
michael@0 55 function run_test() {
michael@0 56 // check that the favicon loaded correctly
michael@0 57 do_check_eq(originalFavicon.data.length, 286);
michael@0 58 run_next_test();
michael@0 59 };
michael@0 60
michael@0 61 add_task(function test_replaceFaviconData_validHistoryURI() {
michael@0 62 do_log_info("test replaceFaviconData for valid history uri");
michael@0 63
michael@0 64 let pageURI = uri("http://test1.bar/");
michael@0 65 yield promiseAddVisits(pageURI);
michael@0 66
michael@0 67 let favicon = createFavicon("favicon1.png");
michael@0 68
michael@0 69 iconsvc.replaceFaviconData(favicon.uri, favicon.data, favicon.data.length,
michael@0 70 favicon.mimetype);
michael@0 71
michael@0 72 let deferSetAndFetchFavicon = Promise.defer();
michael@0 73 iconsvc.setAndFetchFaviconForPage(pageURI, favicon.uri, true,
michael@0 74 PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE,
michael@0 75 function test_replaceFaviconData_validHistoryURI_check(aURI, aDataLen, aData, aMimeType) {
michael@0 76 checkCallbackSucceeded(aMimeType, aData, favicon.mimetype, favicon.data);
michael@0 77 checkFaviconDataForPage(
michael@0 78 pageURI, favicon.mimetype, favicon.data,
michael@0 79 function test_replaceFaviconData_validHistoryURI_callback() {
michael@0 80 favicon.file.remove(false);
michael@0 81 deferSetAndFetchFavicon.resolve();
michael@0 82 });
michael@0 83 });
michael@0 84 yield deferSetAndFetchFavicon.promise;
michael@0 85
michael@0 86 yield promiseClearHistory();
michael@0 87 });
michael@0 88
michael@0 89 add_task(function test_replaceFaviconData_overrideDefaultFavicon() {
michael@0 90 do_log_info("test replaceFaviconData to override a later setAndFetchFaviconForPage");
michael@0 91
michael@0 92 let pageURI = uri("http://test2.bar/");
michael@0 93 yield promiseAddVisits(pageURI);
michael@0 94
michael@0 95 let firstFavicon = createFavicon("favicon2.png");
michael@0 96 let secondFavicon = createFavicon("favicon3.png");
michael@0 97
michael@0 98 iconsvc.replaceFaviconData(
michael@0 99 firstFavicon.uri, secondFavicon.data, secondFavicon.data.length,
michael@0 100 secondFavicon.mimetype);
michael@0 101
michael@0 102 let deferSetAndFetchFavicon = Promise.defer();
michael@0 103 iconsvc.setAndFetchFaviconForPage(
michael@0 104 pageURI, firstFavicon.uri, true,
michael@0 105 PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE,
michael@0 106 function test_replaceFaviconData_overrideDefaultFavicon_check(aURI, aDataLen, aData, aMimeType) {
michael@0 107 checkCallbackSucceeded(aMimeType, aData, secondFavicon.mimetype, secondFavicon.data);
michael@0 108 checkFaviconDataForPage(
michael@0 109 pageURI, secondFavicon.mimetype, secondFavicon.data,
michael@0 110 function test_replaceFaviconData_overrideDefaultFavicon_callback() {
michael@0 111 firstFavicon.file.remove(false);
michael@0 112 secondFavicon.file.remove(false);
michael@0 113 deferSetAndFetchFavicon.resolve();
michael@0 114 });
michael@0 115 });
michael@0 116 yield deferSetAndFetchFavicon.promise;
michael@0 117
michael@0 118 yield promiseClearHistory();
michael@0 119 });
michael@0 120
michael@0 121 add_task(function test_replaceFaviconData_replaceExisting() {
michael@0 122 do_log_info("test replaceFaviconData to override a previous setAndFetchFaviconForPage");
michael@0 123
michael@0 124 let pageURI = uri("http://test3.bar");
michael@0 125 yield promiseAddVisits(pageURI);
michael@0 126
michael@0 127 let firstFavicon = createFavicon("favicon4.png");
michael@0 128 let secondFavicon = createFavicon("favicon5.png");
michael@0 129
michael@0 130 let deferSetAndFetchFavicon = Promise.defer();
michael@0 131 iconsvc.setAndFetchFaviconForPage(
michael@0 132 pageURI, firstFavicon.uri, true,
michael@0 133 PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE,
michael@0 134 function test_replaceFaviconData_replaceExisting_firstSet_check(aURI, aDataLen, aData, aMimeType) {
michael@0 135 checkCallbackSucceeded(aMimeType, aData, firstFavicon.mimetype, firstFavicon.data);
michael@0 136 checkFaviconDataForPage(
michael@0 137 pageURI, firstFavicon.mimetype, firstFavicon.data,
michael@0 138 function test_replaceFaviconData_overrideDefaultFavicon_firstCallback() {
michael@0 139 iconsvc.replaceFaviconData(
michael@0 140 firstFavicon.uri, secondFavicon.data, secondFavicon.data.length,
michael@0 141 secondFavicon.mimetype);
michael@0 142 promiseAsyncUpdates().then(function() {
michael@0 143 checkFaviconDataForPage(
michael@0 144 pageURI, secondFavicon.mimetype, secondFavicon.data,
michael@0 145 function test_replaceFaviconData_overrideDefaultFavicon_secondCallback() {
michael@0 146 firstFavicon.file.remove(false);
michael@0 147 secondFavicon.file.remove(false);
michael@0 148 deferSetAndFetchFavicon.resolve();
michael@0 149 });
michael@0 150 });
michael@0 151 });
michael@0 152 });
michael@0 153 yield deferSetAndFetchFavicon.promise;
michael@0 154
michael@0 155 yield promiseClearHistory();
michael@0 156 });
michael@0 157
michael@0 158 add_task(function test_replaceFaviconData_unrelatedReplace() {
michael@0 159 do_log_info("test replaceFaviconData to not make unrelated changes");
michael@0 160
michael@0 161 let pageURI = uri("http://test4.bar/");
michael@0 162 yield promiseAddVisits(pageURI);
michael@0 163
michael@0 164 let favicon = createFavicon("favicon6.png");
michael@0 165 let unrelatedFavicon = createFavicon("favicon7.png");
michael@0 166
michael@0 167 iconsvc.replaceFaviconData(
michael@0 168 unrelatedFavicon.uri, unrelatedFavicon.data, unrelatedFavicon.data.length,
michael@0 169 unrelatedFavicon.mimetype);
michael@0 170
michael@0 171 let deferSetAndFetchFavicon = Promise.defer();
michael@0 172 iconsvc.setAndFetchFaviconForPage(
michael@0 173 pageURI, favicon.uri, true,
michael@0 174 PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE,
michael@0 175 function test_replaceFaviconData_unrelatedReplace_check(aURI, aDataLen, aData, aMimeType) {
michael@0 176 checkCallbackSucceeded(aMimeType, aData, favicon.mimetype, favicon.data);
michael@0 177 checkFaviconDataForPage(
michael@0 178 pageURI, favicon.mimetype, favicon.data,
michael@0 179 function test_replaceFaviconData_unrelatedReplace_callback() {
michael@0 180 favicon.file.remove(false);
michael@0 181 unrelatedFavicon.file.remove(false);
michael@0 182 deferSetAndFetchFavicon.resolve();
michael@0 183 });
michael@0 184 });
michael@0 185 yield deferSetAndFetchFavicon.promise;
michael@0 186
michael@0 187 yield promiseClearHistory();
michael@0 188 });
michael@0 189
michael@0 190 add_task(function test_replaceFaviconData_badInputs() {
michael@0 191 do_log_info("test replaceFaviconData to throw on bad inputs");
michael@0 192
michael@0 193 let favicon = createFavicon("favicon8.png");
michael@0 194
michael@0 195 let ex = null;
michael@0 196 try {
michael@0 197 iconsvc.replaceFaviconData(
michael@0 198 favicon.uri, favicon.data, favicon.data.length, "");
michael@0 199 } catch (e) {
michael@0 200 ex = e;
michael@0 201 } finally {
michael@0 202 do_check_true(!!ex);
michael@0 203 }
michael@0 204
michael@0 205 ex = null;
michael@0 206 try {
michael@0 207 iconsvc.replaceFaviconData(
michael@0 208 null, favicon.data, favicon.data.length, favicon.mimeType);
michael@0 209 } catch (e) {
michael@0 210 ex = e;
michael@0 211 } finally {
michael@0 212 do_check_true(!!ex);
michael@0 213 }
michael@0 214
michael@0 215 ex = null;
michael@0 216 try {
michael@0 217 iconsvc.replaceFaviconData(
michael@0 218 favicon.uri, null, 0, favicon.mimeType);
michael@0 219 } catch (e) {
michael@0 220 ex = e;
michael@0 221 } finally {
michael@0 222 do_check_true(!!ex);
michael@0 223 }
michael@0 224
michael@0 225 favicon.file.remove(false);
michael@0 226
michael@0 227 yield promiseClearHistory();
michael@0 228 });
michael@0 229
michael@0 230 add_task(function test_replaceFaviconData_twiceReplace() {
michael@0 231 do_log_info("test replaceFaviconData on multiple replacements");
michael@0 232
michael@0 233 let pageURI = uri("http://test5.bar/");
michael@0 234 yield promiseAddVisits(pageURI);
michael@0 235
michael@0 236 let firstFavicon = createFavicon("favicon9.png");
michael@0 237 let secondFavicon = createFavicon("favicon10.png");
michael@0 238
michael@0 239 iconsvc.replaceFaviconData(
michael@0 240 firstFavicon.uri, firstFavicon.data, firstFavicon.data.length,
michael@0 241 firstFavicon.mimetype);
michael@0 242 iconsvc.replaceFaviconData(
michael@0 243 firstFavicon.uri, secondFavicon.data, secondFavicon.data.length,
michael@0 244 secondFavicon.mimetype);
michael@0 245
michael@0 246 let deferSetAndFetchFavicon = Promise.defer();
michael@0 247 iconsvc.setAndFetchFaviconForPage(
michael@0 248 pageURI, firstFavicon.uri, true,
michael@0 249 PlacesUtils.favicons.FAVICON_LOAD_NON_PRIVATE,
michael@0 250 function test_replaceFaviconData_twiceReplace_check(aURI, aDataLen, aData, aMimeType) {
michael@0 251 checkCallbackSucceeded(aMimeType, aData, secondFavicon.mimetype, secondFavicon.data);
michael@0 252 checkFaviconDataForPage(
michael@0 253 pageURI, secondFavicon.mimetype, secondFavicon.data,
michael@0 254 function test_replaceFaviconData_twiceReplace_callback() {
michael@0 255 firstFavicon.file.remove(false);
michael@0 256 secondFavicon.file.remove(false);
michael@0 257 deferSetAndFetchFavicon.resolve();
michael@0 258 });
michael@0 259 });
michael@0 260 yield deferSetAndFetchFavicon.promise;
michael@0 261
michael@0 262 yield promiseClearHistory();
michael@0 263 });

mercurial