From debda0571904bd58f074badff3e0091ffb1ed4e6 Mon Sep 17 00:00:00 2001 From: charleeshen Date: Thu, 7 Jul 2022 18:04:06 +0800 Subject: [PATCH] feat(dom): remove event node --- dom/CMakeLists.txt | 1 - dom/include/dom/dom_event.h | 19 ++------- dom/include/dom/dom_manager.h | 1 - dom/include/dom/event_node.h | 41 ------------------- dom/include/dom/root_node.h | 5 +-- dom/src/dom/dom_node.cc | 2 - dom/src/dom/event_node.cc | 25 ----------- dom/src/dom/root_node.cc | 35 ++++++++-------- driver/js/core/include/core/scope.h | 1 - driver/js/core/src/modules/event_module.cc | 36 ++++++++-------- driver/js/core/src/scope.cc | 33 ++++++++++----- .../HippyDemo.xcodeproj/project.pbxproj | 6 --- 12 files changed, 64 insertions(+), 141 deletions(-) delete mode 100644 dom/include/dom/event_node.h delete mode 100644 dom/src/dom/event_node.cc diff --git a/dom/CMakeLists.txt b/dom/CMakeLists.txt index 091ac76a9..525d6872d 100644 --- a/dom/CMakeLists.txt +++ b/dom/CMakeLists.txt @@ -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 diff --git a/dom/include/dom/dom_event.h b/dom/include/dom/dom_event.h index ecdd20a19..0c79b8038 100644 --- a/dom/include/dom/dom_event.h +++ b/dom/include/dom/dom_event.h @@ -25,14 +25,12 @@ #include #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 GetCurrentTarget() { return current_target_; } + inline void SetTarget(std::weak_ptr target) { + target_ = target; + } inline std::weak_ptr GetTarget() { return target_; } - inline void SetTargetEventNode(std::shared_ptr target) { - target_event_node_ = target; - } - inline std::shared_ptr GetTargetEventNode() { - return target_event_node_; - } - inline void SetCurrentEventNode(std::shared_ptr current) { - current_event_node_ = current; - } - inline std::shared_ptr GetCurrentEventNode() { - return current_event_node_; - } inline std::string GetType() { return type_; } @@ -112,8 +101,6 @@ class DomEvent { std::string type_; std::weak_ptr target_; std::weak_ptr current_target_; - std::shared_ptr target_event_node_; - std::shared_ptr current_event_node_; bool prevent_capture_; bool prevent_bubble_; bool can_capture_; diff --git a/dom/include/dom/dom_manager.h b/dom/include/dom/dom_manager.h index faa8ceaaf..0c519f5a7 100644 --- a/dom/include/dom/dom_manager.h +++ b/dom/include/dom/dom_manager.h @@ -49,7 +49,6 @@ class RenderManager; class RootNode; class LayerOptimizedRenderManager; class DomEvent; -class EventNode; struct DomInfo; using EventCallback = std::function&)>; diff --git a/dom/include/dom/event_node.h b/dom/include/dom/event_node.h deleted file mode 100644 index fd6f52e99..000000000 --- a/dom/include/dom/event_node.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include -#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> listeners); - std::vector GetCaptureListeners() { return capture_listeners_; } - - void SetBubbleListeners(const std::vector> listeners); - std::vector GetBubbleListeners() { return bubble_listeners_; } - - private: - uint32_t id_; - uint32_t pid_; - std::vector capture_listeners_; - std::vector bubble_listeners_; -}; - -} // namespace dom -} // namespace hippy diff --git a/dom/include/dom/root_node.h b/dom/include/dom/root_node.h index 6e622cbb0..113a174e1 100644 --- a/dom/include/dom/root_node.h +++ b/dom/include/dom/root_node.h @@ -23,7 +23,6 @@ #include #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& interceptor); // event traverse for js - static void EventTraverse(const std::shared_ptr& event, const std::shared_ptr& node, - std::stack>& capture_nodes); + static void EventTraverse(const std::shared_ptr& event, const std::shared_ptr& node, + std::stack>& capture_nodes); // event traverse for vl static void EventTraverse(const std::shared_ptr& event); diff --git a/dom/src/dom/dom_node.cc b/dom/src/dom/dom_node.cc index 675b50734..b18dcde53 100644 --- a/dom/src/dom/dom_node.cc +++ b/dom/src/dom/dom_node.cc @@ -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::max()); if (!event_listener_map_) { event_listener_map_ = std::make_shared< std::unordered_map>, 2>>>(); diff --git a/dom/src/dom/event_node.cc b/dom/src/dom/event_node.cc deleted file mode 100644 index 2ed247aea..000000000 --- a/dom/src/dom/event_node.cc +++ /dev/null @@ -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> 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> 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 diff --git a/dom/src/dom/root_node.cc b/dom/src/dom/root_node.cc index 29076bdfc..f882af0aa 100644 --- a/dom/src/dom/root_node.cc +++ b/dom/src/dom/root_node.cc @@ -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& event) { RootNode::RunEventCallbackRunner(event); } -void RootNode::EventTraverse(const std::shared_ptr& event, const std::shared_ptr& node, - std::stack>& capture_nodes) { +void RootNode::EventTraverse(const std::shared_ptr& event, const std::shared_ptr& node, + std::stack>& 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> bubble_nodes = {}; + std::stack> 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& 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; diff --git a/driver/js/core/include/core/scope.h b/driver/js/core/include/core/scope.h index 18e0d9606..5443dc5fb 100644 --- a/driver/js/core/include/core/scope.h +++ b/driver/js/core/include/core/scope.h @@ -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 diff --git a/driver/js/core/src/modules/event_module.cc b/driver/js/core/src/modules/event_module.cc index edaa615df..fb59a5062 100644 --- a/driver/js/core/src/modules/event_module.cc +++ b/driver/js/core/src/modules/event_module.cc @@ -94,13 +94,14 @@ std::shared_ptr> 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 ctx_value = scope->GetContext()->CreateNumber(id); return ctx_value; }; @@ -118,13 +119,14 @@ std::shared_ptr> 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 ctx_value = scope->GetContext()->CreateNumber(current_id); return ctx_value; }; @@ -142,13 +144,14 @@ std::shared_ptr> 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 ctx_value = scope->GetContext()->CreateNumber(target_id); return ctx_value; }; @@ -166,13 +169,14 @@ std::shared_ptr> 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 ctx_value = scope->GetContext()->CreateNumber(current_target_id); return ctx_value; }; diff --git a/driver/js/core/src/scope.cc b/driver/js/core/src/scope.cc index 57a22fe74..7f885181f 100644 --- a/driver/js/core/src/scope.cc +++ b/driver/js/core/src/scope.cc @@ -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& value) { return; } - std::stack> capture_nodes = {}; - std::shared_ptr node = {}; auto event_name = event->GetType(); + std::stack> capture_nodes = {}; + std::shared_ptr node = {}; // 获取捕获节点 if (event->CanCapture()) { auto parent = target->GetParent(); while (parent) { - auto capture_node = - std::make_shared(parent->GetId(), parent->GetPid()); + auto capture_node = std::make_shared(); + 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(target->GetId(), target->GetPid()); + node = std::make_shared(); + 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)); }); diff --git a/driver/js/examples/ios-demo/HippyDemo.xcodeproj/project.pbxproj b/driver/js/examples/ios-demo/HippyDemo.xcodeproj/project.pbxproj index 398c49e0d..ce43e7612 100644 --- a/driver/js/examples/ios-demo/HippyDemo.xcodeproj/project.pbxproj +++ b/driver/js/examples/ios-demo/HippyDemo.xcodeproj/project.pbxproj @@ -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 = ""; }; D4B5A0882816642300ABBD9C /* event_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event_module.h; sourceTree = ""; }; D4B5A0892816642300ABBD9C /* scene_builder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scene_builder.h; sourceTree = ""; }; - D4EBECD12874232600170AE1 /* event_node.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = event_node.cc; sourceTree = ""; }; - D4EBECD32874233400170AE1 /* event_node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = event_node.h; sourceTree = ""; }; D806C4EF2872BC3B00E62992 /* repeating_timer.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = repeating_timer.cc; sourceTree = ""; }; D806C4F02872BC3B00E62992 /* task.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = task.cc; sourceTree = ""; }; D806C4F12872BC3B00E62992 /* thread_worker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thread_worker.cc; sourceTree = ""; }; @@ -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 */,