react 0.13.1 → 0.14.0-alpha2

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.
Files changed (197) hide show
  1. package/README.md +1 -1
  2. package/addons.js +7 -0
  3. package/addons/CSSTransitionGroup.js +1 -0
  4. package/addons/LinkedStateMixin.js +1 -0
  5. package/addons/Perf.js +1 -0
  6. package/addons/PureRenderMixin.js +1 -0
  7. package/addons/TestUtils.js +1 -0
  8. package/addons/TransitionGroup.js +1 -0
  9. package/addons/batchedUpdates.js +1 -0
  10. package/addons/cloneWithProps.js +1 -0
  11. package/addons/createFragment.js +1 -0
  12. package/addons/renderSubtreeIntoContainer.js +1 -0
  13. package/addons/shallowCompare.js +1 -0
  14. package/addons/update.js +1 -0
  15. package/dist/JSXTransformer.js +3336 -1671
  16. package/dist/react-with-addons.js +3320 -5125
  17. package/dist/react-with-addons.min.js +6 -6
  18. package/dist/react.js +2952 -4533
  19. package/dist/react.min.js +5 -5
  20. package/lib/AutoFocusMixin.js +4 -3
  21. package/lib/BeforeInputEventPlugin.js +30 -118
  22. package/lib/CSSCore.js +12 -23
  23. package/lib/CSSProperty.js +9 -4
  24. package/lib/CSSPropertyOperations.js +14 -30
  25. package/lib/CallbackQueue.js +7 -10
  26. package/lib/ChangeEventPlugin.js +24 -88
  27. package/lib/ClientReactRootIndex.js +2 -2
  28. package/lib/DOMChildrenOperations.js +13 -33
  29. package/lib/DOMProperty.js +41 -67
  30. package/lib/DOMPropertyOperations.js +30 -51
  31. package/lib/Danger.js +19 -62
  32. package/lib/DefaultEventPluginOrder.js +2 -12
  33. package/lib/EnterLeaveEventPlugin.js +11 -33
  34. package/lib/EventConstants.js +2 -2
  35. package/lib/EventListener.js +11 -13
  36. package/lib/EventPluginHub.js +44 -47
  37. package/lib/EventPluginRegistry.js +18 -74
  38. package/lib/EventPluginUtils.js +27 -38
  39. package/lib/EventPropagators.js +23 -26
  40. package/lib/ExecutionEnvironment.js +4 -8
  41. package/lib/FallbackCompositionState.js +3 -3
  42. package/lib/HTMLDOMPropertyConfig.js +13 -20
  43. package/lib/LinkedStateMixin.js +3 -6
  44. package/lib/LinkedValueUtils.js +34 -64
  45. package/lib/LocalEventTrapMixin.js +9 -16
  46. package/lib/Object.assign.js +1 -1
  47. package/lib/PooledClass.js +8 -11
  48. package/lib/React.js +9 -129
  49. package/lib/ReactBrowserComponentMixin.js +9 -2
  50. package/lib/ReactBrowserEventEmitter.js +26 -82
  51. package/lib/ReactCSSTransitionGroup.js +13 -24
  52. package/lib/ReactCSSTransitionGroupChild.js +18 -28
  53. package/lib/ReactChildReconciler.js +11 -19
  54. package/lib/ReactChildren.js +21 -28
  55. package/lib/ReactClass.js +81 -234
  56. package/lib/ReactComponent.js +17 -33
  57. package/lib/ReactComponentBrowserEnvironment.js +4 -8
  58. package/lib/ReactComponentEnvironment.js +6 -12
  59. package/lib/ReactComponentWithPureRenderMixin.js +4 -5
  60. package/lib/ReactCompositeComponent.js +85 -297
  61. package/lib/ReactContext.js +2 -44
  62. package/lib/ReactCurrentOwner.js +1 -3
  63. package/lib/ReactDOM.js +4 -2
  64. package/lib/ReactDOMButton.js +3 -4
  65. package/lib/ReactDOMClient.js +85 -0
  66. package/lib/ReactDOMComponent.js +184 -146
  67. package/lib/ReactDOMForm.js +3 -3
  68. package/lib/ReactDOMIDOperations.js +11 -22
  69. package/lib/ReactDOMIframe.js +3 -3
  70. package/lib/ReactDOMImg.js +3 -3
  71. package/lib/ReactDOMInput.js +22 -35
  72. package/lib/ReactDOMOption.js +68 -10
  73. package/lib/ReactDOMSelect.js +50 -28
  74. package/lib/ReactDOMSelection.js +5 -20
  75. package/lib/ReactDOMServer.js +24 -0
  76. package/lib/ReactDOMTextComponent.js +17 -18
  77. package/lib/ReactDOMTextarea.js +15 -27
  78. package/lib/ReactDefaultBatchingStrategy.js +9 -13
  79. package/lib/ReactDefaultInjection.js +31 -40
  80. package/lib/ReactDefaultPerf.js +36 -69
  81. package/lib/ReactDefaultPerfAnalysis.js +8 -14
  82. package/lib/ReactElement.js +24 -57
  83. package/lib/ReactElementValidator.js +38 -105
  84. package/lib/ReactEmptyComponent.js +7 -11
  85. package/lib/ReactErrorUtils.js +2 -2
  86. package/lib/ReactEventEmitterMixin.js +3 -12
  87. package/lib/ReactEventListener.js +16 -38
  88. package/lib/ReactFragment.js +23 -54
  89. package/lib/ReactInjection.js +1 -1
  90. package/lib/ReactInputSelection.js +11 -21
  91. package/lib/ReactInstanceHandles.js +27 -57
  92. package/lib/ReactInstanceMap.js +5 -5
  93. package/lib/ReactIsomorphic.js +70 -0
  94. package/lib/ReactLifeCycle.js +1 -1
  95. package/lib/ReactLink.js +2 -4
  96. package/lib/ReactMarkupChecksum.js +5 -10
  97. package/lib/ReactMount.js +137 -260
  98. package/lib/ReactMultiChild.js +19 -45
  99. package/lib/ReactMultiChildUpdateTypes.js +1 -1
  100. package/lib/ReactNativeComponent.js +7 -11
  101. package/lib/ReactOwner.js +7 -24
  102. package/lib/ReactPerf.js +8 -12
  103. package/lib/ReactPropTransferer.js +4 -4
  104. package/lib/ReactPropTypeLocationNames.js +2 -2
  105. package/lib/ReactPropTypeLocations.js +1 -1
  106. package/lib/ReactPropTypes.js +29 -61
  107. package/lib/ReactReconcileTransaction.js +9 -34
  108. package/lib/ReactReconciler.js +9 -19
  109. package/lib/ReactRef.js +5 -8
  110. package/lib/ReactRootIndex.js +2 -2
  111. package/lib/ReactServerRendering.js +7 -15
  112. package/lib/ReactServerRenderingTransaction.js +7 -32
  113. package/lib/ReactStateSetters.js +6 -6
  114. package/lib/ReactTestUtils.js +93 -165
  115. package/lib/ReactTransitionChildMapping.js +5 -7
  116. package/lib/ReactTransitionEvents.js +5 -5
  117. package/lib/ReactTransitionGroup.js +30 -52
  118. package/lib/ReactUpdateQueue.js +27 -90
  119. package/lib/ReactUpdates.js +27 -79
  120. package/lib/ReactWithAddons.js +7 -6
  121. package/lib/SVGDOMPropertyConfig.js +41 -4
  122. package/lib/SelectEventPlugin.js +28 -29
  123. package/lib/ServerReactRootIndex.js +2 -2
  124. package/lib/SimpleEventPlugin.js +136 -128
  125. package/lib/SyntheticClipboardEvent.js +3 -7
  126. package/lib/SyntheticCompositionEvent.js +3 -9
  127. package/lib/SyntheticDragEvent.js +1 -1
  128. package/lib/SyntheticEvent.js +8 -10
  129. package/lib/SyntheticFocusEvent.js +1 -1
  130. package/lib/SyntheticInputEvent.js +3 -9
  131. package/lib/SyntheticKeyboardEvent.js +4 -4
  132. package/lib/SyntheticMouseEvent.js +8 -14
  133. package/lib/SyntheticTouchEvent.js +1 -1
  134. package/lib/SyntheticUIEvent.js +3 -3
  135. package/lib/SyntheticWheelEvent.js +11 -15
  136. package/lib/Transaction.js +12 -24
  137. package/lib/ViewportMetrics.js +2 -2
  138. package/lib/accumulateInto.js +2 -5
  139. package/lib/adler32.js +2 -4
  140. package/lib/camelize.js +4 -2
  141. package/lib/camelizeStyleName.js +2 -2
  142. package/lib/cloneWithProps.js +5 -11
  143. package/lib/containsNode.js +29 -16
  144. package/lib/createArrayFromMixed.js +17 -16
  145. package/lib/createFullPageComponent.js +4 -11
  146. package/lib/createNodesFromMarkup.js +6 -8
  147. package/lib/dangerousStyleValue.js +2 -3
  148. package/lib/emptyFunction.js +10 -4
  149. package/lib/emptyObject.js +1 -1
  150. package/lib/escapeTextContentForBrowser.js +1 -1
  151. package/lib/findDOMNode.js +5 -24
  152. package/lib/flattenChildren.js +4 -10
  153. package/lib/focusNode.js +2 -3
  154. package/lib/forEachAccumulated.js +2 -2
  155. package/lib/getActiveElement.js +4 -2
  156. package/lib/getEventCharCode.js +1 -1
  157. package/lib/getEventKey.js +1 -1
  158. package/lib/getEventModifierState.js +1 -1
  159. package/lib/getEventTarget.js +1 -1
  160. package/lib/getIteratorFn.js +2 -4
  161. package/lib/getMarkupWrap.js +7 -5
  162. package/lib/getNodeForCharacterOffset.js +1 -1
  163. package/lib/getTextContentAccessor.js +2 -4
  164. package/lib/getUnboundedScrollPosition.js +1 -1
  165. package/lib/hyphenate.js +3 -1
  166. package/lib/hyphenateStyleName.js +2 -2
  167. package/lib/instantiateReactComponent.js +14 -37
  168. package/lib/invariant.js +8 -12
  169. package/lib/isEventSupported.js +7 -10
  170. package/lib/isNode.js +4 -6
  171. package/lib/isTextInputElement.js +2 -4
  172. package/lib/isTextNode.js +3 -1
  173. package/lib/joinClasses.js +2 -2
  174. package/lib/keyMirror.js +3 -6
  175. package/lib/keyOf.js +4 -3
  176. package/lib/mapObject.js +1 -1
  177. package/lib/memoizeStringOnly.js +2 -2
  178. package/lib/onlyChild.js +2 -5
  179. package/lib/performance.js +2 -5
  180. package/lib/performanceNow.js +3 -1
  181. package/lib/quoteAttributeValueForBrowser.js +1 -1
  182. package/lib/renderSubtreeIntoContainer.js +16 -0
  183. package/lib/setInnerHTML.js +11 -8
  184. package/lib/setTextContent.js +3 -3
  185. package/lib/shallowCompare.js +24 -0
  186. package/lib/shallowEqual.js +17 -11
  187. package/lib/shouldUpdateReactComponent.js +3 -64
  188. package/lib/toArray.js +8 -19
  189. package/lib/traverseAllChildren.js +22 -89
  190. package/lib/update.js +33 -90
  191. package/lib/validateDOMNesting.js +355 -0
  192. package/lib/warning.js +17 -15
  193. package/package.json +3 -3
  194. package/lib/MobileSafariClickEventPlugin.js +0 -56
  195. package/lib/ReactPutListenerQueue.js +0 -54
  196. package/lib/cx.js +0 -52
  197. package/lib/getReactRootElementInContainer.js +0 -33
