Skip to content

Commit 5b09bd5

Browse files
committed
Merge pull request #4196 from machty/route-index
[BUGFIX beta] Sync router.js, fix index route issues
2 parents 769f6a5 + 3a1505c commit 5b09bd5

File tree

3 files changed

+70
-60
lines changed

3 files changed

+70
-60
lines changed

packages/ember-routing/lib/helpers/link_to.js

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,6 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
2020
resolvePaths = Ember.Router.resolvePaths,
2121
isSimpleClick = Ember.ViewUtils.isSimpleClick;
2222

23-
function fullRouteName(router, name) {
24-
var nameWithIndex;
25-
if (!router.hasRoute(name)) {
26-
nameWithIndex = name + '.index';
27-
Ember.assert(fmt("The attempt to link-to route '%@' failed (also tried '%@'). " +
28-
"The router did not find '%@' in its possible routes: '%@'",
29-
[name, nameWithIndex, name, Ember.keys(router.router.recognizer.names).join("', '")]),
30-
router.hasRoute(nameWithIndex));
31-
name = nameWithIndex;
32-
}
33-
34-
return name;
35-
}
36-
3723
function getResolvedPaths(options) {
3824

3925
var types = options.options.types,
@@ -299,9 +285,7 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
299285
contexts = routeArgs.slice(1),
300286
resolvedParams = get(this, 'resolvedParams'),
301287
currentWhen = this.currentWhen || resolvedParams[0],
302-
currentWithIndex = currentWhen + '.index',
303-
isActive = router.isActive.apply(router, [currentWhen].concat(contexts)) ||
304-
router.isActive.apply(router, [currentWithIndex].concat(contexts));
288+
isActive = router.isActive.apply(router, [currentWhen].concat(contexts));
305289

306290
if (isActive) { return get(this, 'activeClass'); }
307291
}).property('resolvedParams', 'routeArgs'),
@@ -445,7 +429,11 @@ Ember.onLoad('Ember.Handlebars', function(Handlebars) {
445429

446430
if (!namedRoute) { return; }
447431

448-
namedRoute = fullRouteName(router, namedRoute);
432+
Ember.assert(fmt("The attempt to link-to route '%@' failed. " +
433+
"The router did not find '%@' in its possible routes: '%@'",
434+
[namedRoute, namedRoute, Ember.keys(router.router.recognizer.names).join("', '")]),
435+
router.hasRoute(namedRoute));
436+
449437
resolvedParams[0] = namedRoute;
450438

451439
for (var i = 1, len = resolvedParams.length; i < len; ++i) {

packages/ember-routing/lib/system/router.js

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -287,26 +287,21 @@ Ember.Router = Ember.Object.extend(Ember.Evented, {
287287
args = slice.call(args);
288288
args[0] = args[0] || '/';
289289

290-
var passedName = args[0], name, self = this,
290+
var name = args[0], self = this,
291291
isQueryParamsOnly = false, queryParams;
292292

293293
if (Ember.FEATURES.isEnabled("query-params-new")) {
294294
if (args[args.length - 1].hasOwnProperty('queryParams')) {
295295
if (args.length === 1) {
296296
isQueryParamsOnly = true;
297+
name = null;
297298
}
298299
queryParams = args[args.length - 1].queryParams;
299300
}
300301
}
301302

302-
if (!isQueryParamsOnly && passedName.charAt(0) !== '/') {
303-
if (!this.router.hasRoute(passedName)) {
304-
name = args[0] = passedName + '.index';
305-
} else {
306-
name = passedName;
307-
}
308-
309-
Ember.assert("The route " + passedName + " was not found", this.router.hasRoute(name));
303+
if (!isQueryParamsOnly && name.charAt(0) !== '/') {
304+
Ember.assert("The route " + name + " was not found", this.router.hasRoute(name));
310305
}
311306

312307
if (queryParams) {
@@ -380,7 +375,6 @@ Ember.Router = Ember.Object.extend(Ember.Evented, {
380375
_queryParamNamesFor: function(routeName) {
381376

382377
// TODO: add caching
383-
routeName = this.router.hasRoute(routeName) ? routeName : routeName + '.index';
384378

385379
var handlerInfos = this.router.recognizer.handlersFor(routeName);
386380
var result = { queryParams: Ember.create(null), translations: Ember.create(null), validQueryParams: Ember.create(null) };
@@ -756,7 +750,7 @@ Ember.Router.reopenClass({
756750
var regex = /\[(.+)\]/,
757751
result = param.match(regex);
758752

759-
if (!result) {
753+
if (!result) {
760754
result = param;
761755
} else {
762756
result = result[1];

packages/ember-routing/lib/vendor/router.js

Lines changed: 59 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ define("router/handler-info",
66
var merge = __dependency1__.merge;
77
var oCreate = __dependency1__.oCreate;
88
var serialize = __dependency1__.serialize;
9+
var promiseLabel = __dependency1__.promiseLabel;
910
var resolve = __dependency2__.resolve;
1011

1112
function HandlerInfo(props) {
@@ -26,21 +27,26 @@ define("router/handler-info",
2627
}
2728
},
2829

30+
promiseLabel: function(label) {
31+
return promiseLabel("'" + this.name + "' " + label);
32+
},
33+
2934
resolve: function(async, shouldContinue, payload) {
3035
var checkForAbort = bind(this.checkForAbort, this, shouldContinue),
3136
beforeModel = bind(this.runBeforeModelHook, this, async, payload),
3237
model = bind(this.getModel, this, async, payload),
3338
afterModel = bind(this.runAfterModelHook, this, async, payload),
3439
becomeResolved = bind(this.becomeResolved, this, payload);
3540

36-
return resolve().then(checkForAbort)
37-
.then(beforeModel)
38-
.then(checkForAbort)
39-
.then(model)
40-
.then(checkForAbort)
41-
.then(afterModel)
42-
.then(checkForAbort)
43-
.then(becomeResolved);
41+
return resolve(undefined, this.promiseLabel("Start handler"))
42+
.then(checkForAbort, null, this.promiseLabel("Check for abort"))
43+
.then(beforeModel, null, this.promiseLabel("Before model"))
44+
.then(checkForAbort, null, this.promiseLabel("Check if aborted during 'beforeModel' hook"))
45+
.then(model, null, this.promiseLabel("Model"))
46+
.then(checkForAbort, null, this.promiseLabel("Check if aborted in 'model' hook"))
47+
.then(afterModel, null, this.promiseLabel("After model"))
48+
.then(checkForAbort, null, this.promiseLabel("Check if aborted in 'afterModel' hook"))
49+
.then(becomeResolved, null, this.promiseLabel("Become resolved"));
4450
},
4551

4652
runBeforeModelHook: function(async, payload) {
@@ -63,7 +69,7 @@ define("router/handler-info",
6369
// Return the value stashed in resolvedModels, which
6470
// might have been swapped out in afterModel.
6571
return payload.resolvedModels[name];
66-
});
72+
}, null, this.promiseLabel("Ignore fulfillment value and return model value"));
6773
},
6874

6975
runSharedModelHook: function(async, payload, hookName, args) {
@@ -77,19 +83,19 @@ define("router/handler-info",
7783
var handler = this.handler;
7884
return async(function() {
7985
return handler[hookName] && handler[hookName].apply(handler, args);
80-
});
86+
}, this.promiseLabel("Handle " + hookName));
8187
},
8288

8389
getModel: function(payload) {
8490
throw new Error("This should be overridden by a subclass of HandlerInfo");
8591
},
8692

8793
checkForAbort: function(shouldContinue, promiseValue) {
88-
return resolve(shouldContinue()).then(function() {
94+
return resolve(shouldContinue(), this.promiseLabel("Check for abort")).then(function() {
8995
// We don't care about shouldContinue's resolve value;
9096
// pass along the original value passed to this fn.
9197
return promiseValue;
92-
});
98+
}, null, this.promiseLabel("Ignore fulfillment value and continue"));
9399
},
94100

95101
stashResolvedModel: function(payload, resolvedModel) {
@@ -140,7 +146,7 @@ define("router/handler-info",
140146
if (payload && payload.resolvedModels) {
141147
payload.resolvedModels[this.name] = this.context;
142148
}
143-
return resolve(this);
149+
return resolve(this, this.promiseLabel("Resolve"));
144150
};
145151

146152
// These are generated by URL transitions and
@@ -222,6 +228,7 @@ define("router/router",
222228
var serialize = __dependency3__.serialize;
223229
var extractQueryParams = __dependency3__.extractQueryParams;
224230
var getChangelist = __dependency3__.getChangelist;
231+
var promiseLabel = __dependency3__.promiseLabel;
225232
var TransitionState = __dependency4__.TransitionState;
226233
var logAbort = __dependency5__.logAbort;
227234
var Transition = __dependency5__.Transition;
@@ -250,10 +257,12 @@ define("router/router",
250257
map: function(callback) {
251258
this.recognizer.delegate = this.delegate;
252259

253-
this.recognizer.map(callback, function(recognizer, route) {
254-
var lastHandler = route[route.length - 1].handler;
255-
var args = [route, { as: lastHandler }];
256-
recognizer.add.apply(recognizer, args);
260+
this.recognizer.map(callback, function(recognizer, routes) {
261+
for (var i = routes.length - 1, proceed = true; i >= 0 && proceed; --i) {
262+
var route = routes[i];
263+
recognizer.add(routes, { as: route.handler });
264+
proceed = route.path === '/' || route.path === '' || route.handler.slice(-6) === '.index';
265+
}
257266
});
258267
},
259268

@@ -308,7 +317,7 @@ define("router/router",
308317
router.didTransition(router.currentHandlerInfos);
309318
}
310319
return result;
311-
});
320+
}, null, promiseLabel("Transition complete"));
312321
return newTransition;
313322
}
314323
}
@@ -337,8 +346,8 @@ define("router/router",
337346
newTransition.promise = newTransition.promise.then(function(result) {
338347
return router.async(function() {
339348
return finalizeTransition(newTransition, result.state);
340-
});
341-
});
349+
}, "Finalize transition");
350+
}, null, promiseLabel("Settle transition promise when transition is finalized"));
342351

343352
if (!wasTransitioning) {
344353
trigger(this, this.state.handlerInfos, true, ['willTransition', newTransition]);
@@ -532,7 +541,7 @@ define("router/router",
532541

533542
var newState = intent.applyToHandlers(state, recogHandlers, this.getHandler, targetHandler, true, true);
534543

535-
return handlerInfosEqual(newState.handlerInfos, state.handlerInfos) &&
544+
return handlerInfosEqual(newState.handlerInfos, state.handlerInfos) &&
536545
!getChangelist(activeQueryParams, queryParams);
537546
},
538547

@@ -553,10 +562,10 @@ define("router/router",
553562
@return {Promise} a promise that fulfills with the
554563
value returned from the callback
555564
*/
556-
async: function(callback) {
565+
async: function(callback, label) {
557566
return new Promise(function(resolve) {
558567
resolve(callback());
559-
});
568+
}, label);
560569
},
561570

562571
/**
@@ -1217,6 +1226,7 @@ define("router/transition-state",
12171226
"use strict";
12181227
var ResolvedHandlerInfo = __dependency1__.ResolvedHandlerInfo;
12191228
var forEach = __dependency2__.forEach;
1229+
var promiseLabel = __dependency2__.promiseLabel;
12201230
var resolve = __dependency3__.resolve;
12211231

12221232
function TransitionState(other) {
@@ -1230,8 +1240,19 @@ define("router/transition-state",
12301240
queryParams: null,
12311241
params: null,
12321242

1233-
resolve: function(async, shouldContinue, payload) {
1243+
promiseLabel: function(label) {
1244+
var targetName = '';
1245+
forEach(this.handlerInfos, function(handlerInfo) {
1246+
if (targetName !== '') {
1247+
targetName += '.';
1248+
}
1249+
targetName += handlerInfo.name;
1250+
});
1251+
return promiseLabel("'" + targetName + "': " + label);
1252+
},
12341253

1254+
resolve: function(async, shouldContinue, payload) {
1255+
var self = this;
12351256
// First, calculate params for this state. This is useful
12361257
// information to provide to the various route hooks.
12371258
var params = this.params;
@@ -1246,16 +1267,17 @@ define("router/transition-state",
12461267
var wasAborted = false;
12471268

12481269
// The prelude RSVP.resolve() asyncs us into the promise land.
1249-
return resolve().then(resolveOneHandlerInfo)['catch'](handleError);
1270+
return resolve(null, this.promiseLabel("Start transition"))
1271+
.then(resolveOneHandlerInfo, null, this.promiseLabel('Resolve handler'))['catch'](handleError, this.promiseLabel('Handle error'));
12501272

12511273
function innerShouldContinue() {
1252-
return resolve(shouldContinue())['catch'](function(reason) {
1274+
return resolve(shouldContinue(), promiseLabel("Check if should continue"))['catch'](function(reason) {
12531275
// We distinguish between errors that occurred
12541276
// during resolution (e.g. beforeModel/model/afterModel),
12551277
// and aborts due to a rejecting promise from shouldContinue().
12561278
wasAborted = true;
12571279
throw reason;
1258-
});
1280+
}, promiseLabel("Handle abort"));
12591281
}
12601282

12611283
function handleError(error) {
@@ -1285,7 +1307,7 @@ define("router/transition-state",
12851307

12861308
// Proceed after ensuring that the redirect hook
12871309
// didn't abort this transition by transitioning elsewhere.
1288-
return innerShouldContinue().then(resolveOneHandlerInfo);
1310+
return innerShouldContinue().then(resolveOneHandlerInfo, null, promiseLabel('Resolve handler'));
12891311
}
12901312

12911313
function resolveOneHandlerInfo() {
@@ -1301,7 +1323,7 @@ define("router/transition-state",
13011323
var handlerInfo = currentState.handlerInfos[payload.resolveIndex];
13021324

13031325
return handlerInfo.resolve(async, innerShouldContinue, payload)
1304-
.then(proceed);
1326+
.then(proceed, null, promiseLabel('Proceed'));
13051327
}
13061328
}
13071329
};
@@ -1318,6 +1340,7 @@ define("router/transition",
13181340
var trigger = __dependency3__.trigger;
13191341
var slice = __dependency3__.slice;
13201342
var log = __dependency3__.log;
1343+
var promiseLabel = __dependency3__.promiseLabel;
13211344

13221345
/**
13231346
@private
@@ -1368,15 +1391,15 @@ define("router/transition",
13681391
transition.abort();
13691392
throw result.error;
13701393
}
1371-
});
1394+
}, promiseLabel('Handle Abort'));
13721395
} else {
13731396
this.promise = resolve(this.state);
13741397
this.params = {};
13751398
}
13761399

13771400
function checkForAbort() {
13781401
if (transition.isAborted) {
1379-
return reject();
1402+
return reject(undefined, promiseLabel("Transition aborted - reject"));
13801403
}
13811404
}
13821405
}
@@ -1774,6 +1797,10 @@ define("router/utils",
17741797
return didChange && results;
17751798
}
17761799

1800+
function promiseLabel(label) {
1801+
return 'Router: ' + label;
1802+
}
1803+
17771804
__exports__.trigger = trigger;
17781805
__exports__.log = log;
17791806
__exports__.oCreate = oCreate;
@@ -1786,6 +1813,7 @@ define("router/utils",
17861813
__exports__.serialize = serialize;
17871814
__exports__.getChangelist = getChangelist;
17881815
__exports__.coerceQueryParamsToString = coerceQueryParamsToString;
1816+
__exports__.promiseLabel = promiseLabel;
17891817
});
17901818
define("router",
17911819
["./router/router","exports"],

0 commit comments

Comments
 (0)