/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ var { MatrixMessageContent } = ChromeUtils.importESModule( "resource:///modules/matrixMessageContent.sys.mjs" ); const { XPCShellContentUtils } = ChromeUtils.importESModule( "resource://testing-common/XPCShellContentUtils.sys.mjs" ); var { getMatrixTextForEvent } = ChromeUtils.importESModule( "resource:///modules/matrixTextForEvent.sys.mjs" ); var { l10nHelper } = ChromeUtils.importESModule( "resource:///modules/imXPCOMUtils.sys.mjs" ); var _ = l10nHelper("chrome://chat/locale/matrix.properties"); // Required to make it so the DOMParser can handle images and such. XPCShellContentUtils.init(this); const PLAIN_FIXTURES = [ { description: "Normal text message plain quote", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: `> lorem ipsum > dolor sit amet dolor sit amet`, ["m.relates_to"]: { "m.in_reply_to": { event_id: "!event:example.com", }, }, }, sender: "@bar:example.com", }, getEventResult: { id: "!event:example.com", type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: "lorem ipsum!", }, sender: "@foo:example.com", }, result: `@foo:example.com: > lorem ipsum! dolor sit amet`, }, { description: "Normal text message plain quote with missing quote message", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: `> lorem ipsum dolor sit amet`, ["m.relates_to"]: { "m.in_reply_to": { event_id: "!event:example.com", }, }, }, sender: "@bar:example.com", }, result: `> lorem ipsum dolor sit amet`, }, { description: "Emote message plain quote", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: `> lorem ipsum dolor sit amet`, ["m.relates_to"]: { "m.in_reply_to": { event_id: "!event:example.com", }, }, }, sender: "@bar:example.com", }, getEventResult: { id: "!event:example.com", type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Emote, body: "lorem ipsum", }, sender: "@foo:example.com", }, result: `> * @foo:example.com lorem ipsum * dolor sit amet`, }, { description: "Reply is emote", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Emote, body: `> lorem ipsum dolor sit amet`, ["m.relates_to"]: { "m.in_reply_to": { event_id: "!event:example.com", }, }, }, sender: "@bar:example.com", }, getEventResult: { id: "!event:example.com", type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: "lorem ipsum", }, sender: "@foo:example.com", }, result: "\ndolor sit amet", }, { description: "Attachment", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.File, body: "example.png", url: "mxc://example.com/asdf", }, sender: "@bar:example.com", }, result: "https://example.com/_matrix/media/r0/download/example.com/asdf", }, { description: "Sticker", event: { type: MatrixSDK.EventType.Sticker, content: { body: "example.png", url: "mxc://example.com/asdf", }, sender: "@bar:example.com", }, result: "https://example.com/_matrix/media/r0/download/example.com/asdf", }, { description: "Normal body with HTML-y contents", event: { type: MatrixSDK.EventType.Text, content: { body: "", }, sender: "@bar:example.com", }, result: "<foo>", }, { description: "Non-mxc attachment", event: { type: MatrixSDK.EventType.RoomMessage, content: { body: "hello.jpg", msgtype: MatrixSDK.MsgType.Image, url: "https://example.com/hello.jpg", }, sender: "@bar:example.com", }, result: "hello.jpg", }, { description: "Key verification request", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.KeyVerificationRequest, }, sender: "@bar:example.com", }, isGetTextForEvent: true, }, { description: "Decryption failure", event: { type: MatrixSDK.EventType.RoomMessageEncrypted, content: { msgtype: "m.bad.encrypted", }, }, isGetTextForEvent: true, }, { description: "Being decrypted", event: { type: MatrixSDK.EventType.RoomMessageEncrypted, decrypting: true, }, result: _("message.decrypting"), }, { description: "Unsent event", event: { type: MatrixSDK.EventType.RoomMessage, content: { body: "foo", msgtype: MatrixSDK.MsgType.Text, }, sender: "@bar:example.com", status: MatrixSDK.EventStatus.NOT_SENT, }, result: "", }, { description: "Redacted event", event: { type: MatrixSDK.EventType.RoomMessage, content: {}, sender: "@bar:example.com", redacted: true, }, result: _("message.redacted"), }, { description: "Tombstone", event: { type: MatrixSDK.EventType.RoomTombstone, content: { body: "tombstone", }, sender: "@bar:example.com", }, result: "tombstone", }, { description: "Encryption start", event: { type: MatrixSDK.EventType.RoomEncryption, content: {}, sender: "@bar:example.com", }, isGetTextForEvent: true, }, { description: "Reaction", event: { type: MatrixSDK.EventType.Reaction, content: { ["m.relates_to"]: { rel_type: MatrixSDK.RelationType.Annotation, event_id: "!event:example.com", key: "🐦", }, }, sender: "@bar:example.com", }, getEventResult: { id: "!event:example.com", type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: "lorem ipsum!", }, sender: "@foo:example.com", }, result: _("message.reaction", "@bar:example.com", "@foo:example.com", "🐦"), }, ]; const HTML_FIXTURES = [ { description: "Normal text message plain quote", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: `> lorem ipsum > dolor sit amet dolor sit amet`, format: "org.matrix.custom.html", formatted_body: ` Foo wrote:
lorem ipsum

