forked from mirrors/gecko-dev
165 lines
6.7 KiB
JavaScript
165 lines
6.7 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/. */
|
|
|
|
Components.utils.import("resource://gre/modules/Promise.jsm", this);
|
|
|
|
let chatbar = document.getElementById("pinnedchats");
|
|
|
|
function waitForCondition(condition, errorMsg) {
|
|
let deferred = Promise.defer();
|
|
var tries = 0;
|
|
var interval = setInterval(function() {
|
|
if (tries >= 30) {
|
|
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); deferred.resolve(); };
|
|
return deferred.promise;
|
|
}
|
|
|
|
add_chat_task(function* testOpenCloseChat() {
|
|
let chatbox = yield promiseOpenChat("http://example.com");
|
|
Assert.strictEqual(chatbox, chatbar.selectedChat);
|
|
// we requested a "normal" chat, so shouldn't be minimized
|
|
Assert.ok(!chatbox.minimized, "chat is not minimized");
|
|
Assert.equal(chatbar.childNodes.length, 1, "should be 1 chat open");
|
|
|
|
|
|
// now request the same URL again - we should get the same chat.
|
|
let chatbox2 = yield promiseOpenChat("http://example.com");
|
|
Assert.strictEqual(chatbox2, chatbox, "got the same chat");
|
|
Assert.equal(numChatsInWindow(window), 1, "should be 1 chat open");
|
|
|
|
chatbox.toggle();
|
|
is(chatbox.minimized, true, "chat is now minimized");
|
|
// was no other chat to select, so selected becomes null.
|
|
is(chatbar.selectedChat, null);
|
|
|
|
// We check the content gets an unload event as we close it.
|
|
let promiseClosed = promiseOneEvent(chatbox.content, "unload", true);
|
|
chatbox.close();
|
|
yield promiseClosed;
|
|
});
|
|
|
|
// In this case we open a chat minimized, then request the same chat again
|
|
// without specifying minimized. On that second call the chat should open,
|
|
// selected, and no longer minimized.
|
|
add_chat_task(function* testMinimized() {
|
|
let chatbox = yield promiseOpenChat("http://example.com", "minimized");
|
|
Assert.strictEqual(chatbox, chatbar.selectedChat);
|
|
Assert.ok(chatbox.minimized, "chat is minimized");
|
|
Assert.equal(numChatsInWindow(window), 1, "should be 1 chat open");
|
|
yield promiseOpenChat("http://example.com");
|
|
Assert.ok(!chatbox.minimized, false, "chat is no longer minimized");
|
|
});
|
|
|
|
// open enough chats to overflow the window, then check
|
|
// if the menupopup is visible
|
|
add_chat_task(function* testManyChats() {
|
|
Assert.ok(chatbar.menupopup.parentNode.collapsed, "popup nub collapsed at start");
|
|
// we should *never* find a test box that needs more than this to cause
|
|
// an overflow!
|
|
let maxToOpen = 20;
|
|
let numOpened = 0;
|
|
for (let i = 0; i < maxToOpen; i++) {
|
|
yield promiseOpenChat("http://example.com#" + i);
|
|
if (!chatbar.menupopup.parentNode.collapsed) {
|
|
info("the menu popup appeared");
|
|
return;
|
|
}
|
|
}
|
|
Assert.ok(false, "We didn't find a collapsed chat after " + maxToOpen + "chats!");
|
|
});
|
|
|
|
// Check that closeAll works as expected.
|
|
add_chat_task(function* testOpenTwiceCallbacks() {
|
|
yield promiseOpenChat("http://example.com#1");
|
|
yield promiseOpenChat("http://example.com#2");
|
|
yield promiseOpenChat("http://test2.example.com");
|
|
Assert.equal(numChatsInWindow(window), 3, "should be 3 chats open");
|
|
Chat.closeAll("http://example.com");
|
|
Assert.equal(numChatsInWindow(window), 1, "should have closed 2 chats");
|
|
Chat.closeAll("http://test2.example.com");
|
|
Assert.equal(numChatsInWindow(window), 0, "should have closed last chat");
|
|
});
|
|
|
|
// Check that when we open the same chat twice, the callbacks are called back
|
|
// twice.
|
|
add_chat_task(function* testOpenTwiceCallbacks() {
|
|
yield promiseOpenChatCallback("http://example.com");
|
|
yield promiseOpenChatCallback("http://example.com");
|
|
});
|
|
|
|
// Bug 817782 - check chats work in new top-level windows.
|
|
add_chat_task(function* testSecondTopLevelWindow() {
|
|
const chatUrl = "http://example.com";
|
|
let secondWindow = OpenBrowserWindow();
|
|
yield promiseOneEvent(secondWindow, "load");
|
|
yield promiseOpenChat(chatUrl);
|
|
// the chat was created - let's make sure it was created in the second window.
|
|
Assert.equal(numChatsInWindow(window), 0, "main window has no chats");
|
|
Assert.equal(numChatsInWindow(secondWindow), 1, "second window has 1 chat");
|
|
secondWindow.close();
|
|
});
|
|
|
|
// Test that chats are created in the correct window.
|
|
add_chat_task(function* testChatWindowChooser() {
|
|
let chat = yield promiseOpenChat("http://example.com");
|
|
Assert.equal(numChatsInWindow(window), 1, "first window has the chat");
|
|
// create a second window - this will be the "most recent" and will
|
|
// therefore be the window that hosts the new chat (see bug 835111)
|
|
let secondWindow = OpenBrowserWindow();
|
|
yield promiseOneEvent(secondWindow, "load");
|
|
Assert.equal(secondWindow, Chat.findChromeWindowForChats(null), "Second window is the preferred chat window");
|
|
Assert.equal(numChatsInWindow(secondWindow), 0, "second window starts with no chats");
|
|
yield promiseOpenChat("http://example.com#2");
|
|
Assert.equal(numChatsInWindow(secondWindow), 1, "second window now has chats");
|
|
Assert.equal(numChatsInWindow(window), 1, "first window still has 1 chat");
|
|
chat.close();
|
|
|
|
// a bit heavy handed, but handy fixing bug 1090633
|
|
yield waitForCondition(function () !chat.parentNode, "chat has been detached");
|
|
Assert.equal(numChatsInWindow(window), 0, "first window now has no chats");
|
|
// now open another chat - it should still open in the second.
|
|
yield promiseOpenChat("http://example.com#3");
|
|
Assert.equal(numChatsInWindow(window), 0, "first window still has no chats");
|
|
Assert.equal(numChatsInWindow(secondWindow), 2, "second window has both chats");
|
|
|
|
// focus the first window, and open yet another chat - it
|
|
// should open in the first window.
|
|
window.focus();
|
|
yield promiseWaitForFocus();
|
|
chat = yield promiseOpenChat("http://example.com#4");
|
|
Assert.equal(numChatsInWindow(window), 1, "first window got new chat");
|
|
chat.close();
|
|
Assert.equal(numChatsInWindow(window), 0, "first window has no chats");
|
|
|
|
let privateWindow = OpenBrowserWindow({private: true});
|
|
yield promiseOneEvent(privateWindow, "load")
|
|
|
|
// open a last chat - the focused window can't accept
|
|
// chats (it's a private window), so the chat should open
|
|
// in the window that was selected before. This is known
|
|
// to be broken on Linux.
|
|
chat = yield promiseOpenChat("http://example.com#5");
|
|
let os = Services.appinfo.OS;
|
|
const BROKEN_WM_Z_ORDER = os != "WINNT" && os != "Darwin";
|
|
let fn = BROKEN_WM_Z_ORDER ? todo : ok;
|
|
fn(numChatsInWindow(window) == 1, "first window got the chat");
|
|
chat.close();
|
|
privateWindow.close();
|
|
secondWindow.close();
|
|
});
|