react 0.8.0 → 0.9.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 (107) hide show
  1. package/README.md +0 -8
  2. package/addons.js +0 -3
  3. package/lib/AutoFocusMixin.js +30 -0
  4. package/lib/CSSCore.js +22 -21
  5. package/lib/CSSProperty.js +31 -0
  6. package/lib/ChangeEventPlugin.js +26 -4
  7. package/lib/ClientReactRootIndex.js +30 -0
  8. package/lib/CompositionEventPlugin.js +57 -9
  9. package/lib/DOMChildrenOperations.js +32 -2
  10. package/lib/DOMProperty.js +2 -0
  11. package/lib/DOMPropertyOperations.js +14 -1
  12. package/lib/Danger.js +8 -7
  13. package/lib/DefaultDOMPropertyConfig.js +12 -2
  14. package/lib/EnterLeaveEventPlugin.js +37 -4
  15. package/lib/EventConstants.js +3 -0
  16. package/lib/EventListener.js +42 -34
  17. package/lib/EventPluginHub.js +113 -12
  18. package/lib/EventPluginRegistry.js +39 -16
  19. package/lib/EventPluginUtils.js +32 -3
  20. package/lib/EventPropagators.js +6 -42
  21. package/lib/ExecutionEnvironment.js +3 -0
  22. package/lib/LinkedValueUtils.js +161 -0
  23. package/lib/PooledClass.js +6 -0
  24. package/lib/React.js +27 -3
  25. package/lib/ReactCSSTransitionGroup.js +65 -0
  26. package/lib/{ReactTransitionableChild.js → ReactCSSTransitionGroupChild.js} +21 -35
  27. package/lib/ReactComponent.js +87 -52
  28. package/lib/ReactComponentBrowserEnvironment.js +67 -49
  29. package/lib/ReactComponentEnvironment.js +2 -0
  30. package/lib/ReactCompositeComponent.js +547 -112
  31. package/lib/ReactContext.js +67 -0
  32. package/lib/ReactDOM.js +13 -0
  33. package/lib/ReactDOMButton.js +4 -0
  34. package/lib/ReactDOMComponent.js +46 -21
  35. package/lib/ReactDOMForm.js +9 -2
  36. package/lib/ReactDOMIDOperations.js +105 -60
  37. package/lib/ReactDOMImg.js +58 -0
  38. package/lib/ReactDOMInput.js +26 -14
  39. package/lib/ReactDOMOption.js +1 -0
  40. package/lib/ReactDOMSelect.js +36 -17
  41. package/lib/ReactDOMTextarea.js +12 -8
  42. package/lib/ReactDefaultInjection.js +50 -26
  43. package/lib/ReactDefaultPerf.js +207 -370
  44. package/lib/ReactDefaultPerfAnalysis.js +199 -0
  45. package/lib/ReactErrorUtils.js +5 -14
  46. package/lib/ReactEventEmitter.js +141 -145
  47. package/lib/ReactEventEmitterMixin.js +0 -32
  48. package/lib/ReactEventTopLevelCallback.js +32 -12
  49. package/lib/ReactInjection.js +39 -0
  50. package/lib/ReactInstanceHandles.js +35 -19
  51. package/lib/ReactLink.js +1 -1
  52. package/lib/ReactMount.js +127 -103
  53. package/lib/ReactMountReady.js +1 -1
  54. package/lib/ReactMultiChild.js +30 -46
  55. package/lib/ReactMultiChildUpdateTypes.js +2 -0
  56. package/lib/ReactOwner.js +10 -2
  57. package/lib/ReactPerf.js +5 -8
  58. package/lib/ReactPropTransferer.js +40 -21
  59. package/lib/ReactPropTypeLocationNames.js +31 -0
  60. package/lib/ReactPropTypeLocations.js +29 -0
  61. package/lib/ReactPropTypes.js +248 -47
  62. package/lib/ReactPutListenerQueue.js +61 -0
  63. package/lib/ReactReconcileTransaction.js +20 -0
  64. package/lib/ReactRootIndex.js +36 -0
  65. package/lib/ReactServerRendering.js +8 -11
  66. package/lib/ReactTextComponent.js +8 -3
  67. package/lib/{ReactTransitionKeySet.js → ReactTransitionChildMapping.js} +42 -47
  68. package/lib/ReactTransitionGroup.js +132 -57
  69. package/lib/ReactUpdates.js +14 -11
  70. package/lib/ReactWithAddons.js +7 -2
  71. package/lib/SelectEventPlugin.js +22 -39
  72. package/lib/ServerReactRootIndex.js +36 -0
  73. package/lib/SimpleEventPlugin.js +54 -6
  74. package/lib/SyntheticClipboardEvent.js +7 -1
  75. package/lib/SyntheticDragEvent.js +44 -0
  76. package/lib/SyntheticEvent.js +2 -1
  77. package/lib/SyntheticKeyboardEvent.js +4 -2
  78. package/lib/SyntheticWheelEvent.js +10 -7
  79. package/lib/Transaction.js +61 -36
  80. package/lib/cloneWithProps.js +59 -0
  81. package/lib/createArrayFrom.js +10 -13
  82. package/lib/createFullPageComponent.js +63 -0
  83. package/lib/cx.js +2 -2
  84. package/lib/flattenChildren.js +5 -2
  85. package/lib/getActiveElement.js +4 -3
  86. package/lib/getEventKey.js +85 -0
  87. package/lib/getMarkupWrap.js +10 -0
  88. package/lib/getTextContentAccessor.js +5 -3
  89. package/lib/getUnboundedScrollPosition.js +2 -2
  90. package/lib/invariant.js +12 -4
  91. package/lib/isEventSupported.js +7 -11
  92. package/lib/mergeHelpers.js +5 -6
  93. package/lib/onlyChild.js +43 -0
  94. package/lib/shouldUpdateReactComponent.js +58 -0
  95. package/lib/toArray.js +75 -0
  96. package/lib/traverseAllChildren.js +69 -7
  97. package/lib/warning.js +40 -0
  98. package/package.json +2 -3
  99. package/react.js +0 -3
  100. package/ReactJSErrors.js +0 -40
  101. package/lib/$.js +0 -46
  102. package/lib/CallbackRegistry.js +0 -91
  103. package/lib/LinkedValueMixin.js +0 -68
  104. package/lib/ex.js +0 -49
  105. package/lib/filterAttributes.js +0 -45
  106. package/lib/ge.js +0 -76
  107. package/lib/mutateHTMLNodeWithMarkup.js +0 -100
