1
1
/**
2
2
* conjoon
3
3
* 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
5
5
*
6
6
* Permission is hereby granted, free of charge, to any person
7
7
* obtaining a copy of this software and associated documentation
@@ -98,7 +98,8 @@ Ext.define("conjoon.cn_mail.view.mail.message.reader.MessageViewController", {
98
98
* iframe is currently processing.
99
99
*
100
100
* @param {conjoon.cn_mail.view.mail.message.reader.MessageViewIframe } iframe
101
- * @param {String } src
101
+ * @param {Object } src
102
+ * @param {String } src.srcDoc
102
103
*/
103
104
onBeforeSrcDoc : function ( iframe , src ) {
104
105
const me = this ;
@@ -114,28 +115,50 @@ Ext.define("conjoon.cn_mail.view.mail.message.reader.MessageViewController", {
114
115
* sanitizeImages will only be called if the iframe's getImagesAllowed()-method returns
115
116
* false.
116
117
* 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.
117
119
*
118
120
* @param {conjoon.cn_mail.view.mail.message.reader.MessageViewIframe } iframe
119
121
*
120
122
* @see #sanitizeLinks
121
123
* @see #sanitizeImages
122
124
*/
123
- onIframeLoad : function ( iframe ) {
125
+ onIframeLoad ( iframe ) {
124
126
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
126
145
view = me . getView ( ) ,
127
146
vm = view . getViewModel ( ) ,
128
147
body = iframe . getBody ( ) ,
129
148
cnt = view . down ( "#msgBodyContainer" ) ,
130
- bars = Ext . getScrollbarSize ( ) ;
149
+ bars = Ext . getScrollbarSize ( ) ,
150
+ viewerWindow = iframe . cn_iframeEl . dom . contentWindow ;
131
151
132
- me . sanitizeLinks ( iframe . cn_iframeEl . dom . contentWindow . document . getElementsByTagName ( "a" ) ) ;
152
+ const imgs = viewerWindow . document . getElementsByTagName ( "img" ) ;
133
153
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" ) ) ;
136
159
137
160
if ( ! iframe . getImagesAllowed ( ) ) {
138
- me . sanitizeImages ( imgs ) ;
161
+ imgs . length && me . sanitizeImages ( imgs ) ;
139
162
}
140
163
141
164
cnt . setScrollY ( 0 ) ;
@@ -146,6 +169,8 @@ Ext.define("conjoon.cn_mail.view.mail.message.reader.MessageViewController", {
146
169
147
170
iframe . setSize ( cnt . getWidth ( ) - bars . width , cnt . getHeight ( ) - bars . height ) ;
148
171
iframe . setSize ( body . scrollWidth , body . scrollHeight ) ;
172
+
173
+ return true ;
149
174
} ,
150
175
151
176
@@ -215,12 +240,14 @@ Ext.define("conjoon.cn_mail.view.mail.message.reader.MessageViewController", {
215
240
* - the images border ist set to 1px solid black
216
241
* - the images src is set to img_block.png out of this package's resource path
217
242
*
218
- * @param {Array } an array of HTMLElements representing links (<a>).
243
+ * @param {Array } elements array of HTMLElements representing links (<a>).
219
244
*
220
245
* @private
221
246
*/
222
247
sanitizeImages : function ( elements ) {
223
248
249
+ const me = this ;
250
+
224
251
let img , i , len = elements . length ;
225
252
226
253
for ( i = 0 ; i < len ; i ++ ) {
@@ -230,13 +257,41 @@ Ext.define("conjoon.cn_mail.view.mail.message.reader.MessageViewController", {
230
257
// isolated tests will not have resources property set
231
258
img . setAttribute (
232
259
"src" ,
233
- coon . core . Environment . getPathForResource ( "resources/images/img_block.png" , "extjs-app-webmail" )
260
+ me . getProxyImage ( )
234
261
) ;
235
262
236
263
}
237
264
} ,
238
265
239
266
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
+
240
295
/**
241
296
* @private
242
297
*/
0 commit comments