Skip to content

Commit

Permalink
Queue quote reference handling per convo in handleDataMessage
Browse files Browse the repository at this point in the history
  • Loading branch information
scottnonnenberg-signal committed Feb 21, 2019
1 parent 6bcd434 commit ad53423
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 98 deletions.
95 changes: 1 addition & 94 deletions js/background.js
Original file line number Diff line number Diff line change
Expand Up @@ -1063,109 +1063,16 @@
return event.confirm();
}

const withQuoteReference = await copyFromQuotedMessage(data.message);
const upgradedMessage = await upgradeMessageSchema(withQuoteReference);

await ConversationController.getOrCreateAndWait(
messageDescriptor.id,
messageDescriptor.type
);
return message.handleDataMessage(upgradedMessage, event.confirm, {
return message.handleDataMessage(data.message, event.confirm, {
initialLoadComplete,
});
};
}

async function copyFromQuotedMessage(message) {
const { quote } = message;
if (!quote) {
return message;
}

const { attachments, id, author } = quote;
const firstAttachment = attachments[0];

const collection = await window.Signal.Data.getMessagesBySentAt(id, {
MessageCollection: Whisper.MessageCollection,
});
const queryMessage = collection.find(item => {
const messageAuthor = item.getContact();

return messageAuthor && author === messageAuthor.id;
});

if (!queryMessage) {
quote.referencedMessageNotFound = true;
return message;
}

quote.text = queryMessage.get('body');
if (firstAttachment) {
firstAttachment.thumbnail = null;
}

if (
!firstAttachment ||
(!window.Signal.Util.GoogleChrome.isImageTypeSupported(
firstAttachment.contentType
) &&
!window.Signal.Util.GoogleChrome.isVideoTypeSupported(
firstAttachment.contentType
))
) {
return message;
}

try {
if (
queryMessage.get('schemaVersion') < Message.VERSION_NEEDED_FOR_DISPLAY
) {
const upgradedMessage = await upgradeMessageSchema(
queryMessage.attributes
);
queryMessage.set(upgradedMessage);
await window.Signal.Data.saveMessage(upgradedMessage, {
Message: Whisper.Message,
});
}
} catch (error) {
window.log.error(
'Problem upgrading message quoted message from database',
Errors.toLogFormat(error)
);
return message;
}

const queryAttachments = queryMessage.get('attachments') || [];

if (queryAttachments.length > 0) {
const queryFirst = queryAttachments[0];
const { thumbnail } = queryFirst;

if (thumbnail && thumbnail.path) {
firstAttachment.thumbnail = {
...thumbnail,
copied: true,
};
}
}

const queryPreview = queryMessage.get('preview') || [];
if (queryPreview.length > 0) {
const queryFirst = queryPreview[0];
const { image } = queryFirst;

if (image && image.path) {
firstAttachment.thumbnail = {
...image,
copied: true,
};
}
}

return message;
}

// Received:
async function handleMessageReceivedProfileUpdate({
data,
Expand Down
106 changes: 102 additions & 4 deletions js/models/messages.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,14 @@

window.Whisper = window.Whisper || {};

const { Message: TypedMessage, Contact, PhoneNumber } = Signal.Types;
const { Message: TypedMessage, Contact, PhoneNumber, Errors } = Signal.Types;
const {
deleteExternalMessageFiles,
getAbsoluteAttachmentPath,
loadAttachmentData,
loadQuoteData,
loadPreviewData,
upgradeMessageSchema,
} = window.Signal.Migrations;

window.AccountCache = Object.create(null);
Expand Down Expand Up @@ -1284,7 +1285,99 @@

return false;
},
handleDataMessage(dataMessage, confirm) {

async copyFromQuotedMessage(message) {
const { quote } = message;
if (!quote) {
return message;
}

const { attachments, id, author } = quote;
const firstAttachment = attachments[0];

const collection = await window.Signal.Data.getMessagesBySentAt(id, {
MessageCollection: Whisper.MessageCollection,
});
const queryMessage = collection.find(item => {
const messageAuthor = item.getContact();

return messageAuthor && author === messageAuthor.id;
});

if (!queryMessage) {
quote.referencedMessageNotFound = true;
return message;
}

quote.text = queryMessage.get('body');
if (firstAttachment) {
firstAttachment.thumbnail = null;
}

if (
!firstAttachment ||
(!window.Signal.Util.GoogleChrome.isImageTypeSupported(
firstAttachment.contentType
) &&
!window.Signal.Util.GoogleChrome.isVideoTypeSupported(
firstAttachment.contentType
))
) {
return message;
}

try {
if (
queryMessage.get('schemaVersion') <
TypedMessage.VERSION_NEEDED_FOR_DISPLAY
) {
const upgradedMessage = await upgradeMessageSchema(
queryMessage.attributes
);
queryMessage.set(upgradedMessage);
await window.Signal.Data.saveMessage(upgradedMessage, {
Message: Whisper.Message,
});
}
} catch (error) {
window.log.error(
'Problem upgrading message quoted message from database',
Errors.toLogFormat(error)
);
return message;
}

const queryAttachments = queryMessage.get('attachments') || [];

if (queryAttachments.length > 0) {
const queryFirst = queryAttachments[0];
const { thumbnail } = queryFirst;

if (thumbnail && thumbnail.path) {
firstAttachment.thumbnail = {
...thumbnail,
copied: true,
};
}
}

const queryPreview = queryMessage.get('preview') || [];
if (queryPreview.length > 0) {
const queryFirst = queryPreview[0];
const { image } = queryFirst;

if (image && image.path) {
firstAttachment.thumbnail = {
...image,
copied: true,
};
}
}

return message;
},

handleDataMessage(initialMessage, confirm) {
// This function is called from the background script in a few scenarios:
// 1. on an incoming message
// 2. on a sent message sync'd from another device
Expand All @@ -1294,13 +1387,18 @@
const source = message.get('source');
const type = message.get('type');
let conversationId = message.get('conversationId');
if (dataMessage.group) {
conversationId = dataMessage.group.id;
if (initialMessage.group) {
conversationId = initialMessage.group.id;
}
const GROUP_TYPES = textsecure.protobuf.GroupContext.Type;

const conversation = ConversationController.get(conversationId);
return conversation.queueJob(async () => {
const withQuoteReference = await this.copyFromQuotedMessage(
initialMessage
);
const dataMessage = await upgradeMessageSchema(withQuoteReference);

try {
const now = new Date().getTime();
let attributes = {
Expand Down

0 comments on commit ad53423

Please sign in to comment.