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,189 @@
|
|
|
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 ReactDOMSelection
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
"use strict";
|
|
20
|
+
|
|
21
|
+
var getNodeForCharacterOffset = require("./getNodeForCharacterOffset");
|
|
22
|
+
var getTextContentAccessor = require("./getTextContentAccessor");
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Get the appropriate anchor and focus node/offset pairs for IE.
|
|
26
|
+
*
|
|
27
|
+
* The catch here is that IE's selection API doesn't provide information
|
|
28
|
+
* about whether the selection is forward or backward, so we have to
|
|
29
|
+
* behave as though it's always forward.
|
|
30
|
+
*
|
|
31
|
+
* IE text differs from modern selection in that it behaves as though
|
|
32
|
+
* block elements end with a new line. This means character offsets will
|
|
33
|
+
* differ between the two APIs.
|
|
34
|
+
*
|
|
35
|
+
* @param {DOMElement} node
|
|
36
|
+
* @return {object}
|
|
37
|
+
*/
|
|
38
|
+
function getIEOffsets(node) {
|
|
39
|
+
var selection = document.selection;
|
|
40
|
+
var selectedRange = selection.createRange();
|
|
41
|
+
var selectedLength = selectedRange.text.length;
|
|
42
|
+
|
|
43
|
+
// Duplicate selection so we can move range without breaking user selection.
|
|
44
|
+
var fromStart = selectedRange.duplicate();
|
|
45
|
+
fromStart.moveToElementText(node);
|
|
46
|
+
fromStart.setEndPoint('EndToStart', selectedRange);
|
|
47
|
+
|
|
48
|
+
var startOffset = fromStart.text.length;
|
|
49
|
+
var endOffset = startOffset + selectedLength;
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
start: startOffset,
|
|
53
|
+
end: endOffset
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @param {DOMElement} node
|
|
59
|
+
* @return {?object}
|
|
60
|
+
*/
|
|
61
|
+
function getModernOffsets(node) {
|
|
62
|
+
var selection = window.getSelection();
|
|
63
|
+
|
|
64
|
+
if (selection.rangeCount === 0) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
var anchorNode = selection.anchorNode;
|
|
69
|
+
var anchorOffset = selection.anchorOffset;
|
|
70
|
+
var focusNode = selection.focusNode;
|
|
71
|
+
var focusOffset = selection.focusOffset;
|
|
72
|
+
|
|
73
|
+
var currentRange = selection.getRangeAt(0);
|
|
74
|
+
var rangeLength = currentRange.toString().length;
|
|
75
|
+
|
|
76
|
+
var tempRange = currentRange.cloneRange();
|
|
77
|
+
tempRange.selectNodeContents(node);
|
|
78
|
+
tempRange.setEnd(currentRange.startContainer, currentRange.startOffset);
|
|
79
|
+
|
|
80
|
+
var start = tempRange.toString().length;
|
|
81
|
+
var end = start + rangeLength;
|
|
82
|
+
|
|
83
|
+
// Detect whether the selection is backward.
|
|
84
|
+
var detectionRange = document.createRange();
|
|
85
|
+
detectionRange.setStart(anchorNode, anchorOffset);
|
|
86
|
+
detectionRange.setEnd(focusNode, focusOffset);
|
|
87
|
+
var isBackward = detectionRange.collapsed;
|
|
88
|
+
detectionRange.detach();
|
|
89
|
+
|
|
90
|
+
return {
|
|
91
|
+
start: isBackward ? end : start,
|
|
92
|
+
end: isBackward ? start : end
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* @param {DOMElement|DOMTextNode} node
|
|
98
|
+
* @param {object} offsets
|
|
99
|
+
*/
|
|
100
|
+
function setIEOffsets(node, offsets) {
|
|
101
|
+
var range = document.selection.createRange().duplicate();
|
|
102
|
+
var start, end;
|
|
103
|
+
|
|
104
|
+
if (typeof offsets.end === 'undefined') {
|
|
105
|
+
start = offsets.start;
|
|
106
|
+
end = start;
|
|
107
|
+
} else if (offsets.start > offsets.end) {
|
|
108
|
+
start = offsets.end;
|
|
109
|
+
end = offsets.start;
|
|
110
|
+
} else {
|
|
111
|
+
start = offsets.start;
|
|
112
|
+
end = offsets.end;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
range.moveToElementText(node);
|
|
116
|
+
range.moveStart('character', start);
|
|
117
|
+
range.setEndPoint('EndToStart', range);
|
|
118
|
+
range.moveEnd('character', end - start);
|
|
119
|
+
range.select();
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* In modern non-IE browsers, we can support both forward and backward
|
|
124
|
+
* selections.
|
|
125
|
+
*
|
|
126
|
+
* Note: IE10+ supports the Selection object, but it does not support
|
|
127
|
+
* the `extend` method, which means that even in modern IE, it's not possible
|
|
128
|
+
* to programatically create a backward selection. Thus, for all IE
|
|
129
|
+
* versions, we use the old IE API to create our selections.
|
|
130
|
+
*
|
|
131
|
+
* @param {DOMElement|DOMTextNode} node
|
|
132
|
+
* @param {object} offsets
|
|
133
|
+
*/
|
|
134
|
+
function setModernOffsets(node, offsets) {
|
|
135
|
+
var selection = window.getSelection();
|
|
136
|
+
|
|
137
|
+
var length = node[getTextContentAccessor()].length;
|
|
138
|
+
var start = Math.min(offsets.start, length);
|
|
139
|
+
var end = typeof offsets.end === 'undefined' ?
|
|
140
|
+
start : Math.min(offsets.end, length);
|
|
141
|
+
|
|
142
|
+
// IE 11 uses modern selection, but doesn't support the extend method.
|
|
143
|
+
// Flip backward selections, so we can set with a single range.
|
|
144
|
+
if (!selection.extend && start > end) {
|
|
145
|
+
var temp = end;
|
|
146
|
+
end = start;
|
|
147
|
+
start = temp;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
var startMarker = getNodeForCharacterOffset(node, start);
|
|
151
|
+
var endMarker = getNodeForCharacterOffset(node, end);
|
|
152
|
+
|
|
153
|
+
if (startMarker && endMarker) {
|
|
154
|
+
var range = document.createRange();
|
|
155
|
+
range.setStart(startMarker.node, startMarker.offset);
|
|
156
|
+
selection.removeAllRanges();
|
|
157
|
+
|
|
158
|
+
if (start > end) {
|
|
159
|
+
selection.addRange(range);
|
|
160
|
+
selection.extend(endMarker.node, endMarker.offset);
|
|
161
|
+
} else {
|
|
162
|
+
range.setEnd(endMarker.node, endMarker.offset);
|
|
163
|
+
selection.addRange(range);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
range.detach();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
var ReactDOMSelection = {
|
|
171
|
+
/**
|
|
172
|
+
* @param {DOMElement} node
|
|
173
|
+
*/
|
|
174
|
+
getOffsets: function(node) {
|
|
175
|
+
var getOffsets = document.selection ? getIEOffsets : getModernOffsets;
|
|
176
|
+
return getOffsets(node);
|
|
177
|
+
},
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* @param {DOMElement|DOMTextNode} node
|
|
181
|
+
* @param {object} offsets
|
|
182
|
+
*/
|
|
183
|
+
setOffsets: function(node, offsets) {
|
|
184
|
+
var setOffsets = document.selection ? setIEOffsets : setModernOffsets;
|
|
185
|
+
setOffsets(node, offsets);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
module.exports = ReactDOMSelection;
|
|
@@ -0,0 +1,136 @@
|
|
|
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 ReactDOMTextarea
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
"use strict";
|
|
20
|
+
|
|
21
|
+
var DOMPropertyOperations = require("./DOMPropertyOperations");
|
|
22
|
+
var LinkedValueMixin = require("./LinkedValueMixin");
|
|
23
|
+
var ReactCompositeComponent = require("./ReactCompositeComponent");
|
|
24
|
+
var ReactDOM = require("./ReactDOM");
|
|
25
|
+
|
|
26
|
+
var invariant = require("./invariant");
|
|
27
|
+
var merge = require("./merge");
|
|
28
|
+
|
|
29
|
+
// Store a reference to the <textarea> `ReactDOMComponent`.
|
|
30
|
+
var textarea = ReactDOM.textarea;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Implements a <textarea> native component that allows setting `value`, and
|
|
34
|
+
* `defaultValue`. This differs from the traditional DOM API because value is
|
|
35
|
+
* usually set as PCDATA children.
|
|
36
|
+
*
|
|
37
|
+
* If `value` is not supplied (or null/undefined), user actions that affect the
|
|
38
|
+
* value will trigger updates to the element.
|
|
39
|
+
*
|
|
40
|
+
* If `value` is supplied (and not null/undefined), the rendered element will
|
|
41
|
+
* not trigger updates to the element. Instead, the `value` prop must change in
|
|
42
|
+
* order for the rendered element to be updated.
|
|
43
|
+
*
|
|
44
|
+
* The rendered element will be initialized with an empty value, the prop
|
|
45
|
+
* `defaultValue` if specified, or the children content (deprecated).
|
|
46
|
+
*/
|
|
47
|
+
var ReactDOMTextarea = ReactCompositeComponent.createClass({
|
|
48
|
+
mixins: [LinkedValueMixin],
|
|
49
|
+
|
|
50
|
+
getInitialState: function() {
|
|
51
|
+
var defaultValue = this.props.defaultValue;
|
|
52
|
+
// TODO (yungsters): Remove support for children content in <textarea>.
|
|
53
|
+
var children = this.props.children;
|
|
54
|
+
if (children != null) {
|
|
55
|
+
if ("production" !== process.env.NODE_ENV) {
|
|
56
|
+
console.warn(
|
|
57
|
+
'Use the `defaultValue` or `value` props instead of setting ' +
|
|
58
|
+
'children on <textarea>.'
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
("production" !== process.env.NODE_ENV ? invariant(
|
|
62
|
+
defaultValue == null,
|
|
63
|
+
'If you supply `defaultValue` on a <textarea>, do not pass children.'
|
|
64
|
+
) : invariant(defaultValue == null));
|
|
65
|
+
if (Array.isArray(children)) {
|
|
66
|
+
("production" !== process.env.NODE_ENV ? invariant(
|
|
67
|
+
children.length <= 1,
|
|
68
|
+
'<textarea> can only have at most one child.'
|
|
69
|
+
) : invariant(children.length <= 1));
|
|
70
|
+
children = children[0];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
defaultValue = '' + children;
|
|
74
|
+
}
|
|
75
|
+
if (defaultValue == null) {
|
|
76
|
+
defaultValue = '';
|
|
77
|
+
}
|
|
78
|
+
var value = this.getValue();
|
|
79
|
+
return {
|
|
80
|
+
// We save the initial value so that `ReactDOMComponent` doesn't update
|
|
81
|
+
// `textContent` (unnecessary since we update value).
|
|
82
|
+
// The initial value can be a boolean or object so that's why it's
|
|
83
|
+
// forced to be a string.
|
|
84
|
+
initialValue: '' + (value != null ? value : defaultValue),
|
|
85
|
+
value: defaultValue
|
|
86
|
+
};
|
|
87
|
+
},
|
|
88
|
+
|
|
89
|
+
shouldComponentUpdate: function() {
|
|
90
|
+
// Defer any updates to this component during the `onChange` handler.
|
|
91
|
+
return !this._isChanging;
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
render: function() {
|
|
95
|
+
// Clone `this.props` so we don't mutate the input.
|
|
96
|
+
var props = merge(this.props);
|
|
97
|
+
var value = this.getValue();
|
|
98
|
+
|
|
99
|
+
("production" !== process.env.NODE_ENV ? invariant(
|
|
100
|
+
props.dangerouslySetInnerHTML == null,
|
|
101
|
+
'`dangerouslySetInnerHTML` does not make sense on <textarea>.'
|
|
102
|
+
) : invariant(props.dangerouslySetInnerHTML == null));
|
|
103
|
+
|
|
104
|
+
props.defaultValue = null;
|
|
105
|
+
props.value = value != null ? value : this.state.value;
|
|
106
|
+
props.onChange = this._handleChange;
|
|
107
|
+
|
|
108
|
+
// Always set children to the same thing. In IE9, the selection range will
|
|
109
|
+
// get reset if `textContent` is mutated.
|
|
110
|
+
return textarea(props, this.state.initialValue);
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
componentDidUpdate: function(prevProps, prevState, rootNode) {
|
|
114
|
+
var value = this.getValue();
|
|
115
|
+
if (value != null) {
|
|
116
|
+
// Cast `value` to a string to ensure the value is set correctly. While
|
|
117
|
+
// browsers typically do this as necessary, jsdom doesn't.
|
|
118
|
+
DOMPropertyOperations.setValueForProperty(rootNode, 'value', '' + value);
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
|
|
122
|
+
_handleChange: function(event) {
|
|
123
|
+
var returnValue;
|
|
124
|
+
var onChange = this.getOnChange();
|
|
125
|
+
if (onChange) {
|
|
126
|
+
this._isChanging = true;
|
|
127
|
+
returnValue = onChange(event);
|
|
128
|
+
this._isChanging = false;
|
|
129
|
+
}
|
|
130
|
+
this.setState({value: event.target.value});
|
|
131
|
+
return returnValue;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
module.exports = ReactDOMTextarea;
|
|
@@ -0,0 +1,75 @@
|
|
|
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 ReactDefaultBatchingStrategy
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
"use strict";
|
|
20
|
+
|
|
21
|
+
var ReactUpdates = require("./ReactUpdates");
|
|
22
|
+
var Transaction = require("./Transaction");
|
|
23
|
+
|
|
24
|
+
var emptyFunction = require("./emptyFunction");
|
|
25
|
+
var mixInto = require("./mixInto");
|
|
26
|
+
|
|
27
|
+
var RESET_BATCHED_UPDATES = {
|
|
28
|
+
initialize: emptyFunction,
|
|
29
|
+
close: function() {
|
|
30
|
+
ReactDefaultBatchingStrategy.isBatchingUpdates = false;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
var FLUSH_BATCHED_UPDATES = {
|
|
35
|
+
initialize: emptyFunction,
|
|
36
|
+
close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates)
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES, RESET_BATCHED_UPDATES];
|
|
40
|
+
|
|
41
|
+
function ReactDefaultBatchingStrategyTransaction() {
|
|
42
|
+
this.reinitializeTransaction();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
mixInto(ReactDefaultBatchingStrategyTransaction, Transaction.Mixin);
|
|
46
|
+
mixInto(ReactDefaultBatchingStrategyTransaction, {
|
|
47
|
+
getTransactionWrappers: function() {
|
|
48
|
+
return TRANSACTION_WRAPPERS;
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
var transaction = new ReactDefaultBatchingStrategyTransaction();
|
|
53
|
+
|
|
54
|
+
var ReactDefaultBatchingStrategy = {
|
|
55
|
+
isBatchingUpdates: false,
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Call the provided function in a context within which calls to `setState`
|
|
59
|
+
* and friends are batched such that components aren't updated unnecessarily.
|
|
60
|
+
*/
|
|
61
|
+
batchedUpdates: function(callback, param) {
|
|
62
|
+
var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates;
|
|
63
|
+
|
|
64
|
+
ReactDefaultBatchingStrategy.isBatchingUpdates = true;
|
|
65
|
+
|
|
66
|
+
// The code is written this way to avoid extra allocations
|
|
67
|
+
if (alreadyBatchingUpdates) {
|
|
68
|
+
callback(param);
|
|
69
|
+
} else {
|
|
70
|
+
transaction.perform(callback, null, param);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
module.exports = ReactDefaultBatchingStrategy;
|
|
@@ -0,0 +1,91 @@
|
|
|
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 ReactDefaultInjection
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
"use strict";
|
|
20
|
+
|
|
21
|
+
var ReactDOM = require("./ReactDOM");
|
|
22
|
+
var ReactDOMButton = require("./ReactDOMButton");
|
|
23
|
+
var ReactDOMForm = require("./ReactDOMForm");
|
|
24
|
+
var ReactDOMInput = require("./ReactDOMInput");
|
|
25
|
+
var ReactDOMOption = require("./ReactDOMOption");
|
|
26
|
+
var ReactDOMSelect = require("./ReactDOMSelect");
|
|
27
|
+
var ReactDOMTextarea = require("./ReactDOMTextarea");
|
|
28
|
+
var ReactEventEmitter = require("./ReactEventEmitter");
|
|
29
|
+
var ReactEventTopLevelCallback = require("./ReactEventTopLevelCallback");
|
|
30
|
+
var ReactPerf = require("./ReactPerf");
|
|
31
|
+
|
|
32
|
+
var DefaultDOMPropertyConfig = require("./DefaultDOMPropertyConfig");
|
|
33
|
+
var DOMProperty = require("./DOMProperty");
|
|
34
|
+
|
|
35
|
+
var ChangeEventPlugin = require("./ChangeEventPlugin");
|
|
36
|
+
var CompositionEventPlugin = require("./CompositionEventPlugin");
|
|
37
|
+
var DefaultEventPluginOrder = require("./DefaultEventPluginOrder");
|
|
38
|
+
var EnterLeaveEventPlugin = require("./EnterLeaveEventPlugin");
|
|
39
|
+
var EventPluginHub = require("./EventPluginHub");
|
|
40
|
+
var MobileSafariClickEventPlugin = require("./MobileSafariClickEventPlugin");
|
|
41
|
+
var ReactInstanceHandles = require("./ReactInstanceHandles");
|
|
42
|
+
var SelectEventPlugin = require("./SelectEventPlugin");
|
|
43
|
+
var SimpleEventPlugin = require("./SimpleEventPlugin");
|
|
44
|
+
|
|
45
|
+
var ReactDefaultBatchingStrategy = require("./ReactDefaultBatchingStrategy");
|
|
46
|
+
var ReactUpdates = require("./ReactUpdates");
|
|
47
|
+
|
|
48
|
+
function inject() {
|
|
49
|
+
ReactEventEmitter.TopLevelCallbackCreator = ReactEventTopLevelCallback;
|
|
50
|
+
/**
|
|
51
|
+
* Inject module for resolving DOM hierarchy and plugin ordering.
|
|
52
|
+
*/
|
|
53
|
+
EventPluginHub.injection.injectEventPluginOrder(DefaultEventPluginOrder);
|
|
54
|
+
EventPluginHub.injection.injectInstanceHandle(ReactInstanceHandles);
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Some important event plugins included by default (without having to require
|
|
58
|
+
* them).
|
|
59
|
+
*/
|
|
60
|
+
EventPluginHub.injection.injectEventPluginsByName({
|
|
61
|
+
SimpleEventPlugin: SimpleEventPlugin,
|
|
62
|
+
EnterLeaveEventPlugin: EnterLeaveEventPlugin,
|
|
63
|
+
ChangeEventPlugin: ChangeEventPlugin,
|
|
64
|
+
CompositionEventPlugin: CompositionEventPlugin,
|
|
65
|
+
MobileSafariClickEventPlugin: MobileSafariClickEventPlugin,
|
|
66
|
+
SelectEventPlugin: SelectEventPlugin
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
ReactDOM.injection.injectComponentClasses({
|
|
70
|
+
button: ReactDOMButton,
|
|
71
|
+
form: ReactDOMForm,
|
|
72
|
+
input: ReactDOMInput,
|
|
73
|
+
option: ReactDOMOption,
|
|
74
|
+
select: ReactDOMSelect,
|
|
75
|
+
textarea: ReactDOMTextarea
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
DOMProperty.injection.injectDOMPropertyConfig(DefaultDOMPropertyConfig);
|
|
79
|
+
|
|
80
|
+
if ("production" !== process.env.NODE_ENV) {
|
|
81
|
+
ReactPerf.injection.injectMeasure(require("./ReactDefaultPerf").measure);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
ReactUpdates.injection.injectBatchingStrategy(
|
|
85
|
+
ReactDefaultBatchingStrategy
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
module.exports = {
|
|
90
|
+
inject: inject
|
|
91
|
+
};
|