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.
- package/README.md +0 -8
- package/addons.js +0 -3
- package/lib/AutoFocusMixin.js +30 -0
- package/lib/CSSCore.js +22 -21
- package/lib/CSSProperty.js +31 -0
- package/lib/ChangeEventPlugin.js +26 -4
- package/lib/ClientReactRootIndex.js +30 -0
- package/lib/CompositionEventPlugin.js +57 -9
- package/lib/DOMChildrenOperations.js +32 -2
- package/lib/DOMProperty.js +2 -0
- package/lib/DOMPropertyOperations.js +14 -1
- package/lib/Danger.js +8 -7
- package/lib/DefaultDOMPropertyConfig.js +12 -2
- package/lib/EnterLeaveEventPlugin.js +37 -4
- package/lib/EventConstants.js +3 -0
- package/lib/EventListener.js +42 -34
- package/lib/EventPluginHub.js +113 -12
- package/lib/EventPluginRegistry.js +39 -16
- package/lib/EventPluginUtils.js +32 -3
- package/lib/EventPropagators.js +6 -42
- package/lib/ExecutionEnvironment.js +3 -0
- package/lib/LinkedValueUtils.js +161 -0
- package/lib/PooledClass.js +6 -0
- package/lib/React.js +27 -3
- package/lib/ReactCSSTransitionGroup.js +65 -0
- package/lib/{ReactTransitionableChild.js → ReactCSSTransitionGroupChild.js} +21 -35
- package/lib/ReactComponent.js +87 -52
- package/lib/ReactComponentBrowserEnvironment.js +67 -49
- package/lib/ReactComponentEnvironment.js +2 -0
- package/lib/ReactCompositeComponent.js +547 -112
- package/lib/ReactContext.js +67 -0
- package/lib/ReactDOM.js +13 -0
- package/lib/ReactDOMButton.js +4 -0
- package/lib/ReactDOMComponent.js +46 -21
- package/lib/ReactDOMForm.js +9 -2
- package/lib/ReactDOMIDOperations.js +105 -60
- package/lib/ReactDOMImg.js +58 -0
- package/lib/ReactDOMInput.js +26 -14
- package/lib/ReactDOMOption.js +1 -0
- package/lib/ReactDOMSelect.js +36 -17
- package/lib/ReactDOMTextarea.js +12 -8
- package/lib/ReactDefaultInjection.js +50 -26
- package/lib/ReactDefaultPerf.js +207 -370
- package/lib/ReactDefaultPerfAnalysis.js +199 -0
- package/lib/ReactErrorUtils.js +5 -14
- package/lib/ReactEventEmitter.js +141 -145
- package/lib/ReactEventEmitterMixin.js +0 -32
- package/lib/ReactEventTopLevelCallback.js +32 -12
- package/lib/ReactInjection.js +39 -0
- package/lib/ReactInstanceHandles.js +35 -19
- package/lib/ReactLink.js +1 -1
- package/lib/ReactMount.js +127 -103
- package/lib/ReactMountReady.js +1 -1
- package/lib/ReactMultiChild.js +30 -46
- package/lib/ReactMultiChildUpdateTypes.js +2 -0
- package/lib/ReactOwner.js +10 -2
- package/lib/ReactPerf.js +5 -8
- package/lib/ReactPropTransferer.js +40 -21
- package/lib/ReactPropTypeLocationNames.js +31 -0
- package/lib/ReactPropTypeLocations.js +29 -0
- package/lib/ReactPropTypes.js +248 -47
- package/lib/ReactPutListenerQueue.js +61 -0
- package/lib/ReactReconcileTransaction.js +20 -0
- package/lib/ReactRootIndex.js +36 -0
- package/lib/ReactServerRendering.js +8 -11
- package/lib/ReactTextComponent.js +8 -3
- package/lib/{ReactTransitionKeySet.js → ReactTransitionChildMapping.js} +42 -47
- package/lib/ReactTransitionGroup.js +132 -57
- package/lib/ReactUpdates.js +14 -11
- package/lib/ReactWithAddons.js +7 -2
- package/lib/SelectEventPlugin.js +22 -39
- package/lib/ServerReactRootIndex.js +36 -0
- package/lib/SimpleEventPlugin.js +54 -6
- package/lib/SyntheticClipboardEvent.js +7 -1
- package/lib/SyntheticDragEvent.js +44 -0
- package/lib/SyntheticEvent.js +2 -1
- package/lib/SyntheticKeyboardEvent.js +4 -2
- package/lib/SyntheticWheelEvent.js +10 -7
- package/lib/Transaction.js +61 -36
- package/lib/cloneWithProps.js +59 -0
- package/lib/createArrayFrom.js +10 -13
- package/lib/createFullPageComponent.js +63 -0
- package/lib/cx.js +2 -2
- package/lib/flattenChildren.js +5 -2
- package/lib/getActiveElement.js +4 -3
- package/lib/getEventKey.js +85 -0
- package/lib/getMarkupWrap.js +10 -0
- package/lib/getTextContentAccessor.js +5 -3
- package/lib/getUnboundedScrollPosition.js +2 -2
- package/lib/invariant.js +12 -4
- package/lib/isEventSupported.js +7 -11
- package/lib/mergeHelpers.js +5 -6
- package/lib/onlyChild.js +43 -0
- package/lib/shouldUpdateReactComponent.js +58 -0
- package/lib/toArray.js +75 -0
- package/lib/traverseAllChildren.js +69 -7
- package/lib/warning.js +40 -0
- package/package.json +2 -3
- package/react.js +0 -3
- package/ReactJSErrors.js +0 -40
- package/lib/$.js +0 -46
- package/lib/CallbackRegistry.js +0 -91
- package/lib/LinkedValueMixin.js +0 -68
- package/lib/ex.js +0 -49
- package/lib/filterAttributes.js +0 -45
- package/lib/ge.js +0 -76
- 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
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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
|
|
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: {
|
|
34
|
-
|
|
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
|
-
|
|
103
|
+
win;
|
|
78
104
|
} else {
|
|
79
|
-
from =
|
|
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
|
|
package/lib/EventConstants.js
CHANGED
|
@@ -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,
|
package/lib/EventListener.js
CHANGED
|
@@ -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
|
-
*
|
|
13
|
+
* Listen to DOM events during the bubble phase.
|
|
26
14
|
*
|
|
27
|
-
* @param {
|
|
28
|
-
* @param {string}
|
|
29
|
-
* @param {
|
|
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(
|
|
32
|
-
if (
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
*
|
|
39
|
+
* Listen to DOM events during the capture phase.
|
|
41
40
|
*
|
|
42
|
-
* @
|
|
43
|
-
* @
|
|
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(
|
|
46
|
-
if (!
|
|
46
|
+
capture: function(target, eventType, callback) {
|
|
47
|
+
if (!target.addEventListener) {
|
|
47
48
|
if ("production" !== process.env.NODE_ENV) {
|
|
48
49
|
console.error(
|
|
49
|
-
'
|
|
50
|
-
'
|
|
51
|
-
'
|
|
52
|
-
|
|
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
|
-
|
|
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
|
};
|
package/lib/EventPluginHub.js
CHANGED
|
@@ -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:
|
|
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
|
-
|
|
144
|
+
registrationNameModules: EventPluginRegistry.registrationNameModules,
|
|
108
145
|
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|