Skip to content

Commit e6084f9

Browse files
authored
LoadingManager: Lazily instantiate abort controller. (#32120)
* Lazily instantiate `AbortController` in `LoadingManager` * Removed abort controller nullish check * Add basic `LoadingManager` abort controller unit tests * Added TODO to revert `abortController` logic * Mark `_abortController` as private with JSDoc
1 parent b291497 commit e6084f9

File tree

2 files changed

+75
-3
lines changed

2 files changed

+75
-3
lines changed

src/loaders/LoadingManager.js

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,10 @@ class LoadingManager {
7272
/**
7373
* Used for aborting ongoing requests in loaders using this manager.
7474
*
75-
* @type {AbortController}
75+
* @private
76+
* @type {AbortController | null}
7677
*/
77-
this.abortController = new AbortController();
78+
this._abortController = null;
7879

7980
/**
8081
* This should be called by any loader using the manager when the loader
@@ -285,15 +286,36 @@ class LoadingManager {
285286
*/
286287
this.abort = function () {
287288

289+
288290
this.abortController.abort();
289-
this.abortController = new AbortController();
291+
this._abortController = null;
290292

291293
return this;
292294

293295
};
294296

295297
}
296298

299+
// TODO: Revert this back to a single member variable once this issue has been fixed
300+
// https://github.com/cloudflare/workerd/issues/3657
301+
302+
/**
303+
* Used for aborting ongoing requests in loaders using this manager.
304+
*
305+
* @type {AbortController}
306+
*/
307+
get abortController() {
308+
309+
if ( ! this._abortController ) {
310+
311+
this._abortController = new AbortController();
312+
313+
}
314+
315+
return this._abortController;
316+
317+
}
318+
297319
}
298320

299321
/**

test/unit/src/loaders/LoadingManager.tests.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,56 @@ export default QUnit.module( 'Loaders', () => {
121121

122122
} );
123123

124+
QUnit.test( 'abortController - lazy instantiation', ( assert ) => {
125+
126+
const loadingManager = new LoadingManager();
127+
128+
assert.equal( loadingManager._abortController, null, '_abortController is initially null.' );
129+
130+
const controller = loadingManager.abortController;
131+
132+
assert.ok( controller instanceof AbortController, 'abortController returns an AbortController instance.' );
133+
assert.equal( loadingManager._abortController, controller, '_abortController is set after first access.' );
134+
135+
const controller2 = loadingManager.abortController;
136+
assert.equal( controller, controller2, 'Subsequent accesses return the same AbortController instance.' );
137+
138+
} );
139+
140+
QUnit.test( 'abort() - aborts controller and resets', ( assert ) => {
141+
142+
const loadingManager = new LoadingManager();
143+
144+
const controller = loadingManager.abortController;
145+
146+
assert.ok( ! controller.signal.aborted, 'Controller signal is not aborted initially.' );
147+
148+
loadingManager.abort();
149+
150+
assert.ok( controller.signal.aborted, 'Controller signal is aborted after calling abort().' );
151+
assert.equal( loadingManager._abortController, null, '_abortController is reset to null after abort().' );
152+
153+
} );
154+
155+
QUnit.test( 'abortController - recreation after abort', ( assert ) => {
156+
157+
const loadingManager = new LoadingManager();
158+
159+
const controller1 = loadingManager.abortController;
160+
161+
loadingManager.abort();
162+
163+
assert.ok( controller1.signal.aborted, 'First controller is aborted.' );
164+
assert.equal( loadingManager._abortController, null, '_abortController is null after abort.' );
165+
166+
const controller2 = loadingManager.abortController;
167+
168+
assert.ok( controller2 instanceof AbortController, 'New AbortController is created.' );
169+
assert.notEqual( controller1, controller2, 'New controller is a different instance from the aborted one.' );
170+
assert.ok( ! controller2.signal.aborted, 'New controller signal is not aborted.' );
171+
172+
} );
173+
124174
} );
125175

126176
} );

0 commit comments

Comments
 (0)