Skip to content
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
28 changes: 25 additions & 3 deletions src/loaders/LoadingManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,10 @@ class LoadingManager {
/**
* Used for aborting ongoing requests in loaders using this manager.
*
* @type {AbortController}
* @private
* @type {AbortController | null}
*/
this.abortController = new AbortController();
this._abortController = null;

/**
* This should be called by any loader using the manager when the loader
Expand Down Expand Up @@ -285,15 +286,36 @@ class LoadingManager {
*/
this.abort = function () {


this.abortController.abort();
this.abortController = new AbortController();
this._abortController = null;

return this;

};

}

// TODO: Revert this back to a single member variable once this issue has been fixed
// https://github.com/cloudflare/workerd/issues/3657

/**
* Used for aborting ongoing requests in loaders using this manager.
*
* @type {AbortController}
*/
get abortController() {

if ( ! this._abortController ) {

this._abortController = new AbortController();

}

return this._abortController;

}

}

/**
Expand Down
50 changes: 50 additions & 0 deletions test/unit/src/loaders/LoadingManager.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,56 @@ export default QUnit.module( 'Loaders', () => {

} );

QUnit.test( 'abortController - lazy instantiation', ( assert ) => {

const loadingManager = new LoadingManager();

assert.equal( loadingManager._abortController, null, '_abortController is initially null.' );

const controller = loadingManager.abortController;

assert.ok( controller instanceof AbortController, 'abortController returns an AbortController instance.' );
assert.equal( loadingManager._abortController, controller, '_abortController is set after first access.' );

const controller2 = loadingManager.abortController;
assert.equal( controller, controller2, 'Subsequent accesses return the same AbortController instance.' );

} );

QUnit.test( 'abort() - aborts controller and resets', ( assert ) => {

const loadingManager = new LoadingManager();

const controller = loadingManager.abortController;

assert.ok( ! controller.signal.aborted, 'Controller signal is not aborted initially.' );

loadingManager.abort();

assert.ok( controller.signal.aborted, 'Controller signal is aborted after calling abort().' );
assert.equal( loadingManager._abortController, null, '_abortController is reset to null after abort().' );

} );

QUnit.test( 'abortController - recreation after abort', ( assert ) => {

const loadingManager = new LoadingManager();

const controller1 = loadingManager.abortController;

loadingManager.abort();

assert.ok( controller1.signal.aborted, 'First controller is aborted.' );
assert.equal( loadingManager._abortController, null, '_abortController is null after abort.' );

const controller2 = loadingManager.abortController;

assert.ok( controller2 instanceof AbortController, 'New AbortController is created.' );
assert.notEqual( controller1, controller2, 'New controller is a different instance from the aborted one.' );
assert.ok( ! controller2.signal.aborted, 'New controller signal is not aborted.' );

} );

} );

} );