From 1ed7fa5b30092b5d1b1a2cd8294b5ebbe60812f3 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Tue, 8 Apr 2014 22:17:19 -0400 Subject: [PATCH] add test for issue 29 --- archive/v0.1.4/mithril-tests.js | 22 +++++++++++++++++++++- archive/v0.1.4/mithril.js | 2 +- archive/v0.1.4/mithril.min.js | 2 +- archive/v0.1.4/mithril.min.map | 2 +- archive/v0.1.4/mithril.min.zip | Bin 20871 -> 20822 bytes mithril.js | 2 +- tests/mithril-tests.js | 20 ++++++++++++++++++++ 7 files changed, 45 insertions(+), 5 deletions(-) diff --git a/archive/v0.1.4/mithril-tests.js b/archive/v0.1.4/mithril-tests.js index 09bc7c69..b06b4ce4 100644 --- a/archive/v0.1.4/mithril-tests.js +++ b/archive/v0.1.4/mithril-tests.js @@ -129,7 +129,7 @@ new function(window) { cachedAttrs[attrName] = dataAttr if (attrName === "config") continue else if (typeof dataAttr == "function" && attrName.indexOf("on") == 0) { - if (String(dataAttr) !== String(cachedAttr)) node[attrName] = autoredraw(dataAttr, node) + node[attrName] = autoredraw(dataAttr, node) } else if (attrName === "style") { for (var rule in dataAttr) { @@ -679,6 +679,26 @@ function testMithril(mock) { m.render(root, m("a", {config: m.route}, "test")) return root.childNodes[0].childNodes[0].nodeValue === "test" }) + test(function() { + //see issue #29 + var root = mock.document.createElement("div") + var list = [false, false] + m.render(root, list.reverse().map(function(flag, index) { + return m("input[type=checkbox]", {onclick: m.withAttr("checked", function(value) {list[index] = value}), checked: flag}) + })) + + mock.document.activeElement = root.childNodes[0] + root.childNodes[0].checked = true + root.childNodes[0].onclick({currentTarget: {checked: true}}) + + m.render(root, list.reverse().map(function(flag, index) { + return m("input[type=checkbox]", {onclick: m.withAttr("checked", function(value) {list[index] = value}), checked: flag}) + })) + + mock.document.activeElement = null + + return root.childNodes[0].checked === false && root.childNodes[1].checked === true + }) //m.redraw test(function() { diff --git a/archive/v0.1.4/mithril.js b/archive/v0.1.4/mithril.js index 8cc2547a..28912e30 100644 --- a/archive/v0.1.4/mithril.js +++ b/archive/v0.1.4/mithril.js @@ -129,7 +129,7 @@ new function(window) { cachedAttrs[attrName] = dataAttr if (attrName === "config") continue else if (typeof dataAttr == "function" && attrName.indexOf("on") == 0) { - if (String(dataAttr) !== String(cachedAttr)) node[attrName] = autoredraw(dataAttr, node) + node[attrName] = autoredraw(dataAttr, node) } else if (attrName === "style") { for (var rule in dataAttr) { diff --git a/archive/v0.1.4/mithril.min.js b/archive/v0.1.4/mithril.min.js index fbe0e105..97ce9252 100644 --- a/archive/v0.1.4/mithril.min.js +++ b/archive/v0.1.4/mithril.min.js @@ -4,5 +4,5 @@ http://github.com/lhorie/mithril.js (c) Leo Horie License: MIT */ -!new function(a){function b(e,f,g,h){if(null===f||void 0===f)return void(g&&d(g.nodes));if("retain"!==f.subtree){var i=s.call(g),j=s.call(f);if(i!=j&&(null!==g&&void 0!==g&&d(g.nodes),g=new f.constructor,g.nodes=[]),"[object Array]"==j){for(var k=[],l=g.length===f.length,m=0;m-1?new f.constructor(f):f,g.nodes=[o]}else if(g.valueOf()!==f.valueOf()){if(f.$trusted){var r=g.nodes[0],k=[r];if(r){for(;r=r.nextSibling;)k.push(r);d(k);var q=e.lastChild;e.insertAdjacentHTML("beforeend",f),o=q?q.nextSibling:e.firstChild}else e.innerHTML=f}else o=g.nodes[0],e.appendChild(o),o.nodeValue=f;g=new f.constructor(f),g.nodes=[o]}else g.nodes.intact=!0}return g}}function c(b,c,d){for(var e in c){var g=c[e],h=d[e];if(!(e in d)||h!==g||b===a.document.activeElement){if(d[e]=g,"config"===e)continue;if("function"==typeof g&&0==e.indexOf("on"))String(g)!==String(h)&&(b[e]=f(g,b));else if("style"===e)for(var i in g)(void 0===h||h[i]!==g[i])&&(b.style[i]=g[i]);else e in b?b[e]=g:b.setAttribute(e,g)}}return d}function d(a){for(var b=0;b16)m.redraw();else{var b=a.cancelAnimationFrame||a.clearTimeout,c=a.requestAnimationFrame||a.setTimeout;b(E),E=c(m.redraw,0)}}function h(a,b,c){J={};for(var d in b){if(d==c)return!void m.module(a,b[d]);var e=new RegExp("^"+d.replace(/:[^\/]+/g,"([^\\/]+)")+"$");if(e.test(c))return!void c.replace(e,function(){for(var c=d.match(/:[^\/]+/g),e=[].slice.call(arguments,1,-2),f=0;f0&&("GET"==a.method?a.url=a.url+(a.url.indexOf("?")<0?"?":"&")+n(b):a.data=c(b)),a}function p(a,b){var c=a.match(/:[a-z]\w+/gi);if(c&&b)for(var d=0;d0&&(f.attrs[d]=h.join(" "))}f=e(f),f.attrs=e(f.attrs),f.children=b?a[2]:a[1];for(var j in c)f.attrs[j]=j==d?(f.attrs[j]||"")+" "+c[j]:c[j];return f};var v,w={insertAdjacentHTML:function(b,c){a.document.write(c),a.document.close()},appendChild:function(b){void 0===v&&(v=a.document.createElement("html")),"HTML"==b.nodeName?v=b:v.appendChild(b),a.document.documentElement!==v&&a.document.replaceChild(v,a.document.documentElement)}},x=[],y={};m.render=function(c,d){var e=x.indexOf(c),f=0>e?x.push(c)-1:e,g=c==a.document||c==a.document.documentElement?w:c;y[f]=b(g,d,y[f],!1)},m.trust=function(a){return a=new String(a),a.$trusted=!0,a};var z,A={view:function(){}},B={},C=0,D=0,E=0;m.module=function(a,b){m.startComputation(),z=a,A=b,B=new b.controller,m.endComputation()},m.redraw=function(){m.render(z,A.view(B)),D=C};var F=0,G=null;m.startComputation=function(){F++},m.endComputation=function(){F=Math.max(F-1,0),0==F&&(g(),G&&(G(),G=null))},m.withAttr=function(a,b){return function(c){b(a in c.currentTarget?c.currentTarget[a]:c.currentTarget.getAttribute(a))}};var H={pathname:"",hash:"#",search:"?"},I=function(){},J={};m.route=function(){if(3==arguments.length){var b=arguments[0],c=arguments[1],d=arguments[2];I=function(a){var e=a.slice(H[m.route.mode].length);h(b,d,e)||m.route(c,!0)};var e="hash"==m.route.mode?"onhashchange":"onpopstate";a[e]=function(){I(a.location[m.route.mode])},G=j,a[e]()}else if(arguments[0].addEventListener){var f=arguments[0],g=arguments[1];g||(f.removeEventListener("click",i),f.addEventListener("click",i))}else if("string"==typeof arguments[0]){var k=arguments[0],l=arguments[1]===!0;a.history.pushState?(G=function(){a.history[l?"replaceState":"pushState"](null,a.document.title,H[m.route.mode]+k),j()},I(H[m.route.mode]+k)):a.location[m.route.mode]=k}},m.route.param=function(a){return J[a]},m.route.mode="search",m.prop=function(a){return function(){return arguments.length&&(a=arguments[0]),a}},m.deferred=function(){var a=[],b=[],c={resolve:function(b){for(var c=0;c-1?new f.constructor(f):f,g.nodes=[o]}else if(g.valueOf()!==f.valueOf()){if(f.$trusted){var r=g.nodes[0],k=[r];if(r){for(;r=r.nextSibling;)k.push(r);d(k);var q=e.lastChild;e.insertAdjacentHTML("beforeend",f),o=q?q.nextSibling:e.firstChild}else e.innerHTML=f}else o=g.nodes[0],e.appendChild(o),o.nodeValue=f;g=new f.constructor(f),g.nodes=[o]}else g.nodes.intact=!0}return g}}function c(b,c,d){for(var e in c){var g=c[e],h=d[e];if(!(e in d)||h!==g||b===a.document.activeElement){if(d[e]=g,"config"===e)continue;if("function"==typeof g&&0==e.indexOf("on"))b[e]=f(g,b);else if("style"===e)for(var i in g)(void 0===h||h[i]!==g[i])&&(b.style[i]=g[i]);else e in b?b[e]=g:b.setAttribute(e,g)}}return d}function d(a){for(var b=0;b16)m.redraw();else{var b=a.cancelAnimationFrame||a.clearTimeout,c=a.requestAnimationFrame||a.setTimeout;b(E),E=c(m.redraw,0)}}function h(a,b,c){J={};for(var d in b){if(d==c)return!void m.module(a,b[d]);var e=new RegExp("^"+d.replace(/:[^\/]+/g,"([^\\/]+)")+"$");if(e.test(c))return!void c.replace(e,function(){for(var c=d.match(/:[^\/]+/g),e=[].slice.call(arguments,1,-2),f=0;f0&&("GET"==a.method?a.url=a.url+(a.url.indexOf("?")<0?"?":"&")+n(b):a.data=c(b)),a}function p(a,b){var c=a.match(/:[a-z]\w+/gi);if(c&&b)for(var d=0;d0&&(f.attrs[d]=h.join(" "))}f=e(f),f.attrs=e(f.attrs),f.children=b?a[2]:a[1];for(var j in c)f.attrs[j]=j==d?(f.attrs[j]||"")+" "+c[j]:c[j];return f};var v,w={insertAdjacentHTML:function(b,c){a.document.write(c),a.document.close()},appendChild:function(b){void 0===v&&(v=a.document.createElement("html")),"HTML"==b.nodeName?v=b:v.appendChild(b),a.document.documentElement!==v&&a.document.replaceChild(v,a.document.documentElement)}},x=[],y={};m.render=function(c,d){var e=x.indexOf(c),f=0>e?x.push(c)-1:e,g=c==a.document||c==a.document.documentElement?w:c;y[f]=b(g,d,y[f],!1)},m.trust=function(a){return a=new String(a),a.$trusted=!0,a};var z,A={view:function(){}},B={},C=0,D=0,E=0;m.module=function(a,b){m.startComputation(),z=a,A=b,B=new b.controller,m.endComputation()},m.redraw=function(){m.render(z,A.view(B)),D=C};var F=0,G=null;m.startComputation=function(){F++},m.endComputation=function(){F=Math.max(F-1,0),0==F&&(g(),G&&(G(),G=null))},m.withAttr=function(a,b){return function(c){b(a in c.currentTarget?c.currentTarget[a]:c.currentTarget.getAttribute(a))}};var H={pathname:"",hash:"#",search:"?"},I=function(){},J={};m.route=function(){if(3==arguments.length){var b=arguments[0],c=arguments[1],d=arguments[2];I=function(a){var e=a.slice(H[m.route.mode].length);h(b,d,e)||m.route(c,!0)};var e="hash"==m.route.mode?"onhashchange":"onpopstate";a[e]=function(){I(a.location[m.route.mode])},G=j,a[e]()}else if(arguments[0].addEventListener){var f=arguments[0],g=arguments[1];g||(f.removeEventListener("click",i),f.addEventListener("click",i))}else if("string"==typeof arguments[0]){var k=arguments[0],l=arguments[1]===!0;a.history.pushState?(G=function(){a.history[l?"replaceState":"pushState"](null,a.document.title,H[m.route.mode]+k),j()},I(H[m.route.mode]+k)):a.location[m.route.mode]=k}},m.route.param=function(a){return J[a]},m.route.mode="search",m.prop=function(a){return function(){return arguments.length&&(a=arguments[0]),a}},m.deferred=function(){var a=[],b=[],c={resolve:function(b){for(var c=0;cA6O750=;rWL7Mf|}T^V<%}7f*;I`=ht!K+SD+*n9WF(9pXN&prOc3oBn( zy?1l%Gj(I-cr^OgSI&^cV*34e9wml`9vweF{;g+@e|+)i+2=~#oo2g!{Q8xLpL{)G zZ3)9RO)n)3$26-hEh+{2Th0n2FzpSgUQWJN_6*N7!=mAu(n(6AWSVO!Nmo+BXdAo2G<%}2 z*KyJ-W0Jv!Nxhk}jXek*inLy5j{lS%k3`e#L=abz?1j-ro-V%gRn$EoGF__!Jv6RNRX7w+8Omu_UrMsqg{0AIaJ;J?2oP zLP<6}Lz;4*nd$a83ck-lo#urzr7qpLI;I!y13K|`3&@~MiY_6-Qmx&198EKxaz@SH zTsqp|vhXB9^y+#6V=^IHj5l1@PUu`yWDf*;Sr?Sa3j2y^AS7j@3Rh%@F9eGO;J(K& z$j50xKGeD{U0XV2OC6yu&W=U))vejro|&}Nz1d=PpW*}Yo*P>emX4Rg0JR5%= z)F6@!`@WCzcp%TxiG`M z!r#j?U~C5DsrJP~Ov%@jI(Pf(w5CsWhjJz>1Brn(5DjteN|S!7Ii}T~u0L-}^=@B} zG1b=HMS|*jq{5_($^yc@366F+tR)?Fr>!2}{k;`)N0S7wA^z7(P7Hp|o<{L-boP&;-BVPl=4s{w6gXCumq^Qa|HiT}W!N6Fm zV5~F7d9tuCfrvB=PBR7F?P!m{{?`#M!Z~-tqHlMz?FWSu`d&2lvYR(rtd@2DATWDHFXS8QoC5n2GQz%!J$XUdlBt8MFSWLJH~ zN<=|_)TO(terb)|(4EoFXkv2K8_Wy8$(c(EqD(-(mC!>7+9Z3?6fJeucC#QD7>JgK zn3ee)Ljy_hY1_l(;7J1z2~FP$<#sizlx-MjsyMAtJ4$G`>v|g1$ez~LVQ*Kr)IaR8 zMT86pDh!h(5q&nP6e~=L z(3{lO>tooO;5{aq1g^9SHDyZuJ6P9odIm1NRVr@Z3{iF~(0|r4`$RTg54-5ID zb(i2^;<1&gY0u+-mWv#Kab@HbOb9dFutRKeAV9d5M0#A)U5YUP8*KuD72@|@P9nd7 z>VhVSY>0ifQs}wtCYw)i9L~TpQH$?%)z97J)!jS+?^_51vyI9Zp#aLpQ?j2bCQ$?V zVr)2P5w0pd%V?^pFBd>zb`b((q?=!bXNU=IsA+#}a_UqmrIp?;csdR?lRS?d zv>!^yrh3c2GzM!WGY)F%*RDOq=_qp`vg+6VsEwIU4dm1ev2UeCg-j1+{H;i0aV^6= z46hlu+SiTizMdJCdR~pspO3UuZvKsHc#`2IleY8=t;Q+_&p-X-*KamIuD&{-IBL?j z!Jw*_^<=R@FgVZ@Xt!h@9gaDJ4n<3JKVEX1mhC)VtF+Cs0gF^)nrxr}F^MQAll;tc z^E7}v!eLIL0ezgVw$x1E-h&>B!(d+S^7F6M@F8hu?I(xO=}vCeM>jt zlUyS{e+kY;@s5Bwdqe#@81dW8QQM)ZZx{CTM-NXrIj27YPHuDD104$#DOAu&iP~Rg zuv9AxS6)G_5bgH)Dbup}IkDVR-(9#o%r)xtZBBq4SHD|G@psARV6^@6}F)fo+3`}P-P3BL{Oq!>$9skAo8{WI``T6NJTB_O`58Mu z{)wIc1%a|C3!p7mDw|56RzgCcq7oq_mMmtCSb(}fOuIm=P=QSsEcnj3c3>*9aD4AQ z_nz;Z?>pyS|M9)h8}El+EVy5I=D7j-d*K(~HGlW+;46L0_~Mg`cZz$R&1UUh zZT!~UTNhrCn|pMxrmc>jg~Fd)xkOvz`LowQiVX~WboS}!I~Sf+_GjO@ z_4+esgJU0jd3MjNXuhudInCAeHJiU@>3cO}XqK+K2}84Wz2efKoTtxH+Ry^sidgc= z@B?N6r7&`B9$e^@9-;1v1!PkzUf!h!?@=P+u0ct(a?O1kE z2JyS$me8ueu_V70|6%A@UQYZdyk*j1?v(shVpg;*+T-t9WVX>cA5{R?1RmY{uZ5aJ zpaFSvuz-JlSH_Yvb0=zN)Y7_!t{)mPHJ+q%MMN;zAgLx(mbMS0VbA|2?(8lMSNh_n*R(LZl82S0w37+!SZ z^5@eNp_Kg7bToHl(Vl?L^~uuVn0Yv%64R!wRxBIklgc=dY;hp0OYt1+t+)}D{>;_E zGG#v3$L5Q=Nc?2*Ay z)(m2@%&{UHNJ&YnAQZ978~i0Yca4kAr5I6+h@pDm(6;3$dukc-)47q*ksO?V=|att z+I&8IMETLZhWzIIc({{eRUOJ-&PTrlX%NVoDgQSAu)lOHa}RE(wj4@Rk#^cO6+~}q zizDAum;+4G5jfP^v0Cyc4~8{m7ff-l@bJxR5Qo& zGyR5#NQs0lD>)!zhYLp}MUuJmQ>vq)4fRe!8>%!uKS{Yr$#vt-&T6I5_Eia3b)Cs>aFuQ|Mw?sBA(e#KGEaEL651wG zj3CO0cAvy9w!{&mvHBeles+vqxopP5=&0E3?8@((*Jg19+*#;~BvhsyqQ#U~WBTI; zX~w7Miy3z3O!4}rQJ0^XPI{Be4lNM-OB@{f9BA?gyL)VL8zM+CCFe3RzLAuxmZqV} zqWY@To?LoA-zJnCE z=>U_Q01~AD36Ab8XV|ATL45^`L4U6@Rs8a)8FX);D)!h*Zr|bX*!>B|e+iyRK)mNb zzTw30qQ&9@JTVbIU2SZP6aZ!YDcg^ocxYdKEgu;|I{>Z6)2$t|Ld4!2YT|Hcavc#lQ*)c}o=C9}f&RgVjB09boimw#Tk z{(@?P9PV~CGSf(ilMe+1DuzF&uR@>(qOfuJ)g+JUqpkSr0K=y-`fAGKJ zsVf%u5S{^6ZeRWW;cHMVpxa|}|41eSzs3kZ6xmxTQZG#OhB8(dyMh8DzW4YUgP%q8 zzF66pjl!Lw1Jbj7VlgY$vHWo%!9NAhe?`hCg~*MkejMTl;t>DZ?0@`I-Vbg+`&og; F{{aX!6;l8J diff --git a/mithril.js b/mithril.js index 8cc2547a..28912e30 100644 --- a/mithril.js +++ b/mithril.js @@ -129,7 +129,7 @@ new function(window) { cachedAttrs[attrName] = dataAttr if (attrName === "config") continue else if (typeof dataAttr == "function" && attrName.indexOf("on") == 0) { - if (String(dataAttr) !== String(cachedAttr)) node[attrName] = autoredraw(dataAttr, node) + node[attrName] = autoredraw(dataAttr, node) } else if (attrName === "style") { for (var rule in dataAttr) { diff --git a/tests/mithril-tests.js b/tests/mithril-tests.js index 1f18b8fc..ff6adf39 100644 --- a/tests/mithril-tests.js +++ b/tests/mithril-tests.js @@ -147,6 +147,26 @@ function testMithril(mock) { m.render(root, m("a", {config: m.route}, "test")) return root.childNodes[0].childNodes[0].nodeValue === "test" }) + test(function() { + //see issue #29 + var root = mock.document.createElement("div") + var list = [false, false] + m.render(root, list.reverse().map(function(flag, index) { + return m("input[type=checkbox]", {onclick: m.withAttr("checked", function(value) {list[index] = value}), checked: flag}) + })) + + mock.document.activeElement = root.childNodes[0] + root.childNodes[0].checked = true + root.childNodes[0].onclick({currentTarget: {checked: true}}) + + m.render(root, list.reverse().map(function(flag, index) { + return m("input[type=checkbox]", {onclick: m.withAttr("checked", function(value) {list[index] = value}), checked: flag}) + })) + + mock.document.activeElement = null + + return root.childNodes[0].checked === false && root.childNodes[1].checked === true + }) //m.redraw test(function() {