package/lib/Danger.js CHANGED
@@ -27,7 +27,6 @@ var createNodesFromMarkup = require("./createNodesFromMarkup");
27
27
  var emptyFunction = require("./emptyFunction");
28
28
  var getMarkupWrap = require("./getMarkupWrap");
29
29
  var invariant = require("./invariant");
30
- var mutateHTMLNodeWithMarkup = require("./mutateHTMLNodeWithMarkup");
31
30
 
32
31
  var OPEN_TAG_NAME_EXP = /^(<[^ \/>]+)/;
33
32
  var RESULT_INDEX_ATTR = 'data-danger-index';
@@ -171,12 +170,14 @@ var Danger = {
171
170
  'immediately.'
172
171
  ) : invariant(ExecutionEnvironment.canUseDOM));
173
172
  ("production" !== process.env.NODE_ENV ? invariant(markup, 'dangerouslyReplaceNodeWithMarkup(...): Missing markup.') : invariant(markup));
174
- // createNodesFromMarkup() won't work if the markup is rooted by <html>
175
- // since it has special semantic meaning. So we use an alternatie strategy.
176
- if (oldChild.tagName.toLowerCase() === 'html') {
177
- mutateHTMLNodeWithMarkup(oldChild, markup);
178
- return;
179
- }
173
+ ("production" !== process.env.NODE_ENV ? invariant(
174
+ oldChild.tagName.toLowerCase() !== 'html',
175
+ 'dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the ' +
176
+ '<html> node. This is because browser quirks make this unreliable ' +
177
+ 'and/or slow. If you want to render to the root you must use ' +
178
+ 'server rendering. See renderComponentToString().'
179
+ ) : invariant(oldChild.tagName.toLowerCase() !== 'html'));
180
+
180
181
  var newChild = createNodesFromMarkup(markup, emptyFunction)[0];
