From 5a33500765a8b2db5f61db4bcdba5ba5423a40dc Mon Sep 17 00:00:00 2001 From: Andrew Ferrazzutti Date: Sun, 28 Mar 2021 04:23:07 -0400 Subject: [PATCH] Wait for inbound images to load --- puppet/src/contentscript.js | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/puppet/src/contentscript.js b/puppet/src/contentscript.js index 2f7320c..1bf91fd 100644 --- a/puppet/src/contentscript.js +++ b/puppet/src/contentscript.js @@ -211,9 +211,35 @@ class MautrixController { // TODO Use "Inner" or not? messageData.text = messageElement.querySelector(".mdRGT07MsgTextInner")?.innerText } else if (messageElement.classList.contains("mdRGT07Image")) { - // TODO Probably need a MutationObserver to wait for image to load. - // Should also catch "#_chat_message_image_failure" - messageData.image_url = messageElement.querySelector(".mdRGT07MsgImg > img")?.src + const img = messageElement.querySelector(".mdRGT07MsgImg > img") + if (img) { + if (img.src.startsWith("blob:")) { + messageData.image_url = img.src + } else { + let resolve + // TODO Should reject on "#_chat_message_image_failure" + let observer = new MutationObserver((changes) => { + for (const change of changes) { + if (change.target.src.startsWith("blob:")) { + observer.disconnect() + observer = null + resolve(change.target.src) + return + } + } + }) + observer.observe(img, { attributes: true, attributeFilter: ["src"] }) + messageData.image_url = await new Promise((realResolve, reject) => { + resolve = realResolve + setTimeout(() => { + if (observer) { + observer.disconnect() + resolve(img.src) + } + }, 5000) + }) + } + } } return messageData } @@ -223,7 +249,6 @@ class MautrixController { let observer let msgID = -1 let resolve - let reject const resolveMessage = () => { observer.disconnect() @@ -267,9 +292,8 @@ class MautrixController { document.querySelector("#_chat_room_msg_list"), { childList: true }) - return new Promise((realResolve, realReject) => { + return new Promise((realResolve, reject) => { resolve = realResolve - reject = realReject // TODO Handle a timeout better than this setTimeout(() => { if (observer) {