Finish ReactGenericBatching (#8405)
Ben Alpert committed
Nov 23, 2016 at 17:40 UTC
8791325db03725ef4801fc58b35a3bb4486a8904
6 files changed
+20
-20
scripts/fiber/tests-failing.txt
+2
-2
@@ -42,8 +42,8 @@ src/renderers/dom/shared/__tests__/ReactDOMTextComponent-test.js
42
* can reconcile text arbitrarily split into multiple nodes
43
* can reconcile text arbitrarily split into multiple nodes on some substitutions only
44
45
-src/renderers/dom/shared/__tests__/ReactEventListener-test.js
46
-* should batch between handlers from different roots
45
+src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js
46
+* should control a value in reentrant events
47
48
src/renderers/dom/stack/client/__tests__/ReactDOM-test.js
49
* throws in render() if the mount callback is not a function
scripts/fiber/tests-passing.txt
+1
-1
@@ -648,6 +648,7 @@ src/renderers/dom/shared/__tests__/ReactEventListener-test.js
648
* should propagate events one level down
649
* should propagate events two levels down
650
* should not get confused by disappearing elements
651
+* should batch between handlers from different roots
652
* should not fire duplicate events for a React DOM tree
653
654
src/renderers/dom/shared/__tests__/escapeTextContentForBrowser-test.js
@@ -812,7 +813,6 @@ src/renderers/dom/shared/wrappers/__tests__/ReactDOMIframe-test.js
813
814
src/renderers/dom/shared/wrappers/__tests__/ReactDOMInput-test.js
815
* should properly control a value even if no event listener exists
815
-* should control a value in reentrant events
816
* should control values in reentrant events with different targets
817
* should display `defaultValue` of number 0
818
* only assigns defaultValue if it changes
src/renderers/dom/ReactDOM.js
+2
-2
@@ -16,9 +16,9 @@
16
var ReactDOMComponentTree = require('ReactDOMComponentTree');
17
var ReactDOMInjection = require('ReactDOMInjection');
18
var ReactDOMStackInjection = require('ReactDOMStackInjection');
19
+var ReactGenericBatching = require('ReactGenericBatching');
20
var ReactMount = require('ReactMount');
21
var ReactReconciler = require('ReactReconciler');
21
-var ReactUpdates = require('ReactUpdates');
22
var ReactVersion = require('ReactVersion');
23
24
var findDOMNode = require('findDOMNode');
@@ -35,7 +35,7 @@ var ReactDOM = {
35
version: ReactVersion,
36
37
/* eslint-disable camelcase */
38
- unstable_batchedUpdates: ReactUpdates.batchedUpdates,
38
+ unstable_batchedUpdates: ReactGenericBatching.batchedUpdates,
39
unstable_renderSubtreeIntoContainer: ReactMount.renderSubtreeIntoContainer,
40
/* eslint-enable camelcase */
41
};
src/renderers/dom/fiber/ReactDOMFiber.js
+4
-3
@@ -22,6 +22,7 @@ var ReactDOMComponentTree = require('ReactDOMComponentTree');
22
var ReactDOMFeatureFlags = require('ReactDOMFeatureFlags');
23
var ReactDOMFiberComponent = require('ReactDOMFiberComponent');
24
var ReactDOMInjection = require('ReactDOMInjection');
25
+var ReactGenericBatching = require('ReactGenericBatching');
26
var ReactFiberReconciler = require('ReactFiberReconciler');
27
var ReactInputSelection = require('ReactInputSelection');
28
var ReactInstanceMap = require('ReactInstanceMap');
@@ -165,6 +166,8 @@ var DOMRenderer = ReactFiberReconciler({
166
167
});
168
169
+ReactGenericBatching.injection.injectFiberBatchedUpdates(DOMRenderer.batchedUpdates);
170
+
171
var warned = false;
172
173
function warnAboutUnstableUse() {
@@ -220,9 +223,7 @@ var ReactDOM = {
223
return ReactPortal.createPortal(children, container, null, key);
224
},
225
223
- unstable_batchedUpdates<A>(fn : () => A) : A {
224
- return DOMRenderer.batchedUpdates(fn);
225
- },
226
+ unstable_batchedUpdates: ReactGenericBatching.batchedUpdates,
227
228
};
229
src/renderers/shared/fiber/ReactFiberScheduler.js
+2
-2
@@ -790,11 +790,11 @@ module.exports = function<T, P, I, TI, C>(config : HostConfig<T, P, I, TI, C>) {
790
}
791
}
792
793
- function batchedUpdates<A>(fn : () => A) : A {
793
+ function batchedUpdates<A, R>(fn : (a: A) => R, a : A) : R {
794
const prev = shouldBatchUpdates;
795
shouldBatchUpdates = true;
796
try {
797
- return fn();
797
+ return fn(a);
798
} finally {
799
// If we're exiting the batch, perform any scheduled task work
800
try {
src/renderers/shared/shared/event/ReactGenericBatching.js
+9
-10
@@ -21,21 +21,21 @@ var ReactControlledComponent = require('ReactControlledComponent');
21
22
// Defaults
23
var stackBatchedUpdates = function(fn, a, b, c, d, e) {
24
- fn(a, b, c, d, e);
24
+ return fn(a, b, c, d, e);
25
};
26
-var fiberPerformSynchronousWork = function(fn, bookkeeping) {
27
- fn(bookkeeping);
26
+var fiberBatchedUpdates = function(fn, bookkeeping) {
27
+ return fn(bookkeeping);
28
};
29
30
function performFiberBatchedUpdates(fn, bookkeeping) {
31
// If we have Fiber loaded, we need to wrap this in a batching call so that
32
// Fiber can apply its default priority for this call.
33
- fiberPerformSynchronousWork(fn, bookkeeping);
33
+ return fiberBatchedUpdates(fn, bookkeeping);
34
}
35
function batchedUpdates(fn, bookkeeping) {
36
// We first perform work with the stack batching strategy, by passing our
37
// indirection to it.
38
- stackBatchedUpdates(performFiberBatchedUpdates, fn, bookkeeping);
38
+ return stackBatchedUpdates(performFiberBatchedUpdates, fn, bookkeeping);
39
}
40
41
var isNestingBatched = false;
@@ -44,12 +44,11 @@ function batchedUpdatesWithControlledComponents(fn, bookkeeping) {
44
// If we are currently inside another batch, we need to wait until it
45
// fully completes before restoring state. Therefore, we add the target to
46
// a queue of work.
47
- batchedUpdates(fn, bookkeeping);
48
- return;
47
+ return batchedUpdates(fn, bookkeeping);
48
}
49
isNestingBatched = true;
50
try {
52
- batchedUpdates(fn, bookkeeping);
51
+ return batchedUpdates(fn, bookkeeping);
52
} finally {
53
// Here we wait until all updates have propagated, which is important
54
// when using controlled components within layers:
@@ -64,8 +63,8 @@ var ReactGenericBatchingInjection = {
63
injectStackBatchedUpdates: function(_batchedUpdates) {
64
stackBatchedUpdates = _batchedUpdates;
65
},
67
- injectFiberPerformSynchronousWork: function(_performSynchronousWork) {
68
- fiberPerformSynchronousWork = _performSynchronousWork;
66
+ injectFiberBatchedUpdates: function(_batchedUpdates) {
67
+ fiberBatchedUpdates = _batchedUpdates;
68
},
69
};
70