Fix renderSubtreeIntoContainer with non-context-provider parent (#8399)
Ben Alpert committed
Nov 23, 2016 at 14:23 UTC
caa01d498d943f974ea216bfe31ad45bb86982c5
2 files changed
+24
-1
src/addons/__tests__/renderSubtreeIntoContainer-test.js
+19
@@ -196,4 +196,23 @@ describe('renderSubtreeIntoContainer', () => {
196
expect(portal.firstChild.innerHTML).toBe('changed-changed');
197
});
198
199
+ it('should render portal with non-context-provider parent', () => {
200
+ var container = document.createElement('div');
201
+ document.body.appendChild(container);
202
+ var portal = document.createElement('div');
203
+
204
+ class Parent extends React.Component {
205
+ render() {
206
+ return null;
207
+ }
208
+
209
+ componentDidMount() {
210
+ renderSubtreeIntoContainer(this, <div>hello</div>, portal);
211
+ }
212
+ }
213
+
214
+ ReactDOM.render(<Parent bar="initial" />, container);
215
+ expect(portal.firstChild.innerHTML).toBe('hello');
216
+ });
217
+
218
});
src/renderers/shared/fiber/ReactFiberReconciler.js
+5
-1
@@ -19,6 +19,7 @@ import type { PriorityLevel } from 'ReactPriorityLevel';
19
20
var {
21
findCurrentUnmaskedContext,
22
+ isContextProvider,
23
processChildContext,
24
} = require('ReactFiberContext');
25
var { createFiberRoot } = require('ReactFiberRoot');
@@ -91,7 +92,10 @@ export type Reconciler<C, I, TI> = {
92
};
93
94
getContextForSubtree._injectFiber(function(fiber : Fiber) {
94
- return processChildContext(fiber, findCurrentUnmaskedContext(fiber));
95
+ const parentContext = findCurrentUnmaskedContext(fiber);
96
+ return isContextProvider(fiber) ?
97
+ processChildContext(fiber, parentContext) :
98
+ parentContext;
99
});
100
101
module.exports = function<T, P, I, TI, C>(config : HostConfig<T, P, I, TI, C>) : Reconciler<C, I, TI> {