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
@@ -0,0 +1,177 @@
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 ReactDOMFactories
10
+ * @typechecks static-only
11
+ */
12
+
13
+ 'use strict';
14
+
15
+ var ReactElement = require('./ReactElement');
16
+ var ReactElementValidator = require('./ReactElementValidator');
17
+
18
+ var mapObject = require('fbjs/lib/mapObject');
19
+
20
+ /**
21
+ * Create a factory that creates HTML tag elements.
22
+ *
23
+ * @param {string} tag Tag name (e.g. `div`).
24
+ * @private
25
+ */
26
+ function createDOMFactory(tag) {
27
+ if (process.env.NODE_ENV !== 'production') {
28
+ return ReactElementValidator.createFactory(tag);
29
+ }
30
+ return ReactElement.createFactory(tag);
31
+ }
32
+
33
+ /**
34
+ * Creates a mapping from supported HTML tags to `ReactDOMComponent` classes.
35
+ * This is also accessible via `React.DOM`.
36
+ *
37
+ * @public
38
+ */
39
+ var ReactDOMFactories = mapObject({
40
+ a: 'a',
41
+ abbr: 'abbr',
42
+ address: 'address',
43
+ area: 'area',
44
+ article: 'article',
45
+ aside: 'aside',
46
+ audio: 'audio',
47
+ b: 'b',
48
+ base: 'base',
49
+ bdi: 'bdi',
50
+ bdo: 'bdo',
51
+ big: 'big',
52
+ blockquote: 'blockquote',
53
+ body: 'body',
54
+ br: 'br',
55
+ button: 'button',
56
+ canvas: 'canvas',
57
+ caption: 'caption',
58
+ cite: 'cite',
59
+ code: 'code',
60
+ col: 'col',
61
+ colgroup: 'colgroup',
62
+ data: 'data',
63
+ datalist: 'datalist',
64
+ dd: 'dd',
65
+ del: 'del',
66
+ details: 'details',
67
+ dfn: 'dfn',
68
+ dialog: 'dialog',
69
+ div: 'div',
70
+ dl: 'dl',
71
+ dt: 'dt',
72
+ em: 'em',
73
+ embed: 'embed',
74
+ fieldset: 'fieldset',
75
+ figcaption: 'figcaption',
76
+ figure: 'figure',
77
+ footer: 'footer',
78
+ form: 'form',
79
+ h1: 'h1',
80
+ h2: 'h2',
81
+ h3: 'h3',
82
+ h4: 'h4',
83
+ h5: 'h5',
84
+ h6: 'h6',
85
+ head: 'head',
86
+ header: 'header',
87
+ hgroup: 'hgroup',
88
+ hr: 'hr',
89
+ html: 'html',
90
+ i: 'i',
91
+ iframe: 'iframe',
92
+ img: 'img',
93
+ input: 'input',
94
+ ins: 'ins',
95
+ kbd: 'kbd',
96
+ keygen: 'keygen',
97
+ label: 'label',
98
+ legend: 'legend',
99
+ li: 'li',
100
+ link: 'link',
101
+ main: 'main',
102
+ map: 'map',
103
+ mark: 'mark',
104
+ menu: 'menu',
105
+ menuitem: 'menuitem',
106
+ meta: 'meta',
107
+ meter: 'meter',
108
+ nav: 'nav',
109
+ noscript: 'noscript',
110
+ object: 'object',
111
+ ol: 'ol',
112
+ optgroup: 'optgroup',
113
+ option: 'option',
114
+ output: 'output',
115
+ p: 'p',
116
+ param: 'param',
117
+ picture: 'picture',
118
+ pre: 'pre',
119
+ progress: 'progress',
120
+ q: 'q',
121
+ rp: 'rp',
122
+ rt: 'rt',
123
+ ruby: 'ruby',
124
+ s: 's',
125
+ samp: 'samp',
126
+ script: 'script',
127
+ section: 'section',
128
+ select: 'select',
129
+ small: 'small',
130
+ source: 'source',
131
+ span: 'span',
132
+ strong: 'strong',
133
+ style: 'style',
134
+ sub: 'sub',
135
+ summary: 'summary',
136
+ sup: 'sup',
137
+ table: 'table',
138
+ tbody: 'tbody',
139
+ td: 'td',
140
+ textarea: 'textarea',
141
+ tfoot: 'tfoot',
142
+ th: 'th',
143
+ thead: 'thead',
144
+ time: 'time',
145
+ title: 'title',
146
+ tr: 'tr',
147
+ track: 'track',
148
+ u: 'u',
149
+ ul: 'ul',
150
+ 'var': 'var',
151
+ video: 'video',
152
+ wbr: 'wbr',
153
+
154
+ // SVG
155
+ circle: 'circle',
156
+ clipPath: 'clipPath',
157
+ defs: 'defs',
158
+ ellipse: 'ellipse',
159
+ g: 'g',
160
+ image: 'image',
161
+ line: 'line',
162
+ linearGradient: 'linearGradient',
163
+ mask: 'mask',
164
+ path: 'path',
165
+ pattern: 'pattern',
166
+ polygon: 'polygon',
167
+ polyline: 'polyline',
168
+ radialGradient: 'radialGradient',
169
+ rect: 'rect',
170
+ stop: 'stop',
171
+ svg: 'svg',
172
+ text: 'text',
173
+ tspan: 'tspan'
174
+
175
+ }, createDOMFactory);
176
+
177
+ module.exports = ReactDOMFactories;
@@ -6,15 +6,13 @@
6
6
  * LICENSE file in the root directory of this source tree. An additional grant
