summaryrefslogtreecommitdiffstats
path: root/toolkit/components/places/tests/chrome/test_favicon_annotations.xul
blob: b7647cbc682c74c0ec5247ae3871f828074711b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
<?xml version="1.0"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
   - License, v. 2.0. If a copy of the MPL was not distributed with this
   - file, You can obtain one at http://mozilla.org/MPL/2.0/.  -->
<!--
 * This file tests the moz-anno protocol, which was added in Bug 316077 and how
 * it loads favicons.
-->

<window title="Favicon Annotation Protocol Test"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        onload="test();">

  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/WindowSnapshot.js"/>
  <script type="application/javascript"
          src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>

  <script type="application/javascript">
  <![CDATA[

var Cc = Components.classes;
var Ci = Components.interfaces;
var Cr = Components.results;

let fs = Cc["@mozilla.org/browser/favicon-service;1"].
         getService(Ci.nsIFaviconService);

// Test descriptions that will be printed in the case of failure.
let testDescriptions = [
  "moz-anno URI with no data in the database loads default icon",
  "URI added to the database is properly loaded",
];

// URIs to load (will be compared with expectedURIs of the same index).
let testURIs = [
  "http://mozilla.org/2009/made-up-favicon/places-rocks/",
  "http://mozilla.org/should-be-barney/",
];

// URIs to load for expected results.
let expectedURIs = [
  fs.defaultFavicon.spec,
  "data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%10%00%00%00%10%08%06%00%00%00%1F%F3%FFa%00%00%00%04gAMA%00%00%AF%C87%05%8A%E9%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%01%D6IDATx%DAb%FC%FF%FF%3F%03%25%00%20%80%98%909%EF%DF%BFg%EF%EC%EC%FC%AD%AC%AC%FC%DF%95%91%F1%BF%89%89%C9%7F%20%FF%D7%EA%D5%AB%B7%DF%BBwO%16%9B%01%00%01%C4%00r%01%08%9F9s%C6%CD%D8%D8%F8%BF%0B%03%C3%FF3%40%BC%0A%88%EF%02q%1A%10%BB%40%F1%AAU%ABv%C1%D4%C30%40%00%81%89%993g%3E%06%1A%F6%3F%14%AA%11D%97%03%F1%7Fc%08%0D%E2%2B))%FD%17%04%89%A1%19%00%10%40%0C%D00%F8%0F3%00%C8%F8%BF%1B%E4%0Ac%88a%E5%60%17%19%FF%0F%0D%0D%05%1B%02v%D9%DD%BB%0A0%03%00%02%08%AC%B9%A3%A3%E3%17%03%D4v%90%01%EF%18%106%C3%0Cz%07%C5%BB%A1%DE%82y%07%20%80%A0%A6%08B%FCn%0C1%60%26%D4%20d%C3VA%C3%06%26%BE%0A%EA-%80%00%82%B9%E0%F7L4%0D%EF%90%F8%C6%60%2F%0A%82%BD%01%13%07%0700%D0%01%02%88%11%E4%02P%B41%DC%BB%C7%D0%014%0D%E8l%06W%20%06%BA%88%A1%1C%1AS%15%40%7C%16%CA6.%2Fgx%BFg%0F%83%CB%D9%B3%0C%7B%80%7C%80%00%02%BB%00%E8%9F%ED%20%1B%3A%A0%A6%9F%81%DA%DC%01%C5%B0%80%ED%80%FA%BF%BC%BC%FC%3F%83%12%90%9D%96%F6%1F%20%80%18%DE%BD%7B%C7%0E%8E%05AD%20%FEGr%A6%A0%A0%E0%7F%25P%80%02%9D%0F%D28%13%18%23%C6%C0%B0%02E%3D%C8%F5%00%01%04%8F%05P%A8%BA%40my%87%E4%12c%A8%8D%20%8B%D0%D3%00%08%03%04%10%9C%01R%E4%82d%3B%C8%A0%99%C6%90%90%C6%A5%19%84%01%02%08%9E%17%80%C9x%F7%7B%A0%DBVC%F9%A0%C0%5C%7D%16%2C%CE%00%F4%C6O%5C%99%09%20%800L%04y%A5%03%1A%95%A0%80%05%05%14.%DBA%18%20%80%18)%CD%CE%00%01%06%00%0C'%94%C7%C0k%C9%2C%00%00%00%00IEND%AEB%60%82",
];


/**
 * The event listener placed on our test windows used to determine when it is
 * safe to compare the two windows.
 */
let _results = [];
function loadEventHandler()
{
  _results.push(snapshotWindow(window));

  loadNextTest();
}

/**
 * This runs the comparison.
 */
function compareResults(aIndex, aImage1, aImage2)
{
  let [correct, data1, data2] = compareSnapshots(aImage1, aImage2, true);
  SimpleTest.ok(correct,
                "Test '" + testDescriptions[aIndex] + "' matches expectations. " +
                "Data from window 1 is '" + data1 + "'. " +
                "Data from window 2 is '" + data2 + "'");
}

/**
 * Loads the next set of URIs to compare against.
 */
let _counter = -1;
function loadNextTest()
{
  _counter++;
  // If we have no more tests, finish.
  if (_counter / 2 == testDescriptions.length) {
    for (let i = 0; i < _results.length; i = i + 2)
      compareResults(i / 2, _results[i], _results[i + 1]);

    SimpleTest.finish();
    return;
  }

  let nextURI = function() {
    let index = Math.floor(_counter / 2);
    if ((_counter % 2) == 0)
      return "moz-anno:favicon:" + testURIs[index];
    return expectedURIs[index];
  }

  let img = document.getElementById("favicon");
  img.setAttribute("src", nextURI());
}

function test()
{
  SimpleTest.waitForExplicitFinish();
  let db = Cc["@mozilla.org/browser/nav-history-service;1"].
           getService(Ci.nsPIPlacesDatabase).
           DBConnection;

  // Empty any old favicons
  db.executeSimpleSQL("DELETE FROM moz_favicons");

  let ios = Cc["@mozilla.org/network/io-service;1"].
            getService(Ci.nsIIOService);
  let uri = function(aSpec) {
    return ios.newURI(aSpec, null, null);
  };

  let pageURI = uri("http://example.com/favicon_annotations");
  let history = Cc["@mozilla.org/browser/history;1"]
                  .getService(Ci.mozIAsyncHistory);
  history.updatePlaces(
    {
      uri: pageURI,
      visits: [{ transitionType: Ci.nsINavHistoryService.TRANSITION_TYPED,
                 visitDate: Date.now() * 1000
              }],
    },
    {
      handleError: function UP_handleError() {
        ok(false, "Unexpected error in adding visit.");
      },
      handleResult: function () {},
      handleCompletion: function UP_handleCompletion() {
        // Set the favicon data.  Note that the "moz-anno:" protocol requires
        // the favicon to be stored in the database, but the
        // replaceFaviconDataFromDataURL function will not save the favicon
        // unless it is associated with a page.  Thus, we must associate the
        // icon with a page explicitly in order for it to be visible through
        // the protocol.
        var systemPrincipal = Cc["@mozilla.org/systemprincipal;1"]
                                .createInstance(Ci.nsIPrincipal);

        fs.replaceFaviconDataFromDataURL(uri(testURIs[1]), expectedURIs[1],
                                         (Date.now() + 60 * 60 * 24 * 1000) * 1000,
                                         systemPrincipal);

        fs.setAndFetchFaviconForPage(pageURI, uri(testURIs[1]), true,
                                     fs.FAVICON_LOAD_NON_PRIVATE,
                                     null, systemPrincipal);

        // And start our test process.
        loadNextTest();
      }
    }
  );


}

  ]]>
  </script>

  <body xmlns="http://www.w3.org/1999/xhtml">
    <img id="favicon" onload="loadEventHandler();"/>
    <p id="display"></p>
    <div id="content" style="display:none;"></div>
    <pre id="test"></pre>
  </body>
</window>