11/**
22 * conjoon
33 * extjs-app-webmail
4- * Copyright (C) 2019-2022 Thorsten Suckow-Homberg https://github.com/conjoon/extjs-app-webmail
4+ * Copyright (C) 2019-2023 Thorsten Suckow-Homberg https://github.com/conjoon/extjs-app-webmail
55 *
66 * Permission is hereby granted, free of charge, to any person
77 * obtaining a copy of this software and associated documentation
@@ -98,7 +98,8 @@ Ext.define("conjoon.cn_mail.view.mail.message.reader.MessageViewController", {
9898 * iframe is currently processing.
9999 *
100100 * @param {conjoon.cn_mail.view.mail.message.reader.MessageViewIframe } iframe
101- * @param {String } src
101+ * @param {Object } src
102+ * @param {String } src.srcDoc
102103 */
103104 onBeforeSrcDoc : function ( iframe , src ) {
104105 const me = this ;
@@ -114,28 +115,50 @@ Ext.define("conjoon.cn_mail.view.mail.message.reader.MessageViewController", {
114115 * sanitizeImages will only be called if the iframe's getImagesAllowed()-method returns
115116 * false.
116117 * Will set the viewodel's hasImages if any images where detected in the message's html.
118+ * If the method requires check for css images, the srcDoc of the iframe will be updated.
117119 *
118120 * @param {conjoon.cn_mail.view.mail.message.reader.MessageViewIframe } iframe
119121 *
120122 * @see #sanitizeLinks
121123 * @see #sanitizeImages
122124 */
123- onIframeLoad : function ( iframe ) {
125+ onIframeLoad ( iframe ) {
124126
125- const me = this ,
127+ const me = this ;
128+
129+ me . cssImageCheck = me . cssImageCheck || { } ;
130+
131+ // will only step into this method if the check was not finished,
132+ // to prevent recursion because of setSrcDoc and the load-event
133+ // associated with it, this method will return and be recalled
134+ // once setSrcDoc was updated.
135+ if ( ! me . cssImageCheck . finished && ! iframe . getImagesAllowed ( ) ) {
136+ let result = me . sanitizeCssImages ( ) ;
137+ me . cssImageCheck . finished = true ;
138+ me . cssImageCheck . result = result ;
139+ if ( result ) {
140+ return me . cssImageCheck ;
141+ }
142+ }
143+
144+ const
126145 view = me . getView ( ) ,
127146 vm = view . getViewModel ( ) ,
128147 body = iframe . getBody ( ) ,
129148 cnt = view . down ( "#msgBodyContainer" ) ,
130- bars = Ext . getScrollbarSize ( ) ;
149+ bars = Ext . getScrollbarSize ( ) ,
150+ viewerWindow = iframe . cn_iframeEl . dom . contentWindow ;
131151
132- me . sanitizeLinks ( iframe . cn_iframeEl . dom . contentWindow . document . getElementsByTagName ( "a" ) ) ;
152+ const imgs = viewerWindow . document . getElementsByTagName ( "img" ) ;
133153
134- let imgs = iframe . cn_iframeEl . dom . contentWindow . document . getElementsByTagName ( "img" ) ;
135- vm . set ( "hasImages" , imgs . length > 0 ) ;
154+ vm . set ( "hasImages" , me . cssImageCheck . result === true || imgs . length > 0 ) ;
155+
156+ me . cssImageCheck = { } ;
157+
158+ me . sanitizeLinks ( viewerWindow . document . getElementsByTagName ( "a" ) ) ;
136159
137160 if ( ! iframe . getImagesAllowed ( ) ) {
138- me . sanitizeImages ( imgs ) ;
161+ imgs . length && me . sanitizeImages ( imgs ) ;
139162 }
140163
141164 cnt . setScrollY ( 0 ) ;
@@ -146,6 +169,8 @@ Ext.define("conjoon.cn_mail.view.mail.message.reader.MessageViewController", {
146169
147170 iframe . setSize ( cnt . getWidth ( ) - bars . width , cnt . getHeight ( ) - bars . height ) ;
148171 iframe . setSize ( body . scrollWidth , body . scrollHeight ) ;
172+
173+ return true ;
149174 } ,
150175
151176
@@ -215,12 +240,14 @@ Ext.define("conjoon.cn_mail.view.mail.message.reader.MessageViewController", {
215240 * - the images border ist set to 1px solid black
216241 * - the images src is set to img_block.png out of this package's resource path
217242 *
218- * @param {Array } an array of HTMLElements representing links (<a>).
243+ * @param {Array } elements array of HTMLElements representing links (<a>).
219244 *
220245 * @private
221246 */
222247 sanitizeImages : function ( elements ) {
223248
249+ const me = this ;
250+
224251 let img , i , len = elements . length ;
225252
226253 for ( i = 0 ; i < len ; i ++ ) {
@@ -230,13 +257,41 @@ Ext.define("conjoon.cn_mail.view.mail.message.reader.MessageViewController", {
230257 // isolated tests will not have resources property set
231258 img . setAttribute (
232259 "src" ,
233- coon . core . Environment . getPathForResource ( "resources/images/img_block.png" , "extjs-app-webmail" )
260+ me . getProxyImage ( )
234261 ) ;
235262
236263 }
237264 } ,
238265
239266
267+ getCssImages ( viewerWindow ) {
268+ return viewerWindow . performance . getEntriesByType ( "resource" ) . filter (
269+ resource => [ "css" ] . includes ( resource . initiatorType )
270+ ) . map ( resource => resource . name ) ;
271+ } ,
272+
273+
274+ sanitizeCssImages ( ) {
275+
276+ const
277+ me = this ,
278+ iframe = me . getIframe ( ) ,
279+ cssImgs = me . getCssImages ( iframe . cn_iframeEl . dom . contentWindow ) ;
280+
281+ if ( cssImgs . length ) {
282+ let srcDoc = iframe . getSrcDoc ( ) ;
283+ srcDoc = l8 . replace ( cssImgs , me . getProxyImage ( ) , srcDoc , "gmi" ) ;
284+ iframe . setSrcDoc ( srcDoc , false ) ;
285+ return true ;
286+ }
287+
288+ return false ;
289+ } ,
290+
291+ getProxyImage ( ) {
292+ return coon . core . Environment . getPathForResource ( "resources/images/img_block.png" , "extjs-app-webmail" ) ;
293+ } ,
294+
240295 /**
241296 * @private
242297 */
0 commit comments