summaryrefslogtreecommitdiffstats
path: root/toolkit/components/places/tests/chrome/test_cached_favicon.xhtml
blob: f7e7f4f1d8b9e71be04c81b233136497594cfc73 (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
<?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 cached-favicon 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 src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
  <script src="chrome://mochikit/content/tests/SimpleTest/WindowSnapshot.js"/>
  <script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
  <script type="application/javascript" src="head.js" />

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

let tests = [
  {
    desc: "cached-favicon URI with no data in the database loads default icon",
    url: "https://mozilla.org/2009/made-up-favicon/places-rocks/",
    expectedIcon: PlacesUtils.favicons.defaultFavicon.spec,
  },
  {
    desc: "URI added to the database is properly loaded",
    url: "https://mozilla.org/should-be-barney/",
    expectedIcon: "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 '" + tests[aIndex].desc + "' 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 == tests.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 "cached-favicon:" + tests[index].url;
    return tests[index].expectedIcon;
  }

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

function test()
{
  SimpleTest.waitForExplicitFinish();
  (async () => {
    await PlacesUtils.history.clear();

    info("Inserting new visit");
    await PlacesUtils.history.insert({
      url: "https://example.com/favicon_annotations",
      visits: [{
        transition: PlacesUtils.history.TRANSITIONS.TYPED
      }]
    });

    // Set the favicon data.  Note that the "cached-favicon:" 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.
    info("Replace favicon data");
    var systemPrincipal = Cc["@mozilla.org/systemprincipal;1"]
                            .createInstance(Ci.nsIPrincipal);
    PlacesUtils.favicons.replaceFaviconDataFromDataURL(
      Services.io.newURI(tests[1].url),
      tests[1].expectedIcon,
      (Date.now() + 86400) * 1000,
      systemPrincipal);
    info("Set favicon data");
    PlacesUtils.favicons.setAndFetchFaviconForPage(
      Services.io.newURI("https://example.com/favicon_annotations"),
      Services.io.newURI(tests[1].url),
      true, PlacesUtils.favicons.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>