tenfourfox/dom/plugins/test/mochitest/head.js
Cameron Kaiser c9b2922b70 hello FPR
2017-04-19 00:56:45 -07:00

135 lines
3.5 KiB
JavaScript

/**
* Waits for a tab switch.
*/
function waitTabSwitched() {
return new Promise(resolve => {
gBrowser.addEventListener("TabSwitchDone", function onSwitch() {
gBrowser.removeEventListener("TabSwitchDone", onSwitch);
executeSoon(resolve);
});
});
}
/**
* Waits a specified number of miliseconds.
*
* Usage:
* let wait = yield waitForMs(2000);
* ok(wait, "2 seconds should now have elapsed");
*
* @param aMs the number of miliseconds to wait for
* @returns a Promise that resolves to true after the time has elapsed
*/
function waitForMs(aMs) {
return new Promise((resolve) => {
setTimeout(done, aMs);
function done() {
resolve(true);
}
});
}
/**
* Platform string helper for nativeVerticalWheelEventMsg
*/
function getPlatform() {
if (navigator.platform.indexOf("Win") == 0) {
return "windows";
}
if (navigator.platform.indexOf("Mac") == 0) {
return "mac";
}
if (navigator.platform.indexOf("Linux") == 0) {
return "linux";
}
return "unknown";
}
/**
* Returns a native wheel scroll event id for dom window
* uitls sendNativeMouseScrollEvent.
*/
function nativeVerticalWheelEventMsg() {
switch (getPlatform()) {
case "windows": return 0x020A; // WM_MOUSEWHEEL
case "mac": return 0; // value is unused, can be anything
case "linux": return 4; // value is unused, pass GDK_SCROLL_SMOOTH anyway
}
throw "Native wheel events not supported on platform " + getPlatform();
}
/**
* Waits for the first dom "scroll" event.
*/
function waitScrollStart(aTarget) {
return new Promise((resolve, reject) => {
aTarget.addEventListener("scroll", function listener(event) {
aTarget.removeEventListener("scroll", listener, true);
resolve(event);
}, true);
});
}
/**
* Waits for the last dom "scroll" event which generally indicates
* a scroll operation is complete. To detect this the helper waits
* 1 second intervals checking for scroll events from aTarget. If
* a scroll event is not received during that time, it considers
* the scroll operation complete. Not super accurate, be careful.
*/
function waitScrollFinish(aTarget) {
return new Promise((resolve, reject) => {
let recent = false;
let count = 0;
function listener(event) {
recent = true;
}
aTarget.addEventListener("scroll", listener, true);
setInterval(function () {
// one second passed and we didn't receive a scroll event.
if (!recent) {
aTarget.removeEventListener("scroll", listener, true);
resolve();
return;
}
recent = false;
// ten seconds
if (count > 10) {
aTarget.removeEventListener("scroll", listener, true);
reject();
}
}, 1000);
});
}
/**
* Set a plugin activation state. See nsIPluginTag for
* supported states. Affected plugin default to the first
* test plugin.
*/
function setTestPluginEnabledState(aState, aPluginName) {
let name = aPluginName || "Test Plug-in";
let plugin = getTestPlugin(name);
plugin.enabledState = aState;
}
/**
* Returns the chrome side nsIPluginTag for this plugin, helper for
* setTestPluginEnabledState.
*/
function getTestPlugin(aName) {
let pluginName = aName || "Test Plug-in";
let ph = Components.classes["@mozilla.org/plugin/host;1"].getService(Components.interfaces.nsIPluginHost);
let tags = ph.getPluginTags();
// Find the test plugin
for (let i = 0; i < tags.length; i++) {
if (tags[i].name == pluginName)
return tags[i];
}
ok(false, "Unable to find plugin");
return null;
}