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
@@ -12,7 +12,7 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var SyntheticEvent = require("./SyntheticEvent");
15
+ var SyntheticEvent = require('./SyntheticEvent');
16
16
 
17
17
  /**
18
18
  * @interface Event
@@ -30,8 +30,8 @@ var ClipboardEventInterface = {
30
30
  * @param {object} nativeEvent Native browser event.
31
31
  * @extends {SyntheticUIEvent}
32
32
  */
33
- function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent) {
34
- SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
33
+ function SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
34
+ SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
35
35
  }
36
36
 
37
37
  SyntheticEvent.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface);
@@ -12,7 +12,7 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var SyntheticEvent = require("./SyntheticEvent");
15
+ var SyntheticEvent = require('./SyntheticEvent');
16
16
 
17
17
  /**
18
18
  * @interface Event
@@ -28,8 +28,8 @@ var CompositionEventInterface = {
28
28
  * @param {object} nativeEvent Native browser event.
29
29
  * @extends {SyntheticUIEvent}
30
30
  */
31
- function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent) {
32
- SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
31
+ function SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
32
+ SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
33
33
  }
34
34
 
35
35
  SyntheticEvent.augmentClass(SyntheticCompositionEvent, CompositionEventInterface);
@@ -12,7 +12,7 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var SyntheticMouseEvent = require("./SyntheticMouseEvent");
15
+ var SyntheticMouseEvent = require('./SyntheticMouseEvent');
16
16
 
17
17
  /**
18
18
  * @interface DragEvent
@@ -28,8 +28,8 @@ var DragEventInterface = {
28
28
  * @param {object} nativeEvent Native browser event.
29
29
  * @extends {SyntheticUIEvent}
30
30
  */
31
- function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent) {
32
- SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
31
+ function SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
32
+ SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
33
33
  }
34
34
 
35
35
  SyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface);
@@ -12,19 +12,19 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var PooledClass = require("./PooledClass");
15
+ var PooledClass = require('./PooledClass');
16
16
 
17
- var assign = require("./Object.assign");
18
- var emptyFunction = require("./emptyFunction");
19
- var getEventTarget = require("./getEventTarget");
17
+ var assign = require('./Object.assign');
18
+ var emptyFunction = require('fbjs/lib/emptyFunction');
19
+ var warning = require('fbjs/lib/warning');
20
20
 
21
21
  /**
22
22
  * @interface Event
23
23
  * @see http://www.w3.org/TR/DOM-Level-3-Events/
24
24
  */
