* @param {string} topLevelType Record from `EventConstants`. * @param {DOMEventTarget} topLevelTarget The listening component root node. * @param {string} topLevelTargetID ID of `topLevelTarget`. * @param {object} nativeEvent Native browser event. * @return {?object} A SyntheticCompositionEvent.
(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget)
| 265 | * @return {?object} A SyntheticCompositionEvent. |
| 266 | */ |
| 267 | function extractCompositionEvent(topLevelType, topLevelTarget, topLevelTargetID, nativeEvent, nativeEventTarget) { |
| 268 | var eventType; |
| 269 | var fallbackData; |
| 270 | |
| 271 | if (canUseCompositionEvent) { |
| 272 | eventType = getCompositionEventType(topLevelType); |
| 273 | } else if (!currentComposition) { |
| 274 | if (isFallbackCompositionStart(topLevelType, nativeEvent)) { |
| 275 | eventType = eventTypes.compositionStart; |
| 276 | } |
| 277 | } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) { |
| 278 | eventType = eventTypes.compositionEnd; |
| 279 | } |
| 280 | |
| 281 | if (!eventType) { |
| 282 | return null; |
| 283 | } |
| 284 | |
| 285 | if (useFallbackCompositionData) { |
| 286 | // The current composition is stored statically and must not be |
| 287 | // overwritten while composition continues. |
| 288 | if (!currentComposition && eventType === eventTypes.compositionStart) { |
| 289 | currentComposition = FallbackCompositionState.getPooled(topLevelTarget); |
| 290 | } else if (eventType === eventTypes.compositionEnd) { |
| 291 | if (currentComposition) { |
| 292 | fallbackData = currentComposition.getData(); |
| 293 | } |
| 294 | } |
| 295 | } |
| 296 | |
| 297 | var event = SyntheticCompositionEvent.getPooled(eventType, topLevelTargetID, nativeEvent, nativeEventTarget); |
| 298 | |
| 299 | if (fallbackData) { |
| 300 | // Inject data generated from fallback path into the synthetic event. |
| 301 | // This matches the property of native CompositionEventInterface. |
| 302 | event.data = fallbackData; |
| 303 | } else { |
| 304 | var customData = getDataFromCustomEvent(nativeEvent); |
| 305 | if (customData !== null) { |
| 306 | event.data = customData; |
| 307 | } |
| 308 | } |
| 309 | |
| 310 | EventPropagators.accumulateTwoPhaseDispatches(event); |
| 311 | return event; |
| 312 | } |
| 313 | |
| 314 | /** |
| 315 | * @param {string} topLevelType Record from `EventConstants`. |
no test coverage detected