react 0.7.0 → 0.9.0

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 (217) hide show
  1. package/README.md +10 -231
  2. package/addons.js +1 -0
  3. package/lib/AutoFocusMixin.js +30 -0
  4. package/lib/CSSCore.js +115 -0
  5. package/lib/CSSProperty.js +121 -0
  6. package/lib/CSSPropertyOperations.js +97 -0
  7. package/lib/ChangeEventPlugin.js +387 -0
  8. package/lib/ClientReactRootIndex.js +30 -0
  9. package/lib/CompositionEventPlugin.js +260 -0
  10. package/lib/DOMChildrenOperations.js +165 -0
  11. package/lib/DOMProperty.js +268 -0
  12. package/lib/DOMPropertyOperations.js +181 -0
  13. package/lib/Danger.js +187 -0
  14. package/lib/DefaultDOMPropertyConfig.js +203 -0
  15. package/lib/DefaultEventPluginOrder.js +44 -0
  16. package/lib/EnterLeaveEventPlugin.js +145 -0
  17. package/lib/EventConstants.js +76 -0
  18. package/lib/EventListener.js +69 -0
  19. package/lib/EventPluginHub.js +293 -0
  20. package/lib/EventPluginRegistry.js +281 -0
  21. package/lib/EventPluginUtils.js +214 -0
  22. package/lib/EventPropagators.js +143 -0
  23. package/lib/ExecutionEnvironment.js +44 -0
  24. package/lib/LinkedStateMixin.js +46 -0
  25. package/lib/LinkedValueUtils.js +161 -0
  26. package/lib/MobileSafariClickEventPlugin.js +63 -0
  27. package/lib/PooledClass.js +119 -0
  28. package/lib/React.js +95 -0
  29. package/lib/ReactCSSTransitionGroup.js +65 -0
  30. package/lib/ReactCSSTransitionGroupChild.js +138 -0
  31. package/lib/ReactChildren.js +132 -0
  32. package/lib/ReactComponent.js +550 -0
  33. package/lib/ReactComponentBrowserEnvironment.js +158 -0
  34. package/lib/ReactComponentEnvironment.js +26 -0
  35. package/lib/ReactCompositeComponent.js +1455 -0
  36. package/lib/ReactContext.js +67 -0
  37. package/lib/ReactCurrentOwner.js +39 -0
  38. package/lib/ReactDOM.js +207 -0
  39. package/lib/ReactDOMButton.js +68 -0
  40. package/lib/ReactDOMComponent.js +399 -0
  41. package/lib/ReactDOMForm.js +59 -0
  42. package/lib/ReactDOMIDOperations.js +218 -0
  43. package/lib/ReactDOMImg.js +58 -0
  44. package/lib/ReactDOMInput.js +181 -0
  45. package/lib/ReactDOMOption.js +51 -0
  46. package/lib/ReactDOMSelect.js +179 -0
  47. package/lib/ReactDOMSelection.js +189 -0
  48. package/lib/ReactDOMTextarea.js +140 -0
  49. package/lib/ReactDefaultBatchingStrategy.js +75 -0
  50. package/lib/ReactDefaultInjection.js +115 -0
  51. package/lib/ReactDefaultPerf.js +244 -0
  52. package/lib/ReactDefaultPerfAnalysis.js +199 -0
  53. package/lib/ReactErrorUtils.js +37 -0
  54. package/lib/ReactEventEmitter.js +339 -0
  55. package/lib/ReactEventEmitterMixin.js +57 -0
  56. package/lib/ReactEventTopLevelCallback.js +149 -0
  57. package/lib/ReactInjection.js +39 -0
  58. package/lib/ReactInputSelection.js +140 -0
  59. package/lib/ReactInstanceHandles.js +338 -0
  60. package/lib/ReactLink.js +54 -0
  61. package/lib/ReactMarkupChecksum.js +53 -0
  62. package/lib/ReactMount.js +641 -0
  63. package/lib/ReactMountReady.js +95 -0
  64. package/lib/ReactMultiChild.js +425 -0
  65. package/lib/ReactMultiChildUpdateTypes.js +38 -0
  66. package/lib/ReactOwner.js +154 -0
  67. package/lib/ReactPerf.js +85 -0
  68. package/lib/ReactPropTransferer.js +147 -0
  69. package/lib/ReactPropTypeLocationNames.js +31 -0
  70. package/lib/ReactPropTypeLocations.js +29 -0
  71. package/lib/ReactPropTypes.js +359 -0
  72. package/lib/ReactPutListenerQueue.js +61 -0
  73. package/lib/ReactReconcileTransaction.js +181 -0
  74. package/lib/ReactRootIndex.js +36 -0
  75. package/lib/ReactServerRendering.js +59 -0
  76. package/lib/ReactStateSetters.js +111 -0
  77. package/lib/ReactTestUtils.js +394 -0
  78. package/lib/ReactTextComponent.js +99 -0
  79. package/lib/ReactTransitionChildMapping.js +106 -0
  80. package/lib/ReactTransitionEvents.js +97 -0
  81. package/lib/ReactTransitionGroup.js +187 -0
  82. package/lib/ReactUpdates.js +148 -0
  83. package/lib/ReactWithAddons.js +51 -0
  84. package/lib/SelectEventPlugin.js +200 -0
  85. package/lib/ServerReactRootIndex.js +36 -0
  86. package/lib/SimpleEventPlugin.js +413 -0
  87. package/lib/SyntheticClipboardEvent.js +51 -0
  88. package/lib/SyntheticCompositionEvent.js +51 -0
  89. package/lib/SyntheticDragEvent.js +44 -0
  90. package/lib/SyntheticEvent.js +164 -0
  91. package/lib/SyntheticFocusEvent.js +44 -0
  92. package/lib/SyntheticKeyboardEvent.js +58 -0
  93. package/lib/SyntheticMouseEvent.js +85 -0
  94. package/lib/SyntheticTouchEvent.js +50 -0
  95. package/lib/SyntheticUIEvent.js +45 -0
  96. package/lib/SyntheticWheelEvent.js +66 -0
  97. package/lib/Transaction.js +276 -0
  98. package/lib/ViewportMetrics.js +37 -0
  99. package/lib/accumulate.js +54 -0
  100. package/lib/adler32.js +39 -0
  101. package/lib/cloneWithProps.js +59 -0
  102. package/lib/containsNode.js +49 -0
  103. package/lib/copyProperties.js +54 -0
  104. package/lib/createArrayFrom.js +91 -0
  105. package/lib/createFullPageComponent.js +63 -0
  106. package/lib/createNodesFromMarkup.js +93 -0
  107. package/lib/createObjectFrom.js +61 -0
  108. package/lib/cx.js +44 -0
  109. package/lib/dangerousStyleValue.js +57 -0
  110. package/lib/emptyFunction.js +43 -0
  111. package/lib/escapeTextForBrowser.js +47 -0
  112. package/lib/flattenChildren.js +57 -0
  113. package/lib/forEachAccumulated.js +36 -0
  114. package/lib/getActiveElement.js +34 -0
  115. package/lib/getEventKey.js +85 -0
  116. package/lib/getEventTarget.js +36 -0
  117. package/lib/getMarkupWrap.js +118 -0
  118. package/lib/getNodeForCharacterOffset.js +80 -0
  119. package/lib/getReactRootElementInContainer.js +40 -0
  120. package/lib/getTextContentAccessor.js +42 -0
  121. package/lib/getUnboundedScrollPosition.js +45 -0
  122. package/lib/hyphenate.js +35 -0
  123. package/lib/invariant.js +62 -0
  124. package/lib/isEventSupported.js +70 -0
  125. package/lib/isNode.js +33 -0
  126. package/lib/isTextInputElement.js +49 -0
  127. package/lib/isTextNode.js +30 -0
  128. package/lib/joinClasses.js +44 -0
  129. package/lib/keyMirror.js +58 -0
  130. package/lib/keyOf.js +41 -0
  131. package/lib/memoizeStringOnly.js +39 -0
  132. package/lib/merge.js +37 -0
  133. package/lib/mergeHelpers.js +136 -0
  134. package/lib/mergeInto.js +45 -0
  135. package/lib/mixInto.js +34 -0
  136. package/lib/objMap.js +47 -0
  137. package/lib/objMapKeyVal.js +47 -0
  138. package/lib/onlyChild.js +43 -0
  139. package/lib/performanceNow.js +42 -0
  140. package/lib/shallowEqual.js +49 -0
  141. package/lib/shouldUpdateReactComponent.js +58 -0
  142. package/lib/toArray.js +75 -0
  143. package/lib/traverseAllChildren.js +189 -0
  144. package/lib/warning.js +48 -0
  145. package/package.json +33 -21
  146. package/react.js +1 -0
  147. package/.npmignore +0 -7
  148. package/.travis.yml +0 -7
  149. package/Jakefile.js +0 -39
  150. package/LICENSE +0 -19
  151. package/browser-test/dist.html +0 -90
  152. package/browser-test/index.html +0 -86
  153. package/browser-test/min.html +0 -90
  154. package/dist/react.js +0 -3141
  155. package/dist/react.min.js +0 -22
  156. package/doc/advanced.md +0 -174
  157. package/doc/color-def.graffle +0 -938
  158. package/doc/color-def.png +0 -0
  159. package/doc/simple.dot +0 -25
  160. package/doc/simple.png +0 -0
  161. package/examples/longer-example.js +0 -41
  162. package/examples/simple.js +0 -45
  163. package/examples/using-ast-directly.js +0 -30
  164. package/examples/using-events1.js +0 -79
  165. package/examples/using-log-events.js +0 -43
  166. package/lib/base-task.js +0 -120
  167. package/lib/cb-task.js +0 -84
  168. package/lib/core.js +0 -138
  169. package/lib/dsl.js +0 -138
  170. package/lib/error.js +0 -55
  171. package/lib/event-collector.js +0 -81
  172. package/lib/event-manager.js +0 -89
  173. package/lib/eventemitter.js +0 -20
  174. package/lib/finalcb-first-task.js +0 -68
  175. package/lib/finalcb-task.js +0 -65
  176. package/lib/id.js +0 -22
  177. package/lib/input-parser.js +0 -56
  178. package/lib/log-events.js +0 -101
  179. package/lib/parse.js +0 -41
  180. package/lib/promise-resolve.js +0 -50
  181. package/lib/promise-task.js +0 -93
  182. package/lib/react.js +0 -59
  183. package/lib/ret-task.js +0 -71
  184. package/lib/sprintf.js +0 -18
  185. package/lib/status.js +0 -14
  186. package/lib/task.js +0 -251
  187. package/lib/track-tasks.js +0 -74
  188. package/lib/validate.js +0 -159
  189. package/lib/vcon.js +0 -113
  190. package/lib/when-task.js +0 -84
  191. package/src/dist.build.requirejs +0 -20
  192. package/test/ast.mocha.js +0 -136
  193. package/test/cb-task.mocha.js +0 -220
  194. package/test/core-deferred.mocha.js +0 -143
  195. package/test/core-when.mocha.js +0 -96
  196. package/test/core.mocha.js +0 -589
  197. package/test/dsl.mocha.js +0 -352
  198. package/test/event-manager.mocha.js +0 -119
  199. package/test/exec-options.mocha.js +0 -48
  200. package/test/finalcb-task.mocha.js +0 -58
  201. package/test/input-parser.mocha.js +0 -86
  202. package/test/log-events.mocha.js +0 -88
  203. package/test/mocha.opts +0 -2
  204. package/test/module-use.mocha.js +0 -164
  205. package/test/promise-auto-resolve.mocha.js +0 -68
  206. package/test/ret-task.mocha.js +0 -220
  207. package/test/task.mocha.js +0 -42
  208. package/test/validate-cb-task.mocha.js +0 -100
  209. package/test/validate-ret-task.mocha.js +0 -110
  210. package/test/validate.mocha.js +0 -324
  211. package/test/vcon.mocha.js +0 -193
  212. package/vendor/chai/chai.js +0 -4251
  213. package/vendor/jquery/jquery-1.7.1.js +0 -9266
  214. package/vendor/jquery/jquery-1.7.1.min.js +0 -4
  215. package/vendor/node/util.js +0 -531
  216. package/vendor/requirejs/require.js +0 -2045
  217. package/vendor/requirejs/require.min.js +0 -36
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Copyright 2013-2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule SyntheticTouchEvent
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ var SyntheticUIEvent = require("./SyntheticUIEvent");
23
+
24
+ /**
25
+ * @interface TouchEvent
26
+ * @see http://www.w3.org/TR/touch-events/
27
+ */
28
+ var TouchEventInterface = {
29
+ touches: null,
30
+ targetTouches: null,
31
+ changedTouches: null,
32
+ altKey: null,
33
+ metaKey: null,
34
+ ctrlKey: null,
35
+ shiftKey: null
36
+ };
37
+
38
+ /**
39
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
40
+ * @param {string} dispatchMarker Marker identifying the event target.
41
+ * @param {object} nativeEvent Native browser event.
42
+ * @extends {SyntheticUIEvent}
43
+ */
44
+ function SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent) {
45
+ SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
46
+ }
47
+
48
+ SyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);
49
+
50
+ module.exports = SyntheticTouchEvent;
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Copyright 2013-2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule SyntheticUIEvent
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ var SyntheticEvent = require("./SyntheticEvent");
23
+
24
+ /**
25
+ * @interface UIEvent
26
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/
27
+ */
28
+ var UIEventInterface = {
29
+ view: null,
30
+ detail: null
31
+ };
32
+
33
+ /**
34
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
35
+ * @param {string} dispatchMarker Marker identifying the event target.
36
+ * @param {object} nativeEvent Native browser event.
37
+ * @extends {SyntheticEvent}
38
+ */
39
+ function SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent) {
40
+ SyntheticEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
41
+ }
42
+
43
+ SyntheticEvent.augmentClass(SyntheticUIEvent, UIEventInterface);
44
+
45
+ module.exports = SyntheticUIEvent;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Copyright 2013-2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule SyntheticWheelEvent
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ var SyntheticMouseEvent = require("./SyntheticMouseEvent");
23
+
24
+ /**
25
+ * @interface WheelEvent
26
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/
27
+ */
28
+ var WheelEventInterface = {
29
+ deltaX: function(event) {
30
+ return (
31
+ 'deltaX' in event ? event.deltaX :
32
+ // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
33
+ 'wheelDeltaX' in event ? -event.wheelDeltaX : 0
34
+ );
35
+ },
36
+ deltaY: function(event) {
37
+ return (
38
+ 'deltaY' in event ? event.deltaY :
39
+ // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).
40
+ 'wheelDeltaY' in event ? -event.wheelDeltaY :
41
+ // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).
42
+ 'wheelDelta' in event ? -event.wheelDelta : 0
43
+ );
44
+ },
45
+ deltaZ: null,
46
+
47
+ // Browsers without "deltaMode" is reporting in raw wheel delta where one
48
+ // notch on the scroll is always +/- 120, roughly equivalent to pixels.
49
+ // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or
50
+ // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.
51
+ deltaMode: null
52
+ };
53
+
54
+ /**
55
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
56
+ * @param {string} dispatchMarker Marker identifying the event target.
57
+ * @param {object} nativeEvent Native browser event.
58
+ * @extends {SyntheticMouseEvent}
59
+ */
60
+ function SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent) {
61
+ SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent);
62
+ }
63
+
64
+ SyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);
65
+
66
+ module.exports = SyntheticWheelEvent;
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Copyright 2013-2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule Transaction
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var invariant = require("./invariant");
22
+
23
+ /**
24
+ * `Transaction` creates a black box that is able to wrap any method such that
25
+ * certain invariants are maintained before and after the method is invoked
26
+ * (Even if an exception is thrown while invoking the wrapped method). Whoever
27
+ * instantiates a transaction can provide enforcers of the invariants at
28
+ * creation time. The `Transaction` class itself will supply one additional
29
+ * automatic invariant for you - the invariant that any transaction instance
30
+ * should not be run while it is already being run. You would typically create a
31
+ * single instance of a `Transaction` for reuse multiple times, that potentially
32
+ * is used to wrap several different methods. Wrappers are extremely simple -
33
+ * they only require implementing two methods.
34
+ *
35
+ * <pre>
36
+ * wrappers (injected at creation time)
37
+ * + +
38
+ * | |
39
+ * +-----------------|--------|--------------+
40
+ * | v | |
41
+ * | +---------------+ | |
42
+ * | +--| wrapper1 |---|----+ |
43
+ * | | +---------------+ v | |
44
+ * | | +-------------+ | |
45
+ * | | +----| wrapper2 |--------+ |
46
+ * | | | +-------------+ | | |
47
+ * | | | | | |
48
+ * | v v v v | wrapper
49
+ * | +---+ +---+ +---------+ +---+ +---+ | invariants
50
+ * perform(anyMethod) | | | | | | | | | | | | maintained
51
+ * +----------------->|-|---|-|---|-->|anyMethod|---|---|-|---|-|-------->
52
+ * | | | | | | | | | | | |
53
+ * | | | | | | | | | | | |
54
+ * | | | | | | | | | | | |
55
+ * | +---+ +---+ +---------+ +---+ +---+ |
56
+ * | initialize close |
57
+ * +-----------------------------------------+
58
+ * </pre>
59
+ *
60
+ * Bonus:
61
+ * - Reports timing metrics by method name and wrapper index.
62
+ *
63
+ * Use cases:
64
+ * - Preserving the input selection ranges before/after reconciliation.
65
+ * Restoring selection even in the event of an unexpected error.
66
+ * - Deactivating events while rearranging the DOM, preventing blurs/focuses,
67
+ * while guaranteeing that afterwards, the event system is reactivated.
68
+ * - Flushing a queue of collected DOM mutations to the main UI thread after a
69
+ * reconciliation takes place in a worker thread.
70
+ * - Invoking any collected `componentDidUpdate` callbacks after rendering new
71
+ * content.
72
+ * - (Future use case): Wrapping particular flushes of the `ReactWorker` queue
73
+ * to preserve the `scrollTop` (an automatic scroll aware DOM).
74
+ * - (Future use case): Layout calculations before and after DOM upates.
75
+ *
76
+ * Transactional plugin API:
77
+ * - A module that has an `initialize` method that returns any precomputation.
78
+ * - and a `close` method that accepts the precomputation. `close` is invoked
79
+ * when the wrapped process is completed, or has failed.
80
+ *
81
+ * @param {Array<TransactionalWrapper>} transactionWrapper Wrapper modules
82
+ * that implement `initialize` and `close`.
83
+ * @return {Transaction} Single transaction for reuse in thread.
84
+ *
85
+ * @class Transaction
86
+ */
87
+ var Mixin = {
88
+ /**
89
+ * Sets up this instance so that it is prepared for collecting metrics. Does
90
+ * so such that this setup method may be used on an instance that is already
91
+ * initialized, in a way that does not consume additional memory upon reuse.
92
+ * That can be useful if you decide to make your subclass of this mixin a
93
+ * "PooledClass".
94
+ */
95
+ reinitializeTransaction: function() {
96
+ this.transactionWrappers = this.getTransactionWrappers();
97
+ if (!this.wrapperInitData) {
98
+ this.wrapperInitData = [];
99
+ } else {
100
+ this.wrapperInitData.length = 0;
101
+ }
102
+ if (!this.timingMetrics) {
103
+ this.timingMetrics = {};
104
+ }
105
+ this.timingMetrics.methodInvocationTime = 0;
106
+ if (!this.timingMetrics.wrapperInitTimes) {
107
+ this.timingMetrics.wrapperInitTimes = [];
108
+ } else {
109
+ this.timingMetrics.wrapperInitTimes.length = 0;
110
+ }
111
+ if (!this.timingMetrics.wrapperCloseTimes) {
112
+ this.timingMetrics.wrapperCloseTimes = [];
113
+ } else {
114
+ this.timingMetrics.wrapperCloseTimes.length = 0;
115
+ }
116
+ this._isInTransaction = false;
117
+ },
118
+
119
+ _isInTransaction: false,
120
+
121
+ /**
122
+ * @abstract
123
+ * @return {Array<TransactionWrapper>} Array of transaction wrappers.
124
+ */
125
+ getTransactionWrappers: null,
126
+
127
+ isInTransaction: function() {
128
+ return !!this._isInTransaction;
129
+ },
130
+
131
+ /**
132
+ * Executes the function within a safety window. Use this for the top level
133
+ * methods that result in large amounts of computation/mutations that would
134
+ * need to be safety checked.
135
+ *
136
+ * @param {function} method Member of scope to call.
137
+ * @param {Object} scope Scope to invoke from.
138
+ * @param {Object?=} args... Arguments to pass to the method (optional).
139
+ * Helps prevent need to bind in many cases.
140
+ * @return Return value from `method`.
141
+ */
142
+ perform: function(method, scope, a, b, c, d, e, f) {
143
+ ("production" !== process.env.NODE_ENV ? invariant(
144
+ !this.isInTransaction(),
145
+ 'Transaction.perform(...): Cannot initialize a transaction when there ' +
146
+ 'is already an outstanding transaction.'
147
+ ) : invariant(!this.isInTransaction()));
148
+ var memberStart = Date.now();
149
+ var errorThrown;
150
+ var ret;
151
+ try {
152
+ this._isInTransaction = true;
153
+ // Catching errors makes debugging more difficult, so we start with
154
+ // errorThrown set to true before setting it to false after calling
155
+ // close -- if it's still set to true in the finally block, it means
156
+ // one of these calls threw.
157
+ errorThrown = true;
158
+ this.initializeAll(0);
159
+ ret = method.call(scope, a, b, c, d, e, f);
160
+ errorThrown = false;
161
+ } finally {
162
+ var memberEnd = Date.now();
163
+ this.methodInvocationTime += (memberEnd - memberStart);
164
+ try {
165
+ if (errorThrown) {
166
+ // If `method` throws, prefer to show that stack trace over any thrown
167
+ // by invoking `closeAll`.
168
+ try {
169
+ this.closeAll(0);
170
+ } catch (err) {
171
+ }
172
+ } else {
173
+ // Since `method` didn't throw, we don't want to silence the exception
174
+ // here.
175
+ this.closeAll(0);
176
+ }
177
+ } finally {
178
+ this._isInTransaction = false;
179
+ }
180
+ }
181
+ return ret;
182
+ },
183
+
184
+ initializeAll: function(startIndex) {
185
+ var transactionWrappers = this.transactionWrappers;
186
+ var wrapperInitTimes = this.timingMetrics.wrapperInitTimes;
187
+ for (var i = startIndex; i < transactionWrappers.length; i++) {
188
+ var initStart = Date.now();
189
+ var wrapper = transactionWrappers[i];
190
+ try {
191
+ // Catching errors makes debugging more difficult, so we start with the
192
+ // OBSERVED_ERROR state before overwriting it with the real return value
193
+ // of initialize -- if it's still set to OBSERVED_ERROR in the finally
194
+ // block, it means wrapper.initialize threw.
195
+ this.wrapperInitData[i] = Transaction.OBSERVED_ERROR;
196
+ this.wrapperInitData[i] = wrapper.initialize ?
197
+ wrapper.initialize.call(this) :
198
+ null;
199
+ } finally {
200
+ var curInitTime = wrapperInitTimes[i];
201
+ var initEnd = Date.now();
202
+ wrapperInitTimes[i] = (curInitTime || 0) + (initEnd - initStart);
203
+
204
+ if (this.wrapperInitData[i] === Transaction.OBSERVED_ERROR) {
205
+ // The initializer for wrapper i threw an error; initialize the
206
+ // remaining wrappers but silence any exceptions from them to ensure
207
+ // that the first error is the one to bubble up.
208
+ try {
209
+ this.initializeAll(i + 1);
210
+ } catch (err) {
211
+ }
212
+ }
213
+ }
214
+ }
215
+ },
216
+
217
+ /**
218
+ * Invokes each of `this.transactionWrappers.close[i]` functions, passing into
219
+ * them the respective return values of `this.transactionWrappers.init[i]`
220
+ * (`close`rs that correspond to initializers that failed will not be
221
+ * invoked).
222
+ */
223
+ closeAll: function(startIndex) {
224
+ ("production" !== process.env.NODE_ENV ? invariant(
225
+ this.isInTransaction(),
226
+ 'Transaction.closeAll(): Cannot close transaction when none are open.'
227
+ ) : invariant(this.isInTransaction()));
228
+ var transactionWrappers = this.transactionWrappers;
229
+ var wrapperCloseTimes = this.timingMetrics.wrapperCloseTimes;
230
+ for (var i = startIndex; i < transactionWrappers.length; i++) {
231
+ var wrapper = transactionWrappers[i];
232
+ var closeStart = Date.now();
233
+ var initData = this.wrapperInitData[i];
234
+ var errorThrown;
235
+ try {
236
+ // Catching errors makes debugging more difficult, so we start with
237
+ // errorThrown set to true before setting it to false after calling
238
+ // close -- if it's still set to true in the finally block, it means
239
+ // wrapper.close threw.
240
+ errorThrown = true;
241
+ if (initData !== Transaction.OBSERVED_ERROR) {
242
+ wrapper.close && wrapper.close.call(this, initData);
243
+ }
244
+ errorThrown = false;
245
+ } finally {
246
+ var closeEnd = Date.now();
247
+ var curCloseTime = wrapperCloseTimes[i];
248
+ wrapperCloseTimes[i] = (curCloseTime || 0) + (closeEnd - closeStart);
249
+
250
+ if (errorThrown) {
251
+ // The closer for wrapper i threw an error; close the remaining
252
+ // wrappers but silence any exceptions from them to ensure that the
253
+ // first error is the one to bubble up.
254
+ try {
255
+ this.closeAll(i + 1);
256
+ } catch (e) {
257
+ }
258
+ }
259
+ }
260
+ }
261
+ this.wrapperInitData.length = 0;
262
+ }
263
+ };
264
+
265
+ var Transaction = {
266
+
267
+ Mixin: Mixin,
268
+
269
+ /**
270
+ * Token to look for to determine if an error occured.
271
+ */
272
+ OBSERVED_ERROR: {}
273
+
274
+ };
275
+
276
+ module.exports = Transaction;
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Copyright 2013-2014 Facebook, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ * @providesModule ViewportMetrics
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var getUnboundedScrollPosition = require("./getUnboundedScrollPosition");
22
+
23
+ var ViewportMetrics = {
24
+
25
+ currentScrollLeft: 0,
26
+
27
+ currentScrollTop: 0,
28
+
29
+ refreshScrollValues: function() {
30
+ var scrollPosition = getUnboundedScrollPosition(window);
31
+ ViewportMetrics.currentScrollLeft = scrollPosition.x;
32
+ ViewportMetrics.currentScrollTop = scrollPosition.y;
33
+ }
34
+
35
+ };
36
+
37
+ module.exports = ViewportMetrics;