25
25
  var EventInterface = {
26
+ path: null,
26
27
  type: null,
27
- target: getEventTarget,
28
28
  // currentTarget is set when dispatching; no use in copying it here
29
29
  currentTarget: emptyFunction.thatReturnsNull,
30
30
  eventPhase: null,
@@ -54,10 +54,12 @@ var EventInterface = {
54
54
  * @param {string} dispatchMarker Marker identifying the event target.
55
55
  * @param {object} nativeEvent Native browser event.
56
56
  */
57
- function SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent) {
57
+ function SyntheticEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
58
58
  this.dispatchConfig = dispatchConfig;
59
59
  this.dispatchMarker = dispatchMarker;
60
60
  this.nativeEvent = nativeEvent;
61
+ this.target = nativeEventTarget;
62
+ this.currentTarget = nativeEventTarget;
61
63
 
62
64
  var Interface = this.constructor.Interface;
63
65
  for (var propName in Interface) {
@@ -86,6 +88,13 @@ assign(SyntheticEvent.prototype, {
86
88
  preventDefault: function () {
87
89
  this.defaultPrevented = true;
88
90
  var event = this.nativeEvent;
91
+ if (process.env.NODE_ENV !== 'production') {
92
+ process.env.NODE_ENV !== 'production' ? warning(event, 'This synthetic event is reused for performance reasons. If you\'re ' + 'seeing this, you\'re calling `preventDefault` on a ' + 'released/nullified synthetic event. This is a no-op. See ' + 'https://fb.me/react-event-pooling for more information.') : undefined;
93
+ }
94
+ if (!event) {
95
+ return;
96
+ }
97
+
89
98
  if (event.preventDefault) {
90
99
  event.preventDefault();
91
100
  } else {
@@ -96,6 +105,13 @@ assign(SyntheticEvent.prototype, {
96
105
 
97
106
  stopPropagation: function () {
98
107
  var event = this.nativeEvent;
108
+ if (process.env.NODE_ENV !== 'production') {
109
+ process.env.NODE_ENV !== 'production' ? warning(event, 'This synthetic event is reused for performance reasons. If you\'re ' + 'seeing this, you\'re calling `stopPropagation` on a ' + 'released/nullified synthetic event. This is a no-op. See ' + 'https://fb.me/react-event-pooling for more information.') : undefined;
110
+ }
111
+ if (!event) {
112
+ return;
113
+ }
114
+
99
115
  if (event.stopPropagation) {
100
116
  event.stopPropagation();
101
117
  } else {
@@ -154,9 +170,9 @@ SyntheticEvent.augmentClass = function (Class, Interface) {
154
170
  Class.Interface = assign({}, Super.Interface, Interface);
155
171
  Class.augmentClass = Super.augmentClass;
156
172
 
157
- PooledClass.addPoolingTo(Class, PooledClass.threeArgumentPooler);
173
+ PooledClass.addPoolingTo(Class, PooledClass.fourArgumentPooler);
158
174
  };
159
175
 
160
- PooledClass.addPoolingTo(SyntheticEvent, PooledClass.threeArgumentPooler);
176
+ PooledClass.addPoolingTo(SyntheticEvent, PooledClass.fourArgumentPooler);
161
177
 
162
178
  module.exports = SyntheticEvent;
@@ -12,7 +12,7 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var SyntheticUIEvent = require("./SyntheticUIEvent");
15
+ var SyntheticUIEvent = require('./SyntheticUIEvent');
16
16
 
17
17
  /**
18
18
  * @interface FocusEvent
@@ -28,8 +28,8 @@ var FocusEventInterface = {
28
28
  * @param {object} nativeEvent Native browser event.
29
29
  * @extends {SyntheticUIEvent}
30
30
  */
31
- function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent) {
32
- SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
31
+ function SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
32
+ SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
33
33
  }
34
34
 
35
35
  SyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface);
@@ -12,7 +12,7 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var SyntheticEvent = require("./SyntheticEvent");
15
+ var SyntheticEvent = require('./SyntheticEvent');
16
16
 
17
17
  /**
18
18
  * @interface Event
@@ -29,8 +29,8 @@ var InputEventInterface = {
29
29
  * @param {object} nativeEvent Native browser event.
30
30
  * @extends {SyntheticUIEvent}
31
31
  */
32
- function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent) {
33
- SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
32
+ function SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
33
+ SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
34
34
  }
35
35
 
36
36
  SyntheticEvent.augmentClass(SyntheticInputEvent, InputEventInterface);
@@ -12,11 +12,11 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var SyntheticUIEvent = require("./SyntheticUIEvent");
15
+ var SyntheticUIEvent = require('./SyntheticUIEvent');
16
16
 
17
- var getEventCharCode = require("./getEventCharCode");
18
- var getEventKey = require("./getEventKey");
19
- var getEventModifierState = require("./getEventModifierState");
17
+ var getEventCharCode = require('./getEventCharCode');
18
+ var getEventKey = require('./getEventKey');
19
+ var getEventModifierState = require('./getEventModifierState');
20
20
 
21
21
  /**
22
22
  * @interface KeyboardEvent
@@ -76,8 +76,8 @@ var KeyboardEventInterface = {
76
76
  * @param {object} nativeEvent Native browser event.
77
77
  * @extends {SyntheticUIEvent}
78
78
  */
79
- function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent) {
80
- SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
79
+ function SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
80
+ SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
81
81
  }
82
82
 
83
83
  SyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);
@@ -12,10 +12,10 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var SyntheticUIEvent = require("./SyntheticUIEvent");
16
- var ViewportMetrics = require("./ViewportMetrics");
15
+ var SyntheticUIEvent = require('./SyntheticUIEvent');
16
+ var ViewportMetrics = require('./ViewportMetrics');
17
17
 
18
- var getEventModifierState = require("./getEventModifierState");
18
+ var getEventModifierState = require('./getEventModifierState');
19
19
 
20
20
  /**
21
21
  * @interface MouseEvent
@@ -64,8 +64,8 @@ var MouseEventInterface = {
64
64
  * @param {object} nativeEvent Native browser event.
65
65
  * @extends {SyntheticUIEvent}
66
66
  */
67
- function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent) {
68
- SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
67
+ function SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
68
+ SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
69
69
  }
70
70
 
71
71
  SyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface);
@@ -12,9 +12,9 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var SyntheticUIEvent = require("./SyntheticUIEvent");
15
+ var SyntheticUIEvent = require('./SyntheticUIEvent');
16
16
 
17
- var getEventModifierState = require("./getEventModifierState");
17
+ var getEventModifierState = require('./getEventModifierState');
18
18
 
19
19
  /**
20
20
  * @interface TouchEvent
@@ -37,8 +37,8 @@ var TouchEventInterface = {
37
37
  * @param {object} nativeEvent Native browser event.
38
38
  * @extends {SyntheticUIEvent}
39
39
  */
40
- function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent) {
41
- SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
40
+ function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
41
+ SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
42
42
  }
43
43
 
44
44
  SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);
@@ -12,9 +12,9 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var SyntheticEvent = require("./SyntheticEvent");
15
+ var SyntheticEvent = require('./SyntheticEvent');
16
16
 
17
- var getEventTarget = require("./getEventTarget");
17
+ var getEventTarget = require('./getEventTarget');
18
18
 
19
19
  /**
20
20
  * @interface UIEvent
@@ -51,8 +51,8 @@ var UIEventInterface = {
51
51
  * @param {object} nativeEvent Native browser event.
52
52
  * @extends {SyntheticEvent}
53
53
  */
54
- function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent) {
55
- SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
54
+ function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
55
+ SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
56
56
  }
57
57
 
58
58
  SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface);
