Skip to content

Commit

Permalink
more WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
krisselden committed May 3, 2016
1 parent b9016ae commit a984954
Show file tree
Hide file tree
Showing 11 changed files with 447 additions and 392 deletions.
8 changes: 4 additions & 4 deletions packages/ember-metal/lib/core.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import require from 'require';
import { context } from 'ember-environment';
import {
getErrorHandler,
setErrorHandler
getOnerror,
setOnerror
} from 'ember-metal/error_handler';

/**
Expand Down Expand Up @@ -65,8 +65,8 @@ Ember.runInDebug = debugModule.runInDebug;
@public
*/
Object.defineProperty(Ember, 'onerror', {
get: getErrorHandler,
set: setErrorHandler,
get: getOnerror,
set: setOnerror,
enumerable: false
});

Expand Down
50 changes: 45 additions & 5 deletions packages/ember-metal/lib/error_handler.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,49 @@
let errorHandler;
import Logger from 'ember-console';

export function getErrorHandler() {
return errorHandler;
const stack = [];

let onerror;
// Ember.onerror getter
export function getOnerror() {
return onerror;
}
// Ember.onerror setter
export function setOnerror(handler) {
onerror = handler;
}

// dispatch error
export function dispatchError(error) {
let i = stack.length - 1;
function next(error) {
let handler = i === -1 ? defaultHanlder : stack[i];
i--;
handler(error, next);
}
return next(error);
}

// push a handler onto the stack of handlers
// handler: (error, next) => { handle or next(error) }
export function addHandler(fn) {
let i = stack.indexOf(fn);
if (i === -1) {
stack.push(fn);
}
}
export function removeHandler(fn) {
let i = stack.indexOf(fn);
if (i > -1) {
stack.splice(i, 1);
}
}

export function setErrorHandler(handler) {
errorHandler = handler;
// dispatches to onerror or logs
function defaultHanlder(error) {
if (onerror) {
onerror(error);
} else {
// existing behavior, why don't we throw here?
Logger.error(error.stack);
}
}
8 changes: 4 additions & 4 deletions packages/ember-metal/lib/run_loop.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { assert } from 'ember-metal/debug';
import { isTesting } from 'ember-metal/testing';
import {
getErrorHandler,
setErrorHandler
getOnerror,
setOnerror
} from 'ember-metal/error_handler';
import {
GUID_KEY
Expand All @@ -23,10 +23,10 @@ function onEnd(current, next) {

const onErrorTarget = {
get onerror() {
return getErrorHandler();
return getOnerror();
},
set onerror(handler) {
return setErrorHandler(handler);
return setOnerror(handler);
}
};

Expand Down
14 changes: 13 additions & 1 deletion packages/ember-metal/lib/testing.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
import { addHandler, removeHandler } from './error_handler';

let testing = false;

export function isTesting() {
return testing;
}

function testHandler(error) {
throw error;
}

export function setTesting(value) {
testing = !!value;
if (value) {
testing = true;
addHandler(testHandler);
} else {
testing = false;
removeHandler(testHandler);
}
}
6 changes: 3 additions & 3 deletions packages/ember-metal/tests/run_loop/onerror_test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import run from 'ember-metal/run_loop';
import { setErrorHandler } from 'ember-metal/error_handler';
import { setOnerror } from 'ember-metal/error_handler';

QUnit.module('system/run_loop/onerror_test');

Expand All @@ -20,11 +20,11 @@ QUnit.test('With Ember.onerror set, errors in Ember.run are caught', function ()
var thrown = new Error('Boom!');
var caught;

setErrorHandler(error => { caught = error; });
setOnerror(error => { caught = error; });

run(() => { throw thrown; });

deepEqual(caught, thrown);

setErrorHandler(undefined);
setOnerror(undefined);
});
85 changes: 33 additions & 52 deletions packages/ember-runtime/lib/ext/rsvp.js
Original file line number Diff line number Diff line change
@@ -1,41 +1,16 @@
import Ember from 'ember-metal/core'; // Ember.Test
import require, { has } from 'require';
import { isTesting } from 'ember-metal/testing';
import { getErrorHandler } from 'ember-metal/error_handler';
import { assert } from 'ember-metal/debug';
import Logger from 'ember-console';

import run from 'ember-metal/run_loop';
import * as RSVP from 'rsvp';

var testModuleName = 'ember-testing/test';
var Test;

var asyncStart = function() {
if (Ember.Test && Ember.Test.adapter) {
Ember.Test.adapter.asyncStart();
}
};

var asyncEnd = function() {
if (Ember.Test && Ember.Test.adapter) {
Ember.Test.adapter.asyncEnd();
}
};
import run from 'ember-metal/run_loop';
import { assert } from 'ember-metal/debug';
import { dispatchError } from 'ember-metal/error_handler';

RSVP.configure('async', function(callback, promise) {
var async = !run.currentRunLoop;

if (isTesting() && async) { asyncStart(); }

run.backburner.schedule('actions', function() {
if (isTesting() && async) { asyncEnd(); }
callback(promise);
});
run.backburner.schedule('actions', () => callback(promise));
});

//let Test;

export function onerrorDefault(reason) {
var error;
let error;

if (reason && reason.errorThrown) {
// jqXHR provides this
Expand All @@ -56,33 +31,39 @@ export function onerrorDefault(reason) {
return;
}

let onerror = getErrorHandler();
// seems like we should turn this into an error too?
if (error && error.name !== 'TransitionAborted') {
if (isTesting()) {
// ES6TODO: remove when possible
if (!Test && has(testModuleName)) {
Test = require(testModuleName)['default'];
}

if (Test && Test.adapter) {
Test.adapter.exception(error);
Logger.error(error.stack);
} else {
throw error;
}
} else if (onerror) {
onerror(error);
} else {
Logger.error(error.stack);
}
dispatchError(error);
}
// let onerror = getOnerror();
// if (error && error.name !== 'TransitionAborted') {
// if (isTesting()) {
// // ES6TODO: remove when possible
// if (!Test && has(testModuleName)) {
// Test = require(testModuleName)['default'];
// }

// if (Test && Test.adapter) {
// Test.adapter.exception(error);
// Logger.error(error.stack);
// } else {
// throw error;
// }
// } else if (onerror) {
// onerror(error);
// } else {
// Logger.error(error.stack);
// }
// }
}

export function after (cb) {
run.schedule(run.queues[run.queues.length - 1], cb);
export function after(cb) {
run.backburner.schedule('rsvpAfter', null, cb);
}

RSVP.on('error', onerrorDefault);
RSVP.configure('after', after);

run._addQueue('rsvpAfter', 'destroy');

export default RSVP;
Loading

0 comments on commit a984954

Please sign in to comment.