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

View File

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

View File

@ -71,6 +71,7 @@ void UIManagerBinding::dispatchEvent(
SystraceSection s("UIManagerBinding::dispatchEvent");
auto eventTargetValue = jsi::Value::null();
folly::dynamic extendedPayload;
if (eventTarget) {
auto &eventTargetWrapper =
@ -79,6 +80,13 @@ void UIManagerBinding::dispatchEvent(
if (eventTargetValue.isUndefined()) {
return;
}
// Mixing `target` into `payload`.
assert(payload.isObject());
extendedPayload = folly::dynamic::object("target", eventTargetWrapper.tag);
extendedPayload.merge_patch(payload);
} else {
extendedPayload = payload;
}
auto &eventHandlerWrapper =
@ -87,7 +95,7 @@ void UIManagerBinding::dispatchEvent(
runtime,
{std::move(eventTargetValue),
jsi::String::createFromUtf8(runtime, type),
jsi::valueFromDynamic(runtime, payload)});
jsi::valueFromDynamic(runtime, extendedPayload)});
}
void UIManagerBinding::invalidate() const {
@ -119,7 +127,7 @@ jsi::Value UIManagerBinding::get(
componentNameFromValue(runtime, arguments[1]),
surfaceIdFromValue(runtime, arguments[2]),
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 {
EventTargetWrapper(jsi::WeakObject instanceHandle)
: instanceHandle(std::move(instanceHandle)) {}
EventTargetWrapper(jsi::WeakObject instanceHandle, Tag tag)
: instanceHandle(std::move(instanceHandle)), tag(tag) {}
mutable jsi::WeakObject instanceHandle;
mutable Tag tag;
};
struct EventHandlerWrapper : public EventHandler {
@ -97,9 +98,11 @@ inline static RawProps rawPropsFromValue(
inline static SharedEventTarget eventTargetFromValue(
jsi::Runtime &runtime,
const jsi::Value &value) {
const jsi::Value &eventTargetValue,
const jsi::Value &tagValue) {
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) {