@@ -12,7 +12,7 @@
12
12
 
13
13
  'use strict';
14
14
 
15
- var SyntheticMouseEvent = require("./SyntheticMouseEvent");
15
+ var SyntheticMouseEvent = require('./SyntheticMouseEvent');
16
16
 
17
17
  /**
18
18
  * @interface WheelEvent
@@ -46,8 +46,8 @@ var WheelEventInterface = {
46
46
  * @param {object} nativeEvent Native browser event.
47
47
  * @extends {SyntheticMouseEvent}
48
48
  */
49
- function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent) {
50
- SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
49
+ function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {
50
+ SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);
51
51
  }
52
52
 
53
53
  SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);
@@ -0,0 +1,119 @@
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 TapEventPlugin
10
+ * @typechecks static-only
11
+ */
12
+
13
+ 'use strict';
14
+
15
+ var EventConstants = require('./EventConstants');
16
+ var EventPluginUtils = require('./EventPluginUtils');
17
+ var EventPropagators = require('./EventPropagators');
18
+ var SyntheticUIEvent = require('./SyntheticUIEvent');
19
+ var TouchEventUtils = require('fbjs/lib/TouchEventUtils');
20
+ var ViewportMetrics = require('./ViewportMetrics');
21
+
22
+ var keyOf = require('fbjs/lib/keyOf');
23
+ var topLevelTypes = EventConstants.topLevelTypes;
24
+
25
+ var isStartish = EventPluginUtils.isStartish;
26
+ var isEndish = EventPluginUtils.isEndish;
27
+
28
+ /**
29
+ * Number of pixels that are tolerated in between a `touchStart` and `touchEnd`
30
+ * in order to still be considered a 'tap' event.
31
+ */
32
+ var tapMoveThreshold = 10;
33
+ var startCoords = { x: null, y: null };
34
+
35
+ var Axis = {
36
+ x: { page: 'pageX', client: 'clientX', envScroll: 'currentPageScrollLeft' },
37
+ y: { page: 'pageY', client: 'clientY', envScroll: 'currentPageScrollTop' }
38
+ };
39
+
40
+ function getAxisCoordOfEvent(axis, nativeEvent) {
41
+ var singleTouch = TouchEventUtils.extractSingleTouch(nativeEvent);
42
+ if (singleTouch) {
43
+ return singleTouch[axis.page];
44
+ }
45
+ return axis.page in nativeEvent ? nativeEvent[axis.page] : nativeEvent[axis.client] + ViewportMetrics[axis.envScroll];
46
+ }
47
+
48
+ function getDistance(coords, nativeEvent) {
49
+ var pageX = getAxisCoordOfEvent(Axis.x, nativeEvent);
50
+ var pageY = getAxisCoordOfEvent(Axis.y, nativeEvent);
51
+ return Math.pow(Math.pow(pageX - coords.x, 2) + Math.pow(pageY - coords.y, 2), 0.5);
52
+ }
53
+
54
+ var touchEvents = [topLevelTypes.topTouchStart, topLevelTypes.topTouchCancel, topLevelTypes.topTouchEnd, topLevelTypes.topTouchMove];
55
+
56
+ var dependencies = [topLevelTypes.topMouseDown, topLevelTypes.topMouseMove, topLevelTypes.topMouseUp].concat(touchEvents);
57
+
58
+ var eventTypes = {
59
+ touchTap: {
60
+ phasedRegistrationNames: {
61
+ bubbled: keyOf({ onTouchTap: null }),
62
+ captured: keyOf({ onTouchTapCapture: null })
63
+ },
64
+ dependencies: dependencies
65
+ }
66
+ };
67
+
68
+ var usedTouch = false;
69
+ var usedTouchTime = 0;
70
+ var TOUCH_DELAY = 1000;
71
+
72
+ var TapEventPlugin = {
73
+
74
+ tapMoveThreshold: tapMoveThreshold,
75
+
76
+ eventTypes: eventTypes,
77
+
78
+ /**
79
+ * @param {string} topLevelType Record from `EventConstants`.
80
+ * @param {DOMEventTarget} topLevelTarget The listening component root node.
81
+ * @param {string} topLevelTargetID ID of `topLevelTarget`.
82
+ * @param {object} nativeEvent Native browser event.
83
+ * @return {*} An accumulation of synthetic events.
84
+ * @see {EventPluginHub.extractEvents}
85
+ */
86
+ extractEvents: function (topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) {
87
+ if (!isStartish(topLevelType) && !isEndish(topLevelType)) {
88
+ return null;
89
+ }
90
+ // on ios, there is a delay after touch event and synthetic
91
+ // mouse events, so that user can perform double tap
92
+ // solution: ignore mouse events following touchevent within small timeframe
93
+ if (touchEvents.indexOf(topLevelType) !== -1) {
94
+ usedTouch = true;
95
+ usedTouchTime = Date.now();
96
+ } else {
97
+ if (usedTouch && Date.now() - usedTouchTime < TOUCH_DELAY) {
98
+ return null;
99
+ }
100
+ }
101
+ var event = null;
102
+ var distance = getDistance(startCoords, nativeEvent);
103
+ if (isEndish(topLevelType) && distance < tapMoveThreshold) {
104
+ event = SyntheticUIEvent.getPooled(eventTypes.touchTap, topLevelTargetID, nativeEvent, nativeEventTarget);
105
+ }
106
+ if (isStartish(topLevelType)) {
107
+ startCoords.x = getAxisCoordOfEvent(Axis.x, nativeEvent);
108
+ startCoords.y = getAxisCoordOfEvent(Axis.y, nativeEvent);
109
+ } else if (isEndish(topLevelType)) {
110
+ startCoords.x = 0;
111
+ startCoords.y = 0;
112
+ }
113
+ EventPropagators.accumulateTwoPhaseDispatches(event);
114
+ return event;
115
+ }
116
+
117
+ };
118
+
119
+ module.exports = TapEventPlugin;
@@ -11,7 +11,7 @@
11
11
 
