/* 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/. */
const {
initHTMLDocument,
insertHTMLForMessage,
getHTMLForMessage,
replaceHTMLForMessage,
wasNextMessage,
removeMessage,
isNextMessage,
} = ChromeUtils.importESModule("resource:///modules/imThemes.sys.mjs");
const { MockDocument } = ChromeUtils.importESModule(
"resource://testing-common/MockDocument.sys.mjs"
);
const BASIC_CONV_DOCUMENT_HTML =
'
';
add_task(function test_initHTMLDocument() {
const window = {};
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
""
);
Object.defineProperty(document, "defaultView", {
value: window,
});
const conversation = {
title: "test",
};
const theme = {
baseURI: "chrome://messenger-messagestyles/skin/test/",
variant: "default",
metadata: {},
html: {
footer: "",
script: 'console.log("hi");',
},
};
initHTMLDocument(conversation, theme, document);
equal(typeof document.defaultView.convertTimeUnits, "function");
equal(document.querySelector("base").href, theme.baseURI);
ok(
document.querySelector(
'link[rel="stylesheet"][href="chrome://chat/skin/conv.css"]'
)
);
ok(document.querySelector('link[rel="stylesheet"][href="main.css"]'));
equal(document.body.id, "ibcontent");
ok(document.getElementById("Chat"));
equal(document.querySelector("script").src, theme.baseURI + "inline.js");
});
add_task(function test_insertHTMLForMessage() {
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
BASIC_CONV_DOCUMENT_HTML
);
const html = 'foo bar
';
const message = {};
insertHTMLForMessage(message, html, document, false);
const messageElement = document.querySelector("#Chat > div");
strictEqual(messageElement._originalMsg, message);
equal(messageElement.style.backgroundColor, "blue");
equal(messageElement.textContent, "foo bar");
ok(!messageElement.dataset.isNext);
});
add_task(function test_insertHTMLForMessage_next() {
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
BASIC_CONV_DOCUMENT_HTML
);
const html = 'foo bar
';
const message = {};
insertHTMLForMessage(message, html, document, true);
const messageElement = document.querySelector("#Chat > div");
strictEqual(messageElement._originalMsg, message);
equal(messageElement.style.backgroundColor, "blue");
equal(messageElement.textContent, "foo bar");
ok(messageElement.dataset.isNext);
});
add_task(function test_getHTMLForMessage() {
const message = {
incoming: true,
system: false,
message: "foo bar",
who: "userId",
alias: "display name",
color: "#ffbbff",
};
const theme = {
html: {
incomingContent:
'%sender%%message%',
},
};
const html = getHTMLForMessage(message, theme, false, false);
equal(
html,
'display namefoo bar'
);
});
add_task(function test_replaceHTMLForMessage() {
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
BASIC_CONV_DOCUMENT_HTML
);
const html = 'foo bar
';
const message = {
remoteId: "foo",
};
insertHTMLForMessage(message, html, document, false);
const messageElement = document.querySelector("#Chat > div");
strictEqual(messageElement._originalMsg, message);
equal(messageElement.style.backgroundColor, "blue");
equal(messageElement.textContent, "foo bar");
equal(messageElement.dataset.remoteId, "foo");
ok(!messageElement.dataset.isNext);
const updatedHtml =
'lorem ipsum
';
const updatedMessage = {
remoteId: "foo",
};
replaceHTMLForMessage(updatedMessage, updatedHtml, document, true);
const updatedMessageElement = document.querySelector("#Chat > div");
strictEqual(updatedMessageElement._originalMsg, updatedMessage);
equal(updatedMessageElement.style.backgroundColor, "green");
equal(updatedMessageElement.textContent, "lorem ipsum");
equal(updatedMessageElement.dataset.remoteId, "foo");
ok(updatedMessageElement.dataset.isNext);
ok(
!document.querySelector("#insert"),
"Insert anchor in template is ignored when replacing"
);
});
add_task(function test_replaceHTMLForMessageWithoutExistingMessage() {
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
BASIC_CONV_DOCUMENT_HTML
);
const updatedHtml = 'lorem ipsum
';
const updatedMessage = {
remoteId: "foo",
};
replaceHTMLForMessage(updatedMessage, updatedHtml, document, false);
const updatedMessageElement = document.querySelector("#Chat > div");
ok(!updatedMessageElement);
});
add_task(function test_replaceHTMLForMessageWithoutRemoteId() {
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
BASIC_CONV_DOCUMENT_HTML
);
const html = 'foo bar
';
const message = {
remoteId: "foo",
};
insertHTMLForMessage(message, html, document, false);
const messageElement = document.querySelector("#Chat > div");
strictEqual(messageElement._originalMsg, message);
equal(messageElement.style.backgroundColor, "blue");
equal(messageElement.textContent, "foo bar");
equal(messageElement.dataset.remoteId, "foo");
ok(!messageElement.dataset.isNext);
const updatedHtml = 'lorem ipsum
';
const updatedMessage = {};
replaceHTMLForMessage(updatedMessage, updatedHtml, document, false);
const updatedMessageElement = document.querySelector("#Chat > div");
strictEqual(updatedMessageElement._originalMsg, message);
equal(updatedMessageElement.style.backgroundColor, "blue");
equal(updatedMessageElement.textContent, "foo bar");
equal(updatedMessageElement.dataset.remoteId, "foo");
ok(!updatedMessageElement.dataset.isNext);
});
add_task(function test_wasNextMessage_isNext() {
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
BASIC_CONV_DOCUMENT_HTML
);
const html = "foo bar
";
const message = {
remoteId: "foo",
};
insertHTMLForMessage(message, html, document, true);
ok(wasNextMessage(message, document));
});
add_task(function test_wasNextMessage_isNotNext() {
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
BASIC_CONV_DOCUMENT_HTML
);
const html = "foo bar
";
const message = {
remoteId: "foo",
};
insertHTMLForMessage(message, html, document, false);
ok(!wasNextMessage(message, document));
});
add_task(function test_wasNextMessage_noPreviousVersion() {
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
BASIC_CONV_DOCUMENT_HTML
);
const message = {
remoteId: "foo",
};
ok(!wasNextMessage(message, document));
});
add_task(function test_removeMessage() {
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
BASIC_CONV_DOCUMENT_HTML
);
const html = 'foo bar
';
const message = {
remoteId: "foo",
};
insertHTMLForMessage(message, html, document, false);
const messageElement = document.querySelector("#Chat > div");
strictEqual(messageElement._originalMsg, message);
equal(messageElement.style.backgroundColor, "blue");
equal(messageElement.textContent, "foo bar");
equal(messageElement.dataset.remoteId, "foo");
ok(!messageElement.dataset.isNext);
removeMessage("foo", document);
const messageElements = document.querySelectorAll("#Chat > div");
equal(messageElements.length, 0);
});
add_task(function test_removeMessage_noMatchingMessage() {
const document = MockDocument.createTestDocument(
"chrome://chat/content/conv.html",
BASIC_CONV_DOCUMENT_HTML
);
const html = 'foo bar
';
const message = {
remoteId: "foo",
};
insertHTMLForMessage(message, html, document, false);
const messageElement = document.querySelector("#Chat > div");
strictEqual(messageElement._originalMsg, message);
equal(messageElement.style.backgroundColor, "blue");
equal(messageElement.textContent, "foo bar");
equal(messageElement.dataset.remoteId, "foo");
ok(!messageElement.dataset.isNext);
removeMessage("bar", document);
const messageElements = document.querySelectorAll("#Chat > div");
notEqual(messageElements.length, 0);
});
add_task(function test_isNextMessage() {
const theme = {
combineConsecutive: true,
metadata: {},
combineConsecutiveInterval: 300,
};
const messagePairs = [
{
message: {},
previousMessage: null,
isNext: false,
},
{
message: {
system: true,
},
previousMessage: {
system: true,
},
isNext: true,
},
{
message: {
who: "foo",
},
previousMessage: {
who: "bar",
},
isNext: false,
},
{
message: {
outgoing: true,
},
isNext: false,
},
{
message: {
incoming: true,
},
isNext: false,
},
{
message: {
system: true,
},
isNext: false,
},
{
message: {
time: 100,
},
previousMessage: {
time: 100,
},
isNext: true,
},
{
message: {
time: 300,
},
previousMessage: {
time: 100,
},
isNext: true,
},
{
message: {
time: 500,
},
previousMessage: {
time: 100,
},
isNext: false,
},
];
for (const { message, previousMessage = {}, isNext } of messagePairs) {
equal(isNextMessage(theme, message, previousMessage), isNext);
}
});