181
182
  oldChild.parentNode.replaceChild(newChild, oldChild);
182
183
  }
@@ -45,7 +45,8 @@ var DefaultDOMPropertyConfig = {
45
45
  alt: null,
46
46
  async: HAS_BOOLEAN_VALUE,
47
47
  autoComplete: null,
48
- autoFocus: HAS_BOOLEAN_VALUE,
48
+ // autoFocus is polyfilled/normalized by AutoFocusMixin
49
+ // autoFocus: HAS_BOOLEAN_VALUE,
49
50
  autoPlay: HAS_BOOLEAN_VALUE,
50
51
  cellPadding: null,
51
52
  cellSpacing: null,
@@ -66,6 +67,7 @@ var DefaultDOMPropertyConfig = {
66
67
  draggable: null,
67
68
  encType: null,
68
69
  form: MUST_USE_ATTRIBUTE,
70
+ formNoValidate: HAS_BOOLEAN_VALUE,
69
71
  frameBorder: MUST_USE_ATTRIBUTE,
70
72
  height: MUST_USE_ATTRIBUTE,
71
73
  hidden: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
@@ -84,6 +86,7 @@ var DefaultDOMPropertyConfig = {
84
86
  min: null,
85
87
  multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
86
88
  name: null,
89
+ noValidate: HAS_BOOLEAN_VALUE,
87
90
  pattern: null,
88
91
  placeholder: null,
89
92
  poster: null,
@@ -95,12 +98,17 @@ var DefaultDOMPropertyConfig = {
95
98
  role: MUST_USE_ATTRIBUTE,
96
99
  rows: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,
97
100
  rowSpan: null,
101
+ sandbox: null,
102
+ scope: null,
98
103
  scrollLeft: MUST_USE_PROPERTY,
99
104
  scrollTop: MUST_USE_PROPERTY,
105
+ seamless: MUST_USE_ATTRIBUTE | HAS_BOOLEAN_VALUE,
100
106
  selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
101
107
  size: MUST_USE_ATTRIBUTE | HAS_POSITIVE_NUMERIC_VALUE,
108
+ span: HAS_POSITIVE_NUMERIC_VALUE,
102
109
  spellCheck: null,
103
110
  src: null,
111
+ srcDoc: MUST_USE_PROPERTY,
104
112
  step: null,
105
113
  style: null,
106
114
  tabIndex: null,
@@ -116,6 +124,7 @@ var DefaultDOMPropertyConfig = {
116
124
  */
117
125
  autoCapitalize: null, // Supported in Mobile Safari for keyboard hints
118
126
  autoCorrect: null, // Supported in Mobile Safari for keyboard hints
127
+ property: null, // Supports OG in meta tags
119
128
 
120
129
  /**
121
130
  * SVG Properties
@@ -169,7 +178,8 @@ var DefaultDOMPropertyConfig = {
169
178
  autoPlay: 'autoplay',
170
179
  encType: 'enctype',
171
180
  radioGroup: 'radiogroup',
172
- spellCheck: 'spellcheck'
181
+ spellCheck: 'spellcheck',
182
+ srcDoc: 'srcdoc'
173
183
  },
174
184
  DOMMutationMethods: {
175
185
  /**
@@ -30,8 +30,20 @@ var topLevelTypes = EventConstants.topLevelTypes;
30
30
  var getFirstReactDOM = ReactMount.getFirstReactDOM;
31
31
 
32
32
  var eventTypes = {
33
- mouseEnter: {registrationName: keyOf({onMouseEnter: null})},
34
- mouseLeave: {registrationName: keyOf({onMouseLeave: null})}
33
+ mouseEnter: {
34
+ registrationName: keyOf({onMouseEnter: null}),
35
+ dependencies: [
36
+ topLevelTypes.topMouseOut,
37
+ topLevelTypes.topMouseOver
38
+ ]
39
+ },
40
+ mouseLeave: {
41
+ registrationName: keyOf({onMouseLeave: null}),
42
+ dependencies: [
43
+ topLevelTypes.topMouseOut,
44
+ topLevelTypes.topMouseOver
45
+ ]
46
+ }
35
47
  };
36
48
 
37
49
  var extractedEvents = [null, null];
@@ -69,14 +81,28 @@ var EnterLeaveEventPlugin = {
69
81
  return null;
70
82
  }
71
83
 
84
+ var win;
85
+ if (topLevelTarget.window === topLevelTarget) {
86
+ // `topLevelTarget` is probably a window object.
87
+ win = topLevelTarget;
88
+ } else {
89
+ // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
90
+ var doc = topLevelTarget.ownerDocument;
91
+ if (doc) {
92
+ win = doc.defaultView || doc.parentWindow;
93
+ } else {
94
+ win = window;
95
+ }
96
+ }
97
+
72
98
  var from, to;
73
99
  if (topLevelType === topLevelTypes.topMouseOut) {
74
100
  from = topLevelTarget;
75
101
  to =
76
102
  getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) ||
77
- window;
103
+ win;
78
104
  } else {
79
- from = window;
105
+ from = win;
80
106
  to = topLevelTarget;
81
107
  }
82
108
 
@@ -93,11 +119,18 @@ var EnterLeaveEventPlugin = {
93
119
  fromID,
94
120
  nativeEvent
95
121
  );
122
+ leave.type = 'mouseleave';
123
+ leave.target = from;
124
+ leave.relatedTarget = to;
125
+
96
126
  var enter = SyntheticMouseEvent.getPooled(
97
127
  eventTypes.mouseEnter,
98
128
  toID,
99
129
  nativeEvent
100
130
  );
131
+ enter.type = 'mouseenter';
132
+ enter.target = to;
133
+ enter.relatedTarget = from;
101
134
 
102
135
  EventPropagators.accumulateEnterLeaveDispatches(leave, enter, fromID, toID);
103
136
 
@@ -44,17 +44,20 @@ var topLevelTypes = keyMirror({
44
44
  topDragOver: null,
45
45
  topDragStart: null,
46
46
  topDrop: null,
47
+ topError: null,
47
48
  topFocus: null,
48
49
  topInput: null,
49
50
  topKeyDown: null,
50
51
  topKeyPress: null,
51
52
  topKeyUp: null,
53
+ topLoad: null,
52
54
  topMouseDown: null,
53
55
  topMouseMove: null,
54
56
  topMouseOut: null,
55
57
  topMouseOver: null,
56
58
  topMouseUp: null,
57
59
  topPaste: null,
60
+ topReset: null,
58
61
  topScroll: null,
59
62
  topSelectionChange: null,
60
63
  topSubmit: null,
@@ -1,59 +1,67 @@
1
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
2
  * @providesModule EventListener
17
3
  */
18
4
 
5
+ var emptyFunction = require("./emptyFunction");
6
+
19
7
  /**
20
8
  * Upstream version of event listener. Does not take into account specific
21
9
  * nature of platform.
22
10
  */
23
11
  var EventListener = {
24
12
  /**
25
- * Listens to bubbled events on a DOM node.
13
+ * Listen to DOM events during the bubble phase.
26
14
  *
27
- * @param {Element} el DOM element to register listener on.
28
- * @param {string} handlerBaseName 'click'/'mouseover'
29
- * @param {Function!} cb Callback function
15
+ * @param {DOMEventTarget} target DOM element to register listener on.
16
+ * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
17
+ * @param {function} callback Callback function.
18
+ * @return {object} Object with a `remove` method.
30
19
  */
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);
20
+ listen: function(target, eventType, callback) {
21
+ if (target.addEventListener) {
22
+ target.addEventListener(eventType, callback, false);
23
+ return {
24
+ remove: function() {
25
+ target.removeEventListener(eventType, callback, false);
26
+ }
27
+ };
28
+ } else if (target.attachEvent) {
29
+ target.attachEvent('on' + eventType, callback);
30
+ return {
31
+ remove: function() {
32
+ target.detachEvent(eventType, callback);
33
+ }
34
+ };
36
35
  }
37
36
  },
38
37
 
39
38
  /**
40
- * Listens to captured events on a DOM node.
39
+ * Listen to DOM events during the capture phase.
41
40
  *
42
- * @see `EventListener.listen` for params.
43
- * @throws Exception if addEventListener is not supported.
41
+ * @param {DOMEventTarget} target DOM element to register listener on.
42
+ * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
43
+ * @param {function} callback Callback function.
44
+ * @return {object} Object with a `remove` method.
44
45
  */
45
- capture: function(el, handlerBaseName, cb) {
46
- if (!el.addEventListener) {
46
+ capture: function(target, eventType, callback) {
47
+ if (!target.addEventListener) {
47
48
  if ("production" !== process.env.NODE_ENV) {
48
49
  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).');
50
+ 'Attempted to listen to events during the capture phase on a ' +
51
+ 'browser that does not support the capture phase. Your application ' +
52
+ 'will not receive some events.'
53
+ );
53
54
  }
54
- return;
55
+ return {
56
+ remove: emptyFunction
57
+ };
55
58
  } else {
56
- el.addEventListener(handlerBaseName, cb, true);
59
+ target.addEventListener(eventType, callback, true);
60
+ return {
61
+ remove: function() {
62
+ target.removeEventListener(eventType, callback, true);
63
+ }
64
+ };
57
65
  }
58
66
  }
59
67
  };
@@ -18,15 +18,19 @@
18
18
 
19
19
  "use strict";
20
20
 
21
- var CallbackRegistry = require("./CallbackRegistry");
22
21
  var EventPluginRegistry = require("./EventPluginRegistry");
23
22
  var EventPluginUtils = require("./EventPluginUtils");
24
- var EventPropagators = require("./EventPropagators");
25
23
  var ExecutionEnvironment = require("./ExecutionEnvironment");
26
24
 
27
25
  var accumulate = require("./accumulate");
28
26
  var forEachAccumulated = require("./forEachAccumulated");
29
27
  var invariant = require("./invariant");
28
+ var isEventSupported = require("./isEventSupported");
29
+
30
+ /**
31
+ * Internal store for event listeners
32
+ */
33
+ var listenerBank = {};
30
34
 
31
35
  /**
32
36
  * Internal queue of events that have accumulated their dispatches and are
@@ -56,6 +60,21 @@ var executeDispatchesAndRelease = function(event) {
56
60
  }
57
61
  };
58
62
 
63
+ /**
64
+ * - `InstanceHandle`: [required] Module that performs logical traversals of DOM
65
+ * hierarchy given ids of the logical DOM elements involved.
66
+ */
67
+ var InstanceHandle = null;
68
+
69
+ function validateInstanceHandle() {
70
+ var invalid = !InstanceHandle||
71
+ !InstanceHandle.traverseTwoPhase ||
72
+ !InstanceHandle.traverseEnterLeave;
73
+ if (invalid) {
74
+ throw new Error('InstanceHandle not injected before use!');
75
+ }
76
+ }
77
+
59
78
  /**
60
79
  * This is a unified interface for event plugins to be installed and configured.
61
80
  *
@@ -85,11 +104,29 @@ var EventPluginHub = {
85
104
  */
86
105
  injection: {
87
106
 
107
+ /**
108
+ * @param {object} InjectedMount
109
+ * @public
110
+ */
111
+ injectMount: EventPluginUtils.injection.injectMount,
112
+
88
113
  /**
89
114
  * @param {object} InjectedInstanceHandle
90
115
  * @public
91
116
  */
92
- injectInstanceHandle: EventPropagators.injection.injectInstanceHandle,
117
+ injectInstanceHandle: function(InjectedInstanceHandle) {
118
+ InstanceHandle = InjectedInstanceHandle;
119
+ if ("production" !== process.env.NODE_ENV) {
120
+ validateInstanceHandle();
121
+ }
122
+ },
123
+
124
+ getInstanceHandle: function() {
125
+ if ("production" !== process.env.NODE_ENV) {
126
+ validateInstanceHandle();
127
+ }
128
+ return InstanceHandle;
129
+ },
93
130
 
94
131
  /**
95
132
  * @param {array} InjectedEventPluginOrder
@@ -104,15 +141,72 @@ var EventPluginHub = {
104
141
 
105
142
  },
106
143
 
107
- registrationNames: EventPluginRegistry.registrationNames,
144
+ registrationNameModules: EventPluginRegistry.registrationNameModules,
108
145
 
109
- putListener: CallbackRegistry.putListener,
146
+ /**
147
+ * Stores `listener` at `listenerBank[registrationName][id]`. Is idempotent.
148
+ *
149
+ * @param {string} id ID of the DOM element.
150
+ * @param {string} registrationName Name of listener (e.g. `onClick`).
151
+ * @param {?function} listener The callback to store.
152
+ */
153
+ putListener: function(id, registrationName, listener) {
154
+ ("production" !== process.env.NODE_ENV ? invariant(
155
+ ExecutionEnvironment.canUseDOM,
156
+ 'Cannot call putListener() in a non-DOM environment.'
157
+ ) : invariant(ExecutionEnvironment.canUseDOM));
158
+ ("production" !== process.env.NODE_ENV ? invariant(
159
+ !listener || typeof listener === 'function',
160
+ 'Expected %s listener to be a function, instead got type %s',
161
+ registrationName, typeof listener
162
+ ) : invariant(!listener || typeof listener === 'function'));
163
+
164
+ if ("production" !== process.env.NODE_ENV) {
165
+ // IE8 has no API for event capturing and the `onScroll` event doesn't
166
+ // bubble.
167
+ if (registrationName === 'onScroll' &&
168
+ !isEventSupported('scroll', true)) {
169
+ console.warn('This browser doesn\'t support the `onScroll` event');
170
+ }
171
+ }
172
+ var bankForRegistrationName =
173
+ listenerBank[registrationName] || (listenerBank[registrationName] = {});
174
+ bankForRegistrationName[id] = listener;
175
+ },
110
176
 
111
- getListener: CallbackRegistry.getListener,
177
+ /**
178
+ * @param {string} id ID of the DOM element.
179
+ * @param {string} registrationName Name of listener (e.g. `onClick`).
180
+ * @return {?function} The stored callback.
181
+ */
182
+ getListener: function(id, registrationName) {
183
+ var bankForRegistrationName = listenerBank[registrationName];
184
+ return bankForRegistrationName && bankForRegistrationName[id];
185
+ },
112
186
 
113
- deleteListener: CallbackRegistry.deleteListener,
187
+ /**
188
+ * Deletes a listener from the registration bank.
189
+ *
190
+ * @param {string} id ID of the DOM element.
191
+ * @param {string} registrationName Name of listener (e.g. `onClick`).
192
+ */
193
+ deleteListener: function(id, registrationName) {
194
+ var bankForRegistrationName = listenerBank[registrationName];
195
+ if (bankForRegistrationName) {
196
+ delete bankForRegistrationName[id];
197
+ }
198
+ },
114
199
 
115
- deleteAllListeners: CallbackRegistry.deleteAllListeners,
200
+ /**
201
+ * Deletes all listeners for the DOM element with the supplied ID.
202
+ *
203
+ * @param {string} id ID of the DOM element.
204
+ */
205
+ deleteAllListeners: function(id) {
206
+ for (var registrationName in listenerBank) {
207
+ delete listenerBank[registrationName][id];
208
+ }
209
+ },
116
210
 
117
211
  /**
118
212
  * Allows registered plugins an opportunity to extract events from top-level
@@ -179,12 +273,19 @@ var EventPluginHub = {
179
273
  'processEventQueue(): Additional events were enqueued while processing ' +
180
274
  'an event queue. Support for this has not yet been implemented.'
181
275
  ) : invariant(!eventQueue));
276
+ },
277
+
278
+ /**
279
+ * These are needed for tests only. Do not use!
280
+ */
281
+ __purge: function() {
282
+ listenerBank = {};
283
+ },
284
+
285
+ __getListenerBank: function() {
286
+ return listenerBank;
182
287
  }
183
288
 
184
289
  };
185
290
 
186
- if (ExecutionEnvironment.canUseDOM) {
187
- window.EventPluginHub = EventPluginHub;
188
- }
189
-
190
291
  module.exports = EventPluginHub;