12
12
  'use strict';
13
13
 
14
- var invariant = require("./invariant");
14
+ var invariant = require('fbjs/lib/invariant');
15
15
 
16
16
  /**
17
17
  * `Transaction` creates a black box that is able to wrap any method such that
@@ -84,10 +84,10 @@ var Mixin = {
84
84
  */
85
85
  reinitializeTransaction: function () {
86
86
  this.transactionWrappers = this.getTransactionWrappers();
87
- if (!this.wrapperInitData) {
88
- this.wrapperInitData = [];
89
- } else {
87
+ if (this.wrapperInitData) {
90
88
  this.wrapperInitData.length = 0;
89
+ } else {
90
+ this.wrapperInitData = [];
91
91
  }
92
92
  this._isInTransaction = false;
93
93
  },
@@ -107,16 +107,22 @@ var Mixin = {
107
107
  /**
108
108
  * Executes the function within a safety window. Use this for the top level
109
109
  * methods that result in large amounts of computation/mutations that would
110
- * need to be safety checked.
110
+ * need to be safety checked. The optional arguments helps prevent the need
111
+ * to bind in many cases.
111
112
  *
112
113
  * @param {function} method Member of scope to call.
113
114
  * @param {Object} scope Scope to invoke from.
114
- * @param {Object?=} args... Arguments to pass to the method (optional).
115
- * Helps prevent need to bind in many cases.
116
- * @return Return value from `method`.
115
+ * @param {Object?=} a Argument to pass to the method.
116
+ * @param {Object?=} b Argument to pass to the method.
117
+ * @param {Object?=} c Argument to pass to the method.
118
+ * @param {Object?=} d Argument to pass to the method.
119
+ * @param {Object?=} e Argument to pass to the method.
120
+ * @param {Object?=} f Argument to pass to the method.
121
+ *
122
+ * @return {*} Return value from `method`.
117
123
  */
118
124
  perform: function (method, scope, a, b, c, d, e, f) {
119
- !!this.isInTransaction() ? 'production' !== process.env.NODE_ENV ? invariant(false, 'Transaction.perform(...): Cannot initialize a transaction when there ' + 'is already an outstanding transaction.') : invariant(false) : undefined;
125
+ !!this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.perform(...): Cannot initialize a transaction when there ' + 'is already an outstanding transaction.') : invariant(false) : undefined;
120
126
  var errorThrown;
121
127
  var ret;
122
128
  try {
@@ -180,7 +186,7 @@ var Mixin = {
180
186
  * invoked).
181
187
  */
182
188
  closeAll: function (startIndex) {
183
- !this.isInTransaction() ? 'production' !== process.env.NODE_ENV ? invariant(false, 'Transaction.closeAll(): Cannot close transaction when none are open.') : invariant(false) : undefined;
189
+ !this.isInTransaction() ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Transaction.closeAll(): Cannot close transaction when none are open.') : invariant(false) : undefined;
184
190
  var transactionWrappers = this.transactionWrappers;
185
191
  for (var i = startIndex; i < transactionWrappers.length; i++) {
186
192
  var wrapper = transactionWrappers[i];
@@ -216,7 +222,7 @@ var Transaction = {
216
222
  Mixin: Mixin,
217
223
 
218
224
  /**
219
- * Token to look for to determine if an error occured.
225
+ * Token to look for to determine if an error occurred.
220
226
  */
221
227
  OBSERVED_ERROR: {}
222
228