From 232311aa8c8e879c98dc061ac1755ee4d0dd9b0f Mon Sep 17 00:00:00 2001
From: Sam <sam.saffron@gmail.com>
Date: Mon, 13 Nov 2017 12:08:11 +1100
Subject: [PATCH] FIX: missing short image resolution on queued posts

---
 .../components/composer-editor.js.es6         | 36 ++-----------------
 .../discourse/components/cook-text.js.es6     | 12 ++++++-
 .../pretty-text/image-short-url.js.es6        | 32 +++++++++++++++++
 3 files changed, 46 insertions(+), 34 deletions(-)

diff --git a/app/assets/javascripts/discourse/components/composer-editor.js.es6 b/app/assets/javascripts/discourse/components/composer-editor.js.es6
index 8c5dc774758..9a9b33aba0d 100644
--- a/app/assets/javascripts/discourse/components/composer-editor.js.es6
+++ b/app/assets/javascripts/discourse/components/composer-editor.js.es6
@@ -13,9 +13,7 @@ import { tinyAvatar,
          displayErrorForUpload,
          getUploadMarkdown,
          validateUploadedFiles } from 'discourse/lib/utilities';
-import { lookupCachedUploadUrl,
-         lookupUncachedUploadUrls,
-         cacheShortUploadUrl } from 'pretty-text/image-short-url';
+import { cacheShortUploadUrl, resolveAllShortUrls } from 'pretty-text/image-short-url';
 
 export default Ember.Component.extend({
   classNameBindings: ['showToolbar:toolbar-visible', ':wmd-controls'],
@@ -180,24 +178,6 @@ export default Ember.Component.extend({
     $oneboxes.each((_, o) => load(o, refresh, ajax, this.currentUser.id));
   },
 
-  _loadShortUrls($images) {
-    const urls = _.map($images, img => $(img).data('orig-src'));
-    lookupUncachedUploadUrls(urls, ajax).then(() => this._loadCachedShortUrls($images));
-  },
-
-  _loadCachedShortUrls($images) {
-    $images.each((idx, image) => {
-      let $image = $(image);
-      let url = lookupCachedUploadUrl($image.data('orig-src'));
-      if (url) {
-        $image.removeAttr('data-orig-src');
-        if (url !== "missing") {
-          $image.attr('src', url);
-        }
-      }
-    });
-  },
-
   _warnMentionedGroups($preview) {
     Ember.run.scheduleOnce('afterRender', () => {
       var found = this.get('warnedGroupMentions') || [];
@@ -584,18 +564,8 @@ export default Ember.Component.extend({
         Ember.run.debounce(this, this._loadOneboxes, $oneboxes, 450);
       }
 
-      // Short upload urls
-      let $shortUploadUrls = $('img[data-orig-src]');
-
-      if ($shortUploadUrls.length > 0) {
-        this._loadCachedShortUrls($shortUploadUrls);
-
-        $shortUploadUrls = $('img[data-orig-src]');
-        if ($shortUploadUrls.length > 0) {
-          // this is carefully batched so we can do an leading debounce (trigger right away)
-          Ember.run.debounce(this, this._loadShortUrls, $shortUploadUrls, 450, true);
-        }
-      }
+      // Short upload urls need resolution
+      resolveAllShortUrls(ajax);
 
       let inline = {};
       $('a.inline-onebox-loading', $preview).each(function(index, link) {
diff --git a/app/assets/javascripts/discourse/components/cook-text.js.es6 b/app/assets/javascripts/discourse/components/cook-text.js.es6
index 80ed6935632..60a96295c89 100644
--- a/app/assets/javascripts/discourse/components/cook-text.js.es6
+++ b/app/assets/javascripts/discourse/components/cook-text.js.es6
@@ -1,4 +1,5 @@
 import { cookAsync } from 'discourse/lib/text';
+import { ajax } from 'discourse/lib/ajax';
 
 const CookText = Ember.Component.extend({
   tagName: '',
@@ -6,7 +7,16 @@ const CookText = Ember.Component.extend({
 
   didReceiveAttrs() {
     this._super(...arguments);
-    cookAsync(this.get('rawText')).then(cooked => this.set('cooked', cooked));
+    cookAsync(this.get('rawText')).then(
+      cooked => {
+        this.set('cooked', cooked);
+        // no choice but to defer this cause
+        // pretty text may only be loaded now
+        Em.run.next(() =>
+          window.requireModule('pretty-text/image-short-url').resolveAllShortUrls(ajax)
+        );
+      }
+    );
   }
 });
 
diff --git a/app/assets/javascripts/pretty-text/image-short-url.js.es6 b/app/assets/javascripts/pretty-text/image-short-url.js.es6
index d815b46696c..4efcefaec37 100644
--- a/app/assets/javascripts/pretty-text/image-short-url.js.es6
+++ b/app/assets/javascripts/pretty-text/image-short-url.js.es6
@@ -16,3 +16,35 @@ export function lookupUncachedUploadUrls(urls, ajax) {
 export function cacheShortUploadUrl(shortUrl, url) {
   _cache[shortUrl] = url;
 }
+
+function _loadCachedShortUrls($images) {
+  $images.each((idx, image) => {
+    let $image = $(image);
+    let url = lookupCachedUploadUrl($image.data('orig-src'));
+    if (url) {
+      $image.removeAttr('data-orig-src');
+      if (url !== "missing") {
+        $image.attr('src', url);
+      }
+    }
+  });
+}
+
+function _loadShortUrls($images, ajax) {
+  const urls = _.map($images, img => $(img).data('orig-src'));
+  lookupUncachedUploadUrls(urls, ajax).then(() => _loadCachedShortUrls($images));
+}
+
+export function resolveAllShortUrls(ajax) {
+  let $shortUploadUrls = $('img[data-orig-src]');
+
+  if ($shortUploadUrls.length > 0) {
+    _loadCachedShortUrls($shortUploadUrls);
+
+    $shortUploadUrls = $('img[data-orig-src]');
+    if ($shortUploadUrls.length > 0) {
+      // this is carefully batched so we can do a leading debounce (trigger right away)
+      Ember.run.debounce(null, () => { _loadShortUrls($shortUploadUrls, ajax); }, 450, true);
+    }
+  }
+}