Skip to content

Commit 8e0e0ac

Browse files
authored
fix(dom): set Event.target in simulate* methods in src/client/dom/element (#340)
1 parent 9fae656 commit 8e0e0ac

2 files changed

Lines changed: 92 additions & 15 deletions

File tree

src/client/dom/element.cpp

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -746,32 +746,57 @@ namespace dom
746746

747747
void Element::simulateMouseDown(const glm::vec3 &hitPointInWorld)
748748
{
749-
dispatchEventInternal(events::MouseEvent::MouseDown());
750-
dispatchEventInternal(events::PointerEvent::PointerDown());
749+
auto mouseEvent = events::MouseEvent::MouseDown();
750+
mouseEvent->setTarget(shared_from_this());
751+
dispatchEventInternal(std::move(mouseEvent));
752+
753+
auto pointerEvent = events::PointerEvent::PointerDown();
754+
pointerEvent->setTarget(shared_from_this());
755+
dispatchEventInternal(std::move(pointerEvent));
751756
}
752757

753758
void Element::simulateMouseUp(const glm::vec3 &hitPointInWorld)
754759
{
755-
dispatchEventInternal(events::MouseEvent::MouseUp());
756-
dispatchEventInternal(events::PointerEvent::PointerUp());
760+
auto mouseEvent = events::MouseEvent::MouseUp();
761+
mouseEvent->setTarget(shared_from_this());
762+
dispatchEventInternal(std::move(mouseEvent));
763+
764+
auto pointerEvent = events::PointerEvent::PointerUp();
765+
pointerEvent->setTarget(shared_from_this());
766+
dispatchEventInternal(std::move(pointerEvent));
757767
}
758768

759769
void Element::simulateMouseMove(const glm::vec3 &hitPointInWorld)
760770
{
761-
dispatchEventInternal(events::MouseEvent::MouseMove());
762-
dispatchEventInternal(events::PointerEvent::PointerMove());
771+
auto mouseEvent = events::MouseEvent::MouseMove();
772+
mouseEvent->setTarget(shared_from_this());
773+
dispatchEventInternal(std::move(mouseEvent));
774+
775+
auto pointerEvent = events::PointerEvent::PointerMove();
776+
pointerEvent->setTarget(shared_from_this());
777+
dispatchEventInternal(std::move(pointerEvent));
763778
}
764779

765780
void Element::simulateMouseOut(const glm::vec3 &hitPointInWorld)
766781
{
767-
dispatchEventInternal(events::MouseEvent::MouseOut());
768-
dispatchEventInternal(events::PointerEvent::PointerOut());
782+
auto mouseEvent = events::MouseEvent::MouseOut();
783+
mouseEvent->setTarget(shared_from_this());
784+
dispatchEventInternal(std::move(mouseEvent));
785+
786+
auto pointerEvent = events::PointerEvent::PointerOut();
787+
pointerEvent->setTarget(shared_from_this());
788+
dispatchEventInternal(std::move(pointerEvent));
769789
}
770790

771791
void Element::simulateMouseOver(const glm::vec3 &hitPointInWorld)
772792
{
773-
dispatchEventInternal(events::MouseEvent::MouseOver());
774-
dispatchEventInternal(events::PointerEvent::PointerOver());
793+
auto mouseEvent = events::MouseEvent::MouseOver();
794+
mouseEvent->setTarget(shared_from_this());
795+
dispatchEventInternal(std::move(mouseEvent));
796+
797+
auto pointerEvent = events::PointerEvent::PointerOver();
798+
pointerEvent->setTarget(shared_from_this());
799+
dispatchEventInternal(std::move(pointerEvent));
775800
}
776801

777802
void Element::simulateMouseEnter(const glm::vec3 &hitPointInWorld)
@@ -780,8 +805,13 @@ namespace dom
780805
return;
781806
setActionState(is_hovered_, true);
782807

783-
dispatchEventInternal(events::MouseEvent::MouseEnter());
784-
dispatchEventInternal(events::PointerEvent::PointerEnter());
808+
auto mouseEvent = events::MouseEvent::MouseEnter();
809+
mouseEvent->setTarget(shared_from_this());
810+
dispatchEventInternal(std::move(mouseEvent));
811+
812+
auto pointerEvent = events::PointerEvent::PointerEnter();
813+
pointerEvent->setTarget(shared_from_this());
814+
dispatchEventInternal(std::move(pointerEvent));
785815
}
786816

