diff --git a/Ooui/Client.js b/Ooui/Client.js index 4be5c1b..6aaaef9 100644 --- a/Ooui/Client.js +++ b/Ooui/Client.js @@ -1,5 +1,5 @@ -const debug = false; +const debug = true; const nodes = {}; diff --git a/Ooui/EventTarget.cs b/Ooui/EventTarget.cs index 30c855e..d6da403 100644 --- a/Ooui/EventTarget.cs +++ b/Ooui/EventTarget.cs @@ -134,9 +134,8 @@ namespace Ooui { if (message == null) return; - if (message.TargetId != Id) - return; - SaveStateMessageIfNeeded (message); + if (message.TargetId == Id) + SaveStateMessageIfNeeded (message); TriggerEventFromMessage (message); } @@ -168,8 +167,10 @@ namespace Ooui } } - protected virtual void TriggerEventFromMessage (Message message) + protected virtual bool TriggerEventFromMessage (Message message) { + if (message.TargetId != Id) + return false; List handlers = null; lock (eventListeners) { List hs; @@ -177,11 +178,12 @@ namespace Ooui handlers = new List (hs); } } - if (handlers == null) return; + if (handlers == null) return true; var args = EventArgs.Empty; foreach (var h in handlers) { h.Invoke (this, args); } + return true; } } diff --git a/Ooui/Node.cs b/Ooui/Node.cs index cff16eb..5cd3fcf 100644 --- a/Ooui/Node.cs +++ b/Ooui/Node.cs @@ -133,5 +133,17 @@ namespace Ooui break; } } + + protected override bool TriggerEventFromMessage (Message message) + { + if (base.TriggerEventFromMessage (message)) + return true; + var ch = Children; + for (var i = 0; i < ch.Count; i++) { + if (ch[i].TriggerEventFromMessage (message)) + return true; + } + return false; + } } } diff --git a/Tests/NodeTests.cs b/Tests/NodeTests.cs index 32e0da0..a12d0cf 100644 --- a/Tests/NodeTests.cs +++ b/Tests/NodeTests.cs @@ -37,5 +37,19 @@ namespace Tests Assert.AreEqual (c0, c0s.GetValue (0)); Assert.AreEqual (c2, c0s.GetValue (1)); } + + [TestMethod] + public void EventReceptionBubblesDown () + { + var p = new Div (); + var b = new Button (); + p.AppendChild (b); + var clicked = false; + b.Clicked += (s, e) => { + clicked = true; + }; + p.Receive (Message.Event (b.Id, "click")); + Assert.IsTrue (clicked); + } } }