DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (777e60ca8853)

VCS Links

Line Code
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
<?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[

const Cc = Components.classes;
const Ci = Components.interfaces;
const 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.
        fs.replaceFaviconDataFromDataURL(uri(testURIs[1]), expectedURIs[1],
                                         (Date.now() + 60 * 60 * 24 * 1000) * 1000);
        fs.setAndFetchFaviconForPage(pageURI, uri(testURIs[1]), true,
                                     fs.FAVICON_LOAD_NON_PRIVATE);

        // 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>