@@ -57,7 +57,6 @@ export const AUTO_HEIGHT_BRIDGE = `(() => {
5757 microtask: false,
5858 pendingLoads: 0,
5959 lastHeight: 0,
60- lastCssHeight: 0,
6160 anomalyCount: 0,
6261 fallbackTimer: null,
6362 fallbackDelay: INITIAL_FALLBACK_MS,
@@ -173,13 +172,62 @@ export const AUTO_HEIGHT_BRIDGE = `(() => {
173172 return id;
174173 };
175174
175+ var RENDERABLE_MEDIA_TAGS = {
176+ IMG: true,
177+ IFRAME: true,
178+ VIDEO: true,
179+ SVG: true,
180+ CANVAS: true,
181+ PICTURE: true,
182+ OBJECT: true,
183+ EMBED: true,
184+ AUDIO: true,
185+ };
186+
187+ var hasRenderableContent = function (node) {
188+ if (!node || !node.childNodes || !node.childNodes.length) {
189+ return false;
190+ }
191+
192+ var child = node.firstChild;
193+ while (child) {
194+ if (child.nodeType === 3) {
195+ if (child.textContent && child.textContent.trim()) {
196+ return true;
197+ }
198+ } else if (child.nodeType === 1) {
199+ var tag = (child.tagName || '').toUpperCase();
200+ if (tag === 'BR') {
201+ child = child.nextSibling;
202+ continue;
203+ }
204+
205+ if (RENDERABLE_MEDIA_TAGS[tag]) {
206+ return true;
207+ }
208+
209+ if (hasRenderableContent(child)) {
210+ return true;
211+ }
212+ }
213+
214+ child = child.nextSibling;
215+ }
216+
217+ return false;
218+ };
219+
176220 var pruneTrailingNodes = function (container) {
177221 if (!container) {
178222 return;
179223 }
180224
181225 var isWhitespaceText = function (node) {
182- return node && node.nodeType === 3 && (!node.textContent || !node.textContent.trim());
226+ return (
227+ node &&
228+ node.nodeType === 3 &&
229+ (!node.textContent || !node.textContent.trim())
230+ );
183231 };
184232
185233 var isTrimmableElement = function (node) {
@@ -193,7 +241,7 @@ export const AUTO_HEIGHT_BRIDGE = `(() => {
193241 }
194242
195243 if (tag === 'P') {
196- return !node.textContent || !node.textContent.trim( );
244+ return !hasRenderableContent(node );
197245 }
198246
199247 return false;
@@ -231,75 +279,77 @@ export const AUTO_HEIGHT_BRIDGE = `(() => {
231279 }
232280 };
233281
234- var readRectHeight = function (element) {
235- if (!element || typeof element.getBoundingClientRect !== 'function' ) {
282+ var readElementHeight = function (element) {
283+ if (!element) {
236284 return 0;
237285 }
238286
239- var rect = element.getBoundingClientRect();
240- return typeof rect.height === 'number' ? rect.height : 0;
241- };
242-
243- var readMaxValue = function (values) {
244- var max = 0;
245-
246- for (var index = 0; index < values.length; index += 1) {
247- var value = values[index];
248- if (typeof value === 'number' && value > max) {
249- max = value;
250- }
287+ var rectHeight = 0;
288+ if (typeof element.getBoundingClientRect === 'function') {
289+ var rect = element.getBoundingClientRect();
290+ rectHeight = rect && typeof rect.height === 'number' ? rect.height : 0;
251291 }
252292
253- return max;
293+ return Math.max(
294+ 0,
295+ rectHeight,
296+ element.scrollHeight || 0,
297+ element.offsetHeight || 0,
298+ element.clientHeight || 0
299+ );
254300 };
255301
256302 var measureHeight = function () {
257303 var html = document.documentElement;
258304 var body = document.body;
259305 var wrapper = ensureWrapper();
306+ var scrollingElement = document.scrollingElement;
260307
261308 pruneTrailingNodes(wrapper);
262309
263- var values = [];
310+ var targets = [];
264311
265- var collect = function (element) {
266- if (!element) {
267- return;
268- }
312+ if (wrapper) {
313+ targets.push(wrapper);
314+ }
269315
270- values.push(
271- readRectHeight(element),
272- element.scrollHeight || 0,
273- element.offsetHeight || 0,
274- element.clientHeight || 0
275- );
276- };
316+ if (body && targets.indexOf(body) === -1) {
317+ targets.push(body);
318+ }
277319
278- if (wrapper) {
279- collect(wrapper);
280- } else {
281- if (body) {
282- collect(body);
283- }
284- if (html && html !== body) {
285- collect(html);
286- }
320+ if (html && targets.indexOf(html) === -1) {
321+ targets.push(html);
322+ }
323+
324+ if (
325+ scrollingElement &&
326+ scrollingElement !== body &&
327+ scrollingElement !== html &&
328+ targets.indexOf(scrollingElement) === -1
329+ ) {
330+ targets.push(scrollingElement);
287331 }
288332
289- if (!values .length) {
333+ if (!targets .length) {
290334 return 0;
291335 }
292336
293- return Math.max(0, Math.ceil(readMaxValue(values)));
337+ var maxHeight = 0;
338+ for (var index = 0; index < targets.length; index += 1) {
339+ var value = readElementHeight(targets[index]);
340+ if (value > maxHeight) {
341+ maxHeight = value;
342+ }
343+ }
344+
345+ return Math.max(0, Math.ceil(maxHeight));
294346 };
295347
296348 var postHeight = function (height) {
297349 if (!height || height <= 0) {
298350 return;
299351 }
300352
301- state.lastCssHeight = height;
302-
303353 var sanitized = Math.ceil(height);
304354
305355 if (!isFinite(sanitized) || sanitized <= 0) {
0 commit comments