/* Any copyright is dedicated to the Public Domain.
   http://creativecommons.org/publicdomain/zero/1.0/ */

// Tests functionality of the isURIVisited API.

const SCHEMES = {
  "http://": true,
  "https://": true,
  "ftp://": true,
  "file:///": true,
  "about:": false,
// nsIIOService.newURI() can throw if e.g. the app knows about imap://
// but the account is not set up and so the URL is invalid for it.
//  "imap://": false,
  "news://": false,
  "mailbox:": false,
  "moz-anno:favicon:http://": false,
  "view-source:http://": false,
  "chrome://browser/content/browser.xul?": false,
  "resource://": false,
  "data:,": false,
  "wyciwyg:/0/http://": false,
  "javascript:": false,
};

const TRANSITIONS = [
  TRANSITION_LINK,
  TRANSITION_TYPED,
  TRANSITION_BOOKMARK,
  TRANSITION_EMBED,
  TRANSITION_FRAMED_LINK,
  TRANSITION_REDIRECT_PERMANENT,
  TRANSITION_REDIRECT_TEMPORARY,
  TRANSITION_DOWNLOAD,
];

let gRunner;
function run_test()
{
  do_test_pending();
  gRunner = step();
  gRunner.next();
}

function step()
{
  let history = Cc["@mozilla.org/browser/history;1"]
                  .getService(Ci.mozIAsyncHistory);

  for (let scheme in SCHEMES) {
    do_log_info("Testing scheme " + scheme);
    for (let i = 0; i < TRANSITIONS.length; i++) {
      let transition = TRANSITIONS[i];
      do_log_info("With transition " + transition);

      let uri = NetUtil.newURI(scheme + "mozilla.org/");

      history.isURIVisited(uri, function(aURI, aIsVisited) {
        do_check_true(uri.equals(aURI));
        do_check_false(aIsVisited);

        let callback = {
          handleError:  function () {},
          handleResult: function () {},
          handleCompletion: function () {
            do_log_info("Added visit to " + uri.spec);

            history.isURIVisited(uri, function (aURI, aIsVisited) {
              do_check_true(uri.equals(aURI));
              let checker = SCHEMES[scheme] ? do_check_true : do_check_false;
              checker(aIsVisited);

              waitForClearHistory(function () {
                history.isURIVisited(uri, function(aURI, aIsVisited) {
                  do_check_true(uri.equals(aURI));
                  do_check_false(aIsVisited);
                  gRunner.next();
                });
              });
            });
          },
        };

        history.updatePlaces({ uri:    uri
                             , visits: [ { transitionType: transition
                                         , visitDate:      Date.now() * 1000
                                         } ]
                             }, callback);
      });
      yield;
    }
  }

  do_test_finished();
}
