summaryrefslogtreecommitdiffstats
path: root/browser/components/firefoxview/tests/browser/browser_tab_pickup_visibility.js
blob: d9ec59a57fb7436168d12a5a400ec0dcc59b245b (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

registerCleanupFunction(async function () {
  Services.prefs.clearUserPref(TAB_PICKUP_STATE_PREF);
});

async function setup({ open } = {}) {
  TabsSetupFlowManager.resetInternalState();
  // sanity check initial values
  ok(
    !TabsSetupFlowManager.hasVisibleViews,
    "Initially hasVisibleViews is false"
  );
  is(
    TabsSetupFlowManager._viewVisibilityStates.size,
    0,
    "Initially, there are no visible views"
  );
  ok(
    !isFirefoxViewTabSelected(),
    "During setup, the about:firefoxview tab is not selected"
  );

  if (typeof open == "undefined") {
    Services.prefs.clearUserPref(TAB_PICKUP_STATE_PREF);
  } else {
    await SpecialPowers.pushPrefEnv({
      set: [[TAB_PICKUP_STATE_PREF, open]],
    });
  }
  const sandbox = sinon.createSandbox();
  sandbox.stub(TabsSetupFlowManager, "isTabSyncSetupComplete").get(() => true);
  return sandbox;
}

add_task(async function test_tab_pickup_visibility() {
  /* Confirm the correct number of tab-pickup views are registered as visible */
  const sandbox = await setup();

  await withFirefoxView({ win: window }, async function (browser) {
    const { document } = browser.contentWindow;
    let tabPickupContainer = document.querySelector("#tab-pickup-container");

    ok(tabPickupContainer.open, "Tab Pickup container should be open");
    ok(isFirefoxViewTabSelected(), "The firefox view tab is selected");
    ok(TabsSetupFlowManager.hasVisibleViews, "hasVisibleViews");
    is(TabsSetupFlowManager._viewVisibilityStates.size, 1, "One view");

    info("Opening and switching to different tab to background fx-view");
    let newTab = await BrowserTestUtils.openNewForegroundTab(
      gBrowser,
      "about:mozilla"
    );
    ok(!isFirefoxViewTabSelected(), "The firefox view tab is not selected");
    ok(
      !TabsSetupFlowManager.hasVisibleViews,
      "no view visible when fx-view is not active"
    );
    let newWin = await BrowserTestUtils.openNewBrowserWindow();
    await openFirefoxViewTab(newWin);

    ok(
      isFirefoxViewTabSelected(newWin),
      "The firefox view tab in the new window is selected"
    );
    ok(
      TabsSetupFlowManager.hasVisibleViews,
      "view registered as visible when fx-view is opened in a new window"
    );
    is(TabsSetupFlowManager._viewVisibilityStates.size, 2, "2 tracked views");

    await BrowserTestUtils.closeWindow(newWin);

    ok(
      !isFirefoxViewTabSelected(),
      "The firefox view tab in the original window is not selected"
    );
    ok(
      !TabsSetupFlowManager.hasVisibleViews,
      "no visible views when fx-view is not the active tab in the remaining window"
    );
    is(
      TabsSetupFlowManager._viewVisibilityStates.size,
      1,
      "Back to one tracked view"
    );

    // Switch back to FxView:
    await BrowserTestUtils.switchTab(
      gBrowser,
      gBrowser.getTabForBrowser(browser)
    );

    ok(
      isFirefoxViewTabSelected(),
      "The firefox view tab in the original window is now selected"
    );
    ok(
      TabsSetupFlowManager.hasVisibleViews,
      "View visibility updated when we switch tab"
    );
    BrowserTestUtils.removeTab(newTab);
  });
  sandbox.restore();
  await SpecialPowers.popPrefEnv();
  ok(
    !TabsSetupFlowManager.hasVisibleViews,
    "View visibility updated after withFirefoxView"
  );
});

add_task(async function test_instance_closed() {
  /* Confirm tab-pickup views are correctly accounted for when toggled closed */
  const sandbox = await setup({ open: false });
  await withFirefoxView({ win: window }, async function (browser) {
    const { document } = browser.contentWindow;
    info(
      "tab-pickup.open pref: " +
        Services.prefs.getBoolPref(
          "browser.tabs.firefox-view.ui-state.tab-pickup.open"
        )
    );
    info(
      "isTabSyncSetupComplete: " + TabsSetupFlowManager.isTabSyncSetupComplete
    );
    let tabPickupContainer = document.querySelector("#tab-pickup-container");
    ok(!tabPickupContainer.open, "Tab Pickup container should be closed");
    info(
      "_viewVisibilityStates" +
        JSON.stringify(
          Array.from(TabsSetupFlowManager._viewVisibilityStates.values()),
          null,
          2
        )
    );
    ok(!TabsSetupFlowManager.hasVisibleViews, "no visible views");
    is(
      TabsSetupFlowManager._viewVisibilityStates.size,
      1,
      "One registered view"
    );

    tabPickupContainer.open = true;
    await TestUtils.waitForTick();
    ok(TabsSetupFlowManager.hasVisibleViews, "view visible");
  });
  sandbox.restore();
});