@@ -18,6 +18,7 @@ var forEach;
18
18
var isDefined ;
19
19
var lowercase ;
20
20
var noop ;
21
+ var nodeContains ;
21
22
var htmlParser ;
22
23
var htmlSanitizeWriter ;
23
24
@@ -218,6 +219,11 @@ function $SanitizeProvider() {
218
219
htmlParser = htmlParserImpl ;
219
220
htmlSanitizeWriter = htmlSanitizeWriterImpl ;
220
221
222
+ nodeContains = window . Node . prototype . contains || /** @this */ function ( arg ) {
223
+ // eslint-disable-next-line no-bitwise
224
+ return ! ! ( this . compareDocumentPosition ( arg ) & 16 ) ;
225
+ } ;
226
+
221
227
// Regular Expressions for parsing tags and attributes
222
228
var SURROGATE_PAIR_REGEXP = / [ \uD800 - \uDBFF ] [ \uDC00 - \uDFFF ] / g,
223
229
// Match everything outside of normal chars and " (quote character)
@@ -381,12 +387,12 @@ function $SanitizeProvider() {
381
387
if ( node . nodeType === 1 ) {
382
388
handler . end ( node . nodeName . toLowerCase ( ) ) ;
383
389
}
384
- nextNode = node . nextSibling ;
390
+ nextNode = getNonDescendant ( ' nextSibling' , node ) ;
385
391
if ( ! nextNode ) {
386
392
while ( nextNode == null ) {
387
- node = node . parentNode ;
393
+ node = getNonDescendant ( ' parentNode' , node ) ;
388
394
if ( node === inertBodyElement ) break ;
389
- nextNode = node . nextSibling ;
395
+ nextNode = getNonDescendant ( ' nextSibling' , node ) ;
390
396
if ( node . nodeType === 1 ) {
391
397
handler . end ( node . nodeName . toLowerCase ( ) ) ;
392
398
}
@@ -518,8 +524,17 @@ function $SanitizeProvider() {
518
524
stripCustomNsAttrs ( nextNode ) ;
519
525
}
520
526
521
- node = node . nextSibling ;
527
+ node = getNonDescendant ( 'nextSibling' , node ) ;
528
+ }
529
+ }
530
+
531
+ function getNonDescendant ( propName , node ) {
532
+ // An element is clobbered if its `propName` property points to one of its descendants
533
+ var nextNode = node [ propName ] ;
534
+ if ( nextNode && nodeContains . call ( node , nextNode ) ) {
535
+ throw $sanitizeMinErr ( 'elclob' , 'Failed to sanitize html because the element is clobbered: {0}' , node . outerHTML || node . outerText ) ;
522
536
}
537
+ return nextNode ;
523
538
}
524
539
}
525
540
0 commit comments