Fabric: Coupling Tag inside TargetEventEmitter

Summary: Now instead of passing `reactTag` through the whole event pipeline, we store it inside `EventTargetWrapper` (and it does not leave `UIManagerBinding`). It helps with reducing the complexity of `EventEmitter` and will help us in migrating to JSI.

Reviewed By: sahrens

Differential Revision: D13123045

fbshipit-source-id: aa9ee94d5660ff3090369c1e55cf748d2e72b987
This commit is contained in:
Valentin Shergin 2018-11-27 20:58:28 -08:00 committed by Facebook Github Bot
parent 106de1201b
commit f4da8769a3
4 changed files with 19 additions and 15 deletions

View File

@ -40,7 +40,6 @@ EventEmitter::EventEmitter(
WeakEventDispatcher eventDispatcher) WeakEventDispatcher eventDispatcher)
: eventTarget_(std::move(eventTarget)), : eventTarget_(std::move(eventTarget)),
weakEventTarget_({}), weakEventTarget_({}),
tag_(tag),
eventDispatcher_(std::move(eventDispatcher)) {} eventDispatcher_(std::move(eventDispatcher)) {}
void EventEmitter::dispatchEvent( void EventEmitter::dispatchEvent(
@ -48,19 +47,14 @@ void EventEmitter::dispatchEvent(
const folly::dynamic &payload, const folly::dynamic &payload,
const EventPriority &priority) const { const EventPriority &priority) const {
SystraceSection s("EventEmitter::dispatchEvent"); SystraceSection s("EventEmitter::dispatchEvent");
auto eventDispatcher = eventDispatcher_.lock(); auto eventDispatcher = eventDispatcher_.lock();
if (!eventDispatcher) { if (!eventDispatcher) {
return; return;
} }
// Mixing `target` into `payload`.
assert(payload.isObject());
folly::dynamic extendedPayload = folly::dynamic::object("target", tag_);
extendedPayload.merge_patch(payload);
eventDispatcher->dispatchEvent( eventDispatcher->dispatchEvent(
RawEvent(normalizeEventType(type), extendedPayload, eventTarget_), RawEvent(normalizeEventType(type), payload, eventTarget_), priority);
priority);
} }
void EventEmitter::enable() const { void EventEmitter::enable() const {

View File

@ -84,7 +84,6 @@ class EventEmitter {
mutable SharedEventTarget eventTarget_; mutable SharedEventTarget eventTarget_;
mutable WeakEventTarget weakEventTarget_; mutable WeakEventTarget weakEventTarget_;
Tag tag_;
WeakEventDispatcher eventDispatcher_; WeakEventDispatcher eventDispatcher_;
mutable int enableCounter_{0}; mutable int enableCounter_{0};
}; };

View File

@ -71,6 +71,7 @@ void UIManagerBinding::dispatchEvent(
SystraceSection s("UIManagerBinding::dispatchEvent"); SystraceSection s("UIManagerBinding::dispatchEvent");
auto eventTargetValue = jsi::Value::null(); auto eventTargetValue = jsi::Value::null();
folly::dynamic extendedPayload;
if (eventTarget) { if (eventTarget) {
auto &eventTargetWrapper = auto &eventTargetWrapper =
@ -79,6 +80,13 @@ void UIManagerBinding::dispatchEvent(
if (eventTargetValue.isUndefined()) { if (eventTargetValue.isUndefined()) {
return; return;
} }
// Mixing `target` into `payload`.
assert(payload.isObject());
extendedPayload = folly::dynamic::object("target", eventTargetWrapper.tag);
extendedPayload.merge_patch(payload);
} else {
extendedPayload = payload;
} }
auto &eventHandlerWrapper = auto &eventHandlerWrapper =
@ -87,7 +95,7 @@ void UIManagerBinding::dispatchEvent(
runtime, runtime,
{std::move(eventTargetValue), {std::move(eventTargetValue),
jsi::String::createFromUtf8(runtime, type), jsi::String::createFromUtf8(runtime, type),
jsi::valueFromDynamic(runtime, payload)}); jsi::valueFromDynamic(runtime, extendedPayload)});
} }
void UIManagerBinding::invalidate() const { void UIManagerBinding::invalidate() const {
@ -119,7 +127,7 @@ jsi::Value UIManagerBinding::get(
componentNameFromValue(runtime, arguments[1]), componentNameFromValue(runtime, arguments[1]),
surfaceIdFromValue(runtime, arguments[2]), surfaceIdFromValue(runtime, arguments[2]),
rawPropsFromValue(runtime, arguments[3]), rawPropsFromValue(runtime, arguments[3]),
eventTargetFromValue(runtime, arguments[4]))); eventTargetFromValue(runtime, arguments[4], arguments[0])));
}); });
} }

View File

@ -31,10 +31,11 @@ inline RawProps rawPropsFromDynamic(const folly::dynamic object) noexcept {
} }
struct EventTargetWrapper : public EventTarget { struct EventTargetWrapper : public EventTarget {
EventTargetWrapper(jsi::WeakObject instanceHandle) EventTargetWrapper(jsi::WeakObject instanceHandle, Tag tag)
: instanceHandle(std::move(instanceHandle)) {} : instanceHandle(std::move(instanceHandle)), tag(tag) {}
mutable jsi::WeakObject instanceHandle; mutable jsi::WeakObject instanceHandle;
mutable Tag tag;
}; };
struct EventHandlerWrapper : public EventHandler { struct EventHandlerWrapper : public EventHandler {
@ -97,9 +98,11 @@ inline static RawProps rawPropsFromValue(
inline static SharedEventTarget eventTargetFromValue( inline static SharedEventTarget eventTargetFromValue(
jsi::Runtime &runtime, jsi::Runtime &runtime,
const jsi::Value &value) { const jsi::Value &eventTargetValue,
const jsi::Value &tagValue) {
return std::make_shared<EventTargetWrapper>( return std::make_shared<EventTargetWrapper>(
jsi::WeakObject(runtime, value.getObject(runtime))); jsi::WeakObject(runtime, eventTargetValue.getObject(runtime)),
tagValue.getNumber());
} }
inline static Tag tagFromValue(jsi::Runtime &runtime, const jsi::Value &value) { inline static Tag tagFromValue(jsi::Runtime &runtime, const jsi::Value &value) {