diff --git a/CHANGES.md b/CHANGES.md index 0af029be5..1a19c8ace 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,7 @@ - Don't apply message corrections when the MUC occupant-id doesn't match. - Update `nick` attribute on ChatRoom when user nickname changes - Restrict editing of MUC messages to ones with the same XEP-0421 occupant ID +- Remove unfurls for links removed in a subsequent message correction - #2870: Fix for multiple URLs to be linkified when sent together in chat and adds a test for this. - #2879: Quotes, lines not aligned to the first line - #2925: Fix missing disco-items in browser storage. diff --git a/src/headless/plugins/chat/model.js b/src/headless/plugins/chat/model.js index cf3ebb939..cbdff51f1 100644 --- a/src/headless/plugins/chat/model.js +++ b/src/headless/plugins/chat/model.js @@ -934,6 +934,7 @@ const ChatBox = ModelWithContact.extend({ 'correcting': false, 'edited': (new Date()).toISOString(), 'message': attrs.body, + 'ogp_metadata': [], 'origin_id': u.getUniqueId(), 'received': undefined, older_versions, diff --git a/src/plugins/muc-views/tests/unfurls.js b/src/plugins/muc-views/tests/unfurls.js index cf8630a6d..c9093d38c 100644 --- a/src/plugins/muc-views/tests/unfurls.js +++ b/src/plugins/muc-views/tests/unfurls.js @@ -1,6 +1,6 @@ /*global mock, converse */ -const { u } = converse.env; +const { Strophe, u } = converse.env; describe("A Groupchat Message", function () { @@ -106,7 +106,6 @@ describe("A Groupchat Message", function () { const el = await u.waitUntil(() => view.querySelector('.chat-msg__text')); expect(el.textContent).toBe(unfurl_url); - const metadata_stanza = u.toStanza(` @@ -402,4 +401,89 @@ describe("A Groupchat Message", function () { api.settings.set('allowed_image_domains', undefined); await u.waitUntil(() => view.querySelector('converse-message-unfurl .chat-image') !== null); })); + + it("will not render an unfurl that has been removed in a subsequent correction", mock.initConverse(['chatBoxesFetched'], {}, async function (_converse) { + const nick = 'romeo'; + const muc_jid = 'lounge@muc.montague.lit'; + await mock.openAndEnterChatRoom(_converse, muc_jid, nick); + const view = _converse.chatboxviews.get(muc_jid); + + const unfurl_image_src = "https://i.ytimg.com/vi/dQw4w9WgXcQ/maxresdefault.jpg"; + const unfurl_url = "https://www.youtube.com/watch?v=dQw4w9WgXcQ"; + + spyOn(_converse.connection, 'send').and.callThrough(); + + const textarea = await u.waitUntil(() => view.querySelector('textarea.chat-textarea')); + const message_form = view.querySelector('converse-muc-message-form'); + textarea.value = unfurl_url; + const enter_event = { + 'target': textarea, + 'preventDefault': function preventDefault () {}, + 'stopPropagation': function stopPropagation () {}, + 'keyCode': 13 // Enter + } + message_form.onKeyDown(enter_event); + + await u.waitUntil(() => view.querySelectorAll('.chat-msg').length === 1); + expect(view.querySelector('.chat-msg__text').textContent) + .toBe(unfurl_url); + + let msg = _converse.connection.send.calls.all()[0].args[0]; + expect(Strophe.serialize(msg)) + .toBe( + ``+ + `${unfurl_url}`+ + ``+ + ``+ + ``); + + const el = await u.waitUntil(() => view.querySelector('.chat-msg__text')); + expect(el.textContent).toBe(unfurl_url); + + const metadata_stanza = u.toStanza(` + + + + + + + + + + + + + + + + + `); + _converse.connection._dataRecv(mock.createRequest(metadata_stanza)); + + const unfurl = await u.waitUntil(() => view.querySelector('converse-message-unfurl')); + expect(unfurl.querySelector('.card-img-top').getAttribute('src')).toBe(unfurl_image_src); + expect(unfurl.querySelector('.card-img-top').getAttribute('href')).toBe(unfurl_url); + + // Modify the message to use a different URL + expect(textarea.value).toBe(''); + message_form.onKeyDown({ + target: textarea, + keyCode: 38 // Up arrow + }); + expect(textarea.value).toBe(unfurl_url); + textarea.value = "never mind"; + message_form.onKeyDown(enter_event); + + const getSentMessages = () => _converse.connection.send.calls.all().map(c => c.args[0]).filter(s => s.nodeName === 'message'); + await u.waitUntil(() => getSentMessages().length == 2); + msg = getSentMessages().pop(); + expect(Strophe.serialize(msg)) + .toBe( + ``+ + `never mind`+ + ``+ + ``+ + ``+ + ``); + })); });