summaryrefslogtreecommitdiffstats
path: root/comm/mail/components/im/test/TestProtocol.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/components/im/test/TestProtocol.sys.mjs')
-rw-r--r--comm/mail/components/im/test/TestProtocol.sys.mjs308
1 files changed, 308 insertions, 0 deletions
diff --git a/comm/mail/components/im/test/TestProtocol.sys.mjs b/comm/mail/components/im/test/TestProtocol.sys.mjs
new file mode 100644
index 0000000000..7fddbf176b
--- /dev/null
+++ b/comm/mail/components/im/test/TestProtocol.sys.mjs
@@ -0,0 +1,308 @@
+/* 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/. */
+
+import {
+ GenericAccountPrototype,
+ GenericConvChatPrototype,
+ GenericConvIMPrototype,
+ GenericConversationPrototype,
+ GenericProtocolPrototype,
+ GenericConvChatBuddyPrototype,
+ GenericMessagePrototype,
+ TooltipInfo,
+} from "resource:///modules/jsProtoHelper.sys.mjs";
+
+import { nsSimpleEnumerator } from "resource:///modules/imXPCOMUtils.sys.mjs";
+
+function Message(who, text, properties, conversation) {
+ this._init(who, text, properties, conversation);
+ this.displayed = new Promise(resolve => {
+ this._onDisplayed = resolve;
+ });
+ this.read = new Promise(resolve => {
+ this._onRead = resolve;
+ });
+ this.actionRan = new Promise(resolve => {
+ this._onAction = resolve;
+ });
+}
+
+Message.prototype = {
+ __proto__: GenericMessagePrototype,
+
+ whenDisplayed() {
+ this._onDisplayed();
+ },
+
+ whenRead() {
+ this._onRead();
+ },
+
+ getActions() {
+ return [
+ {
+ QueryInterface: ChromeUtils.generateQI(["prplIMessageAction"]),
+ label: "Test",
+ run: () => {
+ this._onAction();
+ },
+ },
+ ];
+ },
+};
+
+/**
+ *
+ * @param {string} who - Nick of the participant.
+ * @param {string} [alias] - Display name of the participant.
+ */
+function Participant(who, alias) {
+ this._name = who;
+ if (alias) {
+ this.alias = alias;
+ }
+}
+Participant.prototype = {
+ __proto__: GenericConvChatBuddyPrototype,
+};
+
+const SharedConversationPrototype = {
+ _disconnected: false,
+ /**
+ * Disconnect the conversation.
+ */
+ _setDisconnected() {
+ this._disconnected = true;
+ },
+ /**
+ * Close the conversation, including in the UI.
+ */
+ close() {
+ this._disconnected = true;
+ this._account._conversations.delete(this);
+ GenericConversationPrototype.close.call(this);
+ },
+ /**
+ * Send an outgoing message.
+ *
+ * @param {string} aMsg - Message to send.
+ * @returns
+ */
+ dispatchMessage(aMsg, aAction = false, aNotice = false) {
+ if (this._disconnected) {
+ return;
+ }
+ this.writeMessage("You", aMsg, { outgoing: true, notification: aNotice });
+ },
+
+ /**
+ *
+ * @param {Array<object>} messages - Array of messages to add to the
+ * conversation. Expects an object with a |who|, |content| and |options|
+ * properties, corresponding to the three params of |writeMessage|.
+ */
+ addMessages(messages) {
+ for (const message of messages) {
+ this.writeMessage(message.who, message.content, message.options);
+ }
+ },
+
+ /**
+ * Add a notice to the conversation.
+ */
+ addNotice() {
+ this.writeMessage("system", "test notice", { system: true });
+ },
+
+ createMessage(who, text, options) {
+ const message = new Message(who, text, options, this);
+ return message;
+ },
+};
+
+/**
+ *
+ * @param {prplIAccount} account
+ * @param {string} name - Name of the conversation.
+ */
+function MUC(account, name) {
+ this._init(account, name, "You");
+}
+MUC.prototype = {
+ __proto__: GenericConvChatPrototype,
+
+ /**
+ *
+ * @param {string} who - Nick of the user to add.
+ * @param {string} alias - Display name of the participant.
+ * @returns
+ */
+ addParticipant(who, alias) {
+ if (this._participants.has(who)) {
+ return;
+ }
+ const participant = new Participant(who, alias);
+ this._participants.set(who, participant);
+ },
+ ...SharedConversationPrototype,
+};
+
+/**
+ *
+ * @param {prplIAccount} account
+ * @param {string} name - Name of the conversation.
+ */
+function DM(account, name) {
+ this._init(account, name);
+}
+DM.prototype = {
+ __proto__: GenericConvIMPrototype,
+ ...SharedConversationPrototype,
+};
+
+function Account(aProtoInstance, aImAccount) {
+ this._init(aProtoInstance, aImAccount);
+ this._conversations = new Set();
+}
+Account.prototype = {
+ __proto__: GenericAccountPrototype,
+
+ /**
+ * @type {Set<GenericConversationPrototype>}
+ */
+ _conversations: null,
+
+ /**
+ *
+ * @param {string} name - Name of the conversation.
+ * @returns {MUC}
+ */
+ makeMUC(name) {
+ const conversation = new MUC(this, name);
+ this._conversations.add(conversation);
+ return conversation;
+ },
+
+ /**
+ *
+ * @param {string} name - Name of the conversation.
+ * @returns {DM}
+ */
+ makeDM(name) {
+ const conversation = new DM(this, name);
+ this._conversations.add(conversation);
+ return conversation;
+ },
+
+ connect() {
+ this.reportConnecting();
+ // do something here
+ this.reportConnected();
+ },
+ disconnect() {
+ this.reportDisconnecting(Ci.prplIAccount.NO_ERROR, "");
+ this.reportDisconnected();
+ },
+
+ requestBuddyInfo(who) {
+ const participant = Array.from(this._conversations)
+ .find(conv => conv.isChat && conv._participants.has(who))
+ ?._participants.get(who);
+ if (participant) {
+ const tooltipInfo = [new TooltipInfo("Display Name", participant.alias)];
+ Services.obs.notifyObservers(
+ new nsSimpleEnumerator(tooltipInfo),
+ "user-info-received",
+ who
+ );
+ }
+ },
+
+ get canJoinChat() {
+ return true;
+ },
+ chatRoomFields: {
+ channel: { label: "_Channel Field", required: true },
+ channelDefault: { label: "_Field with default", default: "Default Value" },
+ password: {
+ label: "_Password Field",
+ default: "",
+ isPassword: true,
+ required: false,
+ },
+ sampleIntField: {
+ label: "_Int Field",
+ default: 4,
+ min: 0,
+ max: 10,
+ required: true,
+ },
+ },
+
+ // Nothing to do.
+ unInit() {
+ for (const conversation of this._conversations) {
+ conversation.close();
+ }
+ },
+ remove() {},
+};
+
+export function TestProtocol() {}
+TestProtocol.prototype = {
+ __proto__: GenericProtocolPrototype,
+ get id() {
+ return "prpl-mochitest";
+ },
+ get normalizedName() {
+ return "mochitest";
+ },
+ get name() {
+ return "Mochitest";
+ },
+ options: {
+ text: { label: "Text option", default: "foo" },
+ bool: { label: "Boolean option", default: true },
+ int: { label: "Integer option", default: 42 },
+ list: {
+ label: "Select option",
+ default: "option2",
+ listValues: {
+ option1: "First option",
+ option2: "Default option",
+ option3: "Other option",
+ },
+ },
+ },
+ usernameSplits: [
+ {
+ label: "Server",
+ separator: "@",
+ defaultValue: "default.server",
+ reverse: true,
+ },
+ ],
+ getAccount(aImAccount) {
+ return new Account(this, aImAccount);
+ },
+ classID: Components.ID("{a4617631-b8b8-4053-8afa-5c4c43498280}"),
+};
+
+export function registerTestProtocol() {
+ Services.catMan.addCategoryEntry(
+ "im-protocol-plugin",
+ TestProtocol.prototype.id,
+ "@mozilla.org/chat/mochitest;1",
+ false,
+ true
+ );
+}
+
+export function unregisterTestProtocol() {
+ Services.catMan.deleteCategoryEntry(
+ "im-protocol-plugin",
+ TestProtocol.prototype.id,
+ true
+ );
+}