react 0.7.1 → 0.8.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 (203) hide show
  1. package/README.md +15 -228
  2. package/ReactJSErrors.js +40 -0
  3. package/addons.js +4 -0
  4. package/lib/$.js +46 -0
  5. package/lib/CSSCore.js +114 -0
  6. package/lib/CSSProperty.js +90 -0
  7. package/lib/CSSPropertyOperations.js +97 -0
  8. package/lib/CallbackRegistry.js +91 -0
  9. package/lib/ChangeEventPlugin.js +365 -0
  10. package/lib/CompositionEventPlugin.js +212 -0
  11. package/lib/DOMChildrenOperations.js +135 -0
  12. package/lib/DOMProperty.js +266 -0
  13. package/lib/DOMPropertyOperations.js +168 -0
  14. package/lib/Danger.js +186 -0
  15. package/lib/DefaultDOMPropertyConfig.js +187 -0
  16. package/lib/DefaultEventPluginOrder.js +44 -0
  17. package/lib/EnterLeaveEventPlugin.js +112 -0
  18. package/lib/EventConstants.js +73 -0
  19. package/lib/EventListener.js +61 -0
  20. package/lib/EventPluginHub.js +190 -0
  21. package/lib/EventPluginRegistry.js +237 -0
  22. package/lib/EventPluginUtils.js +185 -0
  23. package/lib/EventPropagators.js +179 -0
  24. package/lib/ExecutionEnvironment.js +41 -0
  25. package/lib/LinkedStateMixin.js +46 -0
  26. package/lib/LinkedValueMixin.js +68 -0
  27. package/lib/MobileSafariClickEventPlugin.js +63 -0
  28. package/lib/PooledClass.js +113 -0
  29. package/lib/React.js +71 -0
  30. package/lib/ReactChildren.js +132 -0
  31. package/lib/ReactComponent.js +515 -0
  32. package/lib/ReactComponentBrowserEnvironment.js +140 -0
  33. package/lib/ReactComponentEnvironment.js +24 -0
  34. package/lib/ReactCompositeComponent.js +1020 -0
  35. package/lib/ReactCurrentOwner.js +39 -0
  36. package/lib/ReactDOM.js +194 -0
  37. package/lib/ReactDOMButton.js +64 -0
  38. package/lib/ReactDOMComponent.js +374 -0
  39. package/lib/ReactDOMForm.js +52 -0
  40. package/lib/ReactDOMIDOperations.js +173 -0
  41. package/lib/ReactDOMInput.js +169 -0
  42. package/lib/ReactDOMOption.js +50 -0
  43. package/lib/ReactDOMSelect.js +160 -0
  44. package/lib/ReactDOMSelection.js +189 -0
  45. package/lib/ReactDOMTextarea.js +136 -0
  46. package/lib/ReactDefaultBatchingStrategy.js +75 -0
  47. package/lib/ReactDefaultInjection.js +91 -0
  48. package/lib/ReactDefaultPerf.js +407 -0
  49. package/lib/ReactErrorUtils.js +46 -0
  50. package/lib/ReactEventEmitter.js +341 -0
  51. package/lib/ReactEventEmitterMixin.js +89 -0
  52. package/lib/ReactEventTopLevelCallback.js +89 -0
  53. package/lib/ReactInputSelection.js +140 -0
  54. package/lib/ReactInstanceHandles.js +322 -0
  55. package/lib/ReactLink.js +54 -0
  56. package/lib/ReactMarkupChecksum.js +53 -0
  57. package/lib/ReactMount.js +617 -0
  58. package/lib/ReactMountReady.js +95 -0
  59. package/lib/ReactMultiChild.js +441 -0
  60. package/lib/ReactMultiChildUpdateTypes.js +36 -0
  61. package/lib/ReactOwner.js +146 -0
  62. package/lib/ReactPerf.js +88 -0
  63. package/lib/ReactPropTransferer.js +128 -0
  64. package/lib/ReactPropTypes.js +158 -0
  65. package/lib/ReactReconcileTransaction.js +161 -0
  66. package/lib/ReactServerRendering.js +62 -0
  67. package/lib/ReactStateSetters.js +111 -0
  68. package/lib/ReactTextComponent.js +94 -0
  69. package/lib/ReactTransitionEvents.js +97 -0
  70. package/lib/ReactTransitionGroup.js +112 -0
  71. package/lib/ReactTransitionKeySet.js +111 -0
  72. package/lib/ReactTransitionableChild.js +152 -0
  73. package/lib/ReactUpdates.js +145 -0
  74. package/lib/ReactWithAddons.js +41 -0
  75. package/lib/SelectEventPlugin.js +217 -0
  76. package/lib/SimpleEventPlugin.js +365 -0
  77. package/lib/SyntheticClipboardEvent.js +45 -0
  78. package/lib/SyntheticCompositionEvent.js +51 -0
  79. package/lib/SyntheticEvent.js +163 -0
  80. package/lib/SyntheticFocusEvent.js +44 -0
  81. package/lib/SyntheticKeyboardEvent.js +56 -0
  82. package/lib/SyntheticMouseEvent.js +85 -0
  83. package/lib/SyntheticTouchEvent.js +50 -0
  84. package/lib/SyntheticUIEvent.js +45 -0
  85. package/lib/SyntheticWheelEvent.js +63 -0
  86. package/lib/Transaction.js +251 -0
  87. package/lib/ViewportMetrics.js +37 -0
  88. package/lib/accumulate.js +54 -0
  89. package/lib/adler32.js +39 -0
  90. package/lib/containsNode.js +49 -0
  91. package/lib/copyProperties.js +54 -0
  92. package/lib/createArrayFrom.js +94 -0
  93. package/lib/createNodesFromMarkup.js +93 -0
  94. package/lib/createObjectFrom.js +61 -0
  95. package/lib/cx.js +44 -0
  96. package/lib/dangerousStyleValue.js +57 -0
  97. package/lib/emptyFunction.js +43 -0
  98. package/lib/escapeTextForBrowser.js +47 -0
  99. package/lib/ex.js +49 -0
  100. package/lib/filterAttributes.js +45 -0
  101. package/lib/flattenChildren.js +54 -0
  102. package/lib/forEachAccumulated.js +36 -0
  103. package/lib/ge.js +76 -0
  104. package/lib/getActiveElement.js +33 -0
  105. package/lib/getEventTarget.js +36 -0
  106. package/lib/getMarkupWrap.js +108 -0
  107. package/lib/getNodeForCharacterOffset.js +80 -0
  108. package/lib/getReactRootElementInContainer.js +40 -0
  109. package/lib/getTextContentAccessor.js +40 -0
  110. package/lib/getUnboundedScrollPosition.js +45 -0
  111. package/lib/hyphenate.js +35 -0
  112. package/lib/invariant.js +54 -0
  113. package/lib/isEventSupported.js +74 -0
  114. package/lib/isNode.js +33 -0
  115. package/lib/isTextInputElement.js +49 -0
  116. package/lib/isTextNode.js +30 -0
  117. package/lib/joinClasses.js +44 -0
  118. package/lib/keyMirror.js +58 -0
  119. package/lib/keyOf.js +41 -0
  120. package/lib/memoizeStringOnly.js +39 -0
  121. package/lib/merge.js +37 -0
  122. package/lib/mergeHelpers.js +137 -0
  123. package/lib/mergeInto.js +45 -0
  124. package/lib/mixInto.js +34 -0
  125. package/lib/mutateHTMLNodeWithMarkup.js +100 -0
  126. package/lib/objMap.js +47 -0
  127. package/lib/objMapKeyVal.js +47 -0
  128. package/lib/performanceNow.js +42 -0
  129. package/lib/shallowEqual.js +49 -0
  130. package/lib/traverseAllChildren.js +127 -0
  131. package/package.json +33 -31
  132. package/react.js +4 -0
  133. package/.npmignore +0 -7
  134. package/.travis.yml +0 -7
  135. package/Jakefile.js +0 -39
  136. package/LICENSE +0 -19
  137. package/browser-test/dist.html +0 -90
  138. package/browser-test/index.html +0 -86
  139. package/browser-test/min.html +0 -90
  140. package/dist/react.js +0 -3141
  141. package/dist/react.min.js +0 -22
  142. package/doc/advanced.md +0 -175
  143. package/doc/color-def.graffle +0 -938
  144. package/doc/color-def.png +0 -0
  145. package/doc/simple.dot +0 -25
  146. package/doc/simple.png +0 -0
  147. package/examples/longer-example.js +0 -41
  148. package/examples/simple.js +0 -45
  149. package/examples/using-ast-directly.js +0 -30
  150. package/examples/using-events1.js +0 -79
  151. package/examples/using-log-events.js +0 -43
  152. package/lib/base-task.js +0 -120
  153. package/lib/cb-task.js +0 -84
  154. package/lib/core.js +0 -138
  155. package/lib/dsl.js +0 -138
  156. package/lib/error.js +0 -55
  157. package/lib/event-collector.js +0 -81
  158. package/lib/event-manager.js +0 -89
  159. package/lib/eventemitter.js +0 -20
  160. package/lib/finalcb-first-task.js +0 -68
  161. package/lib/finalcb-task.js +0 -65
  162. package/lib/id.js +0 -22
  163. package/lib/input-parser.js +0 -56
  164. package/lib/log-events.js +0 -101
  165. package/lib/parse.js +0 -41
  166. package/lib/promise-resolve.js +0 -50
  167. package/lib/promise-task.js +0 -93
  168. package/lib/react.js +0 -59
  169. package/lib/ret-task.js +0 -71
  170. package/lib/sprintf.js +0 -18
  171. package/lib/status.js +0 -14
  172. package/lib/task.js +0 -251
  173. package/lib/track-tasks.js +0 -74
  174. package/lib/validate.js +0 -159
  175. package/lib/vcon.js +0 -113
  176. package/lib/when-task.js +0 -84
  177. package/src/dist.build.requirejs +0 -20
  178. package/test/ast.mocha.js +0 -136
  179. package/test/cb-task.mocha.js +0 -220
  180. package/test/core-deferred.mocha.js +0 -143
  181. package/test/core-when.mocha.js +0 -96
  182. package/test/core.mocha.js +0 -589
  183. package/test/dsl.mocha.js +0 -352
  184. package/test/event-manager.mocha.js +0 -119
  185. package/test/exec-options.mocha.js +0 -48
  186. package/test/finalcb-task.mocha.js +0 -58
  187. package/test/input-parser.mocha.js +0 -86
  188. package/test/log-events.mocha.js +0 -88
  189. package/test/mocha.opts +0 -2
  190. package/test/module-use.mocha.js +0 -164
  191. package/test/promise-auto-resolve.mocha.js +0 -68
  192. package/test/ret-task.mocha.js +0 -220
  193. package/test/task.mocha.js +0 -42
  194. package/test/validate-cb-task.mocha.js +0 -100
  195. package/test/validate-ret-task.mocha.js +0 -110
  196. package/test/validate.mocha.js +0 -324
  197. package/test/vcon.mocha.js +0 -193
  198. package/vendor/chai/chai.js +0 -4251
  199. package/vendor/jquery/jquery-1.7.1.js +0 -9266
  200. package/vendor/jquery/jquery-1.7.1.min.js +0 -4
  201. package/vendor/node/util.js +0 -531
  202. package/vendor/requirejs/require.js +0 -2045
  203. package/vendor/requirejs/require.min.js +0 -36
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Copyright 2013 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 DefaultEventPluginOrder
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var keyOf = require("./keyOf");
22
+
23
+ /**
24
+ * Module that is injectable into `EventPluginHub`, that specifies a
25
+ * deterministic ordering of `EventPlugin`s. A convenient way to reason about
26
+ * plugins, without having to package every one of them. This is better than
27
+ * having plugins be ordered in the same order that they are injected because
28
+ * that ordering would be influenced by the packaging order.
29
+ * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that
30
+ * preventing default on events is convenient in `SimpleEventPlugin` handlers.
31
+ */
32
+ var DefaultEventPluginOrder = [
33
+ keyOf({ResponderEventPlugin: null}),
34
+ keyOf({SimpleEventPlugin: null}),
35
+ keyOf({TapEventPlugin: null}),
36
+ keyOf({EnterLeaveEventPlugin: null}),
37
+ keyOf({ChangeEventPlugin: null}),
38
+ keyOf({SelectEventPlugin: null}),
39
+ keyOf({CompositionEventPlugin: null}),
40
+ keyOf({AnalyticsEventPlugin: null}),
41
+ keyOf({MobileSafariClickEventPlugin: null})
42
+ ];
43
+
44
+ module.exports = DefaultEventPluginOrder;
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Copyright 2013 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 EnterLeaveEventPlugin
17
+ * @typechecks static-only
18
+ */
19
+
20
+ "use strict";
21
+
22
+ var EventConstants = require("./EventConstants");
23
+ var EventPropagators = require("./EventPropagators");
24
+ var SyntheticMouseEvent = require("./SyntheticMouseEvent");
25
+
26
+ var ReactMount = require("./ReactMount");
27
+ var keyOf = require("./keyOf");
28
+
29
+ var topLevelTypes = EventConstants.topLevelTypes;
30
+ var getFirstReactDOM = ReactMount.getFirstReactDOM;
31
+
32
+ var eventTypes = {
33
+ mouseEnter: {registrationName: keyOf({onMouseEnter: null})},
34
+ mouseLeave: {registrationName: keyOf({onMouseLeave: null})}
35
+ };
36
+
37
+ var extractedEvents = [null, null];
38
+
39
+ var EnterLeaveEventPlugin = {
40
+
41
+ eventTypes: eventTypes,
42
+
43
+ /**
44
+ * For almost every interaction we care about, there will be both a top-level
45
+ * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
46
+ * we do not extract duplicate events. However, moving the mouse into the
47
+ * browser from outside will not fire a `mouseout` event. In this case, we use
48
+ * the `mouseover` top-level event.
49
+ *
50
+ * @param {string} topLevelType Record from `EventConstants`.
51
+ * @param {DOMEventTarget} topLevelTarget The listening component root node.
52
+ * @param {string} topLevelTargetID ID of `topLevelTarget`.
53
+ * @param {object} nativeEvent Native browser event.
54
+ * @return {*} An accumulation of synthetic events.
55
+ * @see {EventPluginHub.extractEvents}
56
+ */
57
+ extractEvents: function(
58
+ topLevelType,
59
+ topLevelTarget,
60
+ topLevelTargetID,
61
+ nativeEvent) {
62
+ if (topLevelType === topLevelTypes.topMouseOver &&
63
+ (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
64
+ return null;
65
+ }
66
+ if (topLevelType !== topLevelTypes.topMouseOut &&
67
+ topLevelType !== topLevelTypes.topMouseOver) {
68
+ // Must not be a mouse in or mouse out - ignoring.
69
+ return null;
70
+ }
71
+
72
+ var from, to;
73
+ if (topLevelType === topLevelTypes.topMouseOut) {
74
+ from = topLevelTarget;
75
+ to =
76
+ getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) ||
77
+ window;
78
+ } else {
79
+ from = window;
80
+ to = topLevelTarget;
81
+ }
82
+
83
+ if (from === to) {
84
+ // Nothing pertains to our managed components.
85
+ return null;
86
+ }
87
+
88
+ var fromID = from ? ReactMount.getID(from) : '';
89
+ var toID = to ? ReactMount.getID(to) : '';
90
+
91
+ var leave = SyntheticMouseEvent.getPooled(
92
+ eventTypes.mouseLeave,
93
+ fromID,
94
+ nativeEvent
95
+ );
96
+ var enter = SyntheticMouseEvent.getPooled(
97
+ eventTypes.mouseEnter,
98
+ toID,
99
+ nativeEvent
100
+ );
101
+
102
+ EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID);
103
+
104
+ extractedEvents[0] = leave;
105
+ extractedEvents[1] = enter;
106
+
107
+ return extractedEvents;
108
+ }
109
+
110
+ };
111
+
112
+ module.exports = EnterLeaveEventPlugin;
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Copyright 2013 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 EventConstants
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var keyMirror = require("./keyMirror");
22
+
23
+ var PropagationPhases = keyMirror({bubbled: null, captured: null});
24
+
25
+ /**
26
+ * Types of raw signals from the browser caught at the top level.
27
+ */
28
+ var topLevelTypes = keyMirror({
29
+ topBlur: null,
30
+ topChange: null,
31
+ topClick: null,
32
+ topCompositionEnd: null,
33
+ topCompositionStart: null,
34
+ topCompositionUpdate: null,
35
+ topContextMenu: null,
36
+ topCopy: null,
37
+ topCut: null,
38
+ topDoubleClick: null,
39
+ topDrag: null,
40
+ topDragEnd: null,
41
+ topDragEnter: null,
42
+ topDragExit: null,
43
+ topDragLeave: null,
44
+ topDragOver: null,
45
+ topDragStart: null,
46
+ topDrop: null,
47
+ topFocus: null,
48
+ topInput: null,
49
+ topKeyDown: null,
50
+ topKeyPress: null,
51
+ topKeyUp: null,
52
+ topMouseDown: null,
53
+ topMouseMove: null,
54
+ topMouseOut: null,
55
+ topMouseOver: null,
56
+ topMouseUp: null,
57
+ topPaste: null,
58
+ topScroll: null,
59
+ topSelectionChange: null,
60
+ topSubmit: null,
61
+ topTouchCancel: null,
62
+ topTouchEnd: null,
63
+ topTouchMove: null,
64
+ topTouchStart: null,
65
+ topWheel: null
66
+ });
67
+
68
+ var EventConstants = {
69
+ topLevelTypes: topLevelTypes,
70
+ PropagationPhases: PropagationPhases
71
+ };
72
+
73
+ module.exports = EventConstants;
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Copyright 2013 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 EventListener
17
+ */
18
+
19
+ /**
20
+ * Upstream version of event listener. Does not take into account specific
21
+ * nature of platform.
22
+ */
23
+ var EventListener = {
24
+ /**
25
+ * Listens to bubbled events on a DOM node.
26
+ *
27
+ * @param {Element} el DOM element to register listener on.
28
+ * @param {string} handlerBaseName 'click'/'mouseover'
29
+ * @param {Function!} cb Callback function
30
+ */
31
+ listen: function(el, handlerBaseName, cb) {
32
+ if (el.addEventListener) {
33
+ el.addEventListener(handlerBaseName, cb, false);
34
+ } else if (el.attachEvent) {
35
+ el.attachEvent('on' + handlerBaseName, cb);
36
+ }
37
+ },
38
+
39
+ /**
40
+ * Listens to captured events on a DOM node.
41
+ *
42
+ * @see `EventListener.listen` for params.
43
+ * @throws Exception if addEventListener is not supported.
44
+ */
45
+ capture: function(el, handlerBaseName, cb) {
46
+ if (!el.addEventListener) {
47
+ if ("production" !== process.env.NODE_ENV) {
48
+ console.error(
49
+ 'You are attempting to use addEventListener ' +
50
+ 'in a browser that does not support it.' +
51
+ 'This likely means that you will not receive events that ' +
52
+ 'your application relies on (such as scroll).');
53
+ }
54
+ return;
55
+ } else {
56
+ el.addEventListener(handlerBaseName, cb, true);
57
+ }
58
+ }
59
+ };
60
+
61
+ module.exports = EventListener;
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Copyright 2013 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 EventPluginHub
17
+ */
18
+
19
+ "use strict";
20
+
21
+ var CallbackRegistry = require("./CallbackRegistry");
22
+ var EventPluginRegistry = require("./EventPluginRegistry");
23
+ var EventPluginUtils = require("./EventPluginUtils");
24
+ var EventPropagators = require("./EventPropagators");
25
+ var ExecutionEnvironment = require("./ExecutionEnvironment");
26
+
27
+ var accumulate = require("./accumulate");
28
+ var forEachAccumulated = require("./forEachAccumulated");
29
+ var invariant = require("./invariant");
30
+
31
+ /**
32
+ * Internal queue of events that have accumulated their dispatches and are
33
+ * waiting to have their dispatches executed.
34
+ */
35
+ var eventQueue = null;
36
+
37
+ /**
38
+ * Dispatches an event and releases it back into the pool, unless persistent.
39
+ *
40
+ * @param {?object} event Synthetic event to be dispatched.
41
+ * @private
42
+ */
43
+ var executeDispatchesAndRelease = function(event) {
44
+ if (event) {
45
+ var executeDispatch = EventPluginUtils.executeDispatch;
46
+ // Plugins can provide custom behavior when dispatching events.
47
+ var PluginModule = EventPluginRegistry.getPluginModuleForEvent(event);
48
+ if (PluginModule && PluginModule.executeDispatch) {
49
+ executeDispatch = PluginModule.executeDispatch;
50
+ }
51
+ EventPluginUtils.executeDispatchesInOrder(event, executeDispatch);
52
+
53
+ if (!event.isPersistent()) {
54
+ event.constructor.release(event);
55
+ }
56
+ }
57
+ };
58
+
59
+ /**
60
+ * This is a unified interface for event plugins to be installed and configured.
61
+ *
62
+ * Event plugins can implement the following properties:
63
+ *
64
+ * `extractEvents` {function(string, DOMEventTarget, string, object): *}
65
+ * Required. When a top-level event is fired, this method is expected to
66
+ * extract synthetic events that will in turn be queued and dispatched.
67
+ *
68
+ * `eventTypes` {object}
69
+ * Optional, plugins that fire events must publish a mapping of registration
70
+ * names that are used to register listeners. Values of this mapping must
71
+ * be objects that contain `registrationName` or `phasedRegistrationNames`.
72
+ *
73
+ * `executeDispatch` {function(object, function, string)}
74
+ * Optional, allows plugins to override how an event gets dispatched. By
75
+ * default, the listener is simply invoked.
76
+ *
77
+ * Each plugin that is injected into `EventsPluginHub` is immediately operable.
78
+ *
79
+ * @public
80
+ */
81
+ var EventPluginHub = {
82
+
83
+ /**
84
+ * Methods for injecting dependencies.
85
+ */
86
+ injection: {
87
+
88
+ /**
89
+ * @param {object} InjectedInstanceHandle
90
+ * @public
91
+ */
92
+ injectInstanceHandle: EventPropagators.injection.injectInstanceHandle,
93
+
94
+ /**
95
+ * @param {array} InjectedEventPluginOrder
96
+ * @public
97
+ */
98
+ injectEventPluginOrder: EventPluginRegistry.injectEventPluginOrder,
99
+
100
+ /**
101
+ * @param {object} injectedNamesToPlugins Map from names to plugin modules.
102
+ */
103
+ injectEventPluginsByName: EventPluginRegistry.injectEventPluginsByName
104
+
105
+ },
106
+
107
+ registrationNames: EventPluginRegistry.registrationNames,
108
+
109
+ putListener: CallbackRegistry.putListener,
110
+
111
+ getListener: CallbackRegistry.getListener,
112
+
113
+ deleteListener: CallbackRegistry.deleteListener,
114
+
115
+ deleteAllListeners: CallbackRegistry.deleteAllListeners,
116
+
117
+ /**
118
+ * Allows registered plugins an opportunity to extract events from top-level
119
+ * native browser events.
120
+ *
121
+ * @param {string} topLevelType Record from `EventConstants`.
122
+ * @param {DOMEventTarget} topLevelTarget The listening component root node.
123
+ * @param {string} topLevelTargetID ID of `topLevelTarget`.
124
+ * @param {object} nativeEvent Native browser event.
125
+ * @return {*} An accumulation of synthetic events.
126
+ * @internal
127
+ */
128
+ extractEvents: function(
129
+ topLevelType,
130
+ topLevelTarget,
131
+ topLevelTargetID,
132
+ nativeEvent) {
133
+ var events;
134
+ var plugins = EventPluginRegistry.plugins;
135
+ for (var i = 0, l = plugins.length; i < l; i++) {
136
+ // Not every plugin in the ordering may be loaded at runtime.
137
+ var possiblePlugin = plugins[i];
138
+ if (possiblePlugin) {
139
+ var extractedEvents = possiblePlugin.extractEvents(
140
+ topLevelType,
141
+ topLevelTarget,
142
+ topLevelTargetID,
143
+ nativeEvent
144
+ );
145
+ if (extractedEvents) {
146
+ events = accumulate(events, extractedEvents);
147
+ }
148
+ }
149
+ }
150
+ return events;
151
+ },
152
+
153
+ /**
154
+ * Enqueues a synthetic event that should be dispatched when
155
+ * `processEventQueue` is invoked.
156
+ *
157
+ * @param {*} events An accumulation of synthetic events.
158
+ * @internal
159
+ */
160
+ enqueueEvents: function(events) {
161
+ if (events) {
162
+ eventQueue = accumulate(eventQueue, events);
163
+ }
164
+ },
165
+
166
+ /**
167
+ * Dispatches all synthetic events on the event queue.
168
+ *
169
+ * @internal
170
+ */
171
+ processEventQueue: function() {
172
+ // Set `eventQueue` to null before processing it so that we can tell if more
173
+ // events get enqueued while processing.
174
+ var processingEventQueue = eventQueue;
175
+ eventQueue = null;
176
+ forEachAccumulated(processingEventQueue, executeDispatchesAndRelease);
177
+ ("production" !== process.env.NODE_ENV ? invariant(
178
+ !eventQueue,
179
+ 'processEventQueue(): Additional events were enqueued while processing ' +
180
+ 'an event queue. Support for this has not yet been implemented.'
181
+ ) : invariant(!eventQueue));
182
+ }
183
+
184
+ };
185
+
186
+ if (ExecutionEnvironment.canUseDOM) {
187
+ window.EventPluginHub = EventPluginHub;
188
+ }
189
+
190
+ module.exports = EventPluginHub;