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
|
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
import { BrowserTestUtils } from "resource://testing-common/BrowserTestUtils.sys.mjs";
import { Assert } from "resource://testing-common/Assert.sys.mjs";
import { TestUtils } from "resource://testing-common/TestUtils.sys.mjs";
function assertFirefoxViewTab(win) {
Assert.ok(win.FirefoxViewHandler.tab, "Firefox View tab exists");
Assert.ok(win.FirefoxViewHandler.tab?.hidden, "Firefox View tab is hidden");
Assert.equal(
win.gBrowser.visibleTabs.indexOf(win.FirefoxViewHandler.tab),
-1,
"Firefox View tab is not in the list of visible tabs"
);
}
async function assertFirefoxViewTabSelected(win) {
assertFirefoxViewTab(win);
Assert.ok(
win.FirefoxViewHandler.tab.selected,
"Firefox View tab is selected"
);
await BrowserTestUtils.browserLoaded(
win.FirefoxViewHandler.tab.linkedBrowser
);
}
async function openFirefoxViewTab(win) {
await BrowserTestUtils.synthesizeMouseAtCenter(
"#firefox-view-button",
{ type: "mousedown" },
win.browsingContext
);
assertFirefoxViewTab(win);
Assert.ok(
win.FirefoxViewHandler.tab.selected,
"Firefox View tab is selected"
);
await BrowserTestUtils.browserLoaded(
win.FirefoxViewHandler.tab.linkedBrowser
);
return win.FirefoxViewHandler.tab;
}
function closeFirefoxViewTab(win) {
win.gBrowser.removeTab(win.FirefoxViewHandler.tab);
Assert.ok(
!win.FirefoxViewHandler.tab,
"Reference to Firefox View tab got removed when closing the tab"
);
}
/**
* Run a task with Firefox View open.
*
* @param {Object} options
* Options object.
* @param {boolean} [options.openNewWindow]
* Whether to run the task in a new window. If false, the current window will
* be used.
* @param {boolean} [options.resetFlowManager]
* Whether to reset the internal state of TabsSetupFlowManager before running
* the task.
* @param {function(MozBrowser)} taskFn
* The task to run. It can be asynchronous.
* @returns {any}
* The value returned by the task.
*/
async function withFirefoxView(
{ openNewWindow = false, resetFlowManager = true },
taskFn
) {
const win = openNewWindow
? await BrowserTestUtils.openNewBrowserWindow()
: Services.wm.getMostRecentBrowserWindow();
if (resetFlowManager) {
const { TabsSetupFlowManager } = ChromeUtils.importESModule(
"resource:///modules/firefox-view-tabs-setup-manager.sys.mjs"
);
// reset internal state so we aren't reacting to whatever state the last invocation left behind
TabsSetupFlowManager.resetInternalState();
}
// Setting this pref allows the test to run as expected with a keyboard on MacOS
await win.SpecialPowers.pushPrefEnv({
set: [["accessibility.tabfocus", 7]],
});
let tab = await openFirefoxViewTab(win);
let originalWindow = tab.ownerGlobal;
let result = await taskFn(tab.linkedBrowser);
let finalWindow = tab.ownerGlobal;
if (originalWindow == finalWindow && !tab.closing && tab.linkedBrowser) {
// taskFn may resolve within a tick after opening a new tab.
// We shouldn't remove the newly opened tab in the same tick.
// Wait for the next tick here.
await TestUtils.waitForTick();
BrowserTestUtils.removeTab(tab);
} else {
Services.console.logStringMessage(
"withFirefoxView: Tab was already closed before " +
"removeTab would have been called"
);
}
await win.SpecialPowers.popPrefEnv();
if (openNewWindow) {
await BrowserTestUtils.closeWindow(win);
}
return result;
}
function isFirefoxViewTabSelectedInWindow(win) {
return win.gBrowser.selectedBrowser.currentURI.spec == "about:firefoxview";
}
export {
withFirefoxView,
assertFirefoxViewTab,
assertFirefoxViewTabSelected,
openFirefoxViewTab,
closeFirefoxViewTab,
isFirefoxViewTabSelectedInWindow,
};
|