react 0.13.0 → 0.14.0-alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/addons.js +7 -0
- package/addons/CSSTransitionGroup.js +1 -0
- package/addons/LinkedStateMixin.js +1 -0
- package/addons/Perf.js +1 -0
- package/addons/PureRenderMixin.js +1 -0
- package/addons/TestUtils.js +1 -0
- package/addons/TransitionGroup.js +1 -0
- package/addons/batchedUpdates.js +1 -0
- package/addons/cloneWithProps.js +1 -0
- package/addons/createFragment.js +1 -0
- package/addons/renderSubtreeIntoContainer.js +1 -0
- package/addons/shallowCompare.js +1 -0
- package/addons/update.js +1 -0
- package/dist/JSXTransformer.js +3336 -1671
- package/dist/react-with-addons.js +3134 -5113
- package/dist/react-with-addons.min.js +6 -6
- package/dist/react.js +2812 -4567
- package/dist/react.min.js +5 -5
- package/lib/AutoFocusMixin.js +4 -3
- package/lib/BeforeInputEventPlugin.js +30 -118
- package/lib/CSSCore.js +12 -23
- package/lib/CSSProperty.js +9 -4
- package/lib/CSSPropertyOperations.js +14 -30
- package/lib/CallbackQueue.js +7 -10
- package/lib/ChangeEventPlugin.js +24 -88
- package/lib/ClientReactRootIndex.js +2 -2
- package/lib/DOMChildrenOperations.js +13 -33
- package/lib/DOMProperty.js +41 -65
- package/lib/DOMPropertyOperations.js +30 -51
- package/lib/Danger.js +19 -60
- package/lib/DefaultEventPluginOrder.js +2 -12
- package/lib/EnterLeaveEventPlugin.js +11 -33
- package/lib/EventConstants.js +2 -2
- package/lib/EventListener.js +11 -13
- package/lib/EventPluginHub.js +44 -47
- package/lib/EventPluginRegistry.js +18 -74
- package/lib/EventPluginUtils.js +27 -38
- package/lib/EventPropagators.js +23 -26
- package/lib/ExecutionEnvironment.js +4 -8
- package/lib/FallbackCompositionState.js +3 -3
- package/lib/HTMLDOMPropertyConfig.js +12 -18
- package/lib/LinkedStateMixin.js +3 -6
- package/lib/LinkedValueUtils.js +34 -64
- package/lib/LocalEventTrapMixin.js +9 -16
- package/lib/Object.assign.js +1 -1
- package/lib/PooledClass.js +8 -11
- package/lib/React.js +20 -38
- package/lib/ReactBrowserComponentMixin.js +9 -2
- package/lib/ReactBrowserEventEmitter.js +26 -82
- package/lib/ReactCSSTransitionGroup.js +13 -24
- package/lib/ReactCSSTransitionGroupChild.js +18 -28
- package/lib/ReactChildReconciler.js +11 -19
- package/lib/ReactChildren.js +7 -16
- package/lib/ReactClass.js +78 -231
- package/lib/ReactComponent.js +17 -33
- package/lib/ReactComponentBrowserEnvironment.js +4 -6
- package/lib/ReactComponentEnvironment.js +6 -12
- package/lib/ReactComponentWithPureRenderMixin.js +4 -5
- package/lib/ReactCompositeComponent.js +85 -297
- package/lib/ReactContext.js +2 -44
- package/lib/ReactCurrentOwner.js +1 -3
- package/lib/ReactDOM.js +4 -2
- package/lib/ReactDOMButton.js +3 -4
- package/lib/ReactDOMComponent.js +185 -146
- package/lib/ReactDOMForm.js +3 -3
- package/lib/ReactDOMIDOperations.js +11 -20
- package/lib/ReactDOMIframe.js +3 -3
- package/lib/ReactDOMImg.js +3 -3
- package/lib/ReactDOMInput.js +22 -35
- package/lib/ReactDOMOption.js +52 -10
- package/lib/ReactDOMSelect.js +53 -29
- package/lib/ReactDOMSelection.js +5 -20
- package/lib/ReactDOMTextComponent.js +17 -18
- package/lib/ReactDOMTextarea.js +15 -27
- package/lib/ReactDefaultBatchingStrategy.js +9 -13
- package/lib/ReactDefaultInjection.js +21 -40
- package/lib/ReactDefaultPerf.js +41 -72
- package/lib/ReactDefaultPerfAnalysis.js +8 -14
- package/lib/ReactElement.js +35 -72
- package/lib/ReactElementValidator.js +51 -110
- package/lib/ReactEmptyComponent.js +7 -11
- package/lib/ReactErrorUtils.js +2 -2
- package/lib/ReactEventEmitterMixin.js +3 -12
- package/lib/ReactEventListener.js +16 -38
- package/lib/ReactFragment.js +23 -54
- package/lib/ReactInjection.js +1 -1
- package/lib/ReactInputSelection.js +11 -21
- package/lib/ReactInstanceHandles.js +27 -57
- package/lib/ReactInstanceMap.js +5 -5
- package/lib/ReactLifeCycle.js +1 -1
- package/lib/ReactLink.js +2 -4
- package/lib/ReactMarkupChecksum.js +5 -10
- package/lib/ReactMount.js +136 -260
- package/lib/ReactMultiChild.js +19 -45
- package/lib/ReactMultiChildUpdateTypes.js +1 -1
- package/lib/ReactNativeComponent.js +7 -11
- package/lib/ReactOwner.js +7 -24
- package/lib/ReactPerf.js +8 -12
- package/lib/ReactPropTransferer.js +4 -4
- package/lib/ReactPropTypeLocationNames.js +2 -2
- package/lib/ReactPropTypeLocations.js +1 -1
- package/lib/ReactPropTypes.js +13 -46
- package/lib/ReactReconcileTransaction.js +9 -34
- package/lib/ReactReconciler.js +9 -19
- package/lib/ReactRef.js +5 -8
- package/lib/ReactRootIndex.js +2 -2
- package/lib/ReactServerRendering.js +7 -15
- package/lib/ReactServerRenderingTransaction.js +7 -32
- package/lib/ReactStateSetters.js +6 -6
- package/lib/ReactTestUtils.js +94 -166
- package/lib/ReactTransitionChildMapping.js +5 -7
- package/lib/ReactTransitionEvents.js +5 -5
- package/lib/ReactTransitionGroup.js +30 -52
- package/lib/ReactUpdateQueue.js +27 -90
- package/lib/ReactUpdates.js +27 -79
- package/lib/ReactWithAddons.js +7 -6
- package/lib/SVGDOMPropertyConfig.js +41 -2
- package/lib/SelectEventPlugin.js +28 -29
- package/lib/ServerReactRootIndex.js +2 -2
- package/lib/SimpleEventPlugin.js +136 -128
- package/lib/SyntheticClipboardEvent.js +3 -7
- package/lib/SyntheticCompositionEvent.js +3 -9
- package/lib/SyntheticDragEvent.js +1 -1
- package/lib/SyntheticEvent.js +8 -10
- package/lib/SyntheticFocusEvent.js +1 -1
- package/lib/SyntheticInputEvent.js +3 -9
- package/lib/SyntheticKeyboardEvent.js +4 -4
- package/lib/SyntheticMouseEvent.js +8 -14
- package/lib/SyntheticTouchEvent.js +1 -1
- package/lib/SyntheticUIEvent.js +3 -3
- package/lib/SyntheticWheelEvent.js +11 -15
- package/lib/Transaction.js +12 -24
- package/lib/ViewportMetrics.js +2 -2
- package/lib/accumulateInto.js +2 -5
- package/lib/adler32.js +2 -2
- package/lib/camelize.js +4 -2
- package/lib/camelizeStyleName.js +2 -2
- package/lib/cloneWithProps.js +5 -11
- package/lib/containsNode.js +29 -16
- package/lib/createArrayFromMixed.js +17 -16
- package/lib/createFullPageComponent.js +5 -11
- package/lib/createNodesFromMarkup.js +6 -8
- package/lib/dangerousStyleValue.js +2 -3
- package/lib/emptyFunction.js +10 -4
- package/lib/emptyObject.js +1 -1
- package/lib/escapeTextContentForBrowser.js +1 -1
- package/lib/findDOMNode.js +5 -24
- package/lib/flattenChildren.js +4 -10
- package/lib/focusNode.js +2 -3
- package/lib/forEachAccumulated.js +2 -2
- package/lib/getActiveElement.js +4 -2
- package/lib/getEventCharCode.js +1 -1
- package/lib/getEventKey.js +1 -1
- package/lib/getEventModifierState.js +1 -1
- package/lib/getEventTarget.js +1 -1
- package/lib/getIteratorFn.js +2 -4
- package/lib/getMarkupWrap.js +7 -5
- package/lib/getNodeForCharacterOffset.js +1 -1
- package/lib/getTextContentAccessor.js +2 -4
- package/lib/getUnboundedScrollPosition.js +1 -1
- package/lib/hyphenate.js +3 -1
- package/lib/hyphenateStyleName.js +2 -2
- package/lib/instantiateReactComponent.js +14 -37
- package/lib/invariant.js +8 -12
- package/lib/isEventSupported.js +7 -10
- package/lib/isNode.js +4 -6
- package/lib/isTextInputElement.js +2 -4
- package/lib/isTextNode.js +3 -1
- package/lib/joinClasses.js +2 -2
- package/lib/keyMirror.js +3 -6
- package/lib/keyOf.js +4 -3
- package/lib/mapObject.js +1 -1
- package/lib/memoizeStringOnly.js +2 -2
- package/lib/onlyChild.js +2 -5
- package/lib/performance.js +2 -5
- package/lib/performanceNow.js +3 -1
- package/lib/quoteAttributeValueForBrowser.js +1 -1
- package/lib/renderSubtreeIntoContainer.js +16 -0
- package/lib/setInnerHTML.js +11 -8
- package/lib/setTextContent.js +3 -3
- package/lib/shallowCompare.js +24 -0
- package/lib/shallowEqual.js +17 -11
- package/lib/shouldUpdateReactComponent.js +3 -64
- package/lib/toArray.js +8 -19
- package/lib/traverseAllChildren.js +19 -82
- package/lib/update.js +33 -90
- package/lib/validateDOMNesting.js +264 -0
- package/lib/warning.js +17 -15
- package/package.json +3 -3
- package/lib/MobileSafariClickEventPlugin.js +0 -56
- package/lib/ReactPutListenerQueue.js +0 -54
- package/lib/cx.js +0 -52
- package/lib/getReactRootElementInContainer.js +0 -33
package/lib/ReactDOMSelection.js
CHANGED
|
@@ -79,12 +79,7 @@ function getModernOffsets(node) {
|
|
|
79
79
|
// If the node and offset values are the same, the selection is collapsed.
|
|
80
80
|
// `Selection.isCollapsed` is available natively, but IE sometimes gets
|
|
81
81
|
// this value wrong.
|
|
82
|
-
var isSelectionCollapsed = isCollapsed(
|
|
83
|
-
selection.anchorNode,
|
|
84
|
-
selection.anchorOffset,
|
|
85
|
-
selection.focusNode,
|
|
86
|
-
selection.focusOffset
|
|
87
|
-
);
|
|
82
|
+
var isSelectionCollapsed = isCollapsed(selection.anchorNode, selection.anchorOffset, selection.focusNode, selection.focusOffset);
|
|
88
83
|
|
|
89
84
|
var rangeLength = isSelectionCollapsed ? 0 : currentRange.toString().length;
|
|
90
85
|
|
|
@@ -92,12 +87,7 @@ function getModernOffsets(node) {
|
|
|
92
87
|
tempRange.selectNodeContents(node);
|
|
93
88
|
tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);
|
|
94
89
|
|
|
95
|
-
var isTempRangeCollapsed = isCollapsed(
|
|
96
|
-
tempRange.startContainer,
|
|
97
|
-
tempRange.startOffset,
|
|
98
|
-
tempRange.endContainer,
|
|
99
|
-
tempRange.endOffset
|
|
100
|
-
);
|
|
90
|
+
var isTempRangeCollapsed = isCollapsed(tempRange.startContainer, tempRange.startOffset, tempRange.endContainer, tempRange.endOffset);
|
|
101
91
|
|
|
102
92
|
var start = isTempRangeCollapsed ? 0 : tempRange.toString().length;
|
|
103
93
|
var end = start + rangeLength;
|
|
@@ -160,8 +150,7 @@ function setModernOffsets(node, offsets) {
|
|
|
160
150
|
var selection = window.getSelection();
|
|
161
151
|
var length = node[getTextContentAccessor()].length;
|
|
162
152
|
var start = Math.min(offsets.start, length);
|
|
163
|
-
var end = typeof offsets.end === 'undefined' ?
|
|
164
|
-
start : Math.min(offsets.end, length);
|
|
153
|
+
var end = typeof offsets.end === 'undefined' ? start : Math.min(offsets.end, length);
|
|
165
154
|
|
|
166
155
|
// IE 11 uses modern selection, but doesn't support the extend method.
|
|
167
156
|
// Flip backward selections, so we can set with a single range.
|
|
@@ -189,11 +178,7 @@ function setModernOffsets(node, offsets) {
|
|
|
189
178
|
}
|
|
190
179
|
}
|
|
191
180
|
|
|
192
|
-
var useIEOffsets = (
|
|
193
|
-
ExecutionEnvironment.canUseDOM &&
|
|
194
|
-
'selection' in document &&
|
|
195
|
-
!('getSelection' in window)
|
|
196
|
-
);
|
|
181
|
+
var useIEOffsets = ExecutionEnvironment.canUseDOM && 'selection' in document && !('getSelection' in window);
|
|
197
182
|
|
|
198
183
|
var ReactDOMSelection = {
|
|
199
184
|
/**
|
|
@@ -208,4 +193,4 @@ var ReactDOMSelection = {
|
|
|
208
193
|
setOffsets: useIEOffsets ? setIEOffsets : setModernOffsets
|
|
209
194
|
};
|
|
210
195
|
|
|
211
|
-
module.exports = ReactDOMSelection;
|
|
196
|
+
module.exports = ReactDOMSelection;
|
|
@@ -13,12 +13,12 @@
|
|
|
13
13
|
'use strict';
|
|
14
14
|
|
|
15
15
|
var DOMPropertyOperations = require("./DOMPropertyOperations");
|
|
16
|
-
var ReactComponentBrowserEnvironment =
|
|
17
|
-
require("./ReactComponentBrowserEnvironment");
|
|
16
|
+
var ReactComponentBrowserEnvironment = require("./ReactComponentBrowserEnvironment");
|
|
18
17
|
var ReactDOMComponent = require("./ReactDOMComponent");
|
|
19
18
|
|
|
20
19
|
var assign = require("./Object.assign");
|
|
21
20
|
var escapeTextContentForBrowser = require("./escapeTextContentForBrowser");
|
|
21
|
+
var validateDOMNesting = require("./validateDOMNesting");
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Text nodes violate a couple assumptions that React makes about components:
|
|
@@ -35,9 +35,7 @@ var escapeTextContentForBrowser = require("./escapeTextContentForBrowser");
|
|
|
35
35
|
* @extends ReactComponent
|
|
36
36
|
* @internal
|
|
37
37
|
*/
|
|
38
|
-
var ReactDOMTextComponent = function(props) {
|
|
39
|
-
// This constructor and its argument is currently used by mocks.
|
|
40
|
-
};
|
|
38
|
+
var ReactDOMTextComponent = function (props) {};
|
|
41
39
|
|
|
42
40
|
assign(ReactDOMTextComponent.prototype, {
|
|
43
41
|
|
|
@@ -45,7 +43,7 @@ assign(ReactDOMTextComponent.prototype, {
|
|
|
45
43
|
* @param {ReactText} text
|
|
46
44
|
* @internal
|
|
47
45
|
*/
|
|
48
|
-
construct: function(text) {
|
|
46
|
+
construct: function (text) {
|
|
49
47
|
// TODO: This is really a ReactText (ReactNode), not a ReactElement
|
|
50
48
|
this._currentElement = text;
|
|
51
49
|
this._stringText = '' + text;
|
|
@@ -64,7 +62,13 @@ assign(ReactDOMTextComponent.prototype, {
|
|
|
64
62
|
* @return {string} Markup for this text node.
|
|
65
63
|
* @internal
|
|
66
64
|
*/
|
|
67
|
-
mountComponent: function(rootID, transaction, context) {
|
|
65
|
+
mountComponent: function (rootID, transaction, context) {
|
|
66
|
+
if ('production' !== process.env.NODE_ENV) {
|
|
67
|
+
if (context[validateDOMNesting.tagStackContextKey]) {
|
|
68
|
+
validateDOMNesting(context[validateDOMNesting.tagStackContextKey], 'span', null);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
68
72
|
this._rootNodeID = rootID;
|
|
69
73
|
var escapedText = escapeTextContentForBrowser(this._stringText);
|
|
70
74
|
|
|
@@ -75,11 +79,7 @@ assign(ReactDOMTextComponent.prototype, {
|
|
|
75
79
|
return escapedText;
|
|
76
80
|
}
|
|
77
81
|
|
|
78
|
-
return (
|
|
79
|
-
'<span ' + DOMPropertyOperations.createMarkupForID(rootID) + '>' +
|
|
80
|
-
escapedText +
|
|
81
|
-
'</span>'
|
|
82
|
-
);
|
|
82
|
+
return '<span ' + DOMPropertyOperations.createMarkupForID(rootID) + '>' + escapedText + '</span>';
|
|
83
83
|
},
|
|
84
84
|
|
|
85
85
|
/**
|
|
@@ -89,7 +89,7 @@ assign(ReactDOMTextComponent.prototype, {
|
|
|
89
89
|
* @param {ReactReconcileTransaction} transaction
|
|
90
90
|
* @internal
|
|
91
91
|
*/
|
|
92
|
-
receiveComponent: function(nextText, transaction) {
|
|
92
|
+
receiveComponent: function (nextText, transaction) {
|
|
93
93
|
if (nextText !== this._currentElement) {
|
|
94
94
|
this._currentElement = nextText;
|
|
95
95
|
var nextStringText = '' + nextText;
|
|
@@ -98,18 +98,17 @@ assign(ReactDOMTextComponent.prototype, {
|
|
|
98
98
|
// and/or updateComponent to do the actual update for consistency with
|
|
99
99
|
// other component types?
|
|
100
100
|
this._stringText = nextStringText;
|
|
101
|
-
ReactDOMComponent.BackendIDOperations.updateTextContentByID(
|
|
102
|
-
this._rootNodeID,
|
|
103
|
-
nextStringText
|
|
104
|
-
);
|
|
101
|
+
ReactDOMComponent.BackendIDOperations.updateTextContentByID(this._rootNodeID, nextStringText);
|
|
105
102
|
}
|
|
106
103
|
}
|
|
107
104
|
},
|
|
108
105
|
|
|
109
|
-
unmountComponent: function() {
|
|
106
|
+
unmountComponent: function () {
|
|
110
107
|
ReactComponentBrowserEnvironment.unmountIDFromEnvironment(this._rootNodeID);
|
|
111
108
|
}
|
|
112
109
|
|
|
113
110
|
});
|
|
114
111
|
|
|
115
112
|
module.exports = ReactDOMTextComponent;
|
|
113
|
+
|
|
114
|
+
// This constructor and its argument is currently used by mocks.
|
package/lib/ReactDOMTextarea.js
CHANGED
|
@@ -20,6 +20,7 @@ var ReactElement = require("./ReactElement");
|
|
|
20
20
|
var ReactUpdates = require("./ReactUpdates");
|
|
21
21
|
|
|
22
22
|
var assign = require("./Object.assign");
|
|
23
|
+
var findDOMNode = require("./findDOMNode");
|
|
23
24
|
var invariant = require("./invariant");
|
|
24
25
|
|
|
25
26
|
var warning = require("./warning");
|
|
@@ -54,27 +55,17 @@ var ReactDOMTextarea = ReactClass.createClass({
|
|
|
54
55
|
|
|
55
56
|
mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin],
|
|
56
57
|
|
|
57
|
-
getInitialState: function() {
|
|
58
|
+
getInitialState: function () {
|
|
58
59
|
var defaultValue = this.props.defaultValue;
|
|
59
60
|
// TODO (yungsters): Remove support for children content in <textarea>.
|
|
60
61
|
var children = this.props.children;
|
|
61
62
|
if (children != null) {
|
|
62
|
-
if (
|
|
63
|
-
|
|
64
|
-
false,
|
|
65
|
-
'Use the `defaultValue` or `value` props instead of setting ' +
|
|
66
|
-
'children on <textarea>.'
|
|
67
|
-
) : null);
|
|
63
|
+
if ('production' !== process.env.NODE_ENV) {
|
|
64
|
+
'production' !== process.env.NODE_ENV ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : null;
|
|
68
65
|
}
|
|
69
|
-
|
|
70
|
-
defaultValue == null,
|
|
71
|
-
'If you supply `defaultValue` on a <textarea>, do not pass children.'
|
|
72
|
-
) : invariant(defaultValue == null));
|
|
66
|
+
'production' !== process.env.NODE_ENV ? invariant(defaultValue == null, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : invariant(defaultValue == null);
|
|
73
67
|
if (Array.isArray(children)) {
|
|
74
|
-
|
|
75
|
-
children.length <= 1,
|
|
76
|
-
'<textarea> can only have at most one child.'
|
|
77
|
-
) : invariant(children.length <= 1));
|
|
68
|
+
'production' !== process.env.NODE_ENV ? invariant(children.length <= 1, '<textarea> can only have at most one child.') : invariant(children.length <= 1);
|
|
78
69
|
children = children[0];
|
|
79
70
|
}
|
|
80
71
|
|
|
@@ -83,7 +74,7 @@ var ReactDOMTextarea = ReactClass.createClass({
|
|
|
83
74
|
if (defaultValue == null) {
|
|
84
75
|
defaultValue = '';
|
|
85
76
|
}
|
|
86
|
-
var value = LinkedValueUtils.getValue(this);
|
|
77
|
+
var value = LinkedValueUtils.getValue(this.props);
|
|
87
78
|
return {
|
|
88
79
|
// We save the initial value so that `ReactDOMComponent` doesn't update
|
|
89
80
|
// `textContent` (unnecessary since we update value).
|
|
@@ -93,14 +84,11 @@ var ReactDOMTextarea = ReactClass.createClass({
|
|
|
93
84
|
};
|
|
94
85
|
},
|
|
95
86
|
|
|
96
|
-
render: function() {
|
|
87
|
+
render: function () {
|
|
97
88
|
// Clone `this.props` so we don't mutate the input.
|
|
98
89
|
var props = assign({}, this.props);
|
|
99
90
|
|
|
100
|
-
|
|
101
|
-
props.dangerouslySetInnerHTML == null,
|
|
102
|
-
'`dangerouslySetInnerHTML` does not make sense on <textarea>.'
|
|
103
|
-
) : invariant(props.dangerouslySetInnerHTML == null));
|
|
91
|
+
'production' !== process.env.NODE_ENV ? invariant(props.dangerouslySetInnerHTML == null, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : invariant(props.dangerouslySetInnerHTML == null);
|
|
104
92
|
|
|
105
93
|
props.defaultValue = null;
|
|
106
94
|
props.value = null;
|
|
@@ -111,19 +99,19 @@ var ReactDOMTextarea = ReactClass.createClass({
|
|
|
111
99
|
return textarea(props, this.state.initialValue);
|
|
112
100
|
},
|
|
113
101
|
|
|
114
|
-
componentDidUpdate: function(prevProps, prevState, prevContext) {
|
|
115
|
-
var value = LinkedValueUtils.getValue(this);
|
|
102
|
+
componentDidUpdate: function (prevProps, prevState, prevContext) {
|
|
103
|
+
var value = LinkedValueUtils.getValue(this.props);
|
|
116
104
|
if (value != null) {
|
|
117
|
-
var rootNode = this
|
|
105
|
+
var rootNode = findDOMNode(this);
|
|
118
106
|
// Cast `value` to a string to ensure the value is set correctly. While
|
|
119
107
|
// browsers typically do this as necessary, jsdom doesn't.
|
|
120
108
|
DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value);
|
|
121
109
|
}
|
|
122
110
|
},
|
|
123
111
|
|
|
124
|
-
_handleChange: function(event) {
|
|
112
|
+
_handleChange: function (event) {
|
|
125
113
|
var returnValue;
|
|
126
|
-
var onChange = LinkedValueUtils.getOnChange(this);
|
|
114
|
+
var onChange = LinkedValueUtils.getOnChange(this.props);
|
|
127
115
|
if (onChange) {
|
|
128
116
|
returnValue = onChange.call(this, event);
|
|
129
117
|
}
|
|
@@ -133,4 +121,4 @@ var ReactDOMTextarea = ReactClass.createClass({
|
|
|
133
121
|
|
|
134
122
|
});
|
|
135
123
|
|
|
136
|
-
module.exports = ReactDOMTextarea;
|
|
124
|
+
module.exports = ReactDOMTextarea;
|
|
@@ -19,7 +19,7 @@ var emptyFunction = require("./emptyFunction");
|
|
|
19
19
|
|
|
20
20
|
var RESET_BATCHED_UPDATES = {
|
|
21
21
|
initialize: emptyFunction,
|
|
22
|
-
close: function() {
|
|
22
|
+
close: function () {
|
|
23
23
|
ReactDefaultBatchingStrategy.isBatchingUpdates = false;
|
|
24
24
|
}
|
|
25
25
|
};
|
|
@@ -35,15 +35,11 @@ function ReactDefaultBatchingStrategyTransaction() {
|
|
|
35
35
|
this.reinitializeTransaction();
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
assign(
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
{
|
|
42
|
-
getTransactionWrappers: function() {
|
|
43
|
-
return TRANSACTION_WRAPPERS;
|
|
44
|
-
}
|
|
38
|
+
assign(ReactDefaultBatchingStrategyTransaction.prototype, Transaction.Mixin, {
|
|
39
|
+
getTransactionWrappers: function () {
|
|
40
|
+
return TRANSACTION_WRAPPERS;
|
|
45
41
|
}
|
|
46
|
-
);
|
|
42
|
+
});
|
|
47
43
|
|
|
48
44
|
var transaction = new ReactDefaultBatchingStrategyTransaction();
|
|
49
45
|
|
|
@@ -54,18 +50,18 @@ var ReactDefaultBatchingStrategy = {
|
|
|
54
50
|
* Call the provided function in a context within which calls to `setState`
|
|
55
51
|
* and friends are batched such that components aren't updated unnecessarily.
|
|
56
52
|
*/
|
|
57
|
-
batchedUpdates: function(callback, a, b, c, d) {
|
|
53
|
+
batchedUpdates: function (callback, a, b, c, d, e) {
|
|
58
54
|
var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;
|
|
59
55
|
|
|
60
56
|
ReactDefaultBatchingStrategy.isBatchingUpdates = true;
|
|
61
57
|
|
|
62
58
|
// The code is written this way to avoid extra allocations
|
|
63
59
|
if (alreadyBatchingUpdates) {
|
|
64
|
-
callback(a, b, c, d);
|
|
60
|
+
callback(a, b, c, d, e);
|
|
65
61
|
} else {
|
|
66
|
-
transaction.perform(callback, null, a, b, c, d);
|
|
62
|
+
transaction.perform(callback, null, a, b, c, d, e);
|
|
67
63
|
}
|
|
68
64
|
}
|
|
69
65
|
};
|
|
70
66
|
|
|
71
|
-
module.exports = ReactDefaultBatchingStrategy;
|
|
67
|
+
module.exports = ReactDefaultBatchingStrategy;
|
|
@@ -18,11 +18,9 @@ var DefaultEventPluginOrder = require("./DefaultEventPluginOrder");
|
|
|
18
18
|
var EnterLeaveEventPlugin = require("./EnterLeaveEventPlugin");
|
|
19
19
|
var ExecutionEnvironment = require("./ExecutionEnvironment");
|
|
20
20
|
var HTMLDOMPropertyConfig = require("./HTMLDOMPropertyConfig");
|
|
21
|
-
var MobileSafariClickEventPlugin = require("./MobileSafariClickEventPlugin");
|
|
22
21
|
var ReactBrowserComponentMixin = require("./ReactBrowserComponentMixin");
|
|
23
22
|
var ReactClass = require("./ReactClass");
|
|
24
|
-
var ReactComponentBrowserEnvironment =
|
|
25
|
-
require("./ReactComponentBrowserEnvironment");
|
|
23
|
+
var ReactComponentBrowserEnvironment = require("./ReactComponentBrowserEnvironment");
|
|
26
24
|
var ReactDefaultBatchingStrategy = require("./ReactDefaultBatchingStrategy");
|
|
27
25
|
var ReactDOMComponent = require("./ReactDOMComponent");
|
|
28
26
|
var ReactDOMButton = require("./ReactDOMButton");
|
|
@@ -39,6 +37,7 @@ var ReactElement = require("./ReactElement");
|
|
|
39
37
|
var ReactEventListener = require("./ReactEventListener");
|
|
40
38
|
var ReactInjection = require("./ReactInjection");
|
|
41
39
|
var ReactInstanceHandles = require("./ReactInstanceHandles");
|
|
40
|
+
var ReactInstanceMap = require("./ReactInstanceMap");
|
|
42
41
|
var ReactMount = require("./ReactMount");
|
|
43
42
|
var ReactReconcileTransaction = require("./ReactReconcileTransaction");
|
|
44
43
|
var SelectEventPlugin = require("./SelectEventPlugin");
|
|
@@ -51,23 +50,20 @@ var createFullPageComponent = require("./createFullPageComponent");
|
|
|
51
50
|
function autoGenerateWrapperClass(type) {
|
|
52
51
|
return ReactClass.createClass({
|
|
53
52
|
tagName: type.toUpperCase(),
|
|
54
|
-
render: function() {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
);
|
|
53
|
+
render: function () {
|
|
54
|
+
// Copy owner down for debugging info
|
|
55
|
+
var internalInstance = ReactInstanceMap.get(this);
|
|
56
|
+
return new ReactElement(type, null, // key
|
|
57
|
+
null, // ref
|
|
58
|
+
internalInstance._currentElement._owner, // owner
|
|
59
|
+
null, // context
|
|
60
|
+
this.props);
|
|
63
61
|
}
|
|
64
62
|
});
|
|
65
63
|
}
|
|
66
64
|
|
|
67
65
|
function inject() {
|
|
68
|
-
ReactInjection.EventEmitter.injectReactEventListener(
|
|
69
|
-
ReactEventListener
|
|
70
|
-
);
|
|
66
|
+
ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener);
|
|
71
67
|
|
|
72
68
|
/**
|
|
73
69
|
* Inject modules for resolving DOM hierarchy and plugin ordering.
|
|
@@ -84,22 +80,15 @@ function inject() {
|
|
|
84
80
|
SimpleEventPlugin: SimpleEventPlugin,
|
|
85
81
|
EnterLeaveEventPlugin: EnterLeaveEventPlugin,
|
|
86
82
|
ChangeEventPlugin: ChangeEventPlugin,
|
|
87
|
-
MobileSafariClickEventPlugin: MobileSafariClickEventPlugin,
|
|
88
83
|
SelectEventPlugin: SelectEventPlugin,
|
|
89
84
|
BeforeInputEventPlugin: BeforeInputEventPlugin
|
|
90
85
|
});
|
|
91
86
|
|
|
92
|
-
ReactInjection.NativeComponent.injectGenericComponentClass(
|
|
93
|
-
ReactDOMComponent
|
|
94
|
-
);
|
|
87
|
+
ReactInjection.NativeComponent.injectGenericComponentClass(ReactDOMComponent);
|
|
95
88
|
|
|
96
|
-
ReactInjection.NativeComponent.injectTextComponentClass(
|
|
97
|
-
ReactDOMTextComponent
|
|
98
|
-
);
|
|
89
|
+
ReactInjection.NativeComponent.injectTextComponentClass(ReactDOMTextComponent);
|
|
99
90
|
|
|
100
|
-
ReactInjection.NativeComponent.injectAutoWrapper(
|
|
101
|
-
autoGenerateWrapperClass
|
|
102
|
-
);
|
|
91
|
+
ReactInjection.NativeComponent.injectAutoWrapper(autoGenerateWrapperClass);
|
|
103
92
|
|
|
104
93
|
// This needs to happen before createFullPageComponent() otherwise the mixin
|
|
105
94
|
// won't be included.
|
|
@@ -125,25 +114,17 @@ function inject() {
|
|
|
125
114
|
|
|
126
115
|
ReactInjection.EmptyComponent.injectEmptyComponent('noscript');
|
|
127
116
|
|
|
128
|
-
ReactInjection.Updates.injectReconcileTransaction(
|
|
129
|
-
|
|
130
|
-
);
|
|
131
|
-
ReactInjection.Updates.injectBatchingStrategy(
|
|
132
|
-
ReactDefaultBatchingStrategy
|
|
133
|
-
);
|
|
117
|
+
ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction);
|
|
118
|
+
ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy);
|
|
134
119
|
|
|
135
|
-
ReactInjection.RootIndex.injectCreateReactRootIndex(
|
|
136
|
-
ExecutionEnvironment.canUseDOM ?
|
|
137
|
-
ClientReactRootIndex.createReactRootIndex :
|
|
138
|
-
ServerReactRootIndex.createReactRootIndex
|
|
139
|
-
);
|
|
120
|
+
ReactInjection.RootIndex.injectCreateReactRootIndex(ExecutionEnvironment.canUseDOM ? ClientReactRootIndex.createReactRootIndex : ServerReactRootIndex.createReactRootIndex);
|
|
140
121
|
|
|
141
122
|
ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment);
|
|
142
123
|
ReactInjection.DOMComponent.injectIDOperations(ReactDOMIDOperations);
|
|
143
124
|
|
|
144
|
-
if (
|
|
145
|
-
var url =
|
|
146
|
-
if (
|
|
125
|
+
if ('production' !== process.env.NODE_ENV) {
|
|
126
|
+
var url = ExecutionEnvironment.canUseDOM && window.location.href || '';
|
|
127
|
+
if (/[?&]react_perf\b/.test(url)) {
|
|
147
128
|
var ReactDefaultPerf = require("./ReactDefaultPerf");
|
|
148
129
|
ReactDefaultPerf.start();
|
|
149
130
|
}
|
|
@@ -152,4 +133,4 @@ function inject() {
|
|
|
152
133
|
|
|
153
134
|
module.exports = {
|
|
154
135
|
inject: inject
|
|
155
|
-
};
|
|
136
|
+
};
|
package/lib/ReactDefaultPerf.js
CHANGED
|
@@ -32,7 +32,7 @@ var ReactDefaultPerf = {
|
|
|
32
32
|
_mountStack: [0],
|
|
33
33
|
_injected: false,
|
|
34
34
|
|
|
35
|
-
start: function() {
|
|
35
|
+
start: function () {
|
|
36
36
|
if (!ReactDefaultPerf._injected) {
|
|
37
37
|
ReactPerf.injection.injectMeasure(ReactDefaultPerf.measure);
|
|
38
38
|
}
|
|
@@ -41,18 +41,18 @@ var ReactDefaultPerf = {
|
|
|
41
41
|
ReactPerf.enableMeasure = true;
|
|
42
42
|
},
|
|
43
43
|
|
|
44
|
-
stop: function() {
|
|
44
|
+
stop: function () {
|
|
45
45
|
ReactPerf.enableMeasure = false;
|
|
46
46
|
},
|
|
47
47
|
|
|
48
|
-
getLastMeasurements: function() {
|
|
48
|
+
getLastMeasurements: function () {
|
|
49
49
|
return ReactDefaultPerf._allMeasurements;
|
|
50
50
|
},
|
|
51
51
|
|
|
52
|
-
printExclusive: function(measurements) {
|
|
52
|
+
printExclusive: function (measurements) {
|
|
53
53
|
measurements = measurements || ReactDefaultPerf._allMeasurements;
|
|
54
54
|
var summary = ReactDefaultPerfAnalysis.getExclusiveSummary(measurements);
|
|
55
|
-
console.table(summary.map(function(item) {
|
|
55
|
+
console.table(summary.map(function (item) {
|
|
56
56
|
return {
|
|
57
57
|
'Component class name': item.componentName,
|
|
58
58
|
'Total inclusive time (ms)': roundFloat(item.inclusive),
|
|
@@ -67,28 +67,22 @@ var ReactDefaultPerf = {
|
|
|
67
67
|
// number.
|
|
68
68
|
},
|
|
69
69
|
|
|
70
|
-
printInclusive: function(measurements) {
|
|
70
|
+
printInclusive: function (measurements) {
|
|
71
71
|
measurements = measurements || ReactDefaultPerf._allMeasurements;
|
|
72
72
|
var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements);
|
|
73
|
-
console.table(summary.map(function(item) {
|
|
73
|
+
console.table(summary.map(function (item) {
|
|
74
74
|
return {
|
|
75
75
|
'Owner > component': item.componentName,
|
|
76
76
|
'Inclusive time (ms)': roundFloat(item.time),
|
|
77
77
|
'Instances': item.count
|
|
78
78
|
};
|
|
79
79
|
}));
|
|
80
|
-
console.log(
|
|
81
|
-
'Total time:',
|
|
82
|
-
ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'
|
|
83
|
-
);
|
|
80
|
+
console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');
|
|
84
81
|
},
|
|
85
82
|
|
|
86
|
-
getMeasurementsSummaryMap: function(measurements) {
|
|
87
|
-
var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(
|
|
88
|
-
|
|
89
|
-
true
|
|
90
|
-
);
|
|
91
|
-
return summary.map(function(item) {
|
|
83
|
+
getMeasurementsSummaryMap: function (measurements) {
|
|
84
|
+
var summary = ReactDefaultPerfAnalysis.getInclusiveSummary(measurements, true);
|
|
85
|
+
return summary.map(function (item) {
|
|
92
86
|
return {
|
|
93
87
|
'Owner > component': item.componentName,
|
|
94
88
|
'Wasted time (ms)': item.time,
|
|
@@ -97,37 +91,28 @@ var ReactDefaultPerf = {
|
|
|
97
91
|
});
|
|
98
92
|
},
|
|
99
93
|
|
|
100
|
-
printWasted: function(measurements) {
|
|
94
|
+
printWasted: function (measurements) {
|
|
101
95
|
measurements = measurements || ReactDefaultPerf._allMeasurements;
|
|
102
96
|
console.table(ReactDefaultPerf.getMeasurementsSummaryMap(measurements));
|
|
103
|
-
console.log(
|
|
104
|
-
'Total time:',
|
|
105
|
-
ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'
|
|
106
|
-
);
|
|
97
|
+
console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');
|
|
107
98
|
},
|
|
108
99
|
|
|
109
|
-
printDOM: function(measurements) {
|
|
100
|
+
printDOM: function (measurements) {
|
|
110
101
|
measurements = measurements || ReactDefaultPerf._allMeasurements;
|
|
111
102
|
var summary = ReactDefaultPerfAnalysis.getDOMSummary(measurements);
|
|
112
|
-
console.table(summary.map(function(item) {
|
|
103
|
+
console.table(summary.map(function (item) {
|
|
113
104
|
var result = {};
|
|
114
105
|
result[DOMProperty.ID_ATTRIBUTE_NAME] = item.id;
|
|
115
106
|
result['type'] = item.type;
|
|
116
107
|
result['args'] = JSON.stringify(item.args);
|
|
117
108
|
return result;
|
|
118
109
|
}));
|
|
119
|
-
console.log(
|
|
120
|
-
'Total time:',
|
|
121
|
-
ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms'
|
|
122
|
-
);
|
|
110
|
+
console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');
|
|
123
111
|
},
|
|
124
112
|
|
|
125
|
-
_recordWrite: function(id, fnName, totalTime, args) {
|
|
113
|
+
_recordWrite: function (id, fnName, totalTime, args) {
|
|
126
114
|
// TODO: totalTime isn't that useful since it doesn't count paints/reflows
|
|
127
|
-
var writes =
|
|
128
|
-
ReactDefaultPerf
|
|
129
|
-
._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1]
|
|
130
|
-
.writes;
|
|
115
|
+
var writes = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].writes;
|
|
131
116
|
writes[id] = writes[id] || [];
|
|
132
117
|
writes[id].push({
|
|
133
118
|
type: fnName,
|
|
@@ -136,14 +121,17 @@ var ReactDefaultPerf = {
|
|
|
136
121
|
});
|
|
137
122
|
},
|
|
138
123
|
|
|
139
|
-
measure: function(moduleName, fnName, func) {
|
|
140
|
-
return function() {
|
|
124
|
+
measure: function (moduleName, fnName, func) {
|
|
125
|
+
return function () {
|
|
126
|
+
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
127
|
+
args[_key] = arguments[_key];
|
|
128
|
+
}
|
|
129
|
+
|
|
141
130
|
var totalTime;
|
|
142
131
|
var rv;
|
|
143
132
|
var start;
|
|
144
133
|
|
|
145
|
-
if (fnName === '_renderNewRootComponent' ||
|
|
146
|
-
fnName === 'flushBatchedUpdates') {
|
|
134
|
+
if (fnName === '_renderNewRootComponent' || fnName === 'flushBatchedUpdates') {
|
|
147
135
|
// A "measurement" is a set of metrics recorded for each flush. We want
|
|
148
136
|
// to group the metrics for a given flush together so we can look at the
|
|
149
137
|
// components that rendered and the DOM operations that actually
|
|
@@ -159,12 +147,9 @@ var ReactDefaultPerf = {
|
|
|
159
147
|
});
|
|
160
148
|
start = performanceNow();
|
|
161
149
|
rv = func.apply(this, args);
|
|
162
|
-
ReactDefaultPerf._allMeasurements[
|
|
163
|
-
ReactDefaultPerf._allMeasurements.length - 1
|
|
164
|
-
].totalTime = performanceNow() - start;
|
|
150
|
+
ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1].totalTime = performanceNow() - start;
|
|
165
151
|
return rv;
|
|
166
|
-
} else if (moduleName === 'ReactDOMIDOperations'
|
|
167
|
-
moduleName === 'ReactComponentBrowserEnvironment') {
|
|
152
|
+
} else if (fnName === '_mountImageIntoNode' || moduleName === 'ReactDOMIDOperations') {
|
|
168
153
|
start = performanceNow();
|
|
169
154
|
rv = func.apply(this, args);
|
|
170
155
|
totalTime = performanceNow() - start;
|
|
@@ -174,7 +159,7 @@ var ReactDefaultPerf = {
|
|
|
174
159
|
ReactDefaultPerf._recordWrite(mountID, fnName, totalTime, args[0]);
|
|
175
160
|
} else if (fnName === 'dangerouslyProcessChildrenUpdates') {
|
|
176
161
|
// special format
|
|
177
|
-
args[0].forEach(function(update) {
|
|
162
|
+
args[0].forEach(function (update) {
|
|
178
163
|
var writeArgs = {};
|
|
179
164
|
if (update.fromIndex !== null) {
|
|
180
165
|
writeArgs.fromIndex = update.fromIndex;
|
|
@@ -188,38 +173,26 @@ var ReactDefaultPerf = {
|
|
|
188
173
|
if (update.markupIndex !== null) {
|
|
189
174
|
writeArgs.markup = args[1][update.markupIndex];
|
|
190
175
|
}
|
|
191
|
-
ReactDefaultPerf._recordWrite(
|
|
192
|
-
update.parentID,
|
|
193
|
-
update.type,
|
|
194
|
-
totalTime,
|
|
195
|
-
writeArgs
|
|
196
|
-
);
|
|
176
|
+
ReactDefaultPerf._recordWrite(update.parentID, update.type, totalTime, writeArgs);
|
|
197
177
|
});
|
|
198
178
|
} else {
|
|
199
179
|
// basic format
|
|
200
|
-
ReactDefaultPerf._recordWrite(
|
|
201
|
-
args[0],
|
|
202
|
-
fnName,
|
|
203
|
-
totalTime,
|
|
204
|
-
Array.prototype.slice.call(args, 1)
|
|
205
|
-
);
|
|
180
|
+
ReactDefaultPerf._recordWrite(args[0], fnName, totalTime, Array.prototype.slice.call(args, 1));
|
|
206
181
|
}
|
|
207
182
|
return rv;
|
|
208
|
-
} else if (moduleName === 'ReactCompositeComponent' && (
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
183
|
+
} else if (moduleName === 'ReactCompositeComponent' && (fnName === 'mountComponent' || fnName === 'updateComponent' || // TODO: receiveComponent()?
|
|
184
|
+
fnName === '_renderValidatedComponent')) {
|
|
185
|
+
|
|
186
|
+
if (typeof this._currentElement.type === 'string') {
|
|
187
|
+
return func.apply(this, args);
|
|
188
|
+
}
|
|
212
189
|
|
|
213
|
-
var rootNodeID = fnName === 'mountComponent' ?
|
|
214
|
-
args[0] :
|
|
215
|
-
this._rootNodeID;
|
|
190
|
+
var rootNodeID = fnName === 'mountComponent' ? args[0] : this._rootNodeID;
|
|
216
191
|
var isRender = fnName === '_renderValidatedComponent';
|
|
217
192
|
var isMount = fnName === 'mountComponent';
|
|
218
193
|
|
|
219
194
|
var mountStack = ReactDefaultPerf._mountStack;
|
|
220
|
-
var entry = ReactDefaultPerf._allMeasurements[
|
|
221
|
-
ReactDefaultPerf._allMeasurements.length - 1
|
|
222
|
-
];
|
|
195
|
+
var entry = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1];
|
|
223
196
|
|
|
224
197
|
if (isRender) {
|
|
225
198
|
addValue(entry.counts, rootNodeID, 1);
|
|
@@ -243,12 +216,8 @@ var ReactDefaultPerf = {
|
|
|
243
216
|
}
|
|
244
217
|
|
|
245
218
|
entry.displayNames[rootNodeID] = {
|
|
246
|
-
current:
|
|
247
|
-
|
|
248
|
-
this.getName(),
|
|
249
|
-
owner: this._currentElement._owner ?
|
|
250
|
-
this._currentElement._owner.getName() :
|
|
251
|
-
'<root>'
|
|
219
|
+
current: this.getName(),
|
|
220
|
+
owner: this._currentElement._owner ? this._currentElement._owner.getName() : '<root>'
|
|
252
221
|
};
|
|
253
222
|
|
|
254
223
|
return rv;
|
|
@@ -259,4 +228,4 @@ var ReactDefaultPerf = {
|
|
|
259
228
|
}
|
|
260
229
|
};
|
|
261
230
|
|
|
262
|
-
module.exports = ReactDefaultPerf;
|
|
231
|
+
module.exports = ReactDefaultPerf;
|