Skip to content

Commit

Permalink
Merge pull request #15871 from rwjblue/revert-14898
Browse files Browse the repository at this point in the history
[BUGFIX lts] Refactor / fix error handling scenarios.
  • Loading branch information
rwjblue committed Nov 28, 2017
2 parents 87efb0a + 0f3f49c commit c099fb0
Show file tree
Hide file tree
Showing 7 changed files with 475 additions and 68 deletions.
33 changes: 1 addition & 32 deletions packages/ember-metal/lib/error_handler.js
@@ -1,22 +1,10 @@
import Logger from 'ember-console';
import { isTesting } from 'ember-debug';

// To maintain stacktrace consistency across browsers
let getStack = error => {
let stack = error.stack;
let message = error.message;

if (stack && stack.indexOf(message) === -1) {
stack = `${message}\n${stack}`;
}

return stack;
};

let onerror;
export const onErrorTarget = {
get onerror() {
return dispatchOverride || onerror;
return onerror;
}
};

Expand All @@ -30,14 +18,6 @@ export function setOnerror(handler) {
}

let dispatchOverride;
// dispatch error
export function dispatchError(error) {
if (dispatchOverride) {
dispatchOverride(error);
} else {
defaultDispatch(error);
}
}

// allows testing adapter to override dispatch
export function getDispatchOverride() {
Expand All @@ -46,14 +26,3 @@ export function getDispatchOverride() {
export function setDispatchOverride(handler) {
dispatchOverride = handler;
}

function defaultDispatch(error) {
if (isTesting()) {
throw error;
}
if (onerror) {
onerror(error);
} else {
Logger.error(getStack(error));
}
}
1 change: 0 additions & 1 deletion packages/ember-metal/lib/index.js
Expand Up @@ -19,7 +19,6 @@ export {
export {
getOnerror,
setOnerror,
dispatchError,
setDispatchOverride,
getDispatchOverride
} from './error_handler';
Expand Down
9 changes: 7 additions & 2 deletions packages/ember-runtime/lib/ext/rsvp.js
@@ -1,7 +1,7 @@
import * as RSVP from 'rsvp';
import {
run,
dispatchError
getDispatchOverride
} from 'ember-metal';
import { assert } from 'ember-debug';

Expand All @@ -21,7 +21,12 @@ RSVP.on('error', onerrorDefault);
export function onerrorDefault(reason) {
let error = errorFor(reason);
if (error) {
dispatchError(error);
let overrideDispatch = getDispatchOverride();
if (overrideDispatch) {
overrideDispatch(error);
} else {
throw error;
}
}
}

Expand Down
4 changes: 1 addition & 3 deletions packages/ember-runtime/tests/ext/rsvp_test.js
Expand Up @@ -46,12 +46,10 @@ QUnit.test('Can reject with non-Error object', function(assert) {
try {
run(RSVP, 'reject', 'foo');
} catch (e) {
ok(false, 'should not throw');
equal(e, 'foo', 'should throw with rejection message');
} finally {
setTesting(wasEmberTesting);
}

ok(true);
});

QUnit.test('Can reject with no arguments', function(assert) {
Expand Down
2 changes: 1 addition & 1 deletion packages/ember-testing/lib/test/adapter.js
Expand Up @@ -8,7 +8,7 @@ export function getAdapter() {

export function setAdapter(value) {
adapter = value;
if (value) {
if (value && typeof value.exception === 'function') {
setDispatchOverride(adapterDispatch);
} else {
setDispatchOverride(null);
Expand Down
19 changes: 13 additions & 6 deletions packages/ember-testing/tests/adapters_test.js
Expand Up @@ -4,12 +4,13 @@ import Adapter from '../adapters/adapter';
import QUnitAdapter from '../adapters/qunit';
import { Application as EmberApplication } from 'ember-application';

var App, originalAdapter, originalQUnit;
var App, originalAdapter, originalQUnit, originalWindowOnerror;

QUnit.module('ember-testing Adapters', {
setup() {
originalAdapter = Test.adapter;
originalQUnit = window.QUnit;
originalWindowOnerror = window.onerror;
},
teardown() {
if (App) {
Expand All @@ -20,6 +21,7 @@ QUnit.module('ember-testing Adapters', {

Test.adapter = originalAdapter;
window.QUnit = originalQUnit;
window.onerror = originalWindowOnerror;
}
});

Expand Down Expand Up @@ -71,17 +73,22 @@ QUnit.test('Adapter is used by default (if QUnit is not available)', function()
ok(!(Test.adapter instanceof QUnitAdapter));
});

QUnit.test('With Ember.Test.adapter set, errors in Ember.run are caught', function () {
QUnit.test('With Ember.Test.adapter set, errors in synchronous Ember.run are bubbled out', function (assert) {
let thrown = new Error('Boom!');

let caught;
let caughtInAdapter, caughtInCatch;
Test.adapter = QUnitAdapter.create({
exception(error) {
caught = error;
caughtInAdapter = error;
}
});

run(() => { throw thrown; });
try {
run(() => { throw thrown; });
} catch(e) {
caughtInCatch = e;
}

deepEqual(caught, thrown);
assert.equal(caughtInAdapter, undefined, 'test adapter should never receive synchronous errors');
assert.equal(caughtInCatch, thrown, 'a "normal" try/catch should catch errors in sync run');
});

0 comments on commit c099fb0

Please sign in to comment.