@@ -798,24 +798,37 @@ export function appendChildToContainer(
798798 container : Container ,
799799 child : Instance | TextInstance ,
800800) : void {
801- let parentNode ;
802- if ( container . nodeType === COMMENT_NODE ) {
803- parentNode = ( container . parentNode : any ) ;
804- if ( supportsMoveBefore ) {
805- // $FlowFixMe[prop-missing]: We've checked this with supportsMoveBefore.
806- parentNode . moveBefore ( child , container ) ;
807- } else {
808- parentNode . insertBefore ( child , container ) ;
801+ let parentNode : Document | Element ;
802+ switch ( container . nodeType ) {
803+ case COMMENT_NODE : {
804+ parentNode = ( container . parentNode : any ) ;
805+ if ( supportsMoveBefore ) {
806+ // $FlowFixMe[prop-missing]: We've checked this with supportsMoveBefore.
807+ parentNode . moveBefore ( child , container ) ;
808+ } else {
809+ parentNode . insertBefore ( child , container ) ;
810+ }
811+ return ;
809812 }
810- } else {
811- parentNode = container ;
812- if ( supportsMoveBefore ) {
813- // $FlowFixMe[prop-missing]: We've checked this with supportsMoveBefore.
814- parentNode . moveBefore ( child , null) ;
815- } else {
816- parentNode . appendChild ( child ) ;
813+ case DOCUMENT_NODE : {
814+ parentNode = ( container : any ) . body ;
815+ break ;
817816 }
817+ default : {
818+ if ( container . nodeName === 'HTML' ) {
819+ parentNode = ( container . ownerDocument . body : any ) ;
820+ } else {
821+ parentNode = ( container : any ) ;
822+ }
823+ }
824+ }
825+ if ( supportsMoveBefore ) {
826+ // $FlowFixMe[prop-missing]: We've checked this with supportsMoveBefore.
827+ parentNode . moveBefore ( child , null ) ;
828+ } else {
829+ parentNode . appendChild ( child ) ;
818830 }
831+
819832 // This container might be used for a portal.
820833 // If something inside a portal is clicked, that click should bubble
821834 // through the React tree. However, on Mobile Safari the click would
@@ -852,21 +865,35 @@ export function insertInContainerBefore(
852865 child : Instance | TextInstance ,
853866 beforeChild : Instance | TextInstance | SuspenseInstance ,
854867) : void {
855- if ( container . nodeType === COMMENT_NODE ) {
856- if ( supportsMoveBefore ) {
857- // $FlowFixMe[prop-missing]: We've checked this with supportsMoveBefore.
858- ( container . parentNode : any ) . moveBefore ( child , beforeChild ) ;
859- } else {
860- ( container . parentNode : any ) . insertBefore ( child , beforeChild ) ;
868+ let parentNode : Document | Element ;
869+ switch ( container . nodeType ) {
870+ case COMMENT_NODE : {
871+ parentNode = ( container . parentNode : any ) ;
872+ break ;
861873 }
862- } else {
863- if ( supportsMoveBefore ) {
864- // $FlowFixMe[prop-missing]: We've checked this with supportsMoveBefore.
865- container . moveBefore ( child , beforeChild) ;
866- } else {
867- container . insertBefore ( child , beforeChild ) ;
874+ case DOCUMENT_NODE : {
875+ const ownerDocument : Document = ( container : any ) ;
876+ parentNode = ( ownerDocument . body : any ) ;
877+ break ;
878+ }
879+ default : {
880+ if ( container . nodeName === 'HTML' ) {
881+ parentNode = ( container . ownerDocument . body : any ) ;
882+ } else {
883+ parentNode = ( container : any ) ;
884+ }
868885 }
869886 }
887+ if ( supportsMoveBefore ) {
888+ // $FlowFixMe[prop-missing]: We've checked this with supportsMoveBefore.
889+ parentNode . moveBefore ( child , beforeChild ) ;
890+ } else {
891+ parentNode . insertBefore ( child , beforeChild ) ;
892+ }
893+ }
894+
895+ export function isSingletonScope ( type : string ) : boolean {
896+ return type === 'head' ;
870897}
871898
872899function createEvent ( type : DOMEventName , bubbles : boolean ) : Event {
@@ -912,11 +939,22 @@ export function removeChildFromContainer(
912939 container : Container ,
913940 child : Instance | TextInstance | SuspenseInstance ,
914941) : void {
915- if ( container . nodeType === COMMENT_NODE ) {
916- ( container . parentNode : any ) . removeChild ( child ) ;
917- } else {
918- container . removeChild ( child ) ;
942+ let parentNode : Document | Element ;
943+ switch ( container . nodeType ) {
944+ case COMMENT_NODE :
945+ parentNode = ( container . parentNode : any ) ;
946+ break ;
947+ case DOCUMENT_NODE:
948+ parentNode = ( container : any ) . body ;
949+ break ;
950+ default:
951+ if ( container . nodeName === 'HTML' ) {
952+ parentNode = ( container . ownerDocument . body : any ) ;
953+ } else {
954+ parentNode = ( container : any ) ;
955+ }
919956 }
957+ parentNode . removeChild ( child ) ;
920958}
921959
922960export function clearSuspenseBoundary (
@@ -964,10 +1002,15 @@ export function clearSuspenseBoundaryFromContainer(
9641002) : void {
9651003 if ( container . nodeType === COMMENT_NODE ) {
9661004 clearSuspenseBoundary ( ( container . parentNode : any ) , suspenseInstance ) ;
967- } else if ( container . nodeType === ELEMENT_NODE ) {
968- clearSuspenseBoundary ( ( container : any ) , suspenseInstance ) ;
1005+ } else if ( container . nodeType === DOCUMENT_NODE ) {
1006+ clearSuspenseBoundary ( ( container : any ) . body , suspenseInstance ) ;
1007+ } else if ( container . nodeName === 'HTML' ) {
1008+ clearSuspenseBoundary (
1009+ ( container . ownerDocument . body : any ) ,
1010+ suspenseInstance ,
1011+ ) ;
9691012 } else {
970- // Document nodes should never contain suspense boundaries.
1013+ clearSuspenseBoundary ( ( container : any ) , suspenseInstance ) ;
9711014 }
9721015 // Retry if any event replaying was blocked on this.
9731016 retryIfBlockedOn ( container ) ;
@@ -2297,30 +2340,6 @@ export function releaseSingletonInstance(instance: Instance): void {
22972340 detachDeletedInstance ( instance ) ;
22982341}
22992342
2300- export function clearSingleton ( instance : Instance ) : void {
2301- const element : Element = ( instance : any ) ;
2302- let node = element . firstChild ;
2303- while ( node ) {
2304- const nextNode = node . nextSibling ;
2305- const nodeName = node . nodeName ;
2306- if (
2307- isMarkedHoistable ( node ) ||
2308- nodeName === 'HEAD' ||
2309- nodeName === 'BODY' ||
2310- nodeName === 'SCRIPT' ||
2311- nodeName === 'STYLE' ||
2312- ( nodeName === 'LINK' &&
2313- ( ( node : any ) : HTMLLinkElement ) . rel . toLowerCase ( ) === 'stylesheet' )
2314- ) {
2315- // retain these nodes
2316- } else {
2317- element . removeChild ( node ) ;
2318- }
2319- node = nextNode ;
2320- }
2321- return ;
2322- }
2323-
23242343// -------------------
23252344// Resources
23262345// -------------------
0 commit comments