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

function test() {

  let local = {};

  Components.utils.import("resource://gre/modules/CloudSync.jsm", local);
  Components.utils.import("resource:///modules/sessionstore/TabStateFlusher.jsm", local);

  let cloudSync = local.CloudSync();
  let opentabs = [];

  waitForExplicitFinish();

  let testURL = "chrome://mochitests/content/browser/services/cloudsync/tests/mochitest/other_window.html";
  let expected = [
    testURL,
    testURL+"?x=1",
    testURL+"?x=%20a",
    // testURL+"?x=å",
  ];

  let nevents = 0;
  let nflushed = 0;
  function handleTabChangeEvent () {
    cloudSync.tabs.removeEventListener("change", handleTabChangeEvent);
    ++ nevents;
    info("tab change event " + nevents);
    next();
  }

  function getLocalTabs() {
    cloudSync.tabs.getLocalTabs().then(
      function (tabs) {
        for (let tab of tabs) {
          ok(expected.indexOf(tab.url) >= 0, "found an expected tab");
        }

        is(tabs.length, expected.length, "found the right number of tabs");

        opentabs.forEach(function (tab) {
          gBrowser.removeTab(tab);
        });

        is(nevents, 1, "expected number of change events");

        finish();
      }
    )
  }

  cloudSync.tabs.addEventListener("change", handleTabChangeEvent);

  expected.forEach(function(url) {
    let tab = gBrowser.addTab(url);

    function flush() {
      tab.linkedBrowser.removeEventListener("load", flush, true);
      local.TabStateFlusher.flush(tab.linkedBrowser).then(() => {
        ++ nflushed;
        info("flushed " + nflushed);
        next();
      });
    }

    tab.linkedBrowser.addEventListener("load", flush, true);

    opentabs.push(tab);
  });

  function next() {
    if (nevents == 1 && nflushed == expected.length) {
      getLocalTabs();
    }
  }

}