7
7
  * of patent rights can be found in the PATENTS file in the same directory.
8
8
  *
9
- * @providesModule emptyObject
9
+ * @providesModule ReactDOMFeatureFlags
10
10
  */
11
11
 
12
- "use strict";
12
+ 'use strict';
13
13
 
14
- var emptyObject = {};
14
+ var ReactDOMFeatureFlags = {
15
+ useCreateElement: false
16
+ };
15
17
 
16
- if ("production" !== process.env.NODE_ENV) {
17
- Object.freeze(emptyObject);
18
- }
19
-
20
- module.exports = emptyObject;
18
+ module.exports = ReactDOMFeatureFlags;
@@ -12,17 +12,15 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var CSSPropertyOperations = require("./CSSPropertyOperations");
16
- var DOMChildrenOperations = require("./DOMChildrenOperations");
17
- var DOMPropertyOperations = require("./DOMPropertyOperations");
18
- var ReactMount = require("./ReactMount");
19
- var ReactPerf = require("./ReactPerf");
15
+ var DOMChildrenOperations = require('./DOMChildrenOperations');
16
+ var DOMPropertyOperations = require('./DOMPropertyOperations');
17
+ var ReactMount = require('./ReactMount');
18
+ var ReactPerf = require('./ReactPerf');
20
19
 
21
- var invariant = require("./invariant");
22
- var setInnerHTML = require("./setInnerHTML");
20
+ var invariant = require('fbjs/lib/invariant');
23
21
 
24
22
  /**
25
- * Errors for properties that should not be updated with `updatePropertyById()`.
23
+ * Errors for properties that should not be updated with `updatePropertyByID()`.
26
24
  *
27
25
  * @type {object}
28
26
  * @private
@@ -33,8 +31,7 @@ var INVALID_PROPERTY_ERRORS = {
33
31
  };
34
32
 
35
33
  /**
36
- * Operations used to process updates to DOM nodes. This is made injectable via
37
- * `ReactDOMComponent.BackendIDOperations`.
34
+ * Operations used to process updates to DOM nodes.
38
35
  */
