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

// This test checks that changing a tag for a bookmark with multiple tags
// notifies OnItemChanged("tags") only once, and not once per tag.

function run_test() {
  do_test_pending();

  let tags = ["a", "b", "c"];
  let uri = NetUtil.newURI("http://1.moz.org/");

  let id = PlacesUtils.bookmarks.insertBookmark(
    PlacesUtils.unfiledBookmarksFolderId, uri,
    PlacesUtils.bookmarks.DEFAULT_INDEX, "Bookmark 1"
  );
  PlacesUtils.tagging.tagURI(uri, tags);

  let bookmarksObserver = {
    QueryInterface: XPCOMUtils.generateQI([
      Ci.nsINavBookmarkObserver
    ]),

    _changedCount: 0,
    onItemChanged: function (aItemId, aProperty, aIsAnnotationProperty, aValue,
                             aLastModified, aItemType) {
      if (aProperty == "tags") {
        do_check_eq(aItemId, id);
        this._changedCount++;
      }
    },

    onItemRemoved: function (aItemId, aParentId, aIndex, aItemType) {
      if (aItemId == id) {
        PlacesUtils.bookmarks.removeObserver(this);
        do_check_eq(this._changedCount, 2);
        do_test_finished();
      }
    },

    onItemAdded: function () {},
    onBeginUpdateBatch: function () {},
    onEndUpdateBatch: function () {},
    onBeforeItemRemoved: function () {},
    onItemVisited: function () {},
    onItemMoved: function () {},
  };
  PlacesUtils.bookmarks.addObserver(bookmarksObserver, false);

  PlacesUtils.tagging.tagURI(uri, ["d"]);
  PlacesUtils.tagging.tagURI(uri, ["e"]);
  PlacesUtils.bookmarks.removeItem(id);
}
