react 0.14.0-alpha3 → 0.14.0-rc1

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 (200) hide show
  1. package/README.md +5 -2
  2. package/addons.js +8 -3
  3. package/dist/react-dom.js +42 -0
  4. package/dist/react-dom.min.js +12 -0
  5. package/dist/react-with-addons.js +6076 -5337
  6. package/dist/react-with-addons.min.js +6 -6
  7. package/dist/react.js +5445 -4839
  8. package/dist/react.min.js +6 -5
  9. package/lib/{AutoFocusMixin.js → AutoFocusUtils.js} +15 -5
  10. package/lib/BeforeInputEventPlugin.js +13 -13
  11. package/lib/CSSProperty.js +18 -3
  12. package/lib/CSSPropertyOperations.js +22 -14
  13. package/lib/CallbackQueue.js +4 -4
  14. package/lib/ChangeEventPlugin.js +18 -15
  15. package/lib/DOMChildrenOperations.js +17 -7
  16. package/lib/DOMProperty.js +82 -117
  17. package/lib/DOMPropertyOperations.js +84 -33
  18. package/lib/Danger.js +21 -16
  19. package/lib/DefaultEventPluginOrder.js +2 -2
  20. package/lib/EnterLeaveEventPlugin.js +21 -13
  21. package/lib/EventConstants.js +23 -1
  22. package/lib/EventPluginHub.js +17 -20
  23. package/lib/EventPluginRegistry.js +8 -8
  24. package/lib/EventPluginUtils.js +33 -42
  25. package/lib/EventPropagators.js +8 -8
  26. package/lib/FallbackCompositionState.js +9 -3
  27. package/lib/HTMLDOMPropertyConfig.js +19 -3
  28. package/lib/LinkedStateMixin.js +2 -2
  29. package/lib/LinkedValueUtils.js +50 -38
  30. package/lib/MetaMatchers.js +118 -0
  31. package/lib/OrderedMap.js +453 -0
  32. package/lib/PooledClass.js +15 -5
  33. package/lib/React.js +18 -7
  34. package/lib/ReactBrowserComponentMixin.js +4 -4
  35. package/lib/ReactBrowserEventEmitter.js +30 -7
  36. package/lib/ReactCSSTransitionGroup.js +35 -9
  37. package/lib/ReactCSSTransitionGroupChild.js +56 -30
  38. package/lib/ReactChildReconciler.js +24 -19
  39. package/lib/ReactChildren.js +75 -35
  40. package/lib/ReactClass.js +70 -87
  41. package/lib/ReactComponent.js +27 -20
  42. package/lib/ReactComponentBrowserEnvironment.js +2 -2
  43. package/lib/ReactComponentEnvironment.js +2 -2
  44. package/lib/ReactComponentWithPureRenderMixin.js +3 -3
  45. package/lib/ReactCompositeComponent.js +117 -106
  46. package/lib/ReactDOM.js +74 -158
  47. package/lib/ReactDOMButton.js +15 -26
  48. package/lib/ReactDOMComponent.js +441 -72
  49. package/lib/ReactDOMFactories.js +177 -0
  50. package/lib/{emptyObject.js → ReactDOMFeatureFlags.js} +6 -8
  51. package/lib/ReactDOMIDOperations.js +8 -66
  52. package/lib/ReactDOMInput.js +87 -99
  53. package/lib/ReactDOMOption.js +25 -44
  54. package/lib/ReactDOMSelect.js +88 -98
  55. package/lib/ReactDOMSelection.js +3 -3
  56. package/lib/ReactDOMServer.js +5 -3
  57. package/lib/ReactDOMTextComponent.js +33 -20
  58. package/lib/ReactDOMTextarea.js +48 -61
  59. package/lib/ReactDefaultBatchingStrategy.js +4 -4
  60. package/lib/ReactDefaultInjection.js +23 -72
  61. package/lib/ReactDefaultPerf.js +7 -7
  62. package/lib/ReactDefaultPerfAnalysis.js +6 -11
  63. package/lib/ReactElement.js +92 -107
  64. package/lib/ReactElementValidator.js +53 -173
  65. package/lib/ReactEmptyComponent.js +26 -62
  66. package/lib/ReactEmptyComponentRegistry.js +48 -0
  67. package/lib/ReactErrorUtils.js +45 -9
  68. package/lib/ReactEventEmitterMixin.js +3 -4
  69. package/lib/ReactEventListener.js +64 -12
  70. package/lib/ReactFragment.js +29 -115
  71. package/lib/ReactInjection.js +10 -12
  72. package/lib/ReactInputSelection.js +8 -7
  73. package/lib/ReactInstanceHandles.js +12 -12
  74. package/lib/ReactIsomorphic.js +15 -11
  75. package/lib/ReactLink.js +1 -1
  76. package/lib/ReactMarkupChecksum.js +6 -2
  77. package/lib/ReactMount.js +196 -122
  78. package/lib/ReactMultiChild.js +119 -25
  79. package/lib/ReactMultiChildUpdateTypes.js +2 -1
  80. package/lib/ReactNativeComponent.js +3 -8
  81. package/lib/ReactNoopUpdateQueue.js +118 -0
  82. package/lib/ReactOwner.js +3 -3
  83. package/lib/ReactPerf.js +2 -2
  84. package/lib/ReactPropTransferer.js +3 -3
  85. package/lib/ReactPropTypeLocationNames.js +1 -1
  86. package/lib/ReactPropTypeLocations.js +1 -1
  87. package/lib/ReactPropTypes.js +41 -12
  88. package/lib/ReactReconcileTransaction.js +12 -10
  89. package/lib/ReactReconciler.js +8 -11
  90. package/lib/ReactRef.js +15 -2
  91. package/lib/ReactServerBatchingStrategy.js +23 -0
  92. package/lib/ReactServerRendering.js +22 -9
  93. package/lib/ReactServerRenderingTransaction.js +8 -7
  94. package/lib/ReactTestUtils.js +89 -64
  95. package/lib/ReactTransitionChildMapping.js +3 -6
  96. package/lib/ReactTransitionEvents.js +1 -1
  97. package/lib/ReactTransitionGroup.js +5 -6
  98. package/lib/ReactUpdateQueue.js +60 -35
  99. package/lib/ReactUpdates.js +15 -18
  100. package/lib/{isTextNode.js → ReactVersion.js} +2 -13
  101. package/lib/ReactWithAddons.js +24 -17
  102. package/lib/ResponderEventPlugin.js +514 -0
  103. package/lib/ResponderSyntheticEvent.js +40 -0
  104. package/lib/ResponderTouchHistoryStore.js +180 -0
  105. package/lib/SVGDOMPropertyConfig.js +1 -1
  106. package/lib/SelectEventPlugin.js +25 -16
  107. package/lib/SimpleEventPlugin.js +200 -45
  108. package/lib/SyntheticClipboardEvent.js +3 -3
  109. package/lib/SyntheticCompositionEvent.js +3 -3
  110. package/lib/SyntheticDragEvent.js +3 -3
  111. package/lib/SyntheticEvent.js +24 -8
  112. package/lib/SyntheticFocusEvent.js +3 -3
  113. package/lib/SyntheticInputEvent.js +3 -3
  114. package/lib/SyntheticKeyboardEvent.js +6 -6
  115. package/lib/SyntheticMouseEvent.js +5 -5
  116. package/lib/SyntheticTouchEvent.js +4 -4
  117. package/lib/SyntheticUIEvent.js +4 -4
  118. package/lib/SyntheticWheelEvent.js +3 -3
  119. package/lib/TapEventPlugin.js +119 -0
  120. package/lib/Transaction.js +17 -11
  121. package/lib/accumulate.js +44 -0
  122. package/lib/accumulateInto.js +2 -2
  123. package/lib/adler32.js +19 -7
  124. package/lib/cloneWithProps.js +12 -7
  125. package/lib/createHierarchyRenderer.js +85 -0
  126. package/lib/dangerousStyleValue.js +1 -1
  127. package/lib/deprecated.js +48 -0
  128. package/lib/findDOMNode.js +11 -12
  129. package/lib/flattenChildren.js +4 -4
  130. package/lib/forEachAccumulated.js +1 -1
  131. package/lib/getEventCharCode.js +1 -1
  132. package/lib/getEventKey.js +1 -1
  133. package/lib/getEventModifierState.js +0 -1
  134. package/lib/getTestDocument.js +28 -0
  135. package/lib/getTextContentAccessor.js +1 -1
  136. package/lib/instantiateReactComponent.js +27 -25
  137. package/lib/isEventSupported.js +1 -1
  138. package/lib/isTextInputElement.js +2 -1
  139. package/lib/joinClasses.js +1 -1
  140. package/lib/onlyChild.js +3 -3
  141. package/lib/quoteAttributeValueForBrowser.js +1 -1
  142. package/lib/reactComponentExpect.js +216 -0
  143. package/lib/renderSubtreeIntoContainer.js +1 -1
  144. package/lib/setInnerHTML.js +2 -2
  145. package/lib/setTextContent.js +3 -3
  146. package/lib/shallowCompare.js +1 -1
  147. package/lib/shouldUpdateReactComponent.js +12 -8
  148. package/lib/sliceChildren.js +34 -0
  149. package/lib/traverseAllChildren.js +21 -19
  150. package/lib/update.js +13 -13
  151. package/lib/validateDOMNesting.js +6 -6
  152. package/lib/webcomponents.js +6379 -0
  153. package/package.json +4 -6
  154. package/react.js +2 -0
  155. package/addons/CSSTransitionGroup.js +0 -1
  156. package/addons/LinkedStateMixin.js +0 -1
  157. package/addons/Perf.js +0 -1
  158. package/addons/PureRenderMixin.js +0 -1
  159. package/addons/TestUtils.js +0 -1
  160. package/addons/TransitionGroup.js +0 -1
  161. package/addons/batchedUpdates.js +0 -1
  162. package/addons/cloneWithProps.js +0 -1
  163. package/addons/createFragment.js +0 -1
  164. package/addons/renderSubtreeIntoContainer.js +0 -1
  165. package/addons/shallowCompare.js +0 -1
  166. package/addons/update.js +0 -1
  167. package/dist/JSXTransformer.js +0 -17589
  168. package/lib/CSSCore.js +0 -97
  169. package/lib/EventListener.js +0 -84
  170. package/lib/ExecutionEnvironment.js +0 -38
  171. package/lib/LocalEventTrapMixin.js +0 -46
  172. package/lib/ReactContext.js +0 -32
  173. package/lib/ReactDOMClient.js +0 -85
  174. package/lib/ReactDOMForm.js +0 -47
  175. package/lib/ReactDOMIframe.js +0 -43
  176. package/lib/ReactDOMImg.js +0 -44
  177. package/lib/ReactLifeCycle.js +0 -35
  178. package/lib/camelize.js +0 -32
  179. package/lib/camelizeStyleName.js +0 -40
  180. package/lib/containsNode.js +0 -55
  181. package/lib/createArrayFromMixed.js +0 -85
  182. package/lib/createFullPageComponent.js +0 -51
  183. package/lib/createNodesFromMarkup.js +0 -84
  184. package/lib/emptyFunction.js +0 -38
  185. package/lib/focusNode.js +0 -26
  186. package/lib/getActiveElement.js +0 -29
  187. package/lib/getMarkupWrap.js +0 -115
  188. package/lib/getUnboundedScrollPosition.js +0 -38
  189. package/lib/hyphenate.js +0 -33
  190. package/lib/hyphenateStyleName.js +0 -39
  191. package/lib/invariant.js +0 -49
  192. package/lib/isNode.js +0 -23
  193. package/lib/keyMirror.js +0 -48
  194. package/lib/keyOf.js +0 -35
  195. package/lib/mapObject.js +0 -51
  196. package/lib/performance.js +0 -23
  197. package/lib/performanceNow.js +0 -28
  198. package/lib/shallowEqual.js +0 -48
  199. package/lib/toArray.js +0 -57
  200. package/lib/warning.js +0 -61
