diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index 3ae6487afe47..824c2f8be031 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 0.3.5+4 * Updates minimum supported SDK version to Flutter 3.38/Dart 3.10. diff --git a/packages/camera/camera_web/example/integration_test/camera_service_test.dart b/packages/camera/camera_web/example/integration_test/camera_service_test.dart index 2805ae069350..acc77979d28b 100644 --- a/packages/camera/camera_web/example/integration_test/camera_service_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_service_test.dart @@ -672,6 +672,60 @@ void main() { expect(facingMode, equals('environment')); }); + testWidgets('returns null ' + 'when the facing mode setting is empty and ' + 'the first facingMode capability is not a JavaScript string', ( + WidgetTester tester, + ) async { + mockVideoTrack.getSettings = () { + return web.MediaTrackSettings(facingMode: ''); + }.toJS; + mockVideoTrack.getCapabilities = () { + return createJSInteropWrapper(FakeMediaTrackCapabilities()) + as web.MediaTrackCapabilities; + }.toJS; + + when( + jsUtil.hasProperty(videoTrack, 'getCapabilities'.toJS), + ).thenReturn(true); + when( + jsUtil.getProperty(any, 'facingMode'.toJS), + ).thenReturn([true.toJS].toJS); + + final String? facingMode = cameraService.getFacingModeForVideoTrack( + videoTrack, + ); + + expect(facingMode, isNull); + }); + + testWidgets('returns null ' + 'when the facing mode setting is empty and ' + 'the facingMode capability is not a JavaScript array', ( + WidgetTester tester, + ) async { + mockVideoTrack.getSettings = () { + return web.MediaTrackSettings(facingMode: ''); + }.toJS; + mockVideoTrack.getCapabilities = () { + return createJSInteropWrapper(FakeMediaTrackCapabilities()) + as web.MediaTrackCapabilities; + }.toJS; + + when( + jsUtil.hasProperty(videoTrack, 'getCapabilities'.toJS), + ).thenReturn(true); + when( + jsUtil.getProperty(any, 'facingMode'.toJS), + ).thenReturn(true.toJS); + + final String? facingMode = cameraService.getFacingModeForVideoTrack( + videoTrack, + ); + + expect(facingMode, isNull); + }); + testWidgets('returns null ' 'when the facing mode setting ' 'and capabilities are empty', (WidgetTester tester) async { diff --git a/packages/camera/camera_web/lib/src/camera_service.dart b/packages/camera/camera_web/lib/src/camera_service.dart index 9bf588a456da..47ac8ec3b8f6 100644 --- a/packages/camera/camera_web/lib/src/camera_service.dart +++ b/packages/camera/camera_web/lib/src/camera_service.dart @@ -200,19 +200,24 @@ class CameraService { // A list of facing mode capabilities as // the camera may support multiple facing modes. - final List facingModeCapabilities = - videoTrackCapabilities.facingModeNullable?.toDart - .map((JSString e) => e.toDart) - .toList() ?? - []; - - if (facingModeCapabilities.isNotEmpty) { - final String facingModeCapability = facingModeCapabilities.first; - return facingModeCapability; - } else { - // Return null if there are no facing mode capabilities. + final JSAny? facingModeCapabilities = jsUtil.getProperty( + videoTrackCapabilities, + 'facingMode'.toJS, + ); + if (facingModeCapabilities == null || + !facingModeCapabilities.isA()) { return null; } + + final List facingModes = + (facingModeCapabilities as JSArray).toDart; + + if (facingModes.isNotEmpty && facingModes.first.isA()) { + return (facingModes.first! as JSString).toDart; + } + + // Return null if there are no facing mode capabilities. + return null; } return facingMode; diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index bba4fae6d144..084f2caf8cf9 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_web description: A Flutter plugin for getting information about and controlling the camera on Web. repository: https://github.com/flutter/packages/tree/main/packages/camera/camera_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.3.5+3 +version: 0.3.5+4 environment: sdk: ^3.10.0