Skip to content

Commit

Permalink
Core: Re-throw errors that happened in callbacks wrapped in jQuery ready
Browse files Browse the repository at this point in the history
Also, expose jQuery.readyException that allows to overwrite the default
ready error handler.

Fixes jquerygh-3174
Closes jquerygh-3210
  • Loading branch information
mgol committed Jul 7, 2016
1 parent 25d8ccd commit ad6a94c
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 2 deletions.
11 changes: 10 additions & 1 deletion src/core/ready.js
@@ -1,6 +1,7 @@
define( [
"../core",
"../var/document",
"../core/readyException",
"../deferred"
], function( jQuery, document ) {

Expand All @@ -11,7 +12,15 @@ var readyList = jQuery.Deferred();

jQuery.fn.ready = function( fn ) {

readyList.then( fn );
readyList
.then( fn )

// Wrap jQuery.readyException in a function so that the lookup
// happens at the time of error handling instead of callback
// registration.
.catch( function( error ) {
jQuery.readyException( error );
} );

return this;
};
Expand Down
13 changes: 13 additions & 0 deletions src/core/readyException.js
@@ -0,0 +1,13 @@
define( [
"../core"
], function( jQuery ) {

"use strict";

jQuery.readyException = function( error ) {
window.setTimeout( function() {
throw error;
} );
};

} );
52 changes: 51 additions & 1 deletion test/unit/core.js
@@ -1,4 +1,12 @@
QUnit.module( "core", { teardown: moduleTeardown } );
QUnit.module( "core", {
setup: function() {
this.sandbox = sinon.sandbox.create();
},
teardown: function() {
this.sandbox.restore();
return moduleTeardown.apply( this, arguments );
}
} );

QUnit.test( "Basic requirements", function( assert ) {
assert.expect( 7 );
Expand Down Expand Up @@ -1709,3 +1717,45 @@ QUnit.test( "Iterability of jQuery objects (gh-1693)", function( assert ) {
assert.ok( true, "The browser doesn't support Symbols" );
}
} );

QUnit[ jQuery.Deferred ? "test" : "skip" ]( "jQuery.readyException (original)", function( assert ) {
assert.expect( 1 );

var message;

this.sandbox.stub( window, "setTimeout", function( fn ) {
try {
fn();
} catch ( error ) {
message = error.message;
}
} );

jQuery( function() {
throw new Error( "Error in jQuery ready" );
} );
assert.strictEqual(
message,
"Error in jQuery ready",
"The error should have been thrown in a timeout"
);
} );

QUnit[ jQuery.Deferred ? "test" : "skip" ]( "jQuery.readyException (custom)", function( assert ) {
assert.expect( 1 );

var done = assert.async();

this.sandbox.stub( jQuery, "readyException", function( error ) {
assert.strictEqual(
error.message,
"Error in jQuery ready",
"The custom jQuery.readyException should have been called"
);
done();
} );

jQuery( function() {
throw new Error( "Error in jQuery ready" );
} );
} );

0 comments on commit ad6a94c

Please sign in to comment.