diff --git a/packages/ember-routing/lib/system/router.js b/packages/ember-routing/lib/system/router.js index 9a7d44a63a0..fd2e97c1d57 100644 --- a/packages/ember-routing/lib/system/router.js +++ b/packages/ember-routing/lib/system/router.js @@ -612,16 +612,7 @@ var defaultActionHandlers = { return; } - var errorArgs = ['Error while processing route: ' + transition.targetName]; - - if (error) { - if (error.message) { errorArgs.push(error.message); } - if (error.stack) { errorArgs.push(error.stack); } - - if (typeof error === "string") { errorArgs.push(error); } - } - - Ember.Logger.error.apply(this, errorArgs); + logError(error, 'Error while processing route: ' + transition.targetName); }, loading: function(transition, originRoute) { @@ -652,6 +643,21 @@ var defaultActionHandlers = { } }; +function logError(error, initialMessage) { + var errorArgs = []; + + if (initialMessage) { errorArgs.push(initialMessage); } + + if (error) { + if (error.message) { errorArgs.push(error.message); } + if (error.stack) { errorArgs.push(error.stack); } + + if (typeof error === "string") { errorArgs.push(error); } + } + + Ember.Logger.error.apply(this, errorArgs); +} + function findChildRouteName(parentRoute, originatingChildRoute, name) { var router = parentRoute.router; var childName; @@ -833,7 +839,7 @@ function listenForTransitionErrors(transition) { } else if (error.name === 'TransitionAborted') { // just ignore TransitionAborted here } else { - throw error; + logError(error); } return error; diff --git a/packages/ember/tests/routing/basic_test.js b/packages/ember/tests/routing/basic_test.js index 1835b4922db..17249e08e4d 100644 --- a/packages/ember/tests/routing/basic_test.js +++ b/packages/ember/tests/routing/basic_test.js @@ -3,7 +3,7 @@ import { forEach } from "ember-metal/enumerable_utils"; import { get } from "ember-metal/property_get"; import { set } from "ember-metal/property_set"; -var Router, App, AppView, templates, router, container; +var Router, App, AppView, templates, router, container, originalLoggerError; var compile = Ember.Handlebars.compile; function bootApplication() { @@ -68,6 +68,8 @@ QUnit.module("Basic Routing", { Ember.TEMPLATES.home = compile("

Hours

"); Ember.TEMPLATES.homepage = compile("

Megatroll

{{home}}

"); Ember.TEMPLATES.camelot = compile('

Is a silly place

'); + + originalLoggerError = Ember.Logger.error; }); }, @@ -77,6 +79,7 @@ QUnit.module("Basic Routing", { App = null; Ember.TEMPLATES = {}; + Ember.Logger.error = originalLoggerError; }); } }); @@ -3080,8 +3083,7 @@ test("Redirecting with null model doesn't error out", function() { test("rejecting the model hooks promise with a non-error prints the `message` property", function() { var rejectedMessage = 'OMG!! SOOOOOO BAD!!!!', - rejectedStack = 'Yeah, buddy: stack gets printed too.', - originalLoggerError = Ember.Logger.error; + rejectedStack = 'Yeah, buddy: stack gets printed too.'; Router.map(function() { this.route("yippie", { path: "/" }); @@ -3100,13 +3102,9 @@ test("rejecting the model hooks promise with a non-error prints the `message` pr }); bootApplication(); - - Ember.Logger.error = originalLoggerError; }); test("rejecting the model hooks promise with no reason still logs error", function() { - var originalLoggerError = Ember.Logger.error; - Router.map(function() { this.route("wowzers", { path: "/" }); }); @@ -3122,8 +3120,6 @@ test("rejecting the model hooks promise with no reason still logs error", functi }); bootApplication(); - - Ember.Logger.error = originalLoggerError; }); test("rejecting the model hooks promise with a string shows a good error", function() { @@ -3245,6 +3241,9 @@ if (Ember.FEATURES.isEnabled('ember-routing-consistent-resources')) { } test("Errors in transitionTo within redirect hook are logged", function() { + expect(2); + var actual = []; + Router.map(function() { this.route('yondo', { path: "/" }); this.route('stink-bomb'); @@ -3256,12 +3255,34 @@ test("Errors in transitionTo within redirect hook are logged", function() { } }); - raises(function() { - bootApplication(); - }, - /More context objects were passed than there are dynamic segments for the route: stink-bomb/); + Ember.Logger.error = function(message) { + actual.push(message); + }; + + bootApplication(); + + equal(actual[0], 'Error while processing route: yondo', 'source route is printed'); + ok(actual[1].match(/More context objects were passed than there are dynamic segments for the route: stink-bomb/), 'the error is printed'); }); +test("Errors in transition show error template if available", function() { + Ember.TEMPLATES.error = compile("
Error!
"); + + Router.map(function() { + this.route('yondo', { path: "/" }); + this.route('stink-bomb'); + }); + + App.YondoRoute = Ember.Route.extend({ + redirect: function(){ + this.transitionTo('stink-bomb', {something: 'goes boom'}); + } + }); + + bootApplication(); + + equal(Ember.$('#error').length, 1, "Error template was rendered."); +}); if (Ember.FEATURES.isEnabled("query-params-new")) { test("Route#resetController gets fired when changing models and exiting routes", function() {