787817
void Element::simulateMouseLeave(const glm::vec3 &hitPointInWorld)
@@ -790,14 +820,20 @@ namespace dom
790820
return;
791821
setActionState(is_hovered_, false);
792822

793-
dispatchEventInternal(events::MouseEvent::MouseLeave());
794-
dispatchEventInternal(events::PointerEvent::PointerLeave());
823+
auto mouseEvent = events::MouseEvent::MouseLeave();
824+
mouseEvent->setTarget(shared_from_this());
825+
dispatchEventInternal(std::move(mouseEvent));
826+
827+
auto pointerEvent = events::PointerEvent::PointerLeave();
828+
pointerEvent->setTarget(shared_from_this());
829+
dispatchEventInternal(std::move(pointerEvent));
795830
}
796831

797832
void Element::simulateClick(const glm::vec3 &hitPointInWorld)
798833
{
799834
// Create a click event object to pass to the handler
800835
auto clickEvent = events::PointerEvent::Click();
836+
clickEvent->setTarget(shared_from_this());
801837

802838
// Execute click handler if it exists, passing the event object
803839
if (hasEventHandler("click"))
@@ -833,7 +869,9 @@ namespace dom
833869
if (!shouldThrottleScrollEvent())
834870
{
835871
last_scroll_event_time_ = chrono::steady_clock::now();
836-
dispatchEvent(make_shared<dom::Event>(DOMEventConstructorType::kEvent, DOMEventType::Scroll));
872+
auto scrollEvent = make_shared<dom::Event>(DOMEventConstructorType::kEvent, DOMEventType::Scroll);
873+
scrollEvent->setTarget(shared_from_this());
874+
dispatchEvent(scrollEvent);
837875
}
838876
}
839877
return scrolled;

tests/client/element_integration_test.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,43 @@ TEST_CASE("Event type case sensitivity and validation", "[Element][Integration][
9696
std::string expectedCode = "handle" + eventType + "()";
9797
REQUIRE(element->getEventHandlerCode(eventType) == expectedCode);
9898
}
99+
}
100+
101+
TEST_CASE("Element simulate methods set event target correctly", "[Element][Integration][Target]")
102+
{
103+
auto element = std::make_shared<Element>("div", std::nullopt);
104+
105+
// Test 1: Verify simulateClick sets target correctly
106+
bool targetSetCorrectly = false;
107+
108+
// Add an event listener that checks the event target
109+
element->addEventListener(DOMEventType::Click, [&](std::shared_ptr<Event> event) {
110+
targetSetCorrectly = (event->target() == element);
111+
});
112+
113+
// Simulate the click
114+
REQUIRE_NOTHROW(element->simulateClick(glm::vec3(0.0f, 0.0f, 0.0f)));
115+
116+
// Verify the target was set correctly
117+
REQUIRE(targetSetCorrectly == true);
118+
119+
// Test 2: Verify mouse events also set target correctly
120+
bool mouseEventTargetCorrect = false;
121+
122+
element->addEventListener(DOMEventType::MouseDown, [&](std::shared_ptr<Event> event) {
123+
mouseEventTargetCorrect = (event->target() == element);
124+
});
125+
126+
REQUIRE_NOTHROW(element->simulateMouseDown(glm::vec3(1.0f, 1.0f, 1.0f)));
127+
REQUIRE(mouseEventTargetCorrect == true);
128+
129+
// Test 3: Verify pointer events also set target correctly
130+
bool pointerEventTargetCorrect = false;
131+
132+
element->addEventListener(DOMEventType::PointerMove, [&](std::shared_ptr<Event> event) {
133+
pointerEventTargetCorrect = (event->target() == element);
134+
});
135+
136+
REQUIRE_NOTHROW(element->simulateMouseMove(glm::vec3(2.0f, 2.0f, 2.0f)));
137+
REQUIRE(pointerEventTargetCorrect == true);
99138
}

0 commit comments

Comments
 (0)