feat(dom): remove event node

This commit is contained in:
charleeshen
2022-07-07 19:00:38 +08:00
committed by ilikethese
parent b647356535
commit debda05719
12 changed files with 64 additions and 141 deletions
-1
View File
@@ -80,7 +80,6 @@ set(SOURCE_SET
src/dom/dom_listener.cc
src/dom/dom_manager.cc
src/dom/dom_node.cc
src/dom/event_node.cc
src/dom/layer_optimized_render_manager.cc
src/dom/layout_node.cc
src/dom/root_node.cc
+3 -16
View File
@@ -25,14 +25,12 @@
#include <string>
#include "dom/dom_event.h"
#include "dom/event_node.h"
#include "footstone/hippy_value.h"
namespace hippy {
inline namespace dom {
class DomNode;
class EventNode;
enum class EventPhase: uint8_t {
kNone = 0,
@@ -83,21 +81,12 @@ class DomEvent {
inline std::weak_ptr<DomNode> GetCurrentTarget() {
return current_target_;
}
inline void SetTarget(std::weak_ptr<DomNode> target) {
target_ = target;
}
inline std::weak_ptr<DomNode> GetTarget() {
return target_;
}
inline void SetTargetEventNode(std::shared_ptr<EventNode> target) {
target_event_node_ = target;
}
inline std::shared_ptr<EventNode> GetTargetEventNode() {
return target_event_node_;
}
inline void SetCurrentEventNode(std::shared_ptr<EventNode> current) {
current_event_node_ = current;
}
inline std::shared_ptr<EventNode> GetCurrentEventNode() {
return current_event_node_;
}
inline std::string GetType() {
return type_;
}
@@ -112,8 +101,6 @@ class DomEvent {
std::string type_;
std::weak_ptr<DomNode> target_;
std::weak_ptr<DomNode> current_target_;
std::shared_ptr<EventNode> target_event_node_;
std::shared_ptr<EventNode> current_event_node_;
bool prevent_capture_;
bool prevent_bubble_;
bool can_capture_;
-1
View File
@@ -49,7 +49,6 @@ class RenderManager;
class RootNode;
class LayerOptimizedRenderManager;
class DomEvent;
class EventNode;
struct DomInfo;
using EventCallback = std::function<void(const std::shared_ptr<DomEvent>&)>;
-41
View File
@@ -1,41 +0,0 @@
#pragma once
#include <stdint.h>
#include "dom/dom_node.h"
namespace hippy {
inline namespace dom {
struct DomEventListenerInfo;
class EventNode {
public:
EventNode(uint32_t id, uint32_t pid);
virtual ~EventNode() = default;
EventNode(const EventNode& node) = delete;
EventNode(EventNode&& node) = delete;
EventNode& operator=(const EventNode& node) = delete;
EventNode& operator=(EventNode&& node) = delete;
void SetId(uint32_t id) { id_ = id; }
uint32_t GetId() { return id_; }
void SetPid(uint32_t pid) { pid_ = pid; }
uint32_t GetPid() { return pid_; }
void SetCaptureListeners(const std::vector<std::shared_ptr<DomEventListenerInfo>> listeners);
std::vector<DomEventListenerInfo> GetCaptureListeners() { return capture_listeners_; }
void SetBubbleListeners(const std::vector<std::shared_ptr<DomEventListenerInfo>> listeners);
std::vector<DomEventListenerInfo> GetBubbleListeners() { return bubble_listeners_; }
private:
uint32_t id_;
uint32_t pid_;
std::vector<DomEventListenerInfo> capture_listeners_;
std::vector<DomEventListenerInfo> bubble_listeners_;
};
} // namespace dom
} // namespace hippy
+2 -3
View File
@@ -23,7 +23,6 @@
#include <stack>
#include "dom/dom_node.h"
#include "dom/event_node.h"
#include "footstone/task_runner.h"
namespace hippy {
@@ -69,8 +68,8 @@ class RootNode : public DomNode {
void AddInterceptor(const std::shared_ptr<DomActionInterceptor>& interceptor);
// event traverse for js
static void EventTraverse(const std::shared_ptr<DomEvent>& event, const std::shared_ptr<EventNode>& node,
std::stack<std::shared_ptr<EventNode>>& capture_nodes);
static void EventTraverse(const std::shared_ptr<DomEvent>& event, const std::shared_ptr<DomNode>& node,
std::stack<std::shared_ptr<DomNode>>& capture_nodes);
// event traverse for vl
static void EventTraverse(const std::shared_ptr<DomEvent>& event);
-2
View File
@@ -183,8 +183,6 @@ void DomNode::SetLayoutOrigin(float x, float y) {
void DomNode::AddEventListener(const std::string& name, uint64_t listener_id, bool use_capture,
const EventCallback& cb) {
current_callback_id_ += 1;
FOOTSTONE_DCHECK(current_callback_id_ <= std::numeric_limits<uint32_t>::max());
if (!event_listener_map_) {
event_listener_map_ = std::make_shared<
std::unordered_map<std::string, std::array<std::vector<std::shared_ptr<DomEventListenerInfo>>, 2>>>();
-25
View File
@@ -1,25 +0,0 @@
#include "dom/event_node.h"
namespace hippy {
inline namespace dom {
EventNode::EventNode(uint32_t id, uint32_t pid) : id_(id), pid_(pid) {}
void EventNode::SetCaptureListeners(const std::vector<std::shared_ptr<DomEventListenerInfo>> listeners) {
for (const auto& listener : listeners) {
FOOTSTONE_DCHECK(listener != nullptr);
DomEventListenerInfo info = DomEventListenerInfo(listener->id, listener->cb);
capture_listeners_.push_back(info);
}
}
void EventNode::SetBubbleListeners(const std::vector<std::shared_ptr<DomEventListenerInfo>> listeners) {
for (const auto& listener : listeners) {
FOOTSTONE_DCHECK(listener != nullptr);
DomEventListenerInfo info = DomEventListenerInfo(listener->id, listener->cb);
bubble_listeners_.push_back(info);
}
}
} // namespace dom
} // namespace hippy
+17 -18
View File
@@ -4,7 +4,6 @@
#include "dom/animation/animation_manager.h"
#include "dom/diff_utils.h"
#include "dom/event_node.h"
#include "dom/render_manager.h"
#include "footstone/deserializer.h"
#include "footstone/hippy_value.h"
@@ -224,43 +223,43 @@ void RootNode::RemoveEvent(uint32_t id, const std::string& event_name) {
void RootNode::HandleEvent(const std::shared_ptr<DomEvent>& event) { RootNode::RunEventCallbackRunner(event); }
void RootNode::EventTraverse(const std::shared_ptr<DomEvent>& event, const std::shared_ptr<EventNode>& node,
std::stack<std::shared_ptr<EventNode>>& capture_nodes) {
void RootNode::EventTraverse(const std::shared_ptr<DomEvent>& event, const std::shared_ptr<DomNode>& node,
std::stack<std::shared_ptr<DomNode>>& capture_nodes) {
FOOTSTONE_DCHECK(node != nullptr);
FOOTSTONE_DCHECK(event != nullptr);
if (node == nullptr || event == nullptr) return;
auto event_name = event->GetType();
event->SetTargetEventNode(node);
event->SetTarget(node);
// 捕获列表反过来就是冒泡列表,不需要额外遍历生成
// 执行捕获流程
std::stack<std::shared_ptr<EventNode>> bubble_nodes = {};
std::stack<std::shared_ptr<DomNode>> bubble_nodes = {};
while (!capture_nodes.empty()) {
auto capture_node = capture_nodes.top();
capture_nodes.pop();
event->SetCurrentEventNode(capture_node); // 设置当前节点,cb里会用到
auto capture_listeners = capture_node->GetCaptureListeners();
event->SetCurrentTarget(capture_node); // 设置当前节点,cb里会用到
auto capture_listeners = capture_node->GetEventListener(event_name, true);
for (const auto& listener : capture_listeners) {
event->SetEventPhase(EventPhase::kCapturePhase);
listener.cb(event); // StopPropagation并不会影响同级的回调调用
listener->cb(event); // StopPropagation并不会影响同级的回调调用
}
if (event->IsPreventCapture()) { // cb 内部调用了 event.StopPropagation 会阻止捕获
return; // 捕获流中StopPropagation不仅会导致捕获流程结束,后面的目标事件和冒泡都会终止
}
bubble_nodes.push(capture_node);
bubble_nodes.push(std::move(capture_node));
}
// 执行本身节点回调
if (node == nullptr) return;
event->SetCurrentEventNode(node);
for (const auto& listener : node->GetCaptureListeners()) {
event->SetCurrentTarget(node);
for (const auto& listener : node->GetEventListener(event_name, false)) {
event->SetEventPhase(EventPhase::kAtTarget);
listener.cb(event);
listener->cb(event);
}
if (event->IsPreventCapture()) {
return;
}
for (const auto& listener : node->GetBubbleListeners()) {
for (const auto& listener : node->GetEventListener(event_name, false)) {
event->SetEventPhase(EventPhase::kAtTarget);
listener.cb(event);
listener->cb(event);
}
if (event->IsPreventBubble()) {
return;
@@ -270,11 +269,11 @@ void RootNode::EventTraverse(const std::shared_ptr<DomEvent>& event, const std::
while (!bubble_nodes.empty()) {
auto bubble_node = bubble_nodes.top();
bubble_nodes.pop();
event->SetCurrentEventNode(bubble_node);
auto listeners = bubble_node->GetBubbleListeners();
event->SetCurrentTarget(bubble_node);
auto listeners = bubble_node->GetEventListener(event_name, false);
for (const auto& listener : listeners) {
event->SetEventPhase(EventPhase::kBubblePhase);
listener.cb(event);
listener->cb(event);
}
if (event->IsPreventBubble()) {
break;
-1
View File
@@ -41,7 +41,6 @@
#include "footstone/hippy_value.h"
#include "dom/root_node.h"
#include "dom/dom_node.h"
#include "dom/event_node.h"
#ifdef ENABLE_INSPECTOR
#include "devtools/devtools_data_source.h"
#endif
+20 -16
View File
@@ -94,13 +94,14 @@ std::shared_ptr<InstanceDefine<DomEvent>> MakeEventInstanceDefine(
scope->GetContext()->ThrowException(footstone::stringview::unicode_string_view("nullptr event pointer"));
return nullptr;
}
auto event_node = event->GetTargetEventNode();
FOOTSTONE_DCHECK(event_node != nullptr);
if (!event_node) {
auto weak_node = event->GetTarget();
auto dom_node = weak_node.lock();
FOOTSTONE_DCHECK(dom_node != nullptr);
if (!dom_node) {
scope->GetContext()->ThrowException(footstone::stringview::unicode_string_view("nullptr event node pointer"));
return nullptr;
}
uint32_t id = event_node->GetId();
uint32_t id = dom_node->GetId();
std::shared_ptr<CtxValue> ctx_value = scope->GetContext()->CreateNumber(id);
return ctx_value;
};
@@ -118,13 +119,14 @@ std::shared_ptr<InstanceDefine<DomEvent>> MakeEventInstanceDefine(
scope->GetContext()->ThrowException(footstone::stringview::unicode_string_view("nullptr event pointer"));
return nullptr;
}
auto event_node = event->GetCurrentEventNode();
FOOTSTONE_DCHECK(event_node != nullptr);
if (!event_node) {
auto weak_node = event->GetCurrentTarget();
auto dom_node = weak_node.lock();
FOOTSTONE_DCHECK(dom_node != nullptr);
if (!dom_node) {
scope->GetContext()->ThrowException(footstone::stringview::unicode_string_view("nullptr event node pointer"));
return nullptr;
}
uint32_t current_id = event_node->GetId();
uint32_t current_id = dom_node->GetId();
std::shared_ptr<CtxValue> ctx_value = scope->GetContext()->CreateNumber(current_id);
return ctx_value;
};
@@ -142,13 +144,14 @@ std::shared_ptr<InstanceDefine<DomEvent>> MakeEventInstanceDefine(
scope->GetContext()->ThrowException(footstone::stringview::unicode_string_view("nullptr event pointer"));
return nullptr;
}
auto event_node = event->GetTargetEventNode();
FOOTSTONE_DCHECK(event_node != nullptr);
if (!event_node) {
auto weak_node = event->GetTarget();
auto dom_node = weak_node.lock();
FOOTSTONE_DCHECK(dom_node != nullptr);
if (!dom_node) {
scope->GetContext()->ThrowException(footstone::stringview::unicode_string_view("nullptr event node pointer"));
return nullptr;
}
uint32_t target_id = event_node->GetId();
uint32_t target_id = dom_node->GetId();
std::shared_ptr<CtxValue> ctx_value = scope->GetContext()->CreateNumber(target_id);
return ctx_value;
};
@@ -166,13 +169,14 @@ std::shared_ptr<InstanceDefine<DomEvent>> MakeEventInstanceDefine(
scope->GetContext()->ThrowException(footstone::stringview::unicode_string_view("nullptr event pointer"));
return nullptr;
}
auto event_node = event->GetCurrentEventNode();
FOOTSTONE_DCHECK(event_node != nullptr);
if (!event_node) {
auto weak_node = event->GetCurrentTarget();
auto dom_node = weak_node.lock();
FOOTSTONE_DCHECK(dom_node != nullptr);
if (!dom_node) {
scope->GetContext()->ThrowException(footstone::stringview::unicode_string_view("nullptr event node pointer"));
return scope->GetContext()->CreateUndefined();
}
uint32_t current_target_id = event_node->GetId();
uint32_t current_target_id = dom_node->GetId();
std::shared_ptr<CtxValue> ctx_value = scope->GetContext()->CreateNumber(current_target_id);
return ctx_value;
};
+22 -11
View File
@@ -33,6 +33,7 @@
#include "footstone/task_runner.h"
#include "core/modules/module_register.h"
#include "core/napi/native_source_code.h"
#include "dom/dom_node.h"
#ifdef JS_V8
#include "core/napi/v8/js_native_api_v8.h"
#endif
@@ -45,7 +46,7 @@ using ModuleClassMap = hippy::napi::ModuleClassMap;
using CtxValue = hippy::napi::CtxValue;
using TryCatch = hippy::napi::TryCatch;
using DomEvent = hippy::dom::DomEvent;
using EventNode = hippy::dom::EventNode;
using DomNode = hippy::dom::DomNode;
constexpr char kDeallocFuncName[] = "HippyDealloc";
@@ -381,31 +382,41 @@ void Scope::LoadInstance(const std::shared_ptr<HippyValue>& value) {
return;
}
std::stack<std::shared_ptr<EventNode>> capture_nodes = {};
std::shared_ptr<EventNode> node = {};
auto event_name = event->GetType();
std::stack<std::shared_ptr<DomNode>> capture_nodes = {};
std::shared_ptr<DomNode> node = {};
// 获取捕获节点
if (event->CanCapture()) {
auto parent = target->GetParent();
while (parent) {
auto capture_node =
std::make_shared<EventNode>(parent->GetId(), parent->GetPid());
auto capture_node = std::make_shared<DomNode>();
capture_node->SetId(parent->GetId());
capture_node->SetPid(parent->GetPid());
auto capture_listeners = parent->GetEventListener(event_name, true);
for(const auto& listener: capture_listeners) {
capture_node->AddEventListener(event_name, listener->id, true, listener->cb);
}
auto bubble_listeners = parent->GetEventListener(event_name, false);
capture_node->SetCaptureListeners(capture_listeners);
capture_node->SetBubbleListeners(bubble_listeners);
for(const auto& listener: capture_listeners) {
capture_node->AddEventListener(event_name, listener->id, true, listener->cb);
}
capture_nodes.push(capture_node);
parent = parent->GetParent();
}
}
// 当前节点
node = std::make_shared<EventNode>(target->GetId(), target->GetPid());
node = std::make_shared<DomNode>();
node->SetId(target->GetId());
node->SetPid(target->GetPid());
auto capture_listeners = target->GetEventListener(event_name, true);
for(const auto& listener: capture_listeners) {
node->AddEventListener(event_name, listener->id, true, listener->cb);
}
auto bubble_listeners = target->GetEventListener(event_name, false);
node->SetCaptureListeners(capture_listeners);
node->SetBubbleListeners(bubble_listeners);
for(const auto& listener: bubble_listeners) {
node->AddEventListener(event_name, listener->id, false, listener->cb);
}
auto callback = [event, node, capture_nodes]() mutable { RootNode::EventTraverse(event, node, capture_nodes); };
scope->GetTaskRunner()->PostTask(std::move(callback));
});
@@ -22,7 +22,6 @@
D4B5A081281663F400ABBD9C /* scene.cc in Sources */ = {isa = PBXBuildFile; fileRef = D4B5A07F281663F400ABBD9C /* scene.cc */; };
D4B5A0862816641600ABBD9C /* event_module.cc in Sources */ = {isa = PBXBuildFile; fileRef = D4B5A0842816641600ABBD9C /* event_module.cc */; };
D4B5A0872816641600ABBD9C /* scene_builder.cc in Sources */ = {isa = PBXBuildFile; fileRef = D4B5A0852816641600ABBD9C /* scene_builder.cc */; };
D4EBECD22874232600170AE1 /* event_node.cc in Sources */ = {isa = PBXBuildFile; fileRef = D4EBECD12874232600170AE1 /* event_node.cc */; };
D806C5082872BC3C00E62992 /* repeating_timer.cc in Sources */ = {isa = PBXBuildFile; fileRef = D806C4EF2872BC3B00E62992 /* repeating_timer.cc */; };
D806C5092872BC3C00E62992 /* task.cc in Sources */ = {isa = PBXBuildFile; fileRef = D806C4F02872BC3B00E62992 /* task.cc */; };
D806C50A2872BC3C00E62992 /* thread_worker.cc in Sources */ = {isa = PBXBuildFile; fileRef = D806C4F12872BC3B00E62992 /* thread_worker.cc */; };
@@ -253,8 +252,6 @@
D4B5A0852816641600ABBD9C /* scene_builder.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scene_builder.cc; sourceTree = "<group>"; };
D4B5A0882816642300ABBD9C /* event_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event_module.h; sourceTree = "<group>"; };
D4B5A0892816642300ABBD9C /* scene_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scene_builder.h; sourceTree = "<group>"; };
D4EBECD12874232600170AE1 /* event_node.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = event_node.cc; sourceTree = "<group>"; };
D4EBECD32874233400170AE1 /* event_node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event_node.h; sourceTree = "<group>"; };
D806C4EF2872BC3B00E62992 /* repeating_timer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = repeating_timer.cc; sourceTree = "<group>"; };
D806C4F02872BC3B00E62992 /* task.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = task.cc; sourceTree = "<group>"; };
D806C4F12872BC3B00E62992 /* thread_worker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thread_worker.cc; sourceTree = "<group>"; };
@@ -808,7 +805,6 @@
D84AB8D9273A5AAD00987D03 /* dom */ = {
isa = PBXGroup;
children = (
D4EBECD32874233400170AE1 /* event_node.h */,
D86B3E54284E31D2007E729B /* animation */,
D4B5A0832816640500ABBD9C /* scene_builder.h */,
D4B5A0822816640500ABBD9C /* scene.h */,
@@ -841,7 +837,6 @@
D84AB8E4273A5AAD00987D03 /* dom */ = {
isa = PBXGroup;
children = (
D4EBECD12874232600170AE1 /* event_node.cc */,
D86B3E5A284E31EB007E729B /* animation */,
D42D2C7A2833C84D0079B47B /* dom_listener.cc */,
D4B5A07E281663F400ABBD9C /* scene_builder.cc */,
@@ -2069,7 +2064,6 @@
F468DE6F2812A95200319196 /* HippyJSStackFrame.m in Sources */,
F45D268128067B6900CAB185 /* UIView+DirectionalLayout.mm in Sources */,
D806C5192872BC3C00E62992 /* worker.cc in Sources */,
D4EBECD22874232600170AE1 /* event_node.cc in Sources */,
F468DE692812A95200319196 /* HippyAssert.m in Sources */,
F45D265928067B6900CAB185 /* NativeRenderRefresh.mm in Sources */,
F4C1CE262811439A00CED4C4 /* UIView+Sequence.m in Sources */,