summaryrefslogtreecommitdiffstats
path: root/toolkit/components/places/tests/bookmarks/test_removeFolderTransaction_reinsert.js
blob: 537974b38ab8cbf25872d357c301af736e2c7702 (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
/**
 * This test ensures that reinserting a folder within a transaction gives it
 * a different GUID, and passes the GUID to the observers.
 */

add_task(function* test_removeFolderTransaction_reinsert() {
  let folder = yield PlacesUtils.bookmarks.insert({
    type: PlacesUtils.bookmarks.TYPE_FOLDER,
    parentGuid: PlacesUtils.bookmarks.menuGuid,
    title: "Test folder",
  });
  let folderId = yield PlacesUtils.promiseItemId(folder.guid);
  let fx = yield PlacesUtils.bookmarks.insert({
    parentGuid: folder.guid,
    title: "Get Firefox!",
    url: "http://getfirefox.com",
  });
  let fxId = yield PlacesUtils.promiseItemId(fx.guid);
  let tb = yield PlacesUtils.bookmarks.insert({
    parentGuid: folder.guid,
    title: "Get Thunderbird!",
    url: "http://getthunderbird.com",
  });
  let tbId = yield PlacesUtils.promiseItemId(tb.guid);

  let notifications = [];
  function checkNotifications(expected, message) {
    deepEqual(notifications, expected, message);
    notifications.length = 0;
  }

  let observer = {
    onItemAdded(itemId, parentId, index, type, uri, title, dateAdded, guid,
                parentGuid) {
      notifications.push(["onItemAdded", itemId, parentId, guid, parentGuid]);
    },
    onItemRemoved(itemId, parentId, index, type, uri, guid, parentGuid) {
      notifications.push(["onItemRemoved", itemId, parentId, guid, parentGuid]);
    },
  };
  PlacesUtils.bookmarks.addObserver(observer, false);
  PlacesUtils.registerShutdownFunction(function() {
    PlacesUtils.bookmarks.removeObserver(observer);
  });

  let transaction = PlacesUtils.bookmarks.getRemoveFolderTransaction(folderId);
  deepEqual(notifications, [], "We haven't executed the transaction yet");

  transaction.doTransaction();
  checkNotifications([
    ["onItemRemoved", tbId, folderId, tb.guid, folder.guid],
    ["onItemRemoved", fxId, folderId, fx.guid, folder.guid],
    ["onItemRemoved", folderId, PlacesUtils.bookmarksMenuFolderId, folder.guid,
      PlacesUtils.bookmarks.menuGuid],
  ], "Executing transaction should remove folder and its descendants");

  transaction.undoTransaction();
  // At this point, the restored folder has the same ID, but a different GUID.
  let newFolderGuid = yield PlacesUtils.promiseItemGuid(folderId);
  checkNotifications([
    ["onItemAdded", folderId, PlacesUtils.bookmarksMenuFolderId, newFolderGuid,
      PlacesUtils.bookmarks.menuGuid],
  ], "Undo should reinsert folder with same ID and different GUID");

  transaction.redoTransaction();
  checkNotifications([
    ["onItemRemoved", folderId, PlacesUtils.bookmarksMenuFolderId,
      newFolderGuid, PlacesUtils.bookmarks.menuGuid],
  ], "Redo should forward new GUID to observer");
});