@@ -11,26 +11,18 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var AutoFocusMixin = require("./AutoFocusMixin");
15
- var DOMPropertyOperations = require("./DOMPropertyOperations");
16
- var LinkedValueUtils = require("./LinkedValueUtils");
17
- var ReactBrowserComponentMixin = require("./ReactBrowserComponentMixin");
18
- var ReactClass = require("./ReactClass");
19
- var ReactElement = require("./ReactElement");
20
- var ReactUpdates = require("./ReactUpdates");
14
+ var LinkedValueUtils = require('./LinkedValueUtils');
15
+ var ReactDOMIDOperations = require('./ReactDOMIDOperations');
16
+ var ReactUpdates = require('./ReactUpdates');
21
17
 
22
- var assign = require("./Object.assign");
23
- var findDOMNode = require("./findDOMNode");
24
- var invariant = require("./invariant");
25
-
26
- var warning = require("./warning");
27
-
28
- var textarea = ReactElement.createFactory('textarea');
18
+ var assign = require('./Object.assign');
19
+ var invariant = require('fbjs/lib/invariant');
20
+ var warning = require('fbjs/lib/warning');
29
21
 
30
22
  function forceUpdateIfMounted() {
31
- /*jshint validthis:true */
32
- if (this.isMounted()) {
33
- this.forceUpdate();
23
+ if (this._rootNodeID) {
24
+ // DOM component is still mounted; update
25
+ ReactDOMTextarea.updateWrapper(this);
34
26
  }
35
27
  }
36
28
 
@@ -49,23 +41,35 @@ function forceUpdateIfMounted() {
49
41
  * The rendered element will be initialized with an empty value, the prop
50
42
  * `defaultValue` if specified, or the children content (deprecated).
51
43
  */
52
- var ReactDOMTextarea = ReactClass.createClass({
53
- displayName: 'ReactDOMTextarea',
54
- tagName: 'TEXTAREA',
44
+ var ReactDOMTextarea = {
45
+ getNativeProps: function (inst, props, context) {
46
+ !(props.dangerouslySetInnerHTML == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : invariant(false) : undefined;
55
47
 
56
- mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin],
48
+ // Always set children to the same thing. In IE9, the selection range will
49
+ // get reset if `textContent` is mutated.
50
+ var nativeProps = assign({}, props, {
51
+ defaultValue: undefined,
52
+ value: undefined,
53
+ children: inst._wrapperState.initialValue,
54
+ onChange: inst._wrapperState.onChange
55
+ });
56
+
57
+ return nativeProps;
58
+ },
57
59
 
58
- getInitialState: function () {
59
- var defaultValue = this.props.defaultValue;
60
+ mountWrapper: function (inst, props) {
61
+ LinkedValueUtils.checkPropTypes('textarea', props, inst._currentElement._owner);
62
+
63
+ var defaultValue = props.defaultValue;
60
64
  // TODO (yungsters): Remove support for children content in <textarea>.
61
- var children = this.props.children;
65
+ var children = props.children;
62
66
  if (children != 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>.') : undefined;
67
+ if (process.env.NODE_ENV !== 'production') {
68
+ process.env.NODE_ENV !== 'production' ? warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.') : undefined;
65
69
  }
66
- !(defaultValue == null) ? 'production' !== process.env.NODE_ENV ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : invariant(false) : undefined;
70
+ !(defaultValue == null) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : invariant(false) : undefined;
67
71
  if (Array.isArray(children)) {
68
- !(children.length <= 1) ? 'production' !== process.env.NODE_ENV ? invariant(false, '<textarea> can only have at most one child.') : invariant(false) : undefined;
72
+ !(children.length <= 1) ? process.env.NODE_ENV !== 'production' ? invariant(false, '<textarea> can only have at most one child.') : invariant(false) : undefined;
69
73
  children = children[0];
70
74
  }
71
75
 
@@ -74,51 +78,34 @@ var ReactDOMTextarea = ReactClass.createClass({
74
78
  if (defaultValue == null) {
75
79
  defaultValue = '';
76
80
  }
77
- var value = LinkedValueUtils.getValue(this.props);
78
- return {
81
+ var value = LinkedValueUtils.getValue(props);
82
+
83
+ inst._wrapperState = {
79
84
  // We save the initial value so that `ReactDOMComponent` doesn't update
80
85
  // `textContent` (unnecessary since we update value).
81
86
  // The initial value can be a boolean or object so that's why it's
82
87
  // forced to be a string.
83
- initialValue: '' + (value != null ? value : defaultValue)
88
+ initialValue: '' + (value != null ? value : defaultValue),
89
+ onChange: _handleChange.bind(inst)
84
90
  };
85
91
  },
86
92
 
87
- render: function () {
88
- // Clone `this.props` so we don't mutate the input.
89
- var props = assign({}, this.props);
90
-
91
- !(props.dangerouslySetInnerHTML == null) ? 'production' !== process.env.NODE_ENV ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : invariant(false) : undefined;
92
-
93
- props.defaultValue = null;
94
- props.value = null;
95
- props.onChange = this._handleChange;
96
-
97
- // Always set children to the same thing. In IE9, the selection range will
98
- // get reset if `textContent` is mutated.
99
- return textarea(props, this.state.initialValue);
100
- },
101
-
102
- componentDidUpdate: function (prevProps, prevState, prevContext) {
103
- var value = LinkedValueUtils.getValue(this.props);
93
+ updateWrapper: function (inst) {
94
+ var props = inst._currentElement.props;
95
+ var value = LinkedValueUtils.getValue(props);
104
96
  if (value != null) {
105
- var rootNode = findDOMNode(this);
106
97
  // Cast `value` to a string to ensure the value is set correctly. While
107
98
  // browsers typically do this as necessary, jsdom doesn't.
108
- DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value);
99
+ ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value);
109
100
  }
110
- },
111
-
112
- _handleChange: function (event) {
113
- var returnValue;
114
- var onChange = LinkedValueUtils.getOnChange(this.props);
115
- if (onChange) {
116
- returnValue = onChange.call(this, event);
117
- }
118
- ReactUpdates.asap(forceUpdateIfMounted, this);
119
- return returnValue;
120
101
  }
102
+ };
121
103
 
122
- });
104
+ function _handleChange(event) {
105
+ var props = this._currentElement.props;
106
+ var returnValue = LinkedValueUtils.executeOnChange(props, event);
107
+ ReactUpdates.asap(forceUpdateIfMounted, this);
108
+ return returnValue;
109
+ }
123
110
 
124
111
  module.exports = ReactDOMTextarea;
@@ -11,11 +11,11 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var ReactUpdates = require("./ReactUpdates");
15
- var Transaction = require("./Transaction");
14
+ var ReactUpdates = require('./ReactUpdates');
15
+ var Transaction = require('./Transaction');
16
16
 
17
- var assign = require("./Object.assign");
18
- var emptyFunction = require("./emptyFunction");
17
+ var assign = require('./Object.assign');
18
+ var emptyFunction = require('fbjs/lib/emptyFunction');
19
19
 
20
20
  var RESET_BATCHED_UPDATES = {
21
21
  initialize: emptyFunction,
@@ -11,56 +11,27 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var BeforeInputEventPlugin = require("./BeforeInputEventPlugin");
15
- var ChangeEventPlugin = require("./ChangeEventPlugin");
16
- var ClientReactRootIndex = require("./ClientReactRootIndex");
17
- var DefaultEventPluginOrder = require("./DefaultEventPluginOrder");
18
- var EnterLeaveEventPlugin = require("./EnterLeaveEventPlugin");
19
- var ExecutionEnvironment = require("./ExecutionEnvironment");
20
- var HTMLDOMPropertyConfig = require("./HTMLDOMPropertyConfig");
21
- var ReactBrowserComponentMixin = require("./ReactBrowserComponentMixin");
22
- var ReactClass = require("./ReactClass");
23
- var ReactComponentBrowserEnvironment = require("./ReactComponentBrowserEnvironment");
24
- var ReactDefaultBatchingStrategy = require("./ReactDefaultBatchingStrategy");
25
- var ReactDOMComponent = require("./ReactDOMComponent");
26
- var ReactDOMButton = require("./ReactDOMButton");
27
- var ReactDOMForm = require("./ReactDOMForm");
28
- var ReactDOMImg = require("./ReactDOMImg");
29
- var ReactDOMIDOperations = require("./ReactDOMIDOperations");
30
- var ReactDOMIframe = require("./ReactDOMIframe");
31
- var ReactDOMInput = require("./ReactDOMInput");
32
- var ReactDOMOption = require("./ReactDOMOption");
33
- var ReactDOMSelect = require("./ReactDOMSelect");
34
- var ReactDOMTextarea = require("./ReactDOMTextarea");
35
- var ReactDOMTextComponent = require("./ReactDOMTextComponent");
36
- var ReactElement = require("./ReactElement");
37
- var ReactEventListener = require("./ReactEventListener");
38
- var ReactInjection = require("./ReactInjection");
39
- var ReactInstanceHandles = require("./ReactInstanceHandles");
40
- var ReactInstanceMap = require("./ReactInstanceMap");
41
- var ReactMount = require("./ReactMount");
42
- var ReactReconcileTransaction = require("./ReactReconcileTransaction");
43
- var SelectEventPlugin = require("./SelectEventPlugin");
44
- var ServerReactRootIndex = require("./ServerReactRootIndex");
45
- var SimpleEventPlugin = require("./SimpleEventPlugin");
46
- var SVGDOMPropertyConfig = require("./SVGDOMPropertyConfig");
47
-
48
- var createFullPageComponent = require("./createFullPageComponent");
49
-
50
- function autoGenerateWrapperClass(type) {
51
- return ReactClass.createClass({
52
- tagName: type.toUpperCase(),
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);
61
- }
62
- });
63
- }
14
+ var BeforeInputEventPlugin = require('./BeforeInputEventPlugin');
15
+ var ChangeEventPlugin = require('./ChangeEventPlugin');
16
+ var ClientReactRootIndex = require('./ClientReactRootIndex');
17
+ var DefaultEventPluginOrder = require('./DefaultEventPluginOrder');
18
+ var EnterLeaveEventPlugin = require('./EnterLeaveEventPlugin');
19
+ var ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');
20
+ var HTMLDOMPropertyConfig = require('./HTMLDOMPropertyConfig');
21
+ var ReactBrowserComponentMixin = require('./ReactBrowserComponentMixin');
22
+ var ReactComponentBrowserEnvironment = require('./ReactComponentBrowserEnvironment');
23
+ var ReactDefaultBatchingStrategy = require('./ReactDefaultBatchingStrategy');
24
+ var ReactDOMComponent = require('./ReactDOMComponent');
25
+ var ReactDOMTextComponent = require('./ReactDOMTextComponent');
26
+ var ReactEventListener = require('./ReactEventListener');
27
+ var ReactInjection = require('./ReactInjection');
28
+ var ReactInstanceHandles = require('./ReactInstanceHandles');
29
+ var ReactMount = require('./ReactMount');
30
+ var ReactReconcileTransaction = require('./ReactReconcileTransaction');
31
+ var SelectEventPlugin = require('./SelectEventPlugin');
32
+ var ServerReactRootIndex = require('./ServerReactRootIndex');
33
+ var SimpleEventPlugin = require('./SimpleEventPlugin');
34
+ var SVGDOMPropertyConfig = require('./SVGDOMPropertyConfig');
64
35
 
65
36
  var alreadyInjected = false;
66
37
 
@@ -98,27 +69,8 @@ function inject() {
98
69
 
99
70
  ReactInjection.NativeComponent.injectTextComponentClass(ReactDOMTextComponent);
100
71
 
101
- ReactInjection.NativeComponent.injectAutoWrapper(autoGenerateWrapperClass);
102
-
103
- // This needs to happen before createFullPageComponent() otherwise the mixin
104
- // won't be included.
105
72
  ReactInjection.Class.injectMixin(ReactBrowserComponentMixin);
106
73
 
107
- ReactInjection.NativeComponent.injectComponentClasses({
108
- 'button': ReactDOMButton,
109
- 'form': ReactDOMForm,
110
- 'iframe': ReactDOMIframe,
111
- 'img': ReactDOMImg,
112
- 'input': ReactDOMInput,
113
- 'option': ReactDOMOption,
114
- 'select': ReactDOMSelect,
115
- 'textarea': ReactDOMTextarea,
116
-
117
- 'html': createFullPageComponent('html'),
118
- 'head': createFullPageComponent('head'),
119
- 'body': createFullPageComponent('body')
120
- });
121
-
122
74
  ReactInjection.DOMProperty.injectDOMPropertyConfig(HTMLDOMPropertyConfig);
123
75
  ReactInjection.DOMProperty.injectDOMPropertyConfig(SVGDOMPropertyConfig);
124
76
 
@@ -130,12 +82,11 @@ function inject() {
130
82
  ReactInjection.RootIndex.injectCreateReactRootIndex(ExecutionEnvironment.canUseDOM ? ClientReactRootIndex.createReactRootIndex : ServerReactRootIndex.createReactRootIndex);
131
83
 
132
84
  ReactInjection.Component.injectEnvironment(ReactComponentBrowserEnvironment);
133
- ReactInjection.DOMComponent.injectIDOperations(ReactDOMIDOperations);
134
85
 
135
- if ('production' !== process.env.NODE_ENV) {
86
+ if (process.env.NODE_ENV !== 'production') {
136
87
  var url = ExecutionEnvironment.canUseDOM && window.location.href || '';
137
88
  if (/[?&]react_perf\b/.test(url)) {
138
- var ReactDefaultPerf = require("./ReactDefaultPerf");
89
+ var ReactDefaultPerf = require('./ReactDefaultPerf');
139
90
  ReactDefaultPerf.start();
140
91
  }
141
92
  }
@@ -12,12 +12,12 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var DOMProperty = require("./DOMProperty");
16
- var ReactDefaultPerfAnalysis = require("./ReactDefaultPerfAnalysis");
17
- var ReactMount = require("./ReactMount");
18
- var ReactPerf = require("./ReactPerf");
15
+ var DOMProperty = require('./DOMProperty');
16
+ var ReactDefaultPerfAnalysis = require('./ReactDefaultPerfAnalysis');
17
+ var ReactMount = require('./ReactMount');
18
+ var ReactPerf = require('./ReactPerf');
19
19
 
20
- var performanceNow = require("./performanceNow");
20
+ var performanceNow = require('fbjs/lib/performanceNow');
21
21
 
22
22
  function roundFloat(val) {
23
23
  return Math.floor(val * 100) / 100;
@@ -103,8 +103,8 @@ var ReactDefaultPerf = {
103
103
  console.table(summary.map(function (item) {
104
104
  var result = {};
105
105
  result[DOMProperty.ID_ATTRIBUTE_NAME] = item.id;
106
- result['type'] = item.type;
107
- result['args'] = JSON.stringify(item.args);
106
+ result.type = item.type;
107
+ result.args = JSON.stringify(item.args);
108
108
  return result;
109
109
  }));
110
110
  console.log('Total time:', ReactDefaultPerfAnalysis.getTotalTime(measurements).toFixed(2) + ' ms');
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var assign = require("./Object.assign");
14
+ var assign = require('./Object.assign');
15
15
 
16
16
  // Don't try to save users less than 1.2ms (a number I made up)
17
17
  var DONT_CARE_THRESHOLD = 1.2;
@@ -20,11 +20,9 @@ var DOM_OPERATION_TYPES = {
20
20
  INSERT_MARKUP: 'set innerHTML',
21
21
  MOVE_EXISTING: 'move',
22
22
  REMOVE_NODE: 'remove',
23
+ SET_MARKUP: 'set innerHTML',
23
24
  TEXT_CONTENT: 'set textContent',
24
25
  'updatePropertyByID': 'update attribute',
25
- 'deletePropertyByID': 'delete attribute',
26
- 'updateStylesByID': 'update styles',
27
- 'updateInnerHTMLByID': 'set innerHTML',
28
26
  'dangerouslyReplaceNodeWithMarkupByID': 'replace'
29
27
  };
30
28
 
@@ -43,11 +41,8 @@ function getTotalTime(measurements) {
43
41
 
44
42
  function getDOMSummary(measurements) {
45
43
  var items = [];
46
- for (var i = 0; i < measurements.length; i++) {
47
- var measurement = measurements[i];
48
- var id;
49
-
50
- for (id in measurement.writes) {
44
+ measurements.forEach(function (measurement) {
45
+ Object.keys(measurement.writes).forEach(function (id) {
51
46
  measurement.writes[id].forEach(function (write) {
52
47
  items.push({
53
48
  id: id,
@@ -55,8 +50,8 @@ function getDOMSummary(measurements) {
55
50
  args: write.args
56
51
  });
57
52
  });
58
- }
59
- }
53
+ });
54
+ });
60
55
  return items;
61
56
  }
62
57
 
@@ -11,66 +11,29 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var ReactContext = require("./ReactContext");
15
- var ReactCurrentOwner = require("./ReactCurrentOwner");
14
+ var ReactCurrentOwner = require('./ReactCurrentOwner');
16
15
 
17
- var assign = require("./Object.assign");
18
- var warning = require("./warning");
16
+ var assign = require('./Object.assign');
17
+
18
+ // The Symbol used to tag the ReactElement type. If there is no native Symbol
19
+ // nor polyfill, then a plain number is used for performance.
20
+ var TYPE_SYMBOL = typeof Symbol === 'function' && Symbol['for'] && Symbol['for']('react.element') || 0xeac7;
19
21
 
20
22
  var RESERVED_PROPS = {
21
23
  key: true,
22
- ref: true
24
+ ref: true,
25
+ __self: true,
26
+ __source: true
23
27
  };
24
28
 
25
- /**
26
- * Warn for mutations.
27
- *
28
- * @internal
29
- * @param {object} object
30
- * @param {string} key
31
- */
32
- function defineWarningProperty(object, key) {
33
- Object.defineProperty(object, key, {
34
-
35
- configurable: false,
36
- enumerable: true,
37
-
38
- get: function () {
39
- if (!this._store) {
40
- return null;
41
- }
42
- return this._store[key];
43
- },
44
-
45
- set: function (value) {
46
- 'production' !== process.env.NODE_ENV ? warning(false, 'Don\'t set the %s property of the React element. Instead, ' + 'specify the correct value when initially creating the element.', key) : undefined;
47
- this._store[key] = value;
48
- }
49
-
50
- });
51
- }
52
-
53
- /**
54
- * This is updated to true if the membrane is successfully created.
55
- */
56
- var useMutationMembrane = false;
57
-
58
- /**
59
- * Warn for mutations.
60
- *
61
- * @internal
62
- * @param {object} element
63
- */
64
- function defineMutationMembrane(prototype) {
29
+ var canDefineProperty = false;
30
+ if (process.env.NODE_ENV !== 'production') {
65
31
  try {
66
- var pseudoFrozenProperties = {
67
- props: true
68
- };
69
- for (var key in pseudoFrozenProperties) {
70
- defineWarningProperty(prototype, key);
71
- }
72
- useMutationMembrane = true;
73
- } catch (x) {}
32
+ Object.defineProperty({}, 'x', {});
33
+ canDefineProperty = true;
34
+ } catch (x) {
35
+ // IE will fail on defineProperty
36
+ }
74
37
  }
75
38
 
76
39
  /**
@@ -78,62 +41,79 @@ function defineMutationMembrane(prototype) {
78
41
  * work with a dynamic instanceof check. Nothing should live on this prototype.
79
42
  *
80
43
  * @param {*} type
81
- * @param {string|object} ref
82
44
  * @param {*} key
45
+ * @param {string|object} ref
46
+ * @param {*} self A *temporary* helper to detect places where `this` is
47
+ * different from the `owner` when React.createElement is called, so that we
48
+ * can warn. We want to get rid of owner and replace string `ref`s with arrow
49
+ * functions, and as long as `this` and owner are the same, there will be no
50
+ * change in behavior.
51
+ * @param {*} source An annotation object (added by a transpiler or otherwise)
52
+ * indicating filename, line number, and/or other information.
53
+ * @param {*} owner
83
54
  * @param {*} props
84
55
  * @internal
85
56
  */
86
- var ReactElement = function (type, key, ref, owner, context, props) {
87
- // Built-in properties that belong on the element
88
- this.type = type;
89
- this.key = key;
90
- this.ref = ref;
91
-
92
- // Record the component responsible for creating this element.
93
- this._owner = owner;
94
-
95
- if ('production' !== process.env.NODE_ENV) {
96
- // The validation flag and props are currently mutative. We put them on
57
+ var ReactElement = function (type, key, ref, self, source, owner, props) {
58
+ var element = {
59
+ // This tag allow us to uniquely identify this as a React Element
60
+ $$typeof: TYPE_SYMBOL,
61
+
62
+ // Built-in properties that belong on the element
63
+ type: type,
64
+ key: key,
65
+ ref: ref,
66
+ props: props,
67
+
68
+ // Record the component responsible for creating this element.
69
+ _owner: owner
70
+ };
71
+
72
+ if (process.env.NODE_ENV !== 'production') {
73
+ // The validation flag is currently mutative. We put it on
97
74
  // an external backing store so that we can freeze the whole object.
98
75
  // This can be replaced with a WeakMap once they are implemented in
99
76
  // commonly used development environments.
100
- this._store = { props: props, originalProps: assign({}, props) };
77
+ element._store = {};
101
78
 
102
79
  // To make comparing ReactElements easier for testing purposes, we make
103
80
  // the validation flag non-enumerable (where possible, which should
104
81
  // include every environment we run tests in), so the test framework
105
82
  // ignores it.
106
- try {
107
- Object.defineProperty(this._store, 'validated', {
83
+ if (canDefineProperty) {
84
+ Object.defineProperty(element._store, 'validated', {
85
+ configurable: false,
86
+ enumerable: false,
87
+ writable: true,
88
+ value: false
89
+ });
90
+ // self and source are DEV only properties.
91
+ Object.defineProperty(element, '_self', {
92
+ configurable: false,
93
+ enumerable: false,
94
+ writable: false,
95
+ value: self
96
+ });
97
+ // Two elements created in two different places should be considered
98
+ // equal for testing purposes and therefore we hide it from enumeration.
99
+ Object.defineProperty(element, '_source', {
108
100
  configurable: false,
109
101
  enumerable: false,
110
- writable: true
102
+ writable: false,
103
+ value: source
111
104
  });
112
- } catch (x) {}
113
- this._store.validated = false;
114
-
115
- // We're not allowed to set props directly on the object so we early
116
- // return and rely on the prototype membrane to forward to the backing
117
- // store.
118
- if (useMutationMembrane) {
119
- Object.freeze(this);
120
- return;
105
+ } else {
106
+ element._store.validated = false;
107
+ element._self = self;
108
+ element._source = source;
121
109
  }
110
+ Object.freeze(element.props);
111
+ Object.freeze(element);
122
112
  }
123
113
 
124
- this.props = props;
114
+ return element;
125
115
  };
126
116
 
127
- // We intentionally don't expose the function on the constructor property.
128
- // ReactElement should be indistinguishable from a plain object.
129
- ReactElement.prototype = {
130
- _isReactElement: true
131
- };
132
-
133
- if ('production' !== process.env.NODE_ENV) {
134
- defineMutationMembrane(ReactElement.prototype);
135
- }
136
-
137
117
  ReactElement.createElement = function (type, config, children) {
138
118
  var propName;
139
119
 
@@ -142,10 +122,14 @@ ReactElement.createElement = function (type, config, children) {
142
122
 
143
123
  var key = null;
144
124
  var ref = null;
125
+ var self = null;
126
+ var source = null;
145
127
 
146
128
  if (config != null) {
147
129
  ref = config.ref === undefined ? null : config.ref;
148
130
  key = config.key === undefined ? null : '' + config.key;
131
+ self = config.__self === undefined ? null : config.__self;
132
+ source = config.__source === undefined ? null : config.__source;
149
133
  // Remaining properties are added to a new props object
150
134
  for (propName in config) {
151
135
  if (config.hasOwnProperty(propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {
@@ -177,7 +161,7 @@ ReactElement.createElement = function (type, config, children) {
177
161
  }
178
162
  }
179
163
 
180
- return new ReactElement(type, key, ref, ReactCurrentOwner.current, ReactContext.current, props);
164
+ return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);
181
165
  };
182
166
 
183
167
  ReactElement.createFactory = function (type) {
@@ -191,13 +175,20 @@ ReactElement.createFactory = function (type) {
191
175
  return factory;
192
176
  };
193
177
 
178
+ ReactElement.cloneAndReplaceKey = function (oldElement, newKey) {
179
+ var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);
180
+
181
+ return newElement;
182
+ };
183
+
194
184
  ReactElement.cloneAndReplaceProps = function (oldElement, newProps) {
195
- var newElement = new ReactElement(oldElement.type, oldElement.key, oldElement.ref, oldElement._owner, oldElement._context, newProps);
185
+ var newElement = ReactElement(oldElement.type, oldElement.key, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, newProps);
196
186
 
197
- if ('production' !== process.env.NODE_ENV) {
187
+ if (process.env.NODE_ENV !== 'production') {
198
188
  // If the key on the original is valid, then the clone is valid
199
189
  newElement._store.validated = oldElement._store.validated;
200
190
  }
191
+
201
192
  return newElement;
202
193
  };
203
194
 
@@ -210,6 +201,12 @@ ReactElement.cloneElement = function (element, config, children) {
210
201
  // Reserved names are extracted
211
202
  var key = element.key;
212
203
  var ref = element.ref;
204
+ // Self is preserved since the owner is preserved.
205
+ var self = element._self;
206
+ // Source is preserved since cloneElement is unlikely to be targeted by a
207
+ // transpiler, and the original source is probably a better indicator of the
208
+ // true owner.
209
+ var source = element._source;
213
210
 
214
211
  // Owner will be preserved, unless ref is overridden
215
212
  var owner = element._owner;
@@ -244,7 +241,7 @@ ReactElement.cloneElement = function (element, config, children) {
244
241
  props.children = childArray;
245
242
  }
246
243
 
247
- return new ReactElement(element.type, key, ref, owner, element._context, props);
244
+ return ReactElement(element.type, key, ref, self, source, owner, props);
248
245
  };
249
246
 
250
247
  /**
@@ -253,19 +250,7 @@ ReactElement.cloneElement = function (element, config, children) {
253
250
  * @final
254
251
  */
255
252
  ReactElement.isValidElement = function (object) {
256
- // ReactTestUtils is often used outside of beforeEach where as React is
257
- // within it. This leads to two different instances of React on the same
258
- // page. To identify a element from a different React instance we use
259
- // a flag instead of an instanceof check.
260
- var isElement = !!(object && object._isReactElement);
261
- // if (isElement && !(object instanceof ReactElement)) {
262
- // This is an indicator that you're using multiple versions of React at the
263
- // same time. This will screw with ownership and stuff. Fix it, please.
264
- // TODO: We could possibly warn here.
265
- // }
266
- return isElement;
253
+ return typeof object === 'object' && object !== null && object.$$typeof === TYPE_SYMBOL;
267
254
  };
268
255
 
269
- module.exports = ReactElement;
270
-
271
- // IE will fail on defineProperty
256
+ module.exports = ReactElement;