summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/tabs/browser_multiselect_tabs_close_duplicate_tabs.js
blob: d18795447fc71c1593f876131b1d9a0062c49afa (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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
const PREF_WARN_ON_CLOSE = "browser.tabs.warnOnCloseOtherTabs";
const PREF_SHOWN_DUPE_DIALOG =
  "browser.tabs.haveShownCloseAllDuplicateTabsWarning";

add_task(async function setPref() {
  await SpecialPowers.pushPrefEnv({
    set: [
      [PREF_WARN_ON_CLOSE, false],
      [PREF_SHOWN_DUPE_DIALOG, true],
    ],
  });
});

add_task(async function withAMultiSelectedTab() {
  let initialTab = gBrowser.selectedTab;
  let tab1 = await addTab();
  let tab2 = await addTab();
  let tab3 = await addTab();
  let tab4 = await addTab();

  is(gBrowser.multiSelectedTabsCount, 0, "Zero multiselected tabs");

  await triggerClickOn(tab1, { ctrlKey: true });

  let tab4Pinned = BrowserTestUtils.waitForEvent(tab4, "TabPinned");
  gBrowser.pinTab(tab4);
  await tab4Pinned;

  ok(initialTab.multiselected, "InitialTab is multiselected");
  ok(tab1.multiselected, "Tab1 is multiselected");
  ok(!tab2.multiselected, "Tab2 is not multiselected");
  ok(!tab3.multiselected, "Tab3 is not multiselected");
  ok(!tab4.multiselected, "Tab4 is not multiselected");
  ok(tab4.pinned, "Tab4 is pinned");
  is(gBrowser.multiSelectedTabsCount, 2, "Two multiselected tabs");
  is(gBrowser.selectedTab, initialTab, "InitialTab is the active tab");

  let closingTabs = [tab2, tab3];
  let tabClosingPromises = [];
  for (let tab of closingTabs) {
    tabClosingPromises.push(BrowserTestUtils.waitForTabClosing(tab));
  }

  gBrowser.removeDuplicateTabs(tab1);

  await Promise.all(tabClosingPromises);

  ok(!initialTab.closing, "InitialTab is not closing");
  ok(!tab1.closing, "Tab1 is not closing");
  ok(tab2.closing, "Tab2 is closing");
  ok(tab3.closing, "Tab3 is closing");
  ok(!tab4.closing, "Tab4 is not closing");
  is(gBrowser.multiSelectedTabsCount, 2, "Two multiselected tabs");
  is(gBrowser.selectedTab, initialTab, "InitialTab is still the active tab");

  gBrowser.clearMultiSelectedTabs();
  BrowserTestUtils.removeTab(tab1);
  BrowserTestUtils.removeTab(tab4);
});

add_task(async function withNotAMultiSelectedTab() {
  let initialTab = gBrowser.selectedTab;
  let tab1 = await addTab("http://mochi.test:8888/");
  let tab2 = await addTab("http://mochi.test:8888/");
  let tab3 = await addTab("http://mochi.test:8888/");
  let tab4 = await addTab("http://mochi.test:8888/");
  let tab5 = await addTab("http://mochi.test:8888/");
  let tab6 = await addTab("http://mochi.test:8888/", { userContextId: 1 });

  is(gBrowser.multiSelectedTabsCount, 0, "Zero multiselected tabs");

  await BrowserTestUtils.switchTab(gBrowser, tab1);
  await triggerClickOn(tab2, { ctrlKey: true });
  await triggerClickOn(tab5, { ctrlKey: true });

  let tab4Pinned = BrowserTestUtils.waitForEvent(tab4, "TabPinned");
  gBrowser.pinTab(tab4);
  await tab4Pinned;

  let tab5Pinned = BrowserTestUtils.waitForEvent(tab5, "TabPinned");
  gBrowser.pinTab(tab5);
  await tab5Pinned;

  ok(!initialTab.multiselected, "InitialTab is not multiselected");
  ok(tab1.multiselected, "Tab1 is multiselected");
  ok(tab2.multiselected, "Tab2 is multiselected");
  ok(!tab3.multiselected, "Tab3 is not multiselected");
  ok(!tab4.multiselected, "Tab4 is not multiselected");
  ok(tab4.pinned, "Tab4 is pinned");
  ok(tab5.multiselected, "Tab5 is multiselected");
  ok(tab5.pinned, "Tab5 is pinned");
  ok(!tab6.multiselected, "Tab6 is not multiselected");
  ok(!tab6.pinned, "Tab6 is not pinned");
  is(gBrowser.multiSelectedTabsCount, 3, "Three multiselected tabs");
  is(gBrowser.selectedTab, tab1, "Tab1 is the active tab");

  let closingTabs = [tab1, tab2];
  let tabClosingPromises = [];
  for (let tab of closingTabs) {
    tabClosingPromises.push(BrowserTestUtils.waitForTabClosing(tab));
  }

  await BrowserTestUtils.switchTab(
    gBrowser,
    gBrowser.removeDuplicateTabs(tab3)
  );

  await Promise.all(tabClosingPromises);

  ok(!initialTab.closing, "InitialTab is not closing");
  ok(tab1.closing, "Tab1 is closing");
  ok(tab2.closing, "Tab2 is closing");
  ok(!tab3.closing, "Tab3 is not closing");
  ok(!tab4.closing, "Tab4 is not closing");
  ok(!tab5.closing, "Tab5 is not closing");
  ok(!tab6.closing, "Tab6 is not closing");
  is(
    gBrowser.multiSelectedTabsCount,
    0,
    "Zero multiselected tabs, selection is cleared"
  );
  is(gBrowser.selectedTab, tab3, "tab3 is the active tab now");

  for (let tab of [tab3, tab4, tab5, tab6]) {
    BrowserTestUtils.removeTab(tab);
  }
});

add_task(async function closeAllDuplicateTabs() {
  let initialTab = gBrowser.selectedTab;
  let tab1 = await addTab("http://mochi.test:8888/one");
  let tab2 = await addTab("http://mochi.test:8888/two", { userContextId: 1 });
  let tab3 = await addTab("http://mochi.test:8888/one");
  let tab4 = await addTab("http://mochi.test:8888/two");
  let tab5 = await addTab("http://mochi.test:8888/one");
  let tab6 = await addTab("http://mochi.test:8888/two");

  let tab1Pinned = BrowserTestUtils.waitForEvent(tab1, "TabPinned");
  gBrowser.pinTab(tab1);
  await tab1Pinned;

  // So we have 1p,2c,1,2,1,2
  // We expect 1p,2c,X,2,X,X because the pinned 1 will dupe the other two 1,
  // but the 2c's userContextId makes it unique against the other two 2,
  // but one of the other two 2 will close.

  // Ensure tab4 remains by making it active more recently than tab6.
  tab4._lastSeenActive = Date.now(); // as recent as it gets.

  // Assert some preconditions:
  ok(tab1.pinned, "Tab1 is pinned");
  Assert.greater(tab4.lastSeenActive, tab6.lastSeenActive);

  let closingTabs = [tab3, tab5, tab6];
  let tabClosingPromises = [];
  for (let tab of closingTabs) {
    tabClosingPromises.push(BrowserTestUtils.waitForTabClosing(tab));
  }

  await BrowserTestUtils.switchTab(
    gBrowser,
    gBrowser.removeAllDuplicateTabs(initialTab)
  );

  await Promise.all(tabClosingPromises);

  ok(!initialTab.closing, "InitialTab is not closing");
  ok(!tab1.closing, "Tab1 is not closing");
  ok(!tab2.closing, "Tab2 is not closing");
  ok(tab3.closing, "Tab3 is closing");
  ok(!tab4.closing, "Tab4 is not closing");
  ok(tab5.closing, "Tab5 is closing");
  ok(tab6.closing, "Tab6 is closing");

  for (let tab of [tab1, tab2, tab4]) {
    BrowserTestUtils.removeTab(tab);
  }
});