@@ -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;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Copyright 2013-2015, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ *
9
+ * @providesModule ReactDOMServer
10
+ */
11
+
12
+ 'use strict';
13
+
14
+ var ReactDefaultInjection = require("./ReactDefaultInjection");
15
+ var ReactServerRendering = require("./ReactServerRendering");
16
+
17
+ ReactDefaultInjection.inject();
18
+
19
+ var ReactDOMServer = {
20
+ renderToString: ReactServerRendering.renderToString,
21
+ renderToStaticMarkup: ReactServerRendering.renderToStaticMarkup
22
+ };
23
+
24
+ module.exports = ReactDOMServer;
@@ -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.ancestorInfoContextKey]) {
68
+ validateDOMNesting('span', null, context[validateDOMNesting.ancestorInfoContextKey]);
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.
@@ -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 ("production" !== process.env.NODE_ENV) {
63
- ("production" !== process.env.NODE_ENV ? warning(
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
- ("production" !== process.env.NODE_ENV ? invariant(
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
- ("production" !== process.env.NODE_ENV ? invariant(
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
- ("production" !== process.env.NODE_ENV ? invariant(
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.getDOMNode();
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
- ReactDefaultBatchingStrategyTransaction.prototype,
40
- Transaction.Mixin,
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,30 @@ var createFullPageComponent = require("./createFullPageComponent");
51
50
  function autoGenerateWrapperClass(type) {
52
51
  return ReactClass.createClass({
53
52
  tagName: type.toUpperCase(),
54
- render: function() {
55
- return new ReactElement(
56
- type,
57
- null,
58
- null,
59
- null,
60
- null,
61
- this.props
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
 
65
+ var alreadyInjected = false;
66
+
67
67
  function inject() {
68
- ReactInjection.EventEmitter.injectReactEventListener(
69
- ReactEventListener
70
- );
68
+ if (alreadyInjected) {
69
+ // TODO: This is currently true because these injections are shared between
70
+ // the client and the server package. They should be built independently
71
+ // and not share any injection state. Then this problem will be solved.
72
+ return;
73
+ }
74
+ alreadyInjected = true;
75
+
76
+ ReactInjection.EventEmitter.injectReactEventListener(ReactEventListener);
71
77
 
72
78
  /**
73
79
  * Inject modules for resolving DOM hierarchy and plugin ordering.
@@ -84,22 +90,15 @@ function inject() {
84
90
  SimpleEventPlugin: SimpleEventPlugin,
85
91
  EnterLeaveEventPlugin: EnterLeaveEventPlugin,
86
92
  ChangeEventPlugin: ChangeEventPlugin,
87
- MobileSafariClickEventPlugin: MobileSafariClickEventPlugin,
88
93
  SelectEventPlugin: SelectEventPlugin,
89
94
  BeforeInputEventPlugin: BeforeInputEventPlugin
90
95
  });
91
96
 
92
- ReactInjection.NativeComponent.injectGenericComponentClass(
93
- ReactDOMComponent
94
- );
97
+ ReactInjection.NativeComponent.injectGenericComponentClass(ReactDOMComponent);
95
98
 
96
- ReactInjection.NativeComponent.injectTextComponentClass(
97
- ReactDOMTextComponent
98
- );
99
+ ReactInjection.NativeComponent.injectTextComponentClass(ReactDOMTextComponent);
99
100
 
100
- ReactInjection.NativeComponent.injectAutoWrapper(
101
- autoGenerateWrapperClass
102
- );
101
+ ReactInjection.NativeComponent.injectAutoWrapper(autoGenerateWrapperClass);
103
102
 
104
103
  // This needs to happen before createFullPageComponent() otherwise the mixin
105
104
  // won't be included.
@@ -125,25 +124,17 @@ function inject() {
125
124
 
126
125
  ReactInjection.EmptyComponent.injectEmptyComponent('noscript');
127
126
 
128
- ReactInjection.Updates.injectReconcileTransaction(
129
- ReactReconcileTransaction
130
- );
131
- ReactInjection.Updates.injectBatchingStrategy(
132
- ReactDefaultBatchingStrategy
133
- );
127
+ ReactInjection.Updates.injectReconcileTransaction(ReactReconcileTransaction);
128
+ ReactInjection.Updates.injectBatchingStrategy(ReactDefaultBatchingStrategy);
134
129
 
135
- ReactInjection.RootIndex.injectCreateReactRootIndex(
136
- ExecutionEnvironment.canUseDOM ?
137
- ClientReactRootIndex.createReactRootIndex :
138
- ServerReactRootIndex.createReactRootIndex
139
- );
130
+ ReactInjection.RootIndex.injectCreateReactRootIndex(ExecutionEnvironment.canUseDOM ? ClientReactRootIndex.createReactRootIndex : ServerReactRootIndex.createReactRootIndex);
140
131
 
141
132
  ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment);
142
133
  ReactInjection.DOMComponent.injectIDOperations(ReactDOMIDOperations);
143
134
 
144
- if ("production" !== process.env.NODE_ENV) {
145
- var url = (ExecutionEnvironment.canUseDOM && window.location.href) || '';
146
- if ((/[?&]react_perf\b/).test(url)) {
135
+ if ('production' !== process.env.NODE_ENV) {
136
+ var url = ExecutionEnvironment.canUseDOM && window.location.href || '';
137
+ if (/[?&]react_perf\b/.test(url)) {
147
138
  var ReactDefaultPerf = require("./ReactDefaultPerf");
148
139
  ReactDefaultPerf.start();
149
140
  }
@@ -152,4 +143,4 @@ function inject() {
152
143
 
153
144
  module.exports = {
154
145
  inject: inject
155
- };
146
+ };
@@ -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
- measurements,
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() {for (var args=[],$__0=0,$__1=arguments.length;$__0<$__1;$__0++) args.push(arguments[$__0]);
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 (fnName === '_mountImageIntoNode' ||
167
- moduleName === 'ReactDOMIDOperations') {
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,42 +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
- (// TODO: receiveComponent()?
210
- (fnName === 'mountComponent' ||
211
- fnName === 'updateComponent' || fnName === '_renderValidatedComponent')))) {
183
+ } else if (moduleName === 'ReactCompositeComponent' && (fnName === 'mountComponent' || fnName === 'updateComponent' || // TODO: receiveComponent()?
184
+ fnName === '_renderValidatedComponent')) {
212
185
 
213
186
  if (typeof this._currentElement.type === 'string') {
214
187
  return func.apply(this, args);
215
188
  }
216
189
 
217
- var rootNodeID = fnName === 'mountComponent' ?
218
- args[0] :
219
- this._rootNodeID;
190
+ var rootNodeID = fnName === 'mountComponent' ? args[0] : this._rootNodeID;
220
191
  var isRender = fnName === '_renderValidatedComponent';
221
192
  var isMount = fnName === 'mountComponent';
222
193
 
223
194
  var mountStack = ReactDefaultPerf._mountStack;
224
- var entry = ReactDefaultPerf._allMeasurements[
225
- ReactDefaultPerf._allMeasurements.length - 1
226
- ];
195
+ var entry = ReactDefaultPerf._allMeasurements[ReactDefaultPerf._allMeasurements.length - 1];
227
196
 
228
197
  if (isRender) {
229
198
  addValue(entry.counts, rootNodeID, 1);
@@ -248,9 +217,7 @@ var ReactDefaultPerf = {
248
217
 
249
218
  entry.displayNames[rootNodeID] = {
250
219
  current: this.getName(),
251
- owner: this._currentElement._owner ?
252
- this._currentElement._owner.getName() :
253
- '<root>'
220
+ owner: this._currentElement._owner ? this._currentElement._owner.getName() : '<root>'
254
221
  };
255
222
 
256
223
  return rv;
@@ -261,4 +228,4 @@ var ReactDefaultPerf = {
261
228
  }
262
229
  };
263
230
 
264
- module.exports = ReactDefaultPerf;
231
+ module.exports = ReactDefaultPerf;