From 9d5f686bbdacf8af32c677f2c67f6da6168b45fd Mon Sep 17 00:00:00 2001 From: Leo Date: Fri, 3 Feb 2017 22:21:14 -0500 Subject: [PATCH] #1579 prevent infinite loop in non-existent default route --- api/router.js | 5 ++- api/tests/test-router.js | 2 +- mithril.js | 8 ++-- mithril.min.js | 82 ++++++++++++++++++++-------------------- router/router.js | 6 +-- 5 files changed, 51 insertions(+), 52 deletions(-) diff --git a/api/router.js b/api/router.js index 1d267bb8..b4690966 100644 --- a/api/router.js +++ b/api/router.js @@ -14,8 +14,9 @@ module.exports = function($window, redrawService) { var run = function() { if (render != null) redrawService.render(root, render(Vnode(component, attrs.key, attrs))) } - var bail = function() { - routeService.setPath(defaultRoute, null, {replace: true}) + var bail = function(path) { + if (path !== defaultRoute) routeService.setPath(defaultRoute, null, {replace: true}) + else throw new Error("Could not resolve default route " + defaultRoute) } routeService.defineRoutes(routes, function(payload, params, path) { var update = lastUpdate = function(routeResolver, comp) { diff --git a/api/tests/test-router.js b/api/tests/test-router.js index 8fec9042..9b8705da 100644 --- a/api/tests/test-router.js +++ b/api/tests/test-router.js @@ -108,7 +108,7 @@ o.spec("route", function() { done() } }) - + o("redraws when render function is executed", function() { var onupdate = o.spy() var oninit = o.spy() diff --git a/mithril.js b/mithril.js index c1ec91f0..3ccb4917 100644 --- a/mithril.js +++ b/mithril.js @@ -1056,7 +1056,6 @@ var coreRouter = function($window) { var path = router.getPath() var params = {} var pathname = parsePath(path, params, params) - var state = $window.history.state if (state != null) { for (var k in state) params[k] = state[k] @@ -1077,12 +1076,10 @@ var coreRouter = function($window) { } reject(path, params) } - if (supportsPushState) $window.onpopstate = debounceAsync(resolveRoute) else if (router.prefix.charAt(0) === "#") $window.onhashchange = resolveRoute resolveRoute() } - return router } var _20 = function($window, redrawService0) { @@ -1094,8 +1091,9 @@ var _20 = function($window, redrawService0) { var run1 = function() { if (render1 != null) redrawService0.render(root, render1(Vnode(component, attrs3.key, attrs3))) } - var bail = function() { - routeService.setPath(defaultRoute, null, {replace: true}) + var bail = function(path) { + if (path !== defaultRoute) routeService.setPath(defaultRoute, null, {replace: true}) + else throw new Error("Could not resolve default route " + defaultRoute) } routeService.defineRoutes(routes, function(payload, params, path) { var update = lastUpdate = function(routeResolver, comp) { diff --git a/mithril.min.js b/mithril.min.js index 528305de..eaf10ad2 100644 --- a/mithril.min.js +++ b/mithril.min.js @@ -1,42 +1,42 @@ -new function(){function x(a,c,k,d,h,m){return{tag:a,key:c,attrs:k,children:d,text:h,dom:m,domSize:void 0,state:{},events:void 0,instance:void 0,skip:!1}}function B(a){if(null==a||"string"!==typeof a&&"function"!==typeof a.view)throw Error("The selector must be either a string or a component.");if("string"===typeof a&&void 0===G[a]){for(var c,k,d=[],h={};c=N.exec(a);){var m=c[1],l=c[2];""===m&&""!==l?k=l:"#"===m?h.id=l:"."===m?d.push(l):"["===c[3][0]&&((m=c[6])&&(m=m.replace(/\\(["'])/g,"$1").replace(/\\\\/g, -"\\")),"class"===c[4]?d.push(m):h[c[4]]=m||!0)}0b.indexOf("?")?"?":"&";b+=d+c}return b}function l(a){try{return""!==a?JSON.parse(a):null}catch(A){throw Error(a);}} -function p(a){return a.responseText}function r(a,c){if("function"===typeof a)if(Array.isArray(c))for(var b=0;bn.status||304===n.status)c(r(b.type,a));else{var g=Error(n.responseText),e;for(e in a)g[e]= -a[e];d(g)}}catch(f){d(f)}};k&&null!=b.data?n.send(b.data):n.send()});return!0===b.background?A:q(A)},jsonp:function(b,l){var p=k();b=d(b,l);var u=new c(function(c,d){var k=b.callbackName||"_mithril_"+Math.round(1E16*Math.random())+"_"+q++,l=a.document.createElement("script");a[k]=function(d){l.parentNode.removeChild(l);c(r(b.type,d));delete a[k]};l.onerror=function(){l.parentNode.removeChild(l);d(Error("JSONP request failed"));delete a[k]};null==b.data&&(b.data={});b.url=h(b.url,b.data);b.data[b.callbackKey|| -"callback"]=k;l.src=m(b.url,b.data);a.document.documentElement.appendChild(l)});return!0===b.background?u:p(u)},setCompletionCallback:function(a){u=a}}}(window,w),M=function(a){function c(g,e,a,b,c,d,h){for(;a=t&&A>=n;){var y=e[t],v=a[n];if(y!==v||f)if(null==y)t++;else if(null==v)n++;else if(y.key===v.key)t++,n++,m(g,y,v,b,p(e,t,d),f,h),f&&y.tag===v.tag&&r(g,l(y),d);else if(y=e[q],y!==v||f)if(null==y)q--;else if(null==v)n++;else if(y.key===v.key)m(g,y,v,b,p(e, -q+1,d),f,h),(f||n=t&&A>=n;){y=e[q];v=a[A];if(y!==v||f)if(null==y)q--;else{if(null!=v)if(y.key===v.key)m(g,y,v,b,p(e,q+1,d),f,h),f&&y.tag===v.tag&&r(g,l(y),d),null!=y.dom&&(d=y.dom),q--;else{if(!z){z=e;var y=q,C={},x;for(x=0;xb.indexOf("?")?"?":"&";b+=d+c}return b}function l(b){try{return""!==b?JSON.parse(b):null}catch(z){throw Error(b);}} +function p(b){return b.responseText}function u(b,a){if("function"===typeof b)if(Array.isArray(a))for(var c=0;cq.status||304===q.status)c(u(b.type,a));else{var g=Error(q.responseText),e;for(e in a)g[e]= +a[e];d(g)}}catch(f){d(f)}};k&&null!=b.data?q.send(b.data):q.send()});return!0===b.background?z:r(z)},jsonp:function(b,l){var p=k();b=d(b,l);var v=new c(function(c,d){var k=b.callbackName||"_mithril_"+Math.round(1E16*Math.random())+"_"+r++,l=a.document.createElement("script");a[k]=function(d){l.parentNode.removeChild(l);c(u(b.type,d));delete a[k]};l.onerror=function(){l.parentNode.removeChild(l);d(Error("JSONP request failed"));delete a[k]};null==b.data&&(b.data={});b.url=h(b.url,b.data);b.data[b.callbackKey|| +"callback"]=k;l.src=n(b.url,b.data);a.document.documentElement.appendChild(l)});return!0===b.background?v:p(v)},setCompletionCallback:function(a){v=a}}}(window,m),M=function(a){function c(g,e,a,b,c,d,h){for(;a=t&&z>=q;){var y=e[t],w=a[q];if(y!==w||f)if(null==y)t++;else if(null==w)q++;else if(y.key===w.key)t++,q++,n(g,y,w,b,p(e,t,d),f,h),f&&y.tag===w.tag&&u(g,l(y),d);else if(y=e[r],y!==w||f)if(null==y)r--;else if(null==w)q++;else if(y.key===w.key)n(g,y,w,b,p(e, +r+1,d),f,h),(f||q=t&&z>=q;){y=e[r];w=a[z];if(y!==w||f)if(null==y)r--;else{if(null!=w)if(y.key===w.key)n(g,y,w,b,p(e,r+1,d),f,h),f&&y.tag===w.tag&&u(g,l(y),d),null!=y.dom&&(d=y.dom),r--;else{if(!D){D=e;var y=r,B={},m;for(m=0;m