diff --git a/api/redraw.js b/api/redraw.js index aa513e38..e43ffffc 100644 --- a/api/redraw.js +++ b/api/redraw.js @@ -17,11 +17,6 @@ function throttle(callback) { module.exports = function($window, throttleMock) { var renderService = coreRenderer($window) - renderService.setEventCallback(function(e) { - if (e.redraw === false) e.redraw = undefined - else redraw() - }) - var callbacks = [] var rendering = false @@ -42,5 +37,6 @@ module.exports = function($window, throttleMock) { var redraw = (throttleMock || throttle)(sync) redraw.sync = sync + renderService.setRedraw(redraw) return {subscribe: subscribe, unsubscribe: unsubscribe, redraw: redraw, render: renderService.render} } diff --git a/render/render.js b/render/render.js index e0bf7ffc..83c5aecc 100644 --- a/render/render.js +++ b/render/render.js @@ -10,8 +10,8 @@ module.exports = function($window) { math: "http://www.w3.org/1998/Math/MathML" } - var onevent - function setEventCallback(callback) {return onevent = callback} + var redraw + function setRedraw(callback) {return redraw = callback} function getNameSpace(vnode) { return vnode.attrs && vnode.attrs.xmlns || nameSpace[vnode.tag] @@ -827,9 +827,10 @@ module.exports = function($window) { EventDict.prototype.handleEvent = function (ev) { var handler = this["on" + ev.type] var result - if (typeof handler === "function") result = handler.call(ev.target, ev) + if (typeof handler === "function") result = handler.call(ev.currentTarget, ev) else if (typeof handler.handleEvent === "function") handler.handleEvent(ev) - if (typeof onevent === "function") onevent.call(ev.target, ev) + if (ev.redraw === false) ev.redraw = undefined + else if (typeof redraw === "function") redraw() if (result === false) { ev.preventDefault() ev.stopPropagation() @@ -897,5 +898,5 @@ module.exports = function($window) { for (var i = 0; i < hooks.length; i++) hooks[i]() } - return {render: render, setEventCallback: setEventCallback} + return {render: render, setRedraw: setRedraw} } diff --git a/render/tests/test-event.js b/render/tests/test-event.js index 02246e18..74dcb75b 100644 --- a/render/tests/test-event.js +++ b/render/tests/test-event.js @@ -5,13 +5,13 @@ var domMock = require("../../test-utils/domMock") var vdom = require("../../render/render") o.spec("event", function() { - var $window, root, onevent, render + var $window, root, redraw, render o.beforeEach(function() { $window = domMock() root = $window.document.body - onevent = o.spy() + redraw = o.spy() var renderer = vdom($window) - renderer.setEventCallback(onevent) + renderer.setRedraw(redraw) render = renderer.render }) @@ -28,10 +28,9 @@ o.spec("event", function() { o(spy.this).equals(div.dom) o(spy.args[0].type).equals("click") o(spy.args[0].target).equals(div.dom) - o(onevent.callCount).equals(1) - o(onevent.this).equals(div.dom) - o(onevent.args[0].type).equals("click") - o(onevent.args[0].target).equals(div.dom) + o(redraw.callCount).equals(1) + o(redraw.this).equals(undefined) + o(redraw.args.length).equals(0) o(e.$defaultPrevented).equals(false) o(e.$propagationStopped).equals(false) }) @@ -49,10 +48,9 @@ o.spec("event", function() { o(spy.this).equals(div.dom) o(spy.args[0].type).equals("click") o(spy.args[0].target).equals(div.dom) - o(onevent.callCount).equals(1) - o(onevent.this).equals(div.dom) - o(onevent.args[0].type).equals("click") - o(onevent.args[0].target).equals(div.dom) + o(redraw.callCount).equals(1) + o(redraw.this).equals(undefined) + o(redraw.args.length).equals(0) o(e.$defaultPrevented).equals(true) o(e.$propagationStopped).equals(true) }) @@ -71,10 +69,9 @@ o.spec("event", function() { o(spy.this).equals(listener) o(spy.args[0].type).equals("click") o(spy.args[0].target).equals(div.dom) - o(onevent.callCount).equals(1) - o(onevent.this).equals(div.dom) - o(onevent.args[0].type).equals("click") - o(onevent.args[0].target).equals(div.dom) + o(redraw.callCount).equals(1) + o(redraw.this).equals(undefined) + o(redraw.args.length).equals(0) o(e.$defaultPrevented).equals(false) o(e.$propagationStopped).equals(false) }) @@ -93,10 +90,30 @@ o.spec("event", function() { o(spy.this).equals(listener) o(spy.args[0].type).equals("click") o(spy.args[0].target).equals(div.dom) - o(onevent.callCount).equals(1) - o(onevent.this).equals(div.dom) - o(onevent.args[0].type).equals("click") - o(onevent.args[0].target).equals(div.dom) + o(redraw.callCount).equals(1) + o(redraw.this).equals(undefined) + o(redraw.args.length).equals(0) + o(e.$defaultPrevented).equals(false) + o(e.$propagationStopped).equals(false) + }) + + o("handles propagated onclick", function() { + var spy = o.spy() + var child = {tag: "div"} + var parent = {tag: "div", attrs: {onclick: spy}, children: [child]} + var e = $window.document.createEvent("MouseEvents") + e.initEvent("click", true, true) + + render(root, [parent]) + child.dom.dispatchEvent(e) + + o(spy.callCount).equals(1) + o(spy.this).equals(parent.dom) + o(spy.args[0].type).equals("click") + o(spy.args[0].target).equals(child.dom) + o(redraw.callCount).equals(1) + o(redraw.this).equals(undefined) + o(redraw.args.length).equals(0) o(e.$defaultPrevented).equals(false) o(e.$propagationStopped).equals(false) }) @@ -254,10 +271,9 @@ o.spec("event", function() { o(spy.this).equals(div.dom) o(spy.args[0].type).equals("click") o(spy.args[0].target).equals(div.dom) - o(onevent.callCount).equals(1) - o(onevent.this).equals(div.dom) - o(onevent.args[0].type).equals("click") - o(onevent.args[0].target).equals(div.dom) + o(redraw.callCount).equals(1) + o(redraw.this).equals(undefined) + o(redraw.args.length).equals(0) o(div.dom).equals(updated.dom) o(div.dom.attributes["id"].value).equals("b") }) @@ -278,10 +294,9 @@ o.spec("event", function() { o(spy.this).equals(listener) o(spy.args[0].type).equals("click") o(spy.args[0].target).equals(div.dom) - o(onevent.callCount).equals(1) - o(onevent.this).equals(div.dom) - o(onevent.args[0].type).equals("click") - o(onevent.args[0].target).equals(div.dom) + o(redraw.callCount).equals(1) + o(redraw.this).equals(undefined) + o(redraw.args.length).equals(0) o(div.dom).equals(updated.dom) o(div.dom.attributes["id"].value).equals("b") }) @@ -299,10 +314,9 @@ o.spec("event", function() { o(spy.this).equals(div.dom) o(spy.args[0].type).equals("transitionend") o(spy.args[0].target).equals(div.dom) - o(onevent.callCount).equals(1) - o(onevent.this).equals(div.dom) - o(onevent.args[0].type).equals("transitionend") - o(onevent.args[0].target).equals(div.dom) + o(redraw.callCount).equals(1) + o(redraw.this).equals(undefined) + o(redraw.args.length).equals(0) }) o("handles transitionend EventListener object", function() { @@ -319,9 +333,8 @@ o.spec("event", function() { o(spy.this).equals(listener) o(spy.args[0].type).equals("transitionend") o(spy.args[0].target).equals(div.dom) - o(onevent.callCount).equals(1) - o(onevent.this).equals(div.dom) - o(onevent.args[0].type).equals("transitionend") - o(onevent.args[0].target).equals(div.dom) + o(redraw.callCount).equals(1) + o(redraw.this).equals(undefined) + o(redraw.args.length).equals(0) }) })