@samitouri / QOS-React-2 / commits / b1384062d2

Move AsyncUpdates flag check to class-only path (#9570)

Andrew Clark committed May 1, 2017 at 13:23 UTC b1384062d2e7014a6c4a7d27c229846c07f9055c
3 files changed +32 -23
src/renderers/dom/fiber/__tests__/ReactDOMFiberAsync-test.js
+20 -12
@@ -25,10 +25,12 @@ describe('ReactDOMFiberAsync', () => {
25
26 if (ReactDOMFeatureFlags.useFiber) {
27 it('renders synchronously when feature flag is disabled', () => {
28 - function Async(props) {
29 - return props.children;
28 + class Async extends React.Component {
29 + static unstable_asyncUpdates = true;
30 + render() {
31 + return this.props.children;
32 + }
33 }
31 - Async.unstable_asyncUpdates = true;
34 ReactDOM.render(<Async><div>Hi</div></Async>, container);
35 expect(container.textContent).toEqual('Hi');
36
@@ -46,10 +48,12 @@ describe('ReactDOMFiberAsync', () => {
48 });
49
50 it('unstable_asyncUpdates at the root makes the entire tree async', () => {
49 - function Async(props) {
50 - return props.children;
51 + class Async extends React.Component {
52 + static unstable_asyncUpdates = true;
53 + render() {
54 + return this.props.children;
55 + }
56 }
52 - Async.unstable_asyncUpdates = true;
57 ReactDOM.render(<Async><div>Hi</div></Async>, container);
58 expect(container.textContent).toEqual('');
59 jest.runAllTimers();
@@ -62,10 +66,12 @@ describe('ReactDOMFiberAsync', () => {
66 });
67
68 it('updates inside an async tree are async by default', () => {
65 - function Async(props) {
66 - return props.children;
69 + class Async extends React.Component {
70 + static unstable_asyncUpdates = true;
71 + render() {
72 + return this.props.children;
73 + }
74 }
68 - Async.unstable_asyncUpdates = true;
75
76 let instance;
77 class Component extends React.Component {
@@ -108,10 +114,12 @@ describe('ReactDOMFiberAsync', () => {
114 });
115
116 it('updates inside an async subtree are async by default', () => {
111 - function Component(props) {
112 - return <Child />;
117 + class Component extends React.Component {
118 + static unstable_asyncUpdates = true;
119 + render() {
120 + return <Child />;
121 + }
122 }
114 - Component.unstable_asyncUpdates = true;
123
124 let instance;
125 class Child extends React.Component {
src/renderers/shared/fiber/ReactFiber.js
+1 -11
@@ -23,8 +23,6 @@ import type {TypeOfSideEffect} from 'ReactTypeOfSideEffect';
23 import type {PriorityLevel} from 'ReactPriorityLevel';
24 import type {UpdateQueue} from 'ReactFiberUpdateQueue';
25
26 -var ReactFeatureFlags = require('ReactFeatureFlags');
27 -
26 var {
27 IndeterminateComponent,
28 ClassComponent,
@@ -39,7 +37,7 @@ var {
37
38 var {NoWork} = require('ReactPriorityLevel');
39
42 -var {NoContext, AsyncUpdates} = require('ReactTypeOfInternalContext');
40 +var {NoContext} = require('ReactTypeOfInternalContext');
41
42 var {NoEffect} = require('ReactTypeOfSideEffect');
43
@@ -383,14 +381,6 @@ function createFiberFromElementType(
381 internalContextTag: TypeOfInternalContext,
382 debugOwner: null | Fiber | ReactInstance,
383 ): Fiber {
386 - if (
387 - ReactFeatureFlags.enableAsyncSubtreeAPI &&
388 - type != null &&
389 - (type: any).unstable_asyncUpdates === true
390 - ) {
391 - internalContextTag |= AsyncUpdates;
392 - }
393 -
384 let fiber;
385 if (typeof type === 'function') {
386 fiber = shouldConstruct(type)
src/renderers/shared/fiber/ReactFiberClassComponent.js
+11
@@ -17,6 +17,9 @@ import type {PriorityLevel} from 'ReactPriorityLevel';
17
18 var {Update} = require('ReactTypeOfSideEffect');
19
20 +var ReactFeatureFlags = require('ReactFeatureFlags');
21 +var {AsyncUpdates} = require('ReactTypeOfInternalContext');
22 +
23 var {
24 cacheContext,
25 getMaskedContext,
@@ -325,6 +328,14 @@ module.exports = function(
328 instance.refs = emptyObject;
329 instance.context = getMaskedContext(workInProgress, unmaskedContext);
330
331 + if (
332 + ReactFeatureFlags.enableAsyncSubtreeAPI &&
333 + workInProgress.type != null &&
334 + workInProgress.type.unstable_asyncUpdates === true
335 + ) {
336 + workInProgress.internalContextTag |= AsyncUpdates;
337 + }
338 +
339 if (typeof instance.componentWillMount === 'function') {
340 if (__DEV__) {
341 startPhaseTimer(workInProgress, 'componentWillMount');