dolor sit amet

`, ["m.relates_to"]: { "m.in_reply_to": { event_id: "!event:example.com", }, }, }, sender: "@bar:example.com", }, getEventResult: { id: "!event:example.com", type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: "lorem ipsum!", }, sender: "@foo:example.com", }, result: `@foo:example.com:
lorem ipsum!
\n

dolor sit amet

`, }, { description: "Normal text message with missing quote message", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: `> lorem ipsum > dolor sit amet dolor sit amet`, format: "org.matrix.custom.html", formatted_body: ` Foo wrote:
lorem ipsum

dolor sit amet

`, ["m.relates_to"]: { "m.in_reply_to": { event_id: "!event:example.com", }, }, }, sender: "@bar:example.com", }, result: ` @foo:example.com wrote:
lorem ipsum

dolor sit amet

`, }, { description: "Quoted emote message", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: `> lorem ipsum dolor sit amet`, format: "org.matrix.custom.html", formatted_body: ` Foo wrote:
lorem ipsum

dolor sit amet

`, ["m.relates_to"]: { "m.in_reply_to": { event_id: "!event:example.com", }, }, }, sender: "@bar:example.com", }, getEventResult: { id: "!event:example.com", type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Emote, body: "lorem ipsum", format: "org.matrix.custom.html", formatted_body: "

lorem ipsum

", }, sender: "@foo:example.com", }, result: `
* @foo:example.com

lorem ipsum

*

dolor sit amet

`, }, { description: "Reply is emote", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Emote, body: `> lorem ipsum dolor sit amet`, format: "org.matrix.custom.html", formatted_body: ` Foo wrote:
lorem ipsum

dolor sit amet

