addon-sdk/source/test/addons/places/tests/test-places-favicon.js

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 /* This Source Code Form is subject to the terms of the Mozilla Public
     2  * License, v. 2.0. If a copy of the MPL was not distributed with this
     3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     5 'use strict';
     7 module.metadata = {
     8   'engines': {
     9     'Firefox': '*'
    10   }
    11 };
    13 const { Cc, Ci, Cu } = require('chrome');
    14 const { getFavicon } = require('sdk/places/favicon');
    15 const tabs = require('sdk/tabs');
    16 const open = tabs.open;
    17 const port = 8099;
    18 const host = 'http://localhost:' + port;
    19 const { onFaviconChange, serve, binFavicon } = require('../favicon-helpers');
    20 const { once } = require('sdk/system/events');
    21 const { defer } = require('sdk/core/promise');
    22 const { resetPlaces } = require('../places-helper');
    23 const faviconService = Cc["@mozilla.org/browser/favicon-service;1"].
    24                          getService(Ci.nsIFaviconService);
    26 exports.testStringGetFaviconCallbackSuccess = function (assert, done) {
    27   let name = 'callbacksuccess'
    28   let srv = makeServer(name);
    29   let url = host + '/' + name + '.html';
    30   let favicon = host + '/' + name + '.ico';
    31   let tab;
    33   onFaviconChange(url, function (faviconUrl) {
    34     getFavicon(url, function (url) {
    35       assert.equal(favicon, url, 'Callback returns correct favicon url');
    36       complete(tab, srv, done);
    37     });
    38   });
    40   open({
    41     url: url,
    42     onOpen: function (newTab) tab = newTab,
    43     inBackground: true
    44   });
    45 };
    47 exports.testStringGetFaviconCallbackFailure = function (assert, done) {
    48   let name = 'callbackfailure';
    49   let srv = makeServer(name);
    50   let url = host + '/' + name + '.html';
    51   let tab;
    53   waitAndExpire(url).then(function () {
    54     getFavicon(url, function (url) {
    55       assert.equal(url, null, 'Callback returns null');
    56       complete(tab, srv, done);
    57     });
    58   });
    60   open({
    61     url: url,
    62     onOpen: function (newTab) tab = newTab,
    63     inBackground: true
    64   });
    65 };
    67 exports.testStringGetFaviconPromiseSuccess = function (assert, done) {
    68   let name = 'promisesuccess'
    69   let srv = makeServer(name);
    70   let url = host + '/' + name + '.html';
    71   let favicon = host + '/' + name + '.ico';
    72   let tab;
    74   onFaviconChange(url, function (faviconUrl) {
    75     getFavicon(url).then(function (url) {
    76       assert.equal(url, favicon, 'Callback returns null');
    77     }, function (err) {
    78       assert.fail('Reject should not be called');
    79     }).then(complete.bind(null, tab, srv, done));
    80   });
    82   open({
    83     url: url,
    84     onOpen: function (newTab) tab = newTab,
    85     inBackground: true
    86   });
    87 };
    89 exports.testStringGetFaviconPromiseFailure = function (assert, done) {
    90   let name = 'promisefailure'
    91   let srv = makeServer(name);
    92   let url = host + '/' + name + '.html';
    93   let tab;
    95   waitAndExpire(url).then(function () {
    96     getFavicon(url).then(invalidResolve(assert), validReject(assert, 'expired url'))
    97       .then(complete.bind(null, tab, srv, done));
    98   });
   100   open({
   101     url: url,
   102     onOpen: function (newTab) tab = newTab,
   103     inBackground: true
   104   });
   105 };
   107 exports.testTabsGetFaviconPromiseSuccess = function (assert, done) {
   108   let name = 'tabs-success'
   109   let srv = makeServer(name);
   110   let url = host + '/' + name + '.html';
   111   let favicon = host + '/' + name + '.ico';
   112   let tab;
   114   onFaviconChange(url, function () {
   115     getFavicon(tab).then(function (url) {
   116       assert.equal(url, favicon, "getFavicon should return url for tab");
   117       complete(tab, srv, done);
   118     });
   119   });
   121   open({
   122     url: url,
   123     onOpen: function (newTab) tab = newTab,
   124     inBackground: true
   125   });
   126 };
   129 exports.testTabsGetFaviconPromiseFailure = function (assert, done) {
   130   let name = 'tabs-failure'
   131   let srv = makeServer(name);
   132   let url = host + '/' + name + '.html';
   133   let tab;
   135   waitAndExpire(url).then(function () {
   136     getFavicon(tab).then(invalidResolve(assert), validReject(assert, 'expired tab'))
   137       .then(complete.bind(null, tab, srv, done));
   138   });
   140   open({
   141     url: url,
   142     onOpen: function (newTab) tab = newTab,
   143     inBackground: true
   144   });
   145 };
   147 exports.testRejects = function (assert, done) {
   148   getFavicon({})
   149     .then(invalidResolve(assert), validReject(assert, 'Object'))
   150   .then(() => getFavicon(null))
   151     .then(invalidResolve(assert), validReject(assert, 'null'))
   152   .then(() => getFavicon(undefined))
   153     .then(invalidResolve(assert), validReject(assert, 'undefined'))
   154   .then(() => getFavicon([]))
   155     .then(invalidResolve(assert), validReject(assert, 'Array'))
   156     .catch(assert.fail).then(done);
   157 };
   159 function invalidResolve (assert) {
   160   return function () assert.fail('Promise should not be resolved successfully');
   161 }
   163 function validReject (assert, name) {
   164   return function () assert.pass(name + ' correctly rejected');
   165 }
   167 function makeServer (name) {
   168   return serve({name: name, favicon: binFavicon, port: port, host: host});
   169 }
   171 function waitAndExpire (url) {
   172   let deferred = defer();
   173   onFaviconChange(url, function (faviconUrl) {
   174     once('places-favicons-expired', function () {
   175       deferred.resolve();
   176     });
   177     faviconService.expireAllFavicons();
   178   });
   179   return deferred.promise;
   180 }
   182 function complete(tab, srv, done) {
   183   tab.close(function () {
   184     resetPlaces(() => {
   185       srv.stop(done);
   186     });
   187   });
   188 }

mercurial