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.
- package/README.md +15 -228
- package/ReactJSErrors.js +40 -0
- package/addons.js +4 -0
- package/lib/$.js +46 -0
- package/lib/CSSCore.js +114 -0
- package/lib/CSSProperty.js +90 -0
- package/lib/CSSPropertyOperations.js +97 -0
- package/lib/CallbackRegistry.js +91 -0
- package/lib/ChangeEventPlugin.js +365 -0
- package/lib/CompositionEventPlugin.js +212 -0
- package/lib/DOMChildrenOperations.js +135 -0
- package/lib/DOMProperty.js +266 -0
- package/lib/DOMPropertyOperations.js +168 -0
- package/lib/Danger.js +186 -0
- package/lib/DefaultDOMPropertyConfig.js +187 -0
- package/lib/DefaultEventPluginOrder.js +44 -0
- package/lib/EnterLeaveEventPlugin.js +112 -0
- package/lib/EventConstants.js +73 -0
- package/lib/EventListener.js +61 -0
- package/lib/EventPluginHub.js +190 -0
- package/lib/EventPluginRegistry.js +237 -0
- package/lib/EventPluginUtils.js +185 -0
- package/lib/EventPropagators.js +179 -0
- package/lib/ExecutionEnvironment.js +41 -0
- package/lib/LinkedStateMixin.js +46 -0
- package/lib/LinkedValueMixin.js +68 -0
- package/lib/MobileSafariClickEventPlugin.js +63 -0
- package/lib/PooledClass.js +113 -0
- package/lib/React.js +71 -0
- package/lib/ReactChildren.js +132 -0
- package/lib/ReactComponent.js +515 -0
- package/lib/ReactComponentBrowserEnvironment.js +140 -0
- package/lib/ReactComponentEnvironment.js +24 -0
- package/lib/ReactCompositeComponent.js +1020 -0
- package/lib/ReactCurrentOwner.js +39 -0
- package/lib/ReactDOM.js +194 -0
- package/lib/ReactDOMButton.js +64 -0
- package/lib/ReactDOMComponent.js +374 -0
- package/lib/ReactDOMForm.js +52 -0
- package/lib/ReactDOMIDOperations.js +173 -0
- package/lib/ReactDOMInput.js +169 -0
- package/lib/ReactDOMOption.js +50 -0
- package/lib/ReactDOMSelect.js +160 -0
- package/lib/ReactDOMSelection.js +189 -0
- package/lib/ReactDOMTextarea.js +136 -0
- package/lib/ReactDefaultBatchingStrategy.js +75 -0
- package/lib/ReactDefaultInjection.js +91 -0
- package/lib/ReactDefaultPerf.js +407 -0
- package/lib/ReactErrorUtils.js +46 -0
- package/lib/ReactEventEmitter.js +341 -0
- package/lib/ReactEventEmitterMixin.js +89 -0
- package/lib/ReactEventTopLevelCallback.js +89 -0
- package/lib/ReactInputSelection.js +140 -0
- package/lib/ReactInstanceHandles.js +322 -0
- package/lib/ReactLink.js +54 -0
- package/lib/ReactMarkupChecksum.js +53 -0
- package/lib/ReactMount.js +617 -0
- package/lib/ReactMountReady.js +95 -0
- package/lib/ReactMultiChild.js +441 -0
- package/lib/ReactMultiChildUpdateTypes.js +36 -0
- package/lib/ReactOwner.js +146 -0
- package/lib/ReactPerf.js +88 -0
- package/lib/ReactPropTransferer.js +128 -0
- package/lib/ReactPropTypes.js +158 -0
- package/lib/ReactReconcileTransaction.js +161 -0
- package/lib/ReactServerRendering.js +62 -0
- package/lib/ReactStateSetters.js +111 -0
- package/lib/ReactTextComponent.js +94 -0
- package/lib/ReactTransitionEvents.js +97 -0
- package/lib/ReactTransitionGroup.js +112 -0
- package/lib/ReactTransitionKeySet.js +111 -0
- package/lib/ReactTransitionableChild.js +152 -0
- package/lib/ReactUpdates.js +145 -0
- package/lib/ReactWithAddons.js +41 -0
- package/lib/SelectEventPlugin.js +217 -0
- package/lib/SimpleEventPlugin.js +365 -0
- package/lib/SyntheticClipboardEvent.js +45 -0
- package/lib/SyntheticCompositionEvent.js +51 -0
- package/lib/SyntheticEvent.js +163 -0
- package/lib/SyntheticFocusEvent.js +44 -0
- package/lib/SyntheticKeyboardEvent.js +56 -0
- package/lib/SyntheticMouseEvent.js +85 -0
- package/lib/SyntheticTouchEvent.js +50 -0
- package/lib/SyntheticUIEvent.js +45 -0
- package/lib/SyntheticWheelEvent.js +63 -0
- package/lib/Transaction.js +251 -0
- package/lib/ViewportMetrics.js +37 -0
- package/lib/accumulate.js +54 -0
- package/lib/adler32.js +39 -0
- package/lib/containsNode.js +49 -0
- package/lib/copyProperties.js +54 -0
- package/lib/createArrayFrom.js +94 -0
- package/lib/createNodesFromMarkup.js +93 -0
- package/lib/createObjectFrom.js +61 -0
- package/lib/cx.js +44 -0
- package/lib/dangerousStyleValue.js +57 -0
- package/lib/emptyFunction.js +43 -0
- package/lib/escapeTextForBrowser.js +47 -0
- package/lib/ex.js +49 -0
- package/lib/filterAttributes.js +45 -0
- package/lib/flattenChildren.js +54 -0
- package/lib/forEachAccumulated.js +36 -0
- package/lib/ge.js +76 -0
- package/lib/getActiveElement.js +33 -0
- package/lib/getEventTarget.js +36 -0
- package/lib/getMarkupWrap.js +108 -0
- package/lib/getNodeForCharacterOffset.js +80 -0
- package/lib/getReactRootElementInContainer.js +40 -0
- package/lib/getTextContentAccessor.js +40 -0
- package/lib/getUnboundedScrollPosition.js +45 -0
- package/lib/hyphenate.js +35 -0
- package/lib/invariant.js +54 -0
- package/lib/isEventSupported.js +74 -0
- package/lib/isNode.js +33 -0
- package/lib/isTextInputElement.js +49 -0
- package/lib/isTextNode.js +30 -0
- package/lib/joinClasses.js +44 -0
- package/lib/keyMirror.js +58 -0
- package/lib/keyOf.js +41 -0
- package/lib/memoizeStringOnly.js +39 -0
- package/lib/merge.js +37 -0
- package/lib/mergeHelpers.js +137 -0
- package/lib/mergeInto.js +45 -0
- package/lib/mixInto.js +34 -0
- package/lib/mutateHTMLNodeWithMarkup.js +100 -0
- package/lib/objMap.js +47 -0
- package/lib/objMapKeyVal.js +47 -0
- package/lib/performanceNow.js +42 -0
- package/lib/shallowEqual.js +49 -0
- package/lib/traverseAllChildren.js +127 -0
- package/package.json +33 -31
- package/react.js +4 -0
- package/.npmignore +0 -7
- package/.travis.yml +0 -7
- package/Jakefile.js +0 -39
- package/LICENSE +0 -19
- package/browser-test/dist.html +0 -90
- package/browser-test/index.html +0 -86
- package/browser-test/min.html +0 -90
- package/dist/react.js +0 -3141
- package/dist/react.min.js +0 -22
- package/doc/advanced.md +0 -175
- package/doc/color-def.graffle +0 -938
- package/doc/color-def.png +0 -0
- package/doc/simple.dot +0 -25
- package/doc/simple.png +0 -0
- package/examples/longer-example.js +0 -41
- package/examples/simple.js +0 -45
- package/examples/using-ast-directly.js +0 -30
- package/examples/using-events1.js +0 -79
- package/examples/using-log-events.js +0 -43
- package/lib/base-task.js +0 -120
- package/lib/cb-task.js +0 -84
- package/lib/core.js +0 -138
- package/lib/dsl.js +0 -138
- package/lib/error.js +0 -55
- package/lib/event-collector.js +0 -81
- package/lib/event-manager.js +0 -89
- package/lib/eventemitter.js +0 -20
- package/lib/finalcb-first-task.js +0 -68
- package/lib/finalcb-task.js +0 -65
- package/lib/id.js +0 -22
- package/lib/input-parser.js +0 -56
- package/lib/log-events.js +0 -101
- package/lib/parse.js +0 -41
- package/lib/promise-resolve.js +0 -50
- package/lib/promise-task.js +0 -93
- package/lib/react.js +0 -59
- package/lib/ret-task.js +0 -71
- package/lib/sprintf.js +0 -18
- package/lib/status.js +0 -14
- package/lib/task.js +0 -251
- package/lib/track-tasks.js +0 -74
- package/lib/validate.js +0 -159
- package/lib/vcon.js +0 -113
- package/lib/when-task.js +0 -84
- package/src/dist.build.requirejs +0 -20
- package/test/ast.mocha.js +0 -136
- package/test/cb-task.mocha.js +0 -220
- package/test/core-deferred.mocha.js +0 -143
- package/test/core-when.mocha.js +0 -96
- package/test/core.mocha.js +0 -589
- package/test/dsl.mocha.js +0 -352
- package/test/event-manager.mocha.js +0 -119
- package/test/exec-options.mocha.js +0 -48
- package/test/finalcb-task.mocha.js +0 -58
- package/test/input-parser.mocha.js +0 -86
- package/test/log-events.mocha.js +0 -88
- package/test/mocha.opts +0 -2
- package/test/module-use.mocha.js +0 -164
- package/test/promise-auto-resolve.mocha.js +0 -68
- package/test/ret-task.mocha.js +0 -220
- package/test/task.mocha.js +0 -42
- package/test/validate-cb-task.mocha.js +0 -100
- package/test/validate-ret-task.mocha.js +0 -110
- package/test/validate.mocha.js +0 -324
- package/test/vcon.mocha.js +0 -193
- package/vendor/chai/chai.js +0 -4251
- package/vendor/jquery/jquery-1.7.1.js +0 -9266
- package/vendor/jquery/jquery-1.7.1.min.js +0 -4
- package/vendor/node/util.js +0 -531
- package/vendor/requirejs/require.js +0 -2045
- 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;
|