Skip to content

Commit 0e842b1

Browse files
authored
Fix QuotaExceededError regression caused by change in Chrome 138 (#7368)
* Improve quota exceeded error handling (In response to #7362 (comment)) * Identify QuotaExceededError(s) with `quota` property (Fixes #7367 whatwg/webidl#1465) * Allow content-steering to penalize pathways on buffer append error without interfering with append retries when there is no alternate
1 parent d69a077 commit 0e842b1

File tree

4 files changed

+24
-14
lines changed

4 files changed

+24
-14
lines changed

src/controller/audio-stream-controller.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,9 @@ class AudioStreamController
810810
if (data.parent !== 'audio') {
811811
return;
812812
}
813-
this.resetLoadingState();
813+
if (!this.reduceLengthAndFlushBuffer(data)) {
814+
this.resetLoadingState();
815+
}
814816
break;
815817
case ErrorDetails.BUFFER_FULL_ERROR:
816818
if (data.parent !== 'audio') {

src/controller/buffer-controller.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -785,7 +785,7 @@ transfer tracks: ${stringify(transferredTracks, (key, value) => (key === 'initSe
785785
}
786786

787787
// Block audio append until overlapping video append
788-
const videoTrack = this.tracks.video;
788+
const videoTrack = tracks.video;
789789
const videoSb = videoTrack?.buffer;
790790
if (videoSb && sn !== 'initSegment') {
791791
const partOrFrag = part || (frag as MediaFragment);
@@ -828,15 +828,12 @@ transfer tracks: ${stringify(transferredTracks, (key, value) => (key === 'initSe
828828
execute: () => {
829829
chunkStats.executeStart = self.performance.now();
830830

831-
const track = this.tracks[type];
832-
if (track) {
833-
const sb = track.buffer;
834-
if (sb) {
835-
if (checkTimestampOffset) {
836-
this.updateTimestampOffset(sb, fragStart, 0.1, type, sn, cc);
837-
} else if (offset !== undefined && Number.isFinite(offset)) {
838-
this.updateTimestampOffset(sb, offset, 0.000001, type, sn, cc);
839-
}
831+
const sb = this.tracks[type]?.buffer;
832+
if (sb) {
833+
if (checkTimestampOffset) {
834+
this.updateTimestampOffset(sb, fragStart, 0.1, type, sn, cc);
835+
} else if (offset !== undefined && Number.isFinite(offset)) {
836+
this.updateTimestampOffset(sb, offset, 0.000001, type, sn, cc);
840837
}
841838
}
842839
this.appendExecutor(data, type);
@@ -892,7 +889,11 @@ transfer tracks: ${stringify(transferredTracks, (key, value) => (key === 'initSe
892889
fatal: false,
893890
};
894891
const mediaError = this.media?.error;
895-
if ((error as DOMException).code === DOMException.QUOTA_EXCEEDED_ERR) {
892+
if (
893+
(error as DOMException).code === DOMException.QUOTA_EXCEEDED_ERR ||
894+
error.name == 'QuotaExceededError' ||
895+
`quota` in error
896+
) {
896897
// QuotaExceededError: http://www.w3.org/TR/html5/infrastructure.html#quotaexceedederror
897898
// let's stop appending any segments, and report BUFFER_FULL_ERROR error
898899
event.details = ErrorDetails.BUFFER_FULL_ERROR;

src/controller/content-steering-controller.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ErrorActionFlags, NetworkErrorAction } from './error-controller';
2+
import { ErrorDetails } from '../errors';
23
import { Events } from '../events';
34
import { Level } from '../types/level';
45
import {
@@ -216,7 +217,11 @@ export default class ContentSteeringController
216217
this.updatePathwayPriority(pathwayPriority);
217218
errorAction.resolved = this.pathwayId !== errorPathway;
218219
}
219-
if (!errorAction.resolved) {
220+
if (data.details === ErrorDetails.BUFFER_APPEND_ERROR && !data.fatal) {
221+
// Error will become fatal in buffer-controller when reaching `appendErrorMaxRetry`
222+
// Stream-controllers are expected to reduce buffer length even if this is not deemed a QuotaExceededError
223+
errorAction.resolved = true;
224+
} else if (!errorAction.resolved) {
220225
this.warn(
221226
`Could not resolve ${data.details} ("${
222227
data.error.message

src/controller/stream-controller.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1053,7 +1053,9 @@ export default class StreamController
10531053
if (data.parent !== 'main') {
10541054
return;
10551055
}
1056-
this.resetLoadingState();
1056+
if (this.reduceLengthAndFlushBuffer(data)) {
1057+
this.resetLoadingState();
1058+
}
10571059
break;
10581060
case ErrorDetails.BUFFER_FULL_ERROR:
10591061
if (data.parent !== 'main') {

0 commit comments

Comments
 (0)