224 lines
7.9 KiB
Diff
224 lines
7.9 KiB
Diff
|
From abdcc5af227972da8db1731f05e66a14eb4f6656 Mon Sep 17 00:00:00 2001
|
||
|
From: Milan Crha <mcrha@redhat.com>
|
||
|
Date: Fri, 16 Jun 2023 12:18:39 +0200
|
||
|
Subject: [PATCH] I#2400 - HTML attachment viewport is tiny
|
||
|
|
||
|
Closes https://gitlab.gnome.org/GNOME/evolution/-/issues/2400
|
||
|
---
|
||
|
data/webkit/e-web-view.js | 138 ++++++++++++++++++++++++++------------
|
||
|
1 file changed, 95 insertions(+), 43 deletions(-)
|
||
|
|
||
|
diff --git a/data/webkit/e-web-view.js b/data/webkit/e-web-view.js
|
||
|
index 032287fd73..10f206092c 100644
|
||
|
--- a/data/webkit/e-web-view.js
|
||
|
+++ b/data/webkit/e-web-view.js
|
||
|
@@ -760,24 +760,6 @@ Evo.EnsureMainDocumentInitialized = function()
|
||
|
Evo.initializeAndPostContentLoaded(null);
|
||
|
}
|
||
|
|
||
|
-Evo.mailDisplaySetIFrameHeight = function(iframe, height, forWidth, force)
|
||
|
-{
|
||
|
- if (!force && iframe.hasAttribute("x-evo-height-for-width") && iframe.hasAttribute("x-evo-cached-height")) {
|
||
|
- var heightForWidth = parseInt(iframe.getAttribute("x-evo-height-for-width"));
|
||
|
- if (heightForWidth == forWidth) {
|
||
|
- var cachedHeight = parseInt(iframe.getAttribute("x-evo-cached-height"));
|
||
|
- if (cachedHeight > 0) {
|
||
|
- iframe.height = cachedHeight;
|
||
|
- return;
|
||
|
- }
|
||
|
- }
|
||
|
- }
|
||
|
-
|
||
|
- iframe.setAttribute("x-evo-height-for-width", forWidth);
|
||
|
- iframe.setAttribute("x-evo-cached-height", height);
|
||
|
- iframe.height = height;
|
||
|
-}
|
||
|
-
|
||
|
Evo.mailDisplayGetScrollbarHeight = function()
|
||
|
{
|
||
|
if (Evo.mailDisplayCachedScrollbarHeight != undefined)
|
||
|
@@ -797,7 +779,7 @@ Evo.mailDisplayUpdateIFramesHeightRecursive = function(doc)
|
||
|
if (!doc)
|
||
|
return;
|
||
|
|
||
|
- var ii, iframes, force = false;
|
||
|
+ var ii, iframes;
|
||
|
|
||
|
iframes = doc.getElementsByTagName("iframe");
|
||
|
|
||
|
@@ -809,18 +791,20 @@ Evo.mailDisplayUpdateIFramesHeightRecursive = function(doc)
|
||
|
if (!doc.scrollingElement || !doc.defaultView || !doc.defaultView.frameElement)
|
||
|
return;
|
||
|
|
||
|
- if (doc.defaultView.frameElement.height == doc.scrollingElement.scrollHeight) {
|
||
|
+ if (doc.defaultView.frameElement.height == doc.scrollingElement.scrollHeight)
|
||
|
doc.defaultView.frameElement.height = 10;
|
||
|
- force = true;
|
||
|
- }
|
||
|
|
||
|
- Evo.mailDisplaySetIFrameHeight(doc.defaultView.frameElement, doc.scrollingElement.scrollHeight + 2 +
|
||
|
- (doc.scrollingElement.scrollWidth > doc.scrollingElement.clientWidth ? Evo.mailDisplayGetScrollbarHeight() : 0),
|
||
|
- doc.scrollingElement.clientWidth, force);
|
||
|
+ doc.defaultView.frameElement.height = doc.scrollingElement.scrollHeight + 2 +
|
||
|
+ (doc.scrollingElement.scrollWidth > doc.scrollingElement.clientWidth ? Evo.mailDisplayGetScrollbarHeight() : 0);
|
||
|
}
|
||
|
|
||
|
-Evo.MailDisplayUpdateIFramesHeight = function()
|
||
|
+Evo.mailDisplayUpdateIFramesHeightCB = function(timeStamp)
|
||
|
{
|
||
|
+ if (Evo.mailDisplayRecalcHeightTimeStamp === timeStamp)
|
||
|
+ return;
|
||
|
+
|
||
|
+ Evo.mailDisplayRecalcHeightTimeStamp = timeStamp;
|
||
|
+
|
||
|
var scrollx = document.defaultView ? document.defaultView.scrollX : -1;
|
||
|
var scrolly = document.defaultView ? document.defaultView.scrollY : -1;
|
||
|
|
||
|
@@ -835,6 +819,11 @@ Evo.MailDisplayUpdateIFramesHeight = function()
|
||
|
Evo.mailDisplayUpdateMagicSpacebarState();
|
||
|
}
|
||
|
|
||
|
+Evo.MailDisplayUpdateIFramesHeight = function()
|
||
|
+{
|
||
|
+ window.requestAnimationFrame(Evo.mailDisplayUpdateIFramesHeightCB);
|
||
|
+}
|
||
|
+
|
||
|
if (this instanceof Window && this.document) {
|
||
|
this.document.onload = function() { Evo.initializeAndPostContentLoaded(this); };
|
||
|
|
||
|
@@ -886,8 +875,13 @@ Evo.VCardBind = function(iframe_id)
|
||
|
Evo.runTraversarForIFrameId(iframe_id, traversar);
|
||
|
}
|
||
|
|
||
|
-Evo.mailDisplayResizeContentToPreviewWidth = function()
|
||
|
+Evo.mailDisplayResizeContentToPreviewWidthCB = function(timeStamp)
|
||
|
{
|
||
|
+ if (Evo.mailDisplayPreviewWidthTimeStamp === timeStamp)
|
||
|
+ return;
|
||
|
+
|
||
|
+ Evo.mailDisplayPreviewWidthTimeStamp = timeStamp;
|
||
|
+
|
||
|
if (!document || !document.documentElement ||
|
||
|
document.documentElement.scrollWidth < document.documentElement.clientWidth) {
|
||
|
return;
|
||
|
@@ -1016,6 +1010,11 @@ Evo.mailDisplayResizeContentToPreviewWidth = function()
|
||
|
window.webkit.messageHandlers.scheduleIFramesHeightUpdate.postMessage(0);
|
||
|
}
|
||
|
|
||
|
+Evo.mailDisplayResizeContentToPreviewWidth = function()
|
||
|
+{
|
||
|
+ window.requestAnimationFrame(Evo.mailDisplayResizeContentToPreviewWidthCB);
|
||
|
+}
|
||
|
+
|
||
|
Evo.mailDisplayUpdateMagicSpacebarState = function()
|
||
|
{
|
||
|
var new_state = 0;
|
||
|
@@ -1217,35 +1216,88 @@ Evo.unsetHTMLColors = function(doc)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-Evo.mailDisplaySizeChanged = function(entries, observer)
|
||
|
+Evo.mailDisplaySetIFrameHeightForDocument = function(doc, minHeight)
|
||
|
{
|
||
|
+ if (!doc || !doc.defaultView || !doc.scrollingElement)
|
||
|
+ return;
|
||
|
+
|
||
|
+ var iframe = doc.defaultView.frameElement;
|
||
|
+
|
||
|
+ if (!iframe)
|
||
|
+ return;
|
||
|
+
|
||
|
+ var value = minHeight;
|
||
|
+
|
||
|
+ iframe.height = 10;
|
||
|
+
|
||
|
+ if (value < doc.scrollingElement.scrollHeight)
|
||
|
+ value = doc.scrollingElement.scrollHeight;
|
||
|
+ if (doc.scrollingElement.scrollWidth > doc.scrollingElement.clientWidth)
|
||
|
+ value += Evo.mailDisplayGetScrollbarHeight();
|
||
|
+
|
||
|
+ // to ignore size change notifications made by itself
|
||
|
+ if (Evo.mailDisplayResizeObserver)
|
||
|
+ Evo.mailDisplayResizeObserver.expectChange++;
|
||
|
+
|
||
|
+ iframe.height = value;
|
||
|
+
|
||
|
+ // update also parent
|
||
|
+ if (iframe.ownerDocument && iframe.ownerDocument.defaultView && iframe.ownerDocument.defaultView.frameElement)
|
||
|
+ Evo.mailDisplaySetIFrameHeightForDocument(iframe.ownerDocument, 10);
|
||
|
+}
|
||
|
+
|
||
|
+Evo.mailDisplayHandleSizeEntries = function(timeStamp)
|
||
|
+{
|
||
|
+ if (!Evo.mailDisplaySizeEntries || !Evo.mailDisplaySizeEntries.length)
|
||
|
+ return;
|
||
|
+
|
||
|
var scrollx = document.defaultView ? document.defaultView.scrollX : -1;
|
||
|
var scrolly = document.defaultView ? document.defaultView.scrollY : -1;
|
||
|
+ var covered = [], ii;
|
||
|
+
|
||
|
+ for (ii = Evo.mailDisplaySizeEntries.length - 1; ii >= 0; ii--) {
|
||
|
+ var entries = Evo.mailDisplaySizeEntries[ii];
|
||
|
+
|
||
|
+ for (const entry of entries) {
|
||
|
+ if (covered.includes(entry.target))
|
||
|
+ continue;
|
||
|
+ covered[covered.length] = entry.target;
|
||
|
|
||
|
- for (const entry of entries) {
|
||
|
- if (entry.target.ownerDocument.defaultView.frameElement && entry.borderBoxSize?.length > 0) {
|
||
|
- var value = entry.borderBoxSize[0].blockSize;
|
||
|
- entry.target.ownerDocument.defaultView.frameElement.height = 10;
|
||
|
- if (value < entry.target.ownerDocument.scrollingElement.scrollHeight)
|
||
|
- value = entry.target.ownerDocument.scrollingElement.scrollHeight;
|
||
|
- if (entry.target.ownerDocument.scrollingElement.scrollWidth > entry.target.ownerDocument.scrollingElement.clientWidth)
|
||
|
- value += Evo.mailDisplayGetScrollbarHeight();
|
||
|
- Evo.mailDisplaySetIFrameHeight(entry.target.ownerDocument.defaultView.frameElement, value,
|
||
|
- entry.target.ownerDocument.scrollingElement.clientWidth, false);
|
||
|
+ if (entry.target.ownerDocument && entry.target.ownerDocument.defaultView &&
|
||
|
+ entry.target.ownerDocument.defaultView.frameElement && entry.borderBoxSize?.length > 0) {
|
||
|
+ Evo.mailDisplaySetIFrameHeightForDocument(entry.target.ownerDocument, entry.borderBoxSize[0].blockSize);
|
||
|
+ }
|
||
|
}
|
||
|
+
|
||
|
+ if (scrollx != -1 && scrolly != -1 && (
|
||
|
+ document.defaultView.scrollX != scrollx ||
|
||
|
+ document.defaultView.scrollY != scrolly))
|
||
|
+ document.defaultView.scrollTo(scrollx, scrolly);
|
||
|
}
|
||
|
|
||
|
- if (scrollx != -1 && scrolly != -1 && (
|
||
|
- document.defaultView.scrollX != scrollx ||
|
||
|
- document.defaultView.scrollY != scrolly))
|
||
|
- document.defaultView.scrollTo(scrollx, scrolly);
|
||
|
+ Evo.mailDisplaySizeEntries = [];
|
||
|
+}
|
||
|
+
|
||
|
+Evo.mailDisplaySizeChanged = function(entries, observer)
|
||
|
+{
|
||
|
+ if (Evo.mailDisplaySizeEntries === undefined) {
|
||
|
+ Evo.mailDisplaySizeEntries = [];
|
||
|
+ }
|
||
|
+ Evo.mailDisplaySizeEntries[Evo.mailDisplaySizeEntries.length] = entries;
|
||
|
+ if (Evo.mailDisplayResizeObserver.expectChange > 0) {
|
||
|
+ Evo.mailDisplayResizeObserver.expectChange--;
|
||
|
+ return;
|
||
|
+ }
|
||
|
+ window.requestAnimationFrame(Evo.mailDisplayHandleSizeEntries);
|
||
|
}
|
||
|
|
||
|
Evo.MailDisplayBindDOM = function(iframe_id, markCitationColor)
|
||
|
{
|
||
|
Evo.markCitationColor = markCitationColor != "" ? markCitationColor : null;
|
||
|
- if (!Evo.mailDisplayResizeObserver)
|
||
|
+ if (!Evo.mailDisplayResizeObserver) {
|
||
|
Evo.mailDisplayResizeObserver = new ResizeObserver(Evo.mailDisplaySizeChanged);
|
||
|
+ Evo.mailDisplayResizeObserver.expectChange = 0;
|
||
|
+ }
|
||
|
|
||
|
var traversar = {
|
||
|
unstyleBlockquotes : function(doc) {
|
||
|
--
|
||
|
GitLab
|
||
|
|