summaryrefslogtreecommitdiffstats
path: root/browser/components/migration/tests/unit/test_Safari_bookmarks.js
blob: 79cbcf9203c06e531339ebf561f7266f4717e56f (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
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
"use strict";

const { CustomizableUI } = ChromeUtils.import(
  "resource:///modules/CustomizableUI.jsm"
);

add_task(async function() {
  registerFakePath("ULibDir", do_get_file("Library/"));

  let migrator = await MigrationUtils.getMigrator("safari");
  // Sanity check for the source.
  Assert.ok(await migrator.isSourceAvailable());

  // Wait for the imported bookmarks. We don't check that "From Safari"
  // folders are created on the toolbar since the profile
  // we're importing to has less than 3 bookmarks in the destination
  // so a "From Safari" folder isn't created.
  let expectedParents = [PlacesUtils.toolbarFolderId];
  let bookmarkRoots = 0;
  let bookmarkRootMap = {
    [PlacesUtils.bookmarks.toolbarGuid]:
      MigrationUtils.SOURCE_BOOKMARK_ROOTS_BOOKMARKS_TOOLBAR,
    [PlacesUtils.bookmarks.menuGuid]:
      MigrationUtils.SOURCE_BOOKMARK_ROOTS_BOOKMARKS_MENU,
    [PlacesUtils.bookmarks.unfiledGuid]:
      MigrationUtils.SOURCE_BOOKMARK_ROOTS_UNFILED,
  };
  let itemCount = 0;

  let gotFolder = false;
  let listener = events => {
    for (let event of events) {
      itemCount++;
      if (
        event.itemType == PlacesUtils.bookmarks.TYPE_BOOKMARK &&
        bookmarkRootMap[event.parentGuid]
      ) {
        bookmarkRoots |= bookmarkRootMap[event.parentGuid];
      }

      if (
        event.itemType == PlacesUtils.bookmarks.TYPE_FOLDER &&
        event.title == "Stuff"
      ) {
        gotFolder = true;
      }
      if (expectedParents.length) {
        let index = expectedParents.indexOf(event.parentId);
        Assert.ok(index != -1, "Found expected parent");
        expectedParents.splice(index, 1);
      }
    }
  };
  PlacesUtils.observers.addListener(["bookmark-added"], listener);
  let observerNotified = false;
  Services.obs.addObserver((aSubject, aTopic, aData) => {
    let [toolbar, visibility] = JSON.parse(aData);
    Assert.equal(
      toolbar,
      CustomizableUI.AREA_BOOKMARKS,
      "Notification should be received for bookmarks toolbar"
    );
    Assert.equal(
      visibility,
      "true",
      "Notification should say to reveal the bookmarks toolbar"
    );
    observerNotified = true;
  }, "browser-set-toolbar-visibility");

  await promiseMigration(migrator, MigrationUtils.resourceTypes.BOOKMARKS);
  PlacesUtils.observers.removeListener(["bookmark-added"], listener);

  // Check the bookmarks have been imported to all the expected parents.
  Assert.ok(!expectedParents.length, "No more expected parents");
  Assert.ok(gotFolder, "Should have seen the folder get imported");
  Assert.equal(itemCount, 13, "Should import all 13 items.");
  // Check that the telemetry matches:
  Assert.equal(
    MigrationUtils._importQuantities.bookmarks,
    itemCount,
    "Telemetry reporting correct."
  );
  let telemetryRootsMatchesExpectations = await TestUtils.waitForCondition(
    () => {
      let snapshot = Services.telemetry.getSnapshotForKeyedHistograms(
        "main",
        false
      ).parent.FX_MIGRATION_BOOKMARKS_ROOTS;
      if (!snapshot || !snapshot.safari) {
        return false;
      }
      let sum = arr => Object.values(arr).reduce((a, b) => a + b, 0);
      let sumOfValues = sum(snapshot.safari.values);
      info(`Expected ${bookmarkRoots}, got ${sumOfValues}`);
      return sumOfValues == bookmarkRoots;
    },
    "Wait until telemetry is updated"
  );
  ok(
    telemetryRootsMatchesExpectations,
    "The value in the roots histogram should match expectations"
  );
  Assert.ok(observerNotified, "The observer should be notified upon migration");
});