Skip to content

Commit c0e18fc

Browse files
aveladjoeyparrish
authored andcommitted
fix(net): Allow preventDefault() on retry event (#8058)
Fixes #8041
1 parent 9066d8b commit c0e18fc

File tree

2 files changed

+34
-0
lines changed

2 files changed

+34
-0
lines changed

lib/net/networking_engine.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -667,8 +667,16 @@ shaka.net.NetworkingEngine = class extends shaka.util.FakeEventTarget {
667667
if (error.severity == shaka.util.Error.Severity.RECOVERABLE) {
668668
const data = (new Map()).set('error', error);
669669
const event = new shaka.util.FakeEvent('retry', data);
670+
// A user can call preventDefault() on a cancelable event.
671+
event.cancelable = true;
670672
this.dispatchEvent(event);
671673

674+
if (event.defaultPrevented) {
675+
// If the caller uses preventDefault() on the 'retry' event, don't
676+
// retry any more.
677+
throw error;
678+
}
679+
672680
// Move to the next URI.
673681
index = (index + 1) % request.uris.length;
674682
return this.send_(

test/net/networking_engine_unit.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ describe('NetworkingEngine', /** @suppress {accessControls} */ () => {
6363
afterEach(() => {
6464
shaka.net.NetworkingEngine.unregisterScheme('resolve');
6565
shaka.net.NetworkingEngine.unregisterScheme('reject');
66+
networkingEngine.destroy();
6667
});
6768

6869
afterAll(() => {
@@ -142,6 +143,31 @@ describe('NetworkingEngine', /** @suppress {accessControls} */ () => {
142143
expect(rejectScheme).toHaveBeenCalledTimes(3);
143144
});
144145

146+
it('allow abort retry', async () => {
147+
const request = createRequest('reject://foo', {
148+
maxAttempts: 2,
149+
baseDelay: 0,
150+
backoffFactor: 0,
151+
fuzzFactor: 0,
152+
timeout: 0,
153+
stallTimeout: 0,
154+
connectionTimeout: 0,
155+
});
156+
rejectScheme.and.callFake(() => {
157+
if (rejectScheme.calls.count() == 1) {
158+
return shaka.util.AbortableOperation.failed(error);
159+
} else {
160+
return shaka.util.AbortableOperation.completed(createResponse());
161+
}
162+
});
163+
networkingEngine.addEventListener('retry', (event) => {
164+
event.preventDefault();
165+
});
166+
await expectAsync(networkingEngine.request(requestType, request).promise)
167+
.toBeRejected();
168+
expect(rejectScheme).toHaveBeenCalledTimes(1);
169+
});
170+
145171
describe('backoff', () => {
146172
const baseDelay = 200;
147173
const realRandom = Math.random;

0 commit comments

Comments
 (0)