Allow parsing png files to fail if thumbnailing is successful (#10308)

pull/28217/head
Michael Telatynski 2023-03-07 15:48:23 +00:00 committed by GitHub
parent 3e340d5906
commit f74867e57b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 11 deletions

View File

@ -96,7 +96,8 @@ async function loadImageElement(imageFile: File): Promise<{
// Thus we could slice the file down to only sniff the first 0x1000 // Thus we could slice the file down to only sniff the first 0x1000
// bytes (but this makes extractPngChunks choke on the corrupt file) // bytes (but this makes extractPngChunks choke on the corrupt file)
const headers = imageFile; //.slice(0, 0x1000); const headers = imageFile; //.slice(0, 0x1000);
parsePromise = readFileAsArrayBuffer(headers).then((arrayBuffer) => { parsePromise = readFileAsArrayBuffer(headers)
.then((arrayBuffer) => {
const buffer = new Uint8Array(arrayBuffer); const buffer = new Uint8Array(arrayBuffer);
const chunks = extractPngChunks(buffer); const chunks = extractPngChunks(buffer);
for (const chunk of chunks) { for (const chunk of chunks) {
@ -106,6 +107,10 @@ async function loadImageElement(imageFile: File): Promise<{
} }
} }
return false; return false;
})
.catch((e) => {
console.error("Failed to parse PNG", e);
return false;
}); });
} }

View File

@ -115,10 +115,25 @@ describe("ContentMessages", () => {
); );
}); });
it("should fall back to m.file for invalid image files", async () => { it("should use m.image for PNG files which cannot be parsed but successfully thumbnail", async () => {
mocked(client.uploadContent).mockResolvedValue({ content_uri: "mxc://server/file" }); mocked(client.uploadContent).mockResolvedValue({ content_uri: "mxc://server/file" });
const file = new File([], "fileName", { type: "image/png" }); const file = new File([], "fileName", { type: "image/png" });
await contentMessages.sendContentToRoom(file, roomId, undefined, client, undefined); await contentMessages.sendContentToRoom(file, roomId, undefined, client, undefined);
expect(client.sendMessage).toHaveBeenCalledWith(
roomId,
null,
expect.objectContaining({
url: "mxc://server/file",
msgtype: "m.image",
}),
);
});
it("should fall back to m.file for invalid image files", async () => {
mocked(client.uploadContent).mockResolvedValue({ content_uri: "mxc://server/file" });
const file = new File([], "fileName", { type: "image/jpeg" });
mocked(BlurhashEncoder.instance.getBlurhash).mockRejectedValue("NOT_AN_IMAGE");
await contentMessages.sendContentToRoom(file, roomId, undefined, client, undefined);
expect(client.sendMessage).toHaveBeenCalledWith( expect(client.sendMessage).toHaveBeenCalledWith(
roomId, roomId,
null, null,