forked from mirrors/gecko-dev
152 lines
4.4 KiB
JavaScript
152 lines
4.4 KiB
JavaScript
/**
|
|
* Global variables for testing.
|
|
*/
|
|
const gEMPTY_PAGE_URL = GetTestWebBasedURL("file_empty.html");
|
|
|
|
/**
|
|
* Return a web-based URL for a given file based on the testing directory.
|
|
* @param {String} fileName
|
|
* file that caller wants its web-based url
|
|
* @param {Boolean} cors [optional]
|
|
* if set, then return a url with different origin
|
|
*/
|
|
function GetTestWebBasedURL(fileName, cors = false) {
|
|
const origin = cors ? "http://example.org" : "http://example.com";
|
|
return (
|
|
getRootDirectory(gTestPath).replace("chrome://mochitests/content", origin) +
|
|
fileName
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Wait until tab sound indicator appears on the given tab.
|
|
* @param {tabbrowser} tab
|
|
* given tab where tab sound indicator should appear
|
|
*/
|
|
async function waitForTabSoundIndicatorAppears(tab) {
|
|
if (!tab.soundPlaying) {
|
|
info("Tab sound indicator doesn't appear yet");
|
|
await BrowserTestUtils.waitForEvent(
|
|
tab,
|
|
"TabAttrModified",
|
|
false,
|
|
event => {
|
|
return event.detail.changed.includes("soundplaying");
|
|
}
|
|
);
|
|
}
|
|
ok(tab.soundPlaying, "Tab sound indicator appears");
|
|
}
|
|
|
|
/**
|
|
* Wait until tab sound indicator disappears on the given tab.
|
|
* @param {tabbrowser} tab
|
|
* given tab where tab sound indicator should disappear
|
|
*/
|
|
async function waitForTabSoundIndicatorDisappears(tab) {
|
|
if (tab.soundPlaying) {
|
|
info("Tab sound indicator doesn't disappear yet");
|
|
await BrowserTestUtils.waitForEvent(
|
|
tab,
|
|
"TabAttrModified",
|
|
false,
|
|
event => {
|
|
return event.detail.changed.includes("soundplaying");
|
|
}
|
|
);
|
|
}
|
|
ok(!tab.soundPlaying, "Tab sound indicator disappears");
|
|
}
|
|
|
|
/**
|
|
* Return a new foreground tab loading with an empty file.
|
|
* @param {boolean} needObserver
|
|
* If true, sets an observer property on the returned tab. This property
|
|
* exposes `hasEverUpdated()` which will return a bool indicating if the
|
|
* sound indicator has ever updated.
|
|
*/
|
|
async function createBlankForegroundTab({ needObserver } = {}) {
|
|
const tab = await BrowserTestUtils.openNewForegroundTab(
|
|
gBrowser,
|
|
gEMPTY_PAGE_URL
|
|
);
|
|
if (needObserver) {
|
|
tab.observer = createSoundIndicatorObserver(tab);
|
|
}
|
|
return tab;
|
|
}
|
|
|
|
function createSoundIndicatorObserver(tab) {
|
|
let hasEverUpdated = false;
|
|
let listener = event => {
|
|
if (event.detail.changed.includes("soundplaying")) {
|
|
hasEverUpdated = true;
|
|
}
|
|
};
|
|
tab.addEventListener("TabAttrModified", listener);
|
|
return {
|
|
hasEverUpdated: () => {
|
|
tab.removeEventListener("TabAttrModified", listener);
|
|
return hasEverUpdated;
|
|
},
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Sythesize mouse hover on the given icon, which would sythesize `mouseover`
|
|
* and `mousemove` event on that. Return a promise that will be resolved when
|
|
* the tooptip element shows.
|
|
* @param {tab icon} icon
|
|
* the icon on which we want to mouse hover
|
|
* @param {tooltip element} tooltip
|
|
* the tab tooltip elementss
|
|
*/
|
|
function hoverIcon(icon, tooltip) {
|
|
disableNonTestMouse(true);
|
|
|
|
let popupShownPromise = BrowserTestUtils.waitForEvent(tooltip, "popupshown");
|
|
EventUtils.synthesizeMouse(icon, 1, 1, { type: "mouseover" });
|
|
EventUtils.synthesizeMouse(icon, 2, 2, { type: "mousemove" });
|
|
EventUtils.synthesizeMouse(icon, 3, 3, { type: "mousemove" });
|
|
EventUtils.synthesizeMouse(icon, 4, 4, { type: "mousemove" });
|
|
return popupShownPromise;
|
|
}
|
|
|
|
/**
|
|
* Leave mouse from the given icon, which would sythesize `mouseout`
|
|
* and `mousemove` event on that.
|
|
* @param {tab icon} icon
|
|
* the icon on which we want to mouse hover
|
|
* @param {tooltip element} tooltip
|
|
* the tab tooltip elementss
|
|
*/
|
|
function leaveIcon(icon) {
|
|
EventUtils.synthesizeMouse(icon, 0, 0, { type: "mouseout" });
|
|
EventUtils.synthesizeMouseAtCenter(document.documentElement, {
|
|
type: "mousemove",
|
|
});
|
|
EventUtils.synthesizeMouseAtCenter(document.documentElement, {
|
|
type: "mousemove",
|
|
});
|
|
EventUtils.synthesizeMouseAtCenter(document.documentElement, {
|
|
type: "mousemove",
|
|
});
|
|
|
|
disableNonTestMouse(false);
|
|
}
|
|
|
|
/**
|
|
* Sythesize mouse click on the given icon.
|
|
* @param {tab icon} icon
|
|
* the icon on which we want to mouse hover
|
|
*/
|
|
async function clickIcon(icon) {
|
|
await hoverIcon(icon, document.getElementById("tabbrowser-tab-tooltip"));
|
|
EventUtils.synthesizeMouseAtCenter(icon, { button: 0 });
|
|
leaveIcon(icon);
|
|
}
|
|
|
|
function disableNonTestMouse(disable) {
|
|
let utils = window.windowUtils;
|
|
utils.disableNonTestMouseEvents(disable);
|
|
}
|