Skip to content

Commit 07ce3c0

Browse files
committed
fix: don't try to access optional track settings
Some properties defined in `package:web/web.dart` are defined as non-nullable, while some browsers don't support them. In my case, `aspectRatio` is not defined for [Firefox](https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings/aspectRatio#browser_compatibility). This seems to be a problem with the IDL itself being inconsistent (see dart-lang/web#309). Checking availability before accessing the fields seems to be an endorsed method: dart-lang/web#181 (comment)
1 parent b870a58 commit 07ce3c0

File tree

1 file changed

+41
-15
lines changed

1 file changed

+41
-15
lines changed

lib/src/media_stream_track_impl.dart

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'dart:async';
22
import 'dart:js_interop';
3+
import 'dart:js_interop_unsafe';
4+
import 'dart:js_util' as js;
35
import 'dart:typed_data';
46

57
import 'package:web/web.dart' as web;
@@ -77,25 +79,49 @@ class MediaStreamTrackWeb extends MediaStreamTrack {
7779
var settings = jsTrack.getSettings();
7880
var _converted = <String, dynamic>{};
7981
if (kind == 'audio') {
80-
_converted['sampleRate'] = settings.sampleRate;
81-
_converted['sampleSize'] = settings.sampleSize;
82-
_converted['echoCancellation'] = settings.echoCancellation;
83-
_converted['autoGainControl'] = settings.autoGainControl;
84-
_converted['noiseSuppression'] = settings.noiseSuppression;
85-
_converted['latency'] = settings.latency;
86-
_converted['channelCount'] = settings.channelCount;
82+
if (settings.has('sampleRate')) {
83+
_converted['sampleRate'] = settings.sampleRate;
84+
}
85+
if (settings.has('sampleSize')) {
86+
_converted['sampleSize'] = settings.sampleSize;
87+
}
88+
if (settings.has('echoCancellation')) {
89+
_converted['echoCancellation'] = settings.echoCancellation;
90+
}
91+
if (settings.has('autoGainControl')) {
92+
_converted['autoGainControl'] = settings.autoGainControl;
93+
}
94+
if (settings.has('noiseSuppression')) {
95+
_converted['noiseSuppression'] = settings.noiseSuppression;
96+
}
97+
if (settings.has('latency')) _converted['latency'] = settings.latency;
98+
if (settings.has('channelCount')) {
99+
_converted['channelCount'] = settings.channelCount;
100+
}
87101
} else {
88-
_converted['width'] = settings.width;
89-
_converted['height'] = settings.height;
90-
_converted['aspectRatio'] = settings.aspectRatio;
91-
_converted['frameRate'] = settings.frameRate;
92-
if (isMobile) {
102+
if (settings.has('width')) {
103+
_converted['width'] = settings.width;
104+
}
105+
if (settings.has('height')) {
106+
_converted['height'] = settings.height;
107+
}
108+
if (settings.has('aspectRatio')) {
109+
_converted['aspectRatio'] = settings.aspectRatio;
110+
}
111+
if (settings.has('frameRate')) {
112+
_converted['frameRate'] = settings.frameRate;
113+
}
114+
if (isMobile && settings.has('facingMode')) {
93115
_converted['facingMode'] = settings.facingMode;
94116
}
95-
_converted['resizeMode'] = settings.resizeMode;
117+
if (settings.has('resizeMode')) {
118+
_converted['resizeMode'] = settings.resizeMode;
119+
}
120+
}
121+
if (settings.has('deviceId')) _converted['deviceId'] = settings.deviceId;
122+
if (settings.has('groupId')) {
123+
_converted['groupId'] = settings.groupId;
96124
}
97-
_converted['deviceId'] = settings.deviceId;
98-
_converted['groupId'] = settings.groupId;
99125
return _converted;
100126
}
101127

0 commit comments

Comments
 (0)