Skip to content

Commit a160f3e

Browse files
kenotronsophiebits
authored andcommitted
Fixes #9667: Updated createTextInstance to create the text node on correct document (#10723)
1 parent cdfbe6b commit a160f3e

File tree

3 files changed

+49
-5
lines changed

3 files changed

+49
-5
lines changed

src/renderers/dom/fiber/ReactDOMFiberComponent.js

+17-4
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,14 @@ function ensureListeningTo(rootContainerElement, registrationName) {
157157
listenTo(registrationName, doc);
158158
}
159159

160+
function getOwnerDocumentFromRootContainer(
161+
rootContainerElement: Element | Document,
162+
): Document {
163+
return rootContainerElement.nodeType === DOCUMENT_NODE
164+
? (rootContainerElement: any)
165+
: rootContainerElement.ownerDocument;
166+
}
167+
160168
// There are so many media events, it makes sense to just
161169
// maintain a list rather than create a `trapBubbledEvent` for each
162170
var mediaEvents = {
@@ -296,10 +304,9 @@ var ReactDOMFiberComponent = {
296304
): Element {
297305
// We create tags in the namespace of their parent container, except HTML
298306
// tags get no namespace.
299-
var ownerDocument: Document = rootContainerElement.nodeType ===
300-
DOCUMENT_NODE
301-
? (rootContainerElement: any)
302-
: rootContainerElement.ownerDocument;
307+
var ownerDocument: Document = getOwnerDocumentFromRootContainer(
308+
rootContainerElement,
309+
);
303310
var domElement: Element;
304311
var namespaceURI = parentNamespace;
305312
if (namespaceURI === HTML_NAMESPACE) {
@@ -362,6 +369,12 @@ var ReactDOMFiberComponent = {
362369
return domElement;
363370
},
364371

372+
createTextNode(text: string, rootContainerElement: Element | Document): Text {
373+
return getOwnerDocumentFromRootContainer(
374+
rootContainerElement,
375+
).createTextNode(text);
376+
},
377+
365378
setInitialProperties(
366379
domElement: Element,
367380
tag: string,

src/renderers/dom/fiber/ReactDOMFiberEntry.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ var invariant = require('fbjs/lib/invariant');
4646
var {getChildNamespace} = DOMNamespaces;
4747
var {
4848
createElement,
49+
createTextNode,
4950
setInitialProperties,
5051
diffProperties,
5152
updateProperties,
@@ -368,7 +369,7 @@ var DOMRenderer = ReactFiberReconciler({
368369
const hostContextDev = ((hostContext: any): HostContextDev);
369370
validateDOMNesting(null, text, null, hostContextDev.ancestorInfo);
370371
}
371-
var textNode: TextInstance = document.createTextNode(text);
372+
var textNode: TextInstance = createTextNode(text, rootContainerInstance);
372373
precacheFiberNode(internalInstanceHandle, textNode);
373374
return textNode;
374375
},

src/renderers/dom/fiber/__tests__/ReactDOMFiber-test.js

+30
Original file line numberDiff line numberDiff line change
@@ -1117,5 +1117,35 @@ describe('ReactDOMFiber', () => {
11171117
'to empty a container.',
11181118
);
11191119
});
1120+
1121+
it('should render a text component with a text DOM node on the same document as the container', () => {
1122+
// 1. Create a new document through the use of iframe
1123+
// 2. Set up the spy to make asserts when a text component
1124+
// is rendered inside the iframe container
1125+
var textContent = 'Hello world';
1126+
var iframe = document.createElement('iframe');
1127+
document.body.appendChild(iframe);
1128+
var iframeDocument = iframe.contentDocument;
1129+
iframeDocument.write(
1130+
'<!DOCTYPE html><html><head></head><body><div></div></body></html>',
1131+
);
1132+
iframeDocument.close();
1133+
var iframeContainer = iframeDocument.body.firstChild;
1134+
1135+
var actualDocument;
1136+
var textNode;
1137+
1138+
spyOn(iframeContainer, 'appendChild').and.callFake(node => {
1139+
actualDocument = node.ownerDocument;
1140+
textNode = node;
1141+
});
1142+
1143+
ReactDOM.render(textContent, iframeContainer);
1144+
1145+
expect(textNode.textContent).toBe(textContent);
1146+
expect(actualDocument).not.toBe(document);
1147+
expect(actualDocument).toBe(iframeDocument);
1148+
expect(iframeContainer.appendChild).toHaveBeenCalledTimes(1);
1149+
});
11201150
}
11211151
});

0 commit comments

Comments
 (0)