From f7d909e79e6b852eb008c2c84fdcff7a98351bce Mon Sep 17 00:00:00 2001 From: romeo4934 Date: Sat, 1 Nov 2025 21:43:21 +0100 Subject: [PATCH 1/6] Fix camera initialization failure on Firefox Android When VideoConstraints has no constraints, return true.toJS instead of an empty object. Firefox Android rejects getUserMedia({video: {}}) with an AbortError, but accepts {video: true}. This fixes the camera initialization failure in availableCameras() on Firefox Android while maintaining compatibility with other browsers. Fixes flutter/flutter#XXXXX --- .../camera/camera_web/lib/src/types/camera_options.dart | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_web/lib/src/types/camera_options.dart b/packages/camera/camera_web/lib/src/types/camera_options.dart index 49572724b0a..d167c2707f3 100644 --- a/packages/camera/camera_web/lib/src/types/camera_options.dart +++ b/packages/camera/camera_web/lib/src/types/camera_options.dart @@ -108,12 +108,16 @@ class VideoConstraints { // TODO(dit): package:web has a class for this. Use it instead of jsify and toJson. /// Convert `this` to something that can be used on the browser. JSAny toMediaStreamConstraints() { - return { + final constraints = { if (width != null) 'width': width!.toJson(), if (height != null) 'height': height!.toJson(), if (facingMode != null) 'facingMode': facingMode!.toJson(), if (deviceId != null) 'deviceId': {'exact': deviceId!}, - }.jsify()!; + }; + + // Return true instead of empty object for better browser compatibility. + // Firefox Android rejects getUserMedia({video: {}}) but accepts {video: true}. + return constraints.isEmpty ? true.toJS : constraints.jsify()!; } @override From c65c2d4d1ab8e70eb172f53bd79e5ffcf2ba72ee Mon Sep 17 00:00:00 2001 From: romeo4934 Date: Sat, 1 Nov 2025 21:43:21 +0100 Subject: [PATCH 2/6] [camera_web] Fix camera initialization failure on Firefox Android When VideoConstraints has no constraints, return true.toJS instead of an empty object. Firefox Android rejects getUserMedia({video: {}}) with an AbortError, but accepts {video: true}. This fixes the camera initialization failure in availableCameras() on Firefox Android while maintaining compatibility with other browsers. Fixes flutter/flutter#XXXXX --- packages/camera/camera_web/CHANGELOG.md | 4 ++-- .../camera/camera_web/lib/src/types/camera_options.dart | 8 ++++++-- packages/camera/camera_web/pubspec.yaml | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index 0bfdbd06124..a79cf3ddb53 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -1,6 +1,6 @@ -## NEXT +## 0.3.6 -* Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. +* Fixes camera initialization failure on Firefox Android by using `{video: true}` instead of `{video: {}}` when no video constraints are specified. ## 0.3.5 diff --git a/packages/camera/camera_web/lib/src/types/camera_options.dart b/packages/camera/camera_web/lib/src/types/camera_options.dart index 49572724b0a..f9cea14b8ec 100644 --- a/packages/camera/camera_web/lib/src/types/camera_options.dart +++ b/packages/camera/camera_web/lib/src/types/camera_options.dart @@ -108,12 +108,16 @@ class VideoConstraints { // TODO(dit): package:web has a class for this. Use it instead of jsify and toJson. /// Convert `this` to something that can be used on the browser. JSAny toMediaStreamConstraints() { - return { + final Map constraints = { if (width != null) 'width': width!.toJson(), if (height != null) 'height': height!.toJson(), if (facingMode != null) 'facingMode': facingMode!.toJson(), if (deviceId != null) 'deviceId': {'exact': deviceId!}, - }.jsify()!; + }; + + // Return true instead of empty object for better browser compatibility. + // Firefox Android rejects getUserMedia({video: {}}) but accepts {video: true}. + return constraints.isEmpty ? true.toJS : constraints.jsify()!; } @override diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index c32cfb084b0..dec1e808947 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 +version: 0.3.6 environment: sdk: ^3.7.0 From 90a4fa22054f677839bc15ab1bc9faceb253a631 Mon Sep 17 00:00:00 2001 From: romeo4934 Date: Sat, 1 Nov 2025 21:57:43 +0100 Subject: [PATCH 3/6] [camera_web] Add test for empty VideoConstraints serialization Add integration test to verify that VideoConstraints.toMediaStreamConstraints() returns true when no constraints are provided, covering the Firefox Android compatibility fix. --- .../example/integration_test/camera_options_test.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/camera/camera_web/example/integration_test/camera_options_test.dart b/packages/camera/camera_web/example/integration_test/camera_options_test.dart index c6e5740f0cb..22c701a3c2b 100644 --- a/packages/camera/camera_web/example/integration_test/camera_options_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_options_test.dart @@ -108,6 +108,15 @@ void main() { ); }); + testWidgets('serializes to true when no constraints are provided', + (WidgetTester tester) async { + const VideoConstraints videoConstraints = VideoConstraints(); + expect( + videoConstraints.toMediaStreamConstraints().dartify(), + isTrue, + ); + }); + testWidgets('supports value equality', (WidgetTester tester) async { expect( VideoConstraints( From ecf097d0b46380a5a8f5217b4a21abbe82da9396 Mon Sep 17 00:00:00 2001 From: romeo4934 Date: Sun, 2 Nov 2025 07:52:05 +0100 Subject: [PATCH 4/6] Fix dart formatting in camera_options_test.dart --- .../example/integration_test/camera_options_test.dart | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/camera/camera_web/example/integration_test/camera_options_test.dart b/packages/camera/camera_web/example/integration_test/camera_options_test.dart index 22c701a3c2b..c9bf2e29d35 100644 --- a/packages/camera/camera_web/example/integration_test/camera_options_test.dart +++ b/packages/camera/camera_web/example/integration_test/camera_options_test.dart @@ -108,13 +108,11 @@ void main() { ); }); - testWidgets('serializes to true when no constraints are provided', - (WidgetTester tester) async { + testWidgets('serializes to true when no constraints are provided', ( + WidgetTester tester, + ) async { const VideoConstraints videoConstraints = VideoConstraints(); - expect( - videoConstraints.toMediaStreamConstraints().dartify(), - isTrue, - ); + expect(videoConstraints.toMediaStreamConstraints().dartify(), isTrue); }); testWidgets('supports value equality', (WidgetTester tester) async { From 5575f61ccf9562bff8f1f54ff7a5b297a9ad9983 Mon Sep 17 00:00:00 2001 From: romeo4934 Date: Wed, 5 Nov 2025 09:44:01 +0100 Subject: [PATCH 5/6] Fix version to 0.3.5+1 (patch) instead of 0.3.6 (minor) This is a bugfix, not a breaking change or new feature, so it should be a patch version bump according to Dart semantic versioning for packages <1.0. --- packages/camera/camera_web/CHANGELOG.md | 2 +- packages/camera/camera_web/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index a79cf3ddb53..98fc7f173cc 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.3.6 +## 0.3.5+1 * Fixes camera initialization failure on Firefox Android by using `{video: true}` instead of `{video: {}}` when no video constraints are specified. diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index dec1e808947..21801fbd736 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.6 +version: 0.3.5+1 environment: sdk: ^3.7.0 From 6e0aa230ef1e423d7debecec382ce1104dd26d67 Mon Sep 17 00:00:00 2001 From: romeo4934 Date: Tue, 11 Nov 2025 23:22:52 +0100 Subject: [PATCH 6/6] upd --- packages/camera/camera_web/CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index 98fc7f173cc..1334373548f 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -1,5 +1,6 @@ ## 0.3.5+1 +* Updates minimum supported SDK version to Flutter 3.29/Dart 3.7. * Fixes camera initialization failure on Firefox Android by using `{video: true}` instead of `{video: {}}` when no video constraints are specified. ## 0.3.5