Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUGFIX LTS] ensure “pause on exception” pauses in the right place #15600

Merged
merged 4 commits into from
Sep 21, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
"babel-plugin-transform-es2015-template-literals": "^6.22.0",
"babel-plugin-transform-proto-to-assign": "^6.23.0",
"babel-template": "^6.24.1",
"backburner.js": "^1.1.0",
"backburner.js": "^1.2.1",
"broccoli-babel-transpiler": "next",
"broccoli-concat": "^3.2.2",
"broccoli-file-creator": "^1.1.1",
Expand Down
6 changes: 6 additions & 0 deletions packages/ember-metal/lib/error_handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ let getStack = error => {
};

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

// Ember.onerror getter
export function getOnerror() {
return onerror;
Expand Down
20 changes: 5 additions & 15 deletions packages/ember-metal/lib/run_loop.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { GUID_KEY } from 'ember-utils';
import { assert, isTesting } from 'ember-debug';
import {
dispatchError,
setOnerror
onErrorTarget
} from './error_handler';
import {
beginPropertyChanges,
Expand All @@ -18,25 +17,16 @@ function onEnd(current, next) {
run.currentRunLoop = next;
}

const onErrorTarget = {
get onerror() {
return dispatchError;
},
set onerror(handler) {
return setOnerror(handler);
}
};

const backburner = new Backburner(['sync', 'actions', 'destroy'], {
GUID_KEY: GUID_KEY,
GUID_KEY,
sync: {
before: beginPropertyChanges,
after: endPropertyChanges
},
defaultQueue: 'actions',
onBegin: onBegin,
onEnd: onEnd,
onErrorTarget: onErrorTarget,
onBegin,
onEnd,
onErrorTarget,
onErrorMethod: 'onerror'
});

Expand Down
5 changes: 3 additions & 2 deletions packages/ember-metal/tests/run_loop/later_test.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { assign } from 'ember-utils';
import { run, isNone } from '../..';

const originalSetTimeout = window.setTimeout;
Expand Down Expand Up @@ -198,15 +199,15 @@ asyncTest('setTimeout should never run with a negative wait', function() {
// happens when an expired timer callback takes a while to run,
// which is what we simulate here.
let newSetTimeoutUsed;
run.backburner._platform = {
run.backburner._platform = assign({}, originalPlatform, {
setTimeout() {
let wait = arguments[arguments.length - 1];
newSetTimeoutUsed = true;
ok(!isNaN(wait) && wait >= 0, 'wait is a non-negative number');

return originalPlatform.setTimeout.apply(originalPlatform, arguments);
}
};
});

let count = 0;
run(() => {
Expand Down
4 changes: 2 additions & 2 deletions packages/ember-runtime/tests/system/object/create_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -115,9 +115,9 @@ QUnit.test('inherits properties from passed in EmberObject', function() {
});

QUnit.test('throws if you try to pass anything a string as a parameter', function() {
let expected = 'EmberObject.create only accepts an objects.';
let expected = 'Ember.Object.create only accepts objects.';

throws(() => EmberObject.create('some-string'), expected);
expectAssertion(() => EmberObject.create('some-string'), expected);
});

QUnit.test('EmberObject.create can take undefined as a parameter', function() {
Expand Down
93 changes: 93 additions & 0 deletions packages/ember/tests/error_handler_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import Ember from 'ember';
import { run } from 'ember-metal';
import { DEBUG } from 'ember-env-flags';

const ONERROR = Ember.onerror;
const ADAPTER = Ember.Test && Ember.Test.adapter;
const TESTING = Ember.testing;

QUnit.module('error_handler', {
teardown() {
Ember.onerror = ONERROR;
Ember.testing = TESTING;
if (Ember.Test) {
Ember.Test.adapter = ADAPTER;
}
}
});

function runThatThrows(message) {
return run(() => {
throw new Error(message);
});
}

test('by default there is no onerror', function(assert) {
Ember.onerror = undefined;
assert.throws(runThatThrows, Error);
assert.equal(Ember.onerror, undefined);
});

test('when Ember.onerror is registered', function(assert) {
assert.expect(2);
Ember.onerror = function(error) {
assert.ok(true, 'onerror called');
throw error;
};
assert.throws(runThatThrows, Error);
// Ember.onerror = ONERROR;
});

if (DEBUG) {
test('when Ember.Test.adapter is registered', function(assert) {
assert.expect(2);

Ember.Test.adapter = {
exception(error) {
assert.ok(true, 'adapter called');
throw error;
}
};

assert.throws(runThatThrows, Error);
});

test('when both Ember.onerror Ember.Test.adapter are registered', function(assert) {
assert.expect(2);

// takes precedence
Ember.Test.adapter = {
exception(error) {
assert.ok(true, 'adapter called');
throw error;
}
};

Ember.onerror = function(error) {
assert.ok(false, 'onerror was NEVER called');
throw error;
};

assert.throws(runThatThrows, Error);
});
}

QUnit.test('Ember.run does not swallow exceptions by default (Ember.testing = true)', function() {
Ember.testing = true;
let error = new Error('the error');
throws(() => {
Ember.run(() => {
throw error;
});
}, error);
});

QUnit.test('Ember.run does not swallow exceptions by default (Ember.testing = false)', function() {
Ember.testing = false;
let error = new Error('the error');
throws(() => {
Ember.run(() => {
throw error;
});
}, error);
});
Original file line number Diff line number Diff line change
Expand Up @@ -564,7 +564,7 @@ moduleFor('The {{link-to}} helper + query params - globals mode app', class exte
[`@test the {{link-to}} helper throws a useful error if you invoke it wrong`](assert) {
assert.expect(1);

assert.throws(() => {
expectAssertion(() => {
this.runTask(() => {
this.createApplication();

Expand All @@ -574,6 +574,6 @@ moduleFor('The {{link-to}} helper + query params - globals mode app', class exte

this.addTemplate('application', `{{#link-to id='the-link'}}Index{{/link-to}}`);
});
}, /(You must provide one or more parameters to the link-to component.|undefined is not an object)/);
}, /You must provide one or more parameters to the link-to component/);
}
});
});
6 changes: 3 additions & 3 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -870,9 +870,9 @@ backbone@^1.1.2:
dependencies:
underscore ">=1.8.3"

backburner.js@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/backburner.js/-/backburner.js-1.1.0.tgz#16ef021891bc330a2d021c63d8d68cb8611eb3e4"
backburner.js@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/backburner.js/-/backburner.js-1.2.1.tgz#26adfcd4d06adc80f78be010b3ff90bf44fc7790"

[email protected]:
version "1.0.2"
Expand Down