From 551ef152767b05ded87c57110bea3d51a5706567 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 8 Apr 2025 13:35:03 +0700 Subject: [PATCH] TF-3622 Fix deformed inlined image Signed-off-by: dab246 --- .../dom/image_transformers.dart | 22 +-- .../html_content_viewer_on_web_widget.dart | 5 +- .../html_content_viewer_widget.dart | 13 +- core/lib/utils/html/html_interaction.dart | 140 ++++++++++++++++++ 4 files changed, 158 insertions(+), 22 deletions(-) diff --git a/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart b/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart index 140df0bed..9dfab79a6 100644 --- a/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart +++ b/core/lib/presentation/utils/html_transformer/dom/image_transformers.dart @@ -27,24 +27,11 @@ class ImageTransformer extends DomTransformer { if (imageElements.isEmpty) return; await Future.wait(imageElements.map((imageElement) async { - var exStyle = imageElement.attributes['style']; - if (exStyle != null) { - if (!exStyle.trim().endsWith(';')) { - exStyle = '$exStyle;'; - } - if (!exStyle.contains('display')) { - exStyle = '$exStyle display:inline;'; - } - if (!exStyle.contains('max-width')) { - exStyle = '$exStyle max-width:100%;'; - } - imageElement.attributes['style'] = exStyle; - } else { - imageElement.attributes['style'] = 'display:inline;max-width:100%;'; - } final src = imageElement.attributes['src']; if (src == null) return; + + final id = imageElement.attributes['id'] ?? ''; final mimeType = imageElement.attributes['data-mimetype']; if (src.startsWith('cid:') && mapUrlDownloadCID != null) { final imageBase64 = await _convertCidToBase64Image( @@ -54,7 +41,10 @@ class ImageTransformer extends DomTransformer { mimeType: mimeType, ); imageElement.attributes['src'] = imageBase64 ?? src; - imageElement.attributes['id'] ??= src; + + if (!id.startsWith('cid:')) { + imageElement.attributes['id'] = src; + } } else if (src.startsWith('https://') || src.startsWith('http://')) { if (!imageElement.attributes.containsKey('loading')) { imageElement.attributes['loading'] = 'lazy'; diff --git a/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart b/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart index 8de4c04e9..7b4ab27cf 100644 --- a/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart +++ b/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart @@ -267,7 +267,10 @@ class _HtmlContentViewerOnWebState extends State { minHeight: minHeight, minWidth: _minWidth, styleCSS: HtmlTemplate.tooltipLinkCss, - javaScripts: webViewActionScripts + scriptsDisableZoom + HtmlInteraction.scriptsHandleLazyLoadingBackgroundImage, + javaScripts: webViewActionScripts + + scriptsDisableZoom + + HtmlInteraction.scriptsHandleLazyLoadingBackgroundImage + + HtmlInteraction.generateNormalizeImageScript(widget.widthContent), direction: widget.direction, contentPadding: widget.contentPadding, useDefaultFont: widget.useDefaultFont, diff --git a/core/lib/presentation/views/html_viewer/html_content_viewer_widget.dart b/core/lib/presentation/views/html_viewer/html_content_viewer_widget.dart index 0fc9fe109..b4d3514c8 100644 --- a/core/lib/presentation/views/html_viewer/html_content_viewer_widget.dart +++ b/core/lib/presentation/views/html_viewer/html_content_viewer_widget.dart @@ -68,7 +68,7 @@ class _HtmlContentViewState extends State { late InAppWebViewController _webViewController; late double _actualHeight; late Set> _gestureRecognizers; - late String _customScripts; + late StringBuffer _customScriptsBuilder; final _loadingBarNotifier = ValueNotifier(true); @@ -92,10 +92,13 @@ class _HtmlContentViewState extends State { Factory(() => LongPressGestureRecognizer(duration: _longPressGestureDurationIOS)), }; } + _customScriptsBuilder = StringBuffer(); + _customScriptsBuilder.write(HtmlInteraction.scriptsHandleLazyLoadingBackgroundImage); + if (widget.initialWidth != null) { + _customScriptsBuilder.write(HtmlInteraction.generateNormalizeImageScript(widget.initialWidth!)); + } if (PlatformInfo.isAndroid) { - _customScripts = HtmlInteraction.scriptsHandleLazyLoadingBackgroundImage + HtmlInteraction.scriptsHandleContentSizeChanged; - } else { - _customScripts = HtmlInteraction.scriptsHandleLazyLoadingBackgroundImage; + _customScriptsBuilder.write(HtmlInteraction.scriptsHandleContentSizeChanged); } _initialData(); } @@ -115,7 +118,7 @@ class _HtmlContentViewState extends State { _htmlData = HtmlUtils.generateHtmlDocument( content: widget.contentHtml, direction: widget.direction, - javaScripts: _customScripts, + javaScripts: _customScriptsBuilder.toString(), contentPadding: widget.contentPadding, useDefaultFont: widget.useDefaultFont, ); diff --git a/core/lib/utils/html/html_interaction.dart b/core/lib/utils/html/html_interaction.dart index 176375aa3..cc51c5b3f 100644 --- a/core/lib/utils/html/html_interaction.dart +++ b/core/lib/utils/html/html_interaction.dart @@ -99,4 +99,144 @@ class HtmlInteraction { }; '''; + + static String generateNormalizeImageScript(double displayWidth) { + return ''' + + '''; + } } \ No newline at end of file