Skip to content

Commit 0f0e8f9

Browse files
committed
Extra insurance that we don't mix events in the wrong timelines
Split out from #2521
1 parent 4a33e58 commit 0f0e8f9

File tree

3 files changed

+72
-0
lines changed

3 files changed

+72
-0
lines changed

.DS_Store

6 KB
Binary file not shown.

spec/unit/event-timeline-set.spec.ts

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,23 @@ describe('EventTimelineSet', () => {
5555
});
5656
};
5757

58+
const mkThreadResponse = (root: MatrixEvent) => utils.mkEvent({
59+
event: true,
60+
type: EventType.RoomMessage,
61+
user: userA,
62+
room: roomId,
63+
content: {
64+
"body": "Thread response :: " + Math.random(),
65+
"m.relates_to": {
66+
"event_id": root.getId(),
67+
"m.in_reply_to": {
68+
"event_id": root.getId()!,
69+
},
70+
"rel_type": "m.thread",
71+
},
72+
},
73+
}, room.client);
74+
5875
beforeEach(() => {
5976
client = utils.mock(MatrixClient, 'MatrixClient');
6077
client.reEmitter = utils.mock(ReEmitter, 'ReEmitter');
@@ -117,6 +134,13 @@ describe('EventTimelineSet', () => {
117134
});
118135

119136
describe('addEventToTimeline', () => {
137+
let thread: Thread;
138+
139+
beforeEach(() => {
140+
(client.supportsExperimentalThreads as jest.Mock).mockReturnValue(true);
141+
thread = new Thread("!thread_id:server", messageEvent, { room, client });
142+
});
143+
120144
it("Adds event to timeline", () => {
121145
const liveTimeline = eventTimelineSet.getLiveTimeline();
122146
expect(liveTimeline.getEvents().length).toStrictEqual(0);
@@ -144,6 +168,41 @@ describe('EventTimelineSet', () => {
144168
);
145169
}).not.toThrow();
146170
});
171+
172+
it("should not add an event to a timeline that does not belong to the timelineSet", () => {
173+
const eventTimelineSet2 = new EventTimelineSet(room);
174+
const liveTimeline2 = eventTimelineSet2.getLiveTimeline();
175+
expect(liveTimeline2.getEvents().length).toStrictEqual(0);
176+
177+
expect(() => {
178+
eventTimelineSet.addEventToTimeline(messageEvent, liveTimeline2, {
179+
toStartOfTimeline: true,
180+
});
181+
}).toThrowError();
182+
});
183+
184+
it("should not add a threaded reply to the main room timeline", () => {
185+
const liveTimeline = eventTimelineSet.getLiveTimeline();
186+
expect(liveTimeline.getEvents().length).toStrictEqual(0);
187+
188+
const threadedReplyEvent = mkThreadResponse(messageEvent);
189+
190+
eventTimelineSet.addEventToTimeline(threadedReplyEvent, liveTimeline, {
191+
toStartOfTimeline: true,
192+
});
193+
expect(liveTimeline.getEvents().length).toStrictEqual(0);
194+
});
195+
196+
it("should not add a normal message to the timelineSet representing a thread", () => {
197+
const eventTimelineSetForThread = new EventTimelineSet(room, {}, client, thread);
198+
const liveTimeline = eventTimelineSetForThread.getLiveTimeline();
199+
expect(liveTimeline.getEvents().length).toStrictEqual(0);
200+
201+
eventTimelineSetForThread.addEventToTimeline(messageEvent, liveTimeline, {
202+
toStartOfTimeline: true,
203+
});
204+
expect(liveTimeline.getEvents().length).toStrictEqual(0);
205+
});
147206
});
148207

149208
describe('aggregateRelations', () => {

src/models/event-timeline-set.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,6 +702,19 @@ export class EventTimelineSet extends TypedEventEmitter<EmittedEvents, EventTime
702702
);
703703
}
704704

705+
if (timeline.getTimelineSet() !== this) {
706+
throw new Error(`EventTimelineSet.addEventToTimeline: Timeline=${timeline.toString()} does not belong " +
707+
"in timelineSet(threadId=${this.thread?.id})`);
708+
}
709+
710+
// Make sure events don't get mixed in timelines they shouldn't be in
711+
// (e.g. a threaded message should not be in the main timeline).
712+
if (!this.canContain(event)) {
713+
logger.warn(`EventTimelineSet.addEventToTimeline: Ignoring event=${event.getId()} that does not belong " +
714+
"in timeline=${timeline.toString()} timelineSet(threadId=${this.thread?.id})`);
715+
return;
716+
}
717+
705718
const eventId = event.getId()!;
706719
timeline.addEvent(event, {
707720
toStartOfTimeline,

0 commit comments

Comments
 (0)