Skip to content

Commit 5c31206

Browse files
committed
Fixed hash routing hanging for malformed routes.
1 parent aa44c15 commit 5c31206

File tree

2 files changed

+48
-12
lines changed

2 files changed

+48
-12
lines changed

aris.js

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,10 @@
214214
"use strict";
215215

216216
var document = window.document;
217-
var gcs = window.getComputedStyle;
217+
var gcs = function (x) { return window.getComputedStyle(x) };
218218
var isUndefined = function (x) { return typeof(x) == 'undefined'; };
219219

220-
var noBrowser = isUndefined(document) || isUndefined(gcs);
220+
var noBrowser = isUndefined(document);
221221

222222
var toSet = function (s) {
223223
for (var d = {}, i = (s = s.split(',')).length; i--;) d[s[i]] = 1;
@@ -236,9 +236,6 @@
236236
var stringTrimRe = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
237237
var splitWordsRe = /(?:(?:^|[A-Z])[a-z]+|[0-9]+|[A-Za-z]+)/g;
238238

239-
var hashPopRe = /(?:(^\/)|\/)[^\/]+[\/]*$/; // $1
240-
var hashResolveRe = /^#\/?|(\/)(?:\.?\/)+|(?:(?!\.\.?)[^\/])+\/\.\.(?:\/|$)|([^\^])\/+$/;
241-
var hashCompsRe = /(?:(^|\/)(:?)([^\/]+))/g;
242239
var locationPathPopRe = /((^|\/)[^\/]*)$/;
243240
var htmlTagRe = /^[\w]+$/;
244241

@@ -854,8 +851,29 @@
854851
svgPath[c] = svgPathAppender(c);
855852

856853
HTML.SVG.Path = svgPath;
854+
855+
var onceDones = {};
856+
var once = function (k, t, f) {
857+
if (onceDones[k]) {
858+
if (isFunction(f)) f();
859+
return false;
860+
} else {
861+
onceDones[k] = 1;
862+
if (isFunction(t)) t();
863+
}
864+
return true;
865+
};
866+
once.clear = function (k) {
867+
delete onceDones[k];
868+
return once;
869+
};
870+
HTML.once = once;
871+
872+
var hashPopRe = /(?:(^\/)|\/)[^\/]+[\/]*$/; // $1
873+
var hashResolveRe = /^#?\/?|(\/)(?:\.?\/)+|(?:(?!\.\.?)[^\/])+\/\.\.(?:\/|$)|([^\^])\/+$/;
874+
var hashCompsRe = /(?:(^|\/)(:?)([^\/]+))/g;
857875

858-
var routes = {}, savedRoutes = {}, routesInited = 0, refreshable = 0;
876+
var routes = {}, savedRoutes = {}, routesInited = 0, refreshable = 0, visited = [];
859877

860878
var hashResolve = function (h) {
861879
for (var p, t = 1; t; ) {
@@ -865,9 +883,18 @@
865883
}
866884
return h;
867885
};
886+
var setVisited = function (p) {
887+
if (visited.length < 1) {
888+
setTimeout(function () {
889+
visited = [];
890+
}, 60);
891+
}
892+
visited.push(p);
893+
}
894+
868895
//HTML.hashResolve = hashResolve;
869896
var execRoute = function (h, s) {
870-
var p = '', j, c, m, a = hashResolve(h);
897+
var p = '', j, c, m, a = hashResolve(h), t = h.length;
871898
while (m = hashCompsRe.exec(a)) {
872899
p += m[1];
873900
c = m[3];
@@ -876,13 +903,24 @@
876903
if (!s) savedRoutes[p] = c;
877904
p += c;
878905
}
879-
for (j = p; j; j = j.replace(hashPopRe, '$1')) {
906+
for (j = p; j && t > 0; j = j.replace(hashPopRe, '$1')) {
880907
if (routes[j]) {
881908
p = j;
882909
j = '';
883910
}
911+
--t;
912+
}
913+
if (!s && isFunction(c = routes[p])) {
914+
if (visited.indexOf(p) < 0) {
915+
setVisited(p);
916+
c();
917+
} else {
918+
var v = h.replace('/:', '/');
919+
if (v != h && visited.indexOf(v) < 0) {
920+
execRoute(v);
921+
}
922+
}
884923
}
885-
if (!s && isFunction(c = routes[p])) c();
886924
return p;
887925
};
888926

@@ -938,8 +976,6 @@
938976
// HTML.route('a', fn).route('b', fn)
939977
return HTML;
940978
}
941-
// If no args are provided,
942-
// return the window.location.hash splitted.
943979
return routes[execRoute(hashResolve(r), 1)];
944980
};
945981

0 commit comments

Comments
 (0)