mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-11 05:39:41 +02:00
130 lines
3.8 KiB
JavaScript
130 lines
3.8 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
// Utility functions for Chat tests.
|
|
|
|
var Chat = Cu.import("resource:///modules/Chat.jsm", {}).Chat;
|
|
const kDefaultButtonSet = new Set(["minimize", "swap", "close"]);
|
|
|
|
function promiseOpenChat(url, mode, focus, buttonSet = null) {
|
|
let uri = Services.io.newURI(url, null, null);
|
|
let origin = uri.prePath;
|
|
let title = origin;
|
|
return new Promise(resolve => {
|
|
// we just through a few hoops to ensure the content document is fully
|
|
// loaded, otherwise tests that rely on that content may intermittently fail.
|
|
let callback = function(chatbox) {
|
|
let mm = chatbox.content.messageManager;
|
|
mm.sendAsyncMessage("WaitForDOMContentLoaded");
|
|
mm.addMessageListener("DOMContentLoaded", function cb() {
|
|
mm.removeMessageListener("DOMContentLoaded", cb);
|
|
resolve(chatbox);
|
|
});
|
|
}
|
|
let chatbox = Chat.open(null, {
|
|
origin: origin,
|
|
title: title,
|
|
url: url,
|
|
mode: mode,
|
|
focus: focus
|
|
}, callback);
|
|
if (buttonSet) {
|
|
chatbox.setAttribute("buttonSet", buttonSet);
|
|
}
|
|
});
|
|
}
|
|
|
|
// Opens a chat, returns a promise resolved when the chat callback fired.
|
|
function promiseOpenChatCallback(url, mode) {
|
|
let uri = Services.io.newURI(url, null, null);
|
|
let origin = uri.prePath;
|
|
let title = origin;
|
|
return new Promise(resolve => {
|
|
Chat.open(null, { origin, title, url, mode }, resolve);
|
|
});
|
|
}
|
|
|
|
// Opens a chat, returns the chat window's promise which fires when the chat
|
|
// starts loading.
|
|
function promiseOneEvent(target, eventName, capture) {
|
|
return new Promise(resolve => {
|
|
target.addEventListener(eventName, function handler(event) {
|
|
target.removeEventListener(eventName, handler, capture);
|
|
resolve();
|
|
}, capture);
|
|
});
|
|
}
|
|
|
|
function promiseOneMessage(target, messageName) {
|
|
return new Promise(resolve => {
|
|
let mm = target.messageManager;
|
|
mm.addMessageListener(messageName, function handler() {
|
|
mm.removeMessageListener(messageName, handler);
|
|
resolve();
|
|
});
|
|
});
|
|
}
|
|
|
|
// Return the number of chats in a browser window.
|
|
function numChatsInWindow(win) {
|
|
let chatbar = win.document.getElementById("pinnedchats");
|
|
return chatbar.childElementCount;
|
|
}
|
|
|
|
function promiseWaitForFocus() {
|
|
return new Promise(resolve => waitForFocus(resolve));
|
|
}
|
|
|
|
// A simple way to clean up after each test.
|
|
function add_chat_task(genFunction) {
|
|
add_task(function* () {
|
|
info("Starting chat test " + genFunction.name);
|
|
try {
|
|
yield genFunction();
|
|
} finally {
|
|
info("Finished chat test " + genFunction.name + " - cleaning up.");
|
|
// close all docked chats.
|
|
while (chatbar.childNodes.length) {
|
|
chatbar.childNodes[0].close();
|
|
}
|
|
// and non-docked chats.
|
|
let winEnum = Services.wm.getEnumerator("Social:Chat");
|
|
while (winEnum.hasMoreElements()) {
|
|
let win = winEnum.getNext();
|
|
if (win.closed) {
|
|
continue;
|
|
}
|
|
win.close();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function waitForCondition(condition, nextTest, errorMsg) {
|
|
var tries = 0;
|
|
var interval = setInterval(function() {
|
|
if (tries >= 100) {
|
|
ok(false, errorMsg);
|
|
moveOn();
|
|
}
|
|
var conditionPassed;
|
|
try {
|
|
conditionPassed = condition();
|
|
} catch (e) {
|
|
ok(false, e + "\n" + e.stack);
|
|
conditionPassed = false;
|
|
}
|
|
if (conditionPassed) {
|
|
moveOn();
|
|
}
|
|
tries++;
|
|
}, 100);
|
|
var moveOn = function() { clearInterval(interval); nextTest(); };
|
|
}
|
|
|
|
function promiseWaitForCondition(aConditionFn) {
|
|
return new Promise((resolve, reject) => {
|
|
waitForCondition(aConditionFn, resolve, "Condition didn't pass.");
|
|
});
|
|
}
|