11
11
12
12
'use strict' ;
13
13
14
+ var {
15
+ Namespaces,
16
+ getIntrinsicNamespace,
17
+ getChildNamespace,
18
+ } = require ( 'DOMNamespaces' ) ;
14
19
var DOMMarkupOperations = require ( 'DOMMarkupOperations' ) ;
15
20
var React = require ( 'react' ) ;
16
21
var ReactControlledValuePropTypes = require ( 'ReactControlledValuePropTypes' ) ;
@@ -443,6 +448,9 @@ class ReactDOMServerRenderer {
443
448
constructor ( element , makeStaticMarkup ) {
444
449
var children = React . isValidElement ( element ) ? [ element ] : toArray ( element ) ;
445
450
var topFrame = {
451
+ // Assume all trees start in the HTML namespace (not totally true, but
452
+ // this is what we did historically)
453
+ domNamespace : Namespaces . html ,
446
454
children,
447
455
childIndex : 0 ,
448
456
context : emptyObject ,
@@ -483,7 +491,7 @@ class ReactDOMServerRenderer {
483
491
if ( __DEV__ ) {
484
492
setCurrentDebugStack ( this . stack ) ;
485
493
}
486
- out += this . render ( child , frame . context ) ;
494
+ out += this . render ( child , frame . context , frame . domNamespace ) ;
487
495
if ( __DEV__ ) {
488
496
// TODO: Handle reentrant server render calls. This doesn't.
489
497
resetCurrentDebugStack ( ) ;
@@ -492,7 +500,7 @@ class ReactDOMServerRenderer {
492
500
return out ;
493
501
}
494
502
495
- render ( child , context ) {
503
+ render ( child , context , parentNamespace ) {
496
504
if ( typeof child === 'string' || typeof child === 'number' ) {
497
505
var text = '' + child ;
498
506
if ( text === '' ) {
@@ -512,10 +520,11 @@ class ReactDOMServerRenderer {
512
520
return '' ;
513
521
} else {
514
522
if ( React . isValidElement ( child ) ) {
515
- return this . renderDOM ( child , context ) ;
523
+ return this . renderDOM ( child , context , parentNamespace ) ;
516
524
} else {
517
525
var children = toArray ( child ) ;
518
526
var frame = {
527
+ domNamespace : parentNamespace ,
519
528
children,
520
529
childIndex : 0 ,
521
530
context : context ,
@@ -531,16 +540,25 @@ class ReactDOMServerRenderer {
531
540
}
532
541
}
533
542
534
- renderDOM ( element , context ) {
543
+ renderDOM ( element , context , parentNamespace ) {
535
544
var tag = element . type . toLowerCase ( ) ;
536
545
546
+ let namespace = parentNamespace ;
547
+ if ( parentNamespace === Namespaces . html ) {
548
+ namespace = getIntrinsicNamespace ( tag ) ;
549
+ }
550
+
537
551
if ( __DEV__ ) {
538
- warning (
539
- tag === element . type ,
540
- '<%s /> is using uppercase HTML. Always use lowercase HTML tags ' +
541
- 'in React.' ,
542
- element . type ,
543
- ) ;
552
+ if ( namespace === Namespaces . html ) {
553
+ // Should this check be gated by parent namespace? Not sure we want to
554
+ // allow <SVG> or <mATH>.
555
+ warning (
556
+ tag === element . type ,
557
+ '<%s /> is using uppercase HTML. Always use lowercase HTML tags ' +
558
+ 'in React.' ,
559
+ element . type ,
560
+ ) ;
561
+ }
544
562
}
545
563
546
564
validateDangerousTag ( tag ) ;
@@ -801,6 +819,7 @@ class ReactDOMServerRenderer {
801
819
children = toArray ( props . children ) ;
802
820
}
803
821
var frame = {
822
+ domNamespace : getChildNamespace ( parentNamespace , element . type ) ,
804
823
tag,
805
824
children,
806
825
childIndex : 0 ,
0 commit comments