39
36
  var ReactDOMIDOperations = {
40
37
 
@@ -49,7 +46,7 @@ var ReactDOMIDOperations = {
49
46
  */
50
47
  updatePropertyByID: function (id, name, value) {
51
48
  var node = ReactMount.getNode(id);
52
- !!INVALID_PROPERTY_ERRORS.hasOwnProperty(name) ? 'production' !== process.env.NODE_ENV ? invariant(false, 'updatePropertyByID(...): %s', INVALID_PROPERTY_ERRORS[name]) : invariant(false) : undefined;
49
+ !!INVALID_PROPERTY_ERRORS.hasOwnProperty(name) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'updatePropertyByID(...): %s', INVALID_PROPERTY_ERRORS[name]) : invariant(false) : undefined;
53
50
 
54
51
  // If we're updating to null or undefined, we should remove the property
55
52
  // from the DOM node instead of inadvertantly setting to a string. This
@@ -61,57 +58,6 @@ var ReactDOMIDOperations = {
61
58
  }
62
59
  },
63
60
 
64
- /**
65
- * Updates a DOM node to remove a property. This should only be used to remove
66
- * DOM properties in `DOMProperty`.
67
- *
68
- * @param {string} id ID of the node to update.
69
- * @param {string} name A property name to remove, see `DOMProperty`.
70
- * @internal
71
- */
72
- deletePropertyByID: function (id, name, value) {
73
- var node = ReactMount.getNode(id);
74
- !!INVALID_PROPERTY_ERRORS.hasOwnProperty(name) ? 'production' !== process.env.NODE_ENV ? invariant(false, 'updatePropertyByID(...): %s', INVALID_PROPERTY_ERRORS[name]) : invariant(false) : undefined;
75
- DOMPropertyOperations.deleteValueForProperty(node, name, value);
76
- },
77
-
78
- /**
79
- * Updates a DOM node with new style values. If a value is specified as '',
80
- * the corresponding style property will be unset.
81
- *
82
- * @param {string} id ID of the node to update.
83
- * @param {object} styles Mapping from styles to values.
84
- * @internal
85
- */
86
- updateStylesByID: function (id, styles) {
87
- var node = ReactMount.getNode(id);
88
- CSSPropertyOperations.setValueForStyles(node, styles);
89
- },
90
-
91
- /**
92
- * Updates a DOM node's innerHTML.
93
- *
94
- * @param {string} id ID of the node to update.
95
- * @param {string} html An HTML string.
96
- * @internal
97
- */
98
- updateInnerHTMLByID: function (id, html) {
99
- var node = ReactMount.getNode(id);
100
- setInnerHTML(node, html);
101
- },
102
-
103
- /**
104
- * Updates a DOM node's text content set by `props.content`.
105
- *
106
- * @param {string} id ID of the node to update.
107
- * @param {string} content Text content.
108
- * @internal
109
- */
110
- updateTextContentByID: function (id, content) {
111
- var node = ReactMount.getNode(id);
112
- DOMChildrenOperations.updateTextContent(node, content);
113
- },
114
-
115
61
  /**
116
62
  * Replaces a DOM node that exists in the document with markup.
117
63
  *
@@ -142,10 +88,6 @@ var ReactDOMIDOperations = {
142
88
 
143
89
  ReactPerf.measureMethods(ReactDOMIDOperations, 'ReactDOMIDOperations', {
144
90
  updatePropertyByID: 'updatePropertyByID',
145
- deletePropertyByID: 'deletePropertyByID',
146
- updateStylesByID: 'updateStylesByID',
147
- updateInnerHTMLByID: 'updateInnerHTMLByID',
148
- updateTextContentByID: 'updateTextContentByID',
149
91
  dangerouslyReplaceNodeWithMarkupByID: 'dangerouslyReplaceNodeWithMarkupByID',
150
92
  dangerouslyProcessChildrenUpdates: 'dangerouslyProcessChildrenUpdates'
151
93
  });
@@ -11,27 +11,20 @@
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 ReactMount = require("./ReactMount");
21
- var ReactUpdates = require("./ReactUpdates");
14
+ var ReactDOMIDOperations = require('./ReactDOMIDOperations');
15
+ var LinkedValueUtils = require('./LinkedValueUtils');
16
+ var ReactMount = require('./ReactMount');
17
+ var ReactUpdates = require('./ReactUpdates');
22
18
 
23
- var assign = require("./Object.assign");
24
- var findDOMNode = require("./findDOMNode");
25
- var invariant = require("./invariant");
26
-
27
- var input = ReactElement.createFactory('input');
19
+ var assign = require('./Object.assign');
20
+ var invariant = require('fbjs/lib/invariant');
28
21
 
29
22
  var instancesByReactID = {};
30
23
 
31
24
  function forceUpdateIfMounted() {
32
- /*jshint validthis:true */
33
- if (this.isMounted()) {
34
- this.forceUpdate();
25
+ if (this._rootNodeID) {
26
+ // DOM component is still mounted; update
27
+ ReactDOMInput.updateWrapper(this);
35
28
  }
36
29
  }
37
30
 
@@ -51,110 +44,105 @@ function forceUpdateIfMounted() {
51
44
  *
52
45
  * @see http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
53
46
  */
54
- var ReactDOMInput = ReactClass.createClass({
55
- displayName: 'ReactDOMInput',
56
- tagName: 'INPUT',
57
-
58
- mixins: [AutoFocusMixin, LinkedValueUtils.Mixin, ReactBrowserComponentMixin],
59
-
60
- getInitialState: function () {
61
- var defaultValue = this.props.defaultValue;
62
- return {
63
- initialChecked: this.props.defaultChecked || false,
64
- initialValue: defaultValue != null ? defaultValue : null
65
- };
47
+ var ReactDOMInput = {
48
+ getNativeProps: function (inst, props, context) {
49
+ var value = LinkedValueUtils.getValue(props);
50
+ var checked = LinkedValueUtils.getChecked(props);
51
+
52
+ var nativeProps = assign({}, props, {
53
+ defaultChecked: undefined,
54
+ defaultValue: undefined,
55
+ value: value != null ? value : inst._wrapperState.initialValue,
56
+ checked: checked != null ? checked : inst._wrapperState.initialChecked,
57
+ onChange: inst._wrapperState.onChange
58
+ });
59
+
60
+ return nativeProps;
66
61
  },
67
62
 
68
- render: function () {
69
- // Clone `this.props` so we don't mutate the input.
70
- var props = assign({}, this.props);
71
-
72
- props.defaultChecked = null;
73
- props.defaultValue = null;
63
+ mountWrapper: function (inst, props) {
64
+ LinkedValueUtils.checkPropTypes('input', props, inst._currentElement._owner);
74
65
 
75
- var value = LinkedValueUtils.getValue(this.props);
76
- props.value = value != null ? value : this.state.initialValue;
77
-
78
- var checked = LinkedValueUtils.getChecked(this.props);
79
- props.checked = checked != null ? checked : this.state.initialChecked;
80
-
81
- props.onChange = this._handleChange;
66
+ var defaultValue = props.defaultValue;
67
+ inst._wrapperState = {
68
+ initialChecked: props.defaultChecked || false,
69
+ initialValue: defaultValue != null ? defaultValue : null,
70
+ onChange: _handleChange.bind(inst)
71
+ };
82
72
 
83
- return input(props, this.props.children);
73
+ instancesByReactID[inst._rootNodeID] = inst;
84
74
  },
85
75
 
86
- componentDidMount: function () {
87
- var id = ReactMount.getID(findDOMNode(this));
88
- instancesByReactID[id] = this;
76
+ unmountWrapper: function (inst) {
77
+ delete instancesByReactID[inst._rootNodeID];
89
78
  },
90
79
 
91
- componentWillUnmount: function () {
92
- var rootNode = findDOMNode(this);
93
- var id = ReactMount.getID(rootNode);
94
- delete instancesByReactID[id];
95
- },
80
+ updateWrapper: function (inst) {
81
+ var props = inst._currentElement.props;
96
82
 
97
- componentDidUpdate: function (prevProps, prevState, prevContext) {
98
- var rootNode = findDOMNode(this);
99
- if (this.props.checked != null) {
100
- DOMPropertyOperations.setValueForProperty(rootNode, 'checked', this.props.checked || false);
83
+ // TODO: Shouldn't this be getChecked(props)?
84
+ var checked = props.checked;
85
+ if (checked != null) {
86
+ ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'checked', checked || false);
101
87
  }
102
88
 
103
- var value = LinkedValueUtils.getValue(this.props);
89
+ var value = LinkedValueUtils.getValue(props);
104
90
  if (value != null) {
105
91
  // Cast `value` to a string to ensure the value is set correctly. While
106
92
  // browsers typically do this as necessary, jsdom doesn't.
107
- DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value);
93
+ ReactDOMIDOperations.updatePropertyByID(inst._rootNodeID, 'value', '' + value);
108
94
  }
109
- },
95
+ }
96
+ };
97
+
98
+ function _handleChange(event) {
99
+ var props = this._currentElement.props;
100
+
101
+ var returnValue = LinkedValueUtils.executeOnChange(props, event);
102
+
103
+ // Here we use asap to wait until all updates have propagated, which
104
+ // is important when using controlled components within layers:
105
+ // https://github.com/facebook/react/issues/1698
106
+ ReactUpdates.asap(forceUpdateIfMounted, this);
110
107
 
111
- _handleChange: function (event) {
112
- var returnValue;
113
- var onChange = LinkedValueUtils.getOnChange(this.props);
114
- if (onChange) {
115
- returnValue = onChange.call(this, event);
108
+ var name = props.name;
109
+ if (props.type === 'radio' && name != null) {
110
+ var rootNode = ReactMount.getNode(this._rootNodeID);
111
+ var queryRoot = rootNode;
112
+
113
+ while (queryRoot.parentNode) {
114
+ queryRoot = queryRoot.parentNode;
116
115
  }
117
- // Here we use asap to wait until all updates have propagated, which
118
- // is important when using controlled components within layers:
119
- // https://github.com/facebook/react/issues/1698
120
- ReactUpdates.asap(forceUpdateIfMounted, this);
121
-
122
- var name = this.props.name;
123
- if (this.props.type === 'radio' && name != null) {
124
- var rootNode = findDOMNode(this);
125
- var queryRoot = rootNode;
126
-
127
- while (queryRoot.parentNode) {
128
- queryRoot = queryRoot.parentNode;
129
- }
130
116
 
131
- // If `rootNode.form` was non-null, then we could try `form.elements`,
132
- // but that sometimes behaves strangely in IE8. We could also try using
133
- // `form.getElementsByName`, but that will only return direct children
134
- // and won't include inputs that use the HTML5 `form=` attribute. Since
135
- // the input might not even be in a form, let's just use the global
136
- // `querySelectorAll` to ensure we don't miss anything.
137
- var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
138
-
139
- for (var i = 0; i < group.length; i++) {
140
- var otherNode = group[i];
141
- if (otherNode === rootNode || otherNode.form !== rootNode.form) {
142
- continue;
143
- }
144
- var otherID = ReactMount.getID(otherNode);
145
- !otherID ? 'production' !== process.env.NODE_ENV ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.') : invariant(false) : undefined;
146
- var otherInstance = instancesByReactID[otherID];
147
- !otherInstance ? 'production' !== process.env.NODE_ENV ? invariant(false, 'ReactDOMInput: Unknown radio button ID %s.', otherID) : invariant(false) : undefined;
148
- // If this is a controlled radio button group, forcing the input that
149
- // was previously checked to update will cause it to be come re-checked
150
- // as appropriate.
151
- ReactUpdates.asap(forceUpdateIfMounted, otherInstance);
117
+ // If `rootNode.form` was non-null, then we could try `form.elements`,
118
+ // but that sometimes behaves strangely in IE8. We could also try using
119
+ // `form.getElementsByName`, but that will only return direct children
120
+ // and won't include inputs that use the HTML5 `form=` attribute. Since
121
+ // the input might not even be in a form, let's just use the global
122
+ // `querySelectorAll` to ensure we don't miss anything.
123
+ var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
124
+
125
+ for (var i = 0; i < group.length; i++) {
126
+ var otherNode = group[i];
127
+ if (otherNode === rootNode || otherNode.form !== rootNode.form) {
128
+ continue;
152
129
  }
130
+ // This will throw if radio buttons rendered by different copies of React
131
+ // and the same name are rendered into the same form (same as #1939).
132
+ // That's probably okay; we don't support it just as we don't support
133
+ // mixing React with non-React.
134
+ var otherID = ReactMount.getID(otherNode);
135
+ !otherID ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.') : invariant(false) : undefined;
136
+ var otherInstance = instancesByReactID[otherID];
137
+ !otherInstance ? process.env.NODE_ENV !== 'production' ? invariant(false, 'ReactDOMInput: Unknown radio button ID %s.', otherID) : invariant(false) : undefined;
138
+ // If this is a controlled radio button group, forcing the input that
139
+ // was previously checked to update will cause it to be come re-checked
140
+ // as appropriate.
141
+ ReactUpdates.asap(forceUpdateIfMounted, otherInstance);
153
142
  }
154
-
155
- return returnValue;
156
143
  }
157
144
 
158
- });
145
+ return returnValue;
146
+ }
159
147
 
160
148
  module.exports = ReactDOMInput;