`, ["m.relates_to"]: { "m.in_reply_to": { event_id: "!event:example.com", }, }, }, sender: "@bar:example.com", }, getEventResult: { id: "!event:example.com", type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: "lorem ipsum", }, sender: "@foo:example.com", }, result: "\n

dolor sit amet

", }, { description: "Attachment", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.File, body: "example.png", url: "mxc://example.com/asdf", }, sender: "@bar:example.com", }, result: 'example.png', }, { description: "Sticker", event: { type: MatrixSDK.EventType.Sticker, content: { body: "example.png", url: "mxc://example.com/asdf", }, sender: "@bar:example.com", }, result: 'example.png', }, { description: "Normal formatted body", event: { type: MatrixSDK.EventType.RoomMessage, content: { body: "foo bar", msgtype: MatrixSDK.MsgType.Text, format: "org.matrix.custom.html", formatted_body: "

foo bar

", }, sender: "@bar:example.com", }, result: "

foo bar

", }, { description: "Inline image", event: { type: MatrixSDK.EventType.RoomMessage, content: { body: ":emote:", msgtype: MatrixSDK.MsgType.Text, format: "org.matrix.custom.html", formatted_body: ':emote:', }, sender: "@bar:example.com", }, result: ':emote:', }, { description: "Non-mxc attachment", event: { type: MatrixSDK.EventType.RoomMessage, content: { body: "foo.png", msgtype: MatrixSDK.MsgType.Image, url: "https://example.com/image.png", }, sender: "@bar:example.com", }, result: "foo.png", }, { description: "Fallback to normal body", event: { type: MatrixSDK.EventType.RoomMessage, content: { body: "hello world ", msgtype: MatrixSDK.MsgType.Notice, }, sender: "@bar:example.com", }, result: "hello world <!>", }, { description: "Colored text", event: { type: MatrixSDK.EventType.RoomMessage, content: { body: "rainbow", msgtype: MatrixSDK.MsgType.Text, format: "org.matrix.custom.html", formatted_body: 'rainbow', }, sender: "@bar:example.com", }, result: 'rainbow', }, { description: "Unsent event", event: { type: MatrixSDK.EventType.RoomMessage, content: { body: "foo", msgtype: MatrixSDK.MsgType.Text, }, sender: "@bar:example.com", status: MatrixSDK.EventStatus.NOT_SENT, }, result: "", }, { description: "Redacted event", event: { type: MatrixSDK.EventType.RoomMessage, content: {}, sender: "@bar:example.com", redacted: true, }, result: _("message.redacted"), }, { description: "Tombstone", event: { type: MatrixSDK.EventType.RoomTombstone, content: { body: "tombstone", }, sender: "@bar:example.com", }, result: "tombstone", }, { description: "Encryption start", event: { type: MatrixSDK.EventType.RoomEncryption, content: {}, sender: "@bar:example.com", }, isGetTextForEvent: true, }, { description: "Reaction", event: { type: MatrixSDK.EventType.Reaction, content: { ["m.relates_to"]: { rel_type: MatrixSDK.RelationType.Annotation, event_id: "!event:example.com", key: "🐦", }, }, sender: "@bar:example.com", }, getEventResult: { id: "!event:example.com", type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: "lorem ipsum!", }, sender: "@foo:example.com", }, result: _( "message.reaction", '@bar:example.com', '@foo:example.com', "🐦" ), }, { description: "URL encoded mention", event: { type: MatrixSDK.EventType.RoomMessage, content: { msgtype: MatrixSDK.MsgType.Text, body: `@foo:example.com dolor sit amet`, format: "org.matrix.custom.html", formatted_body: `Foo dolor sit amet`, }, sender: "@bar:example.com", }, result: '@foo:example.com dolor sit amet', }, ]; add_task(function test_plainBody() { for (const fixture of PLAIN_FIXTURES) { const event = makeEvent(fixture.event); const result = MatrixMessageContent.getIncomingPlain( event, "https://example.com", eventId => { if (fixture.getEventResult) { equal( eventId, fixture.getEventResult.id, `${fixture.description}: getEvent event ID` ); return makeEvent(fixture.getEventResult); } return undefined; } ); if (fixture.isGetTextForEvent) { equal(result, getMatrixTextForEvent(event)); } else { equal(result, fixture.result, fixture.description); } } }); add_task(function test_htmlBody() { for (const fixture of HTML_FIXTURES) { const event = makeEvent(fixture.event); const result = MatrixMessageContent.getIncomingHTML( event, "https://example.com", eventId => { if (fixture.getEventResult) { equal( eventId, fixture.getEventResult.id, `${fixture.description}: getEvent event ID` ); return makeEvent(fixture.getEventResult); } return undefined; } ); if (fixture.isGetTextForEvent) { equal(result, getMatrixTextForEvent(event)); } else { equal(result, fixture.result, fixture.description); } } });