Files
react-native/ReactCommon/react/renderer/core/EventQueueProcessor.cpp
T
Samuel Susla 2016460528 Pass event priority to React
Summary:
Changelog: [internal]

This is a mechanism that will guess event's React priority based on other events ongoing on the platform.

If an event happens within span of ContinuousStart -> ContinuousEnd and its category is unspecified, we deduce it's React priority to be default. All other events are discrete.

Special case: `onScroll`, which is always treated as "Default".

Reviewed By: JoshuaGross

Differential Revision: D28485060

fbshipit-source-id: d2eae63dbcf03271dfed97128a1590dd165a3ce2
2021-05-25 01:16:04 -07:00

83 lines
2.1 KiB
C++

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "EventQueue.h"
#include "EventEmitter.h"
#include "ShadowNodeFamily.h"
namespace facebook {
namespace react {
EventQueueProcessor::EventQueueProcessor(
EventPipe eventPipe,
StatePipe statePipe)
: eventPipe_(std::move(eventPipe)), statePipe_(std::move(statePipe)) {}
void EventQueueProcessor::flushEvents(
jsi::Runtime &runtime,
std::vector<RawEvent> &&events) const {
{
std::lock_guard<std::mutex> lock(EventEmitter::DispatchMutex());
for (const auto &event : events) {
if (event.eventTarget) {
event.eventTarget->retain(runtime);
}
}
}
for (auto const &event : events) {
if (event.category == RawEvent::Category::ContinuousEnd) {
hasContinuousEventStarted_ = false;
}
auto reactPriority = hasContinuousEventStarted_
? ReactEventPriority::Default
: ReactEventPriority::Discrete;
if (event.category == RawEvent::Category::Continuous) {
reactPriority = ReactEventPriority::Default;
}
if (event.category == RawEvent::Category::Discrete) {
reactPriority = ReactEventPriority::Discrete;
}
eventPipe_(
runtime,
event.eventTarget.get(),
event.type,
reactPriority,
event.payloadFactory);
if (event.category == RawEvent::Category::ContinuousStart) {
hasContinuousEventStarted_ = true;
}
}
// No need to lock `EventEmitter::DispatchMutex()` here.
// The mutex protects from a situation when the `instanceHandle` can be
// deallocated during accessing, but that's impossible at this point because
// we have a strong pointer to it.
for (const auto &event : events) {
if (event.eventTarget) {
event.eventTarget->release(runtime);
}
}
}
void EventQueueProcessor::flushStateUpdates(
std::vector<StateUpdate> &&states) const {
for (const auto &stateUpdate : states) {
statePipe_(stateUpdate);
}
}
} // namespace react
} // namespace facebook