From c4551ca7cac19d1a69ed13d741afa1f4c1d29e89 Mon Sep 17 00:00:00 2001
From: Evan Hahn <69474926+EvanHahn-Signal@users.noreply.github.com>
Date: Tue, 23 Feb 2021 10:00:18 -0600
Subject: [PATCH] Revoke object URLs in two error cases

---
 js/views/identicon_svg_view.js |  9 +++++++--
 ts/views/conversation_view.ts  | 11 ++++++++++-
 2 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/js/views/identicon_svg_view.js b/js/views/identicon_svg_view.js
index 60b51999ddf..9933ca8acbe 100644
--- a/js/views/identicon_svg_view.js
+++ b/js/views/identicon_svg_view.js
@@ -1,4 +1,4 @@
-// Copyright 2015-2020 Signal Messenger, LLC
+// Copyright 2015-2021 Signal Messenger, LLC
 // SPDX-License-Identifier: AGPL-3.0-only
 
 /* global Whisper, loadImage */
@@ -21,7 +21,7 @@
       const svg = new Blob([html], { type: 'image/svg+xml;charset=utf-8' });
       return URL.createObjectURL(svg);
     },
-    getDataUrl() {
+    getDataUrl() /* : Promise<string> */ {
       const svgurl = this.getSVGUrl();
       return new Promise(resolve => {
         const img = document.createElement('img');
@@ -36,6 +36,11 @@
           URL.revokeObjectURL(svgurl);
           resolve(canvas.toDataURL('image/png'));
         };
+        img.onerror = () => {
+          URL.revokeObjectURL(svgurl);
+          // If this fails for some reason, we'd rather continue on than reject.
+          resolve(undefined);
+        };
 
         img.src = svgurl;
       });
diff --git a/ts/views/conversation_view.ts b/ts/views/conversation_view.ts
index 046b5eeac9b..b7466568cc5 100644
--- a/ts/views/conversation_view.ts
+++ b/ts/views/conversation_view.ts
@@ -1805,7 +1805,6 @@ Whisper.ConversationView = Whisper.View.extend({
     return new Promise((resolve, reject) => {
       const url = URL.createObjectURL(file);
       const img = document.createElement('img');
-      img.onerror = reject;
       img.onload = () => {
         URL.revokeObjectURL(url);
 
@@ -1863,6 +1862,16 @@ Whisper.ConversationView = Whisper.View.extend({
           file: blob,
         });
       };
+      img.onerror = (
+        _event: unknown,
+        _source: unknown,
+        _lineno: unknown,
+        _colno: unknown,
+        error: Error = new Error('Failed to load image for auto-scaling')
+      ) => {
+        URL.revokeObjectURL(url);
+        reject(error);
+      };
       img.src = url;
     });
   },