浏览代码

Only attempt loading img URL with filename and appropriate extension

updates #1228
JC Brand 6 年之前
父节点
当前提交
2426f9b7c8
共有 2 个文件被更改,包括 61 次插入32 次删除
  1. 30 15
      dist/converse.js
  2. 31 17
      src/utils/core.js

+ 30 - 15
dist/converse.js

@@ -82094,21 +82094,36 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_
      */
     const __ = _converse.__;
     const list = obj.textContent.match(URL_REGEX) || [];
-    return Promise.all(_.map(list, url => new Promise((resolve, reject) => isImage(url).then(function (img) {
-      const i = new Image();
-      i.src = img.src;
-      i.addEventListener('load', resolve); // We also resolve for non-images, otherwise the
-      // Promise.all resolves prematurely.
-
-      i.addEventListener('error', resolve);
-
-      _.each(sizzle(`a[href="${url}"]`, obj), a => {
-        a.outerHTML = tpl_image({
-          'url': url,
-          'label_download': __('Download')
-        });
-      });
-    }).catch(resolve))));
+    return Promise.all(_.map(list, url => new Promise((resolve, reject) => {
+      const uri = new URI(url),
+            filename = uri.filename(),
+            lower_filename = filename.toLowerCase();
+
+      if (!_.includes(["https", "http"], uri.protocol().toLowerCase())) {
+        return resolve();
+      }
+
+      if (lower_filename.endsWith('jpg') || lower_filename.endsWith('jpeg') || lower_filename.endsWith('png') || lower_filename.endsWith('gif') || lower_filename.endsWith('svg')) {
+        return isImage(url).then(img => {
+          const i = new Image();
+          i.src = img.src;
+          i.addEventListener('load', resolve); // We also resolve for non-images, otherwise the
+          // Promise.all resolves prematurely.
+
+          i.addEventListener('error', resolve);
+          const __ = _converse.__;
+
+          _.each(sizzle(`a[href="${url}"]`, obj), a => {
+            a.outerHTML = tpl_image({
+              'url': url,
+              'label_download': __('Download')
+            });
+          });
+        }).catch(resolve);
+      } else {
+        return resolve();
+      }
+    })));
   };
 
   u.renderFileURL = function (_converse, url) {

+ 31 - 17
src/utils/core.js

@@ -288,23 +288,37 @@
         const list = obj.textContent.match(URL_REGEX) || [];
         return Promise.all(
             _.map(list, (url) =>
-                new Promise((resolve, reject) =>
-                    isImage(url).then(function (img) {
-                        const i = new Image();
-                        i.src = img.src;
-                        i.addEventListener('load', resolve);
-                        // We also resolve for non-images, otherwise the
-                        // Promise.all resolves prematurely.
-                        i.addEventListener('error', resolve);
-
-                        _.each(sizzle(`a[href="${url}"]`, obj), (a) => {
-                            a.outerHTML= tpl_image({
-                                'url': url,
-                                'label_download': __('Download')
-                            })
-                        });
-                    }).catch(resolve)
-                )
+                new Promise((resolve, reject) => {
+                    const uri = new URI(url),
+                        filename = uri.filename(),
+                        lower_filename = filename.toLowerCase();
+                    if (!_.includes(["https", "http"], uri.protocol().toLowerCase())) {
+                        return resolve();
+                    }
+                    if (lower_filename.endsWith('jpg') || lower_filename.endsWith('jpeg') ||
+                            lower_filename.endsWith('png') || lower_filename.endsWith('gif') ||
+                            lower_filename.endsWith('svg')) {
+
+                        return isImage(url).then(img => {
+                            const i = new Image();
+                            i.src = img.src;
+                            i.addEventListener('load', resolve);
+                            // We also resolve for non-images, otherwise the
+                            // Promise.all resolves prematurely.
+                            i.addEventListener('error', resolve);
+
+                            const { __ } = _converse;
+                            _.each(sizzle(`a[href="${url}"]`, obj), (a) => {
+                                a.outerHTML= tpl_image({
+                                    'url': url,
+                                    'label_download': __('Download')
+                                })
+                            });
+                        }).catch(resolve)
+                    } else {
+                        return resolve();
+                    }
+                })
             )
         )
     };