From 9c024757b6de5b408afe7204e0c2d1fc9800b15f Mon Sep 17 00:00:00 2001 From: JC Brand Date: Tue, 13 Aug 2019 19:30:20 +0200 Subject: [PATCH] Bugfix: `TypeError: o.getAttribute is not a function converse-chatview.js` can cause messages to not appear. * Check against null not Element. * Avoid iterating over non-Element nodes --- CHANGES.md | 1 + src/utils/html.js | 18 +++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 747193622..5974fa81d 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,6 +6,7 @@ - Reconnect if the server doesn't respond to a `ping` within 10 seconds. - Don't query for MAM MUC messages before the cached messages have been restored (another cause of duplicate messages). - Show an error message and option to retry when fetching of the MAM archive times out +- Bugfix: `TypeError: o.getAttribute is not a function converse-chatview.js` (can cause messages to not appear). ## 5.0.0 (2019-08-08) diff --git a/src/utils/html.js b/src/utils/html.js index 878cf3c3d..11f181504 100644 --- a/src/utils/html.js +++ b/src/utils/html.js @@ -223,7 +223,7 @@ u.calculateElementHeight = function (el) { u.getNextElement = function (el, selector='*') { let next_el = el.nextElementSibling; - while ((next_el instanceof Element) && !sizzle.matchesSelector(next_el, selector)) { + while (next_el !== null && !sizzle.matchesSelector(next_el, selector)) { next_el = next_el.nextElementSibling; } return next_el; @@ -231,24 +231,24 @@ u.getNextElement = function (el, selector='*') { u.getPreviousElement = function (el, selector='*') { let prev_el = el.previousElementSibling; - while ((prev_el instanceof Element) && !sizzle.matchesSelector(prev_el, selector)) { - prev_el = prev_el.previousSibling + while (prev_el !== null && !sizzle.matchesSelector(prev_el, selector)) { + prev_el = prev_el.previousElementSibling } return prev_el; } u.getFirstChildElement = function (el, selector='*') { let first_el = el.firstElementChild; - while ((first_el instanceof Element) && !sizzle.matchesSelector(first_el, selector)) { - first_el = first_el.nextSibling + while (first_el !== null && !sizzle.matchesSelector(first_el, selector)) { + first_el = first_el.nextElementSibling } return first_el; } u.getLastChildElement = function (el, selector='*') { let last_el = el.lastElementChild; - while ((last_el instanceof Element) && !sizzle.matchesSelector(last_el, selector)) { - last_el = last_el.previousSibling + while (last_el !== null && !sizzle.matchesSelector(last_el, selector)) { + last_el = last_el.previousElementSibling } return last_el; } @@ -284,7 +284,7 @@ u.hideElement = function (el) { u.ancestor = function (el, selector) { let parent = el; - while ((parent instanceof Element) && !sizzle.matchesSelector(parent, selector)) { + while (parent !== null && !sizzle.matchesSelector(parent, selector)) { parent = parent.parentElement; } return parent; @@ -294,7 +294,7 @@ u.nextUntil = function (el, selector, include_self=false) { /* Return the element's siblings until one matches the selector. */ const matches = []; let sibling_el = el.nextElementSibling; - while ((sibling_el instanceof Element) && !sibling_el.matches(selector)) { + while (sibling_el !== null && !sibling_el.matches(selector)) { matches.push(sibling_el); sibling_el = sibling_el.nextElementSibling; }