[google_maps_flutter_web] Pass BitmapDescriptor.fromBytes size to JS SDK (2/2) (#6209)

diff --git a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md
index d766e0d..68e6a3f 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md
+++ b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md
@@ -1,5 +1,7 @@
-## NEXT
+## 0.4.0+2
 
+* Updates conversion of `BitmapDescriptor.fromBytes` marker icons to support the
+  new `size` parameter. Issue [#73789](https://github.com/flutter/flutter/issues/73789).
 * Fixes avoid_redundant_argument_values lint warnings and minor typos.
 
 ## 0.4.0+1
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.mocks.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.mocks.dart
index 9565935..a7fe6ba 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.mocks.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.mocks.dart
@@ -1,7 +1,8 @@
-// Mocks generated by Mockito 5.2.0 from annotations
+// Mocks generated by Mockito 5.3.0 from annotations
 // in google_maps_flutter_web_integration_tests/integration_test/google_maps_controller_test.dart.
 // Do not manually edit this file.
 
+// ignore_for_file: no_leading_underscores_for_library_prefixes
 import 'package:google_maps/google_maps.dart' as _i2;
 import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'
     as _i4;
@@ -17,8 +18,12 @@
 // ignore_for_file: prefer_const_constructors
 // ignore_for_file: unnecessary_parenthesis
 // ignore_for_file: camel_case_types
+// ignore_for_file: subtype_of_sealed_class
 
-class _FakeGMap_0 extends _i1.Fake implements _i2.GMap {}
+class _FakeGMap_0 extends _i1.SmartFake implements _i2.GMap {
+  _FakeGMap_0(Object parent, Invocation parentInvocation)
+      : super(parent, parentInvocation);
+}
 
 /// A class which mocks [CirclesController].
 ///
@@ -27,18 +32,21 @@
   @override
   Map<_i4.CircleId, _i3.CircleController> get circles =>
       (super.noSuchMethod(Invocation.getter(#circles),
-              returnValue: <_i4.CircleId, _i3.CircleController>{})
+              returnValue: <_i4.CircleId, _i3.CircleController>{},
+              returnValueForMissingStub: <_i4.CircleId, _i3.CircleController>{})
           as Map<_i4.CircleId, _i3.CircleController>);
   @override
   _i2.GMap get googleMap => (super.noSuchMethod(Invocation.getter(#googleMap),
-      returnValue: _FakeGMap_0()) as _i2.GMap);
+      returnValue: _FakeGMap_0(this, Invocation.getter(#googleMap)),
+      returnValueForMissingStub:
+          _FakeGMap_0(this, Invocation.getter(#googleMap))) as _i2.GMap);
   @override
   set googleMap(_i2.GMap? _googleMap) =>
       super.noSuchMethod(Invocation.setter(#googleMap, _googleMap),
           returnValueForMissingStub: null);
   @override
-  int get mapId =>
-      (super.noSuchMethod(Invocation.getter(#mapId), returnValue: 0) as int);
+  int get mapId => (super.noSuchMethod(Invocation.getter(#mapId),
+      returnValue: 0, returnValueForMissingStub: 0) as int);
   @override
   set mapId(int? _mapId) =>
       super.noSuchMethod(Invocation.setter(#mapId, _mapId),
@@ -67,20 +75,23 @@
 class MockPolygonsController extends _i1.Mock
     implements _i3.PolygonsController {
   @override
-  Map<_i4.PolygonId, _i3.PolygonController> get polygons =>
-      (super.noSuchMethod(Invocation.getter(#polygons),
-              returnValue: <_i4.PolygonId, _i3.PolygonController>{})
-          as Map<_i4.PolygonId, _i3.PolygonController>);
+  Map<_i4.PolygonId, _i3.PolygonController> get polygons => (super.noSuchMethod(
+          Invocation.getter(#polygons),
+          returnValue: <_i4.PolygonId, _i3.PolygonController>{},
+          returnValueForMissingStub: <_i4.PolygonId, _i3.PolygonController>{})
+      as Map<_i4.PolygonId, _i3.PolygonController>);
   @override
   _i2.GMap get googleMap => (super.noSuchMethod(Invocation.getter(#googleMap),
-      returnValue: _FakeGMap_0()) as _i2.GMap);
+      returnValue: _FakeGMap_0(this, Invocation.getter(#googleMap)),
+      returnValueForMissingStub:
+          _FakeGMap_0(this, Invocation.getter(#googleMap))) as _i2.GMap);
   @override
   set googleMap(_i2.GMap? _googleMap) =>
       super.noSuchMethod(Invocation.setter(#googleMap, _googleMap),
           returnValueForMissingStub: null);
   @override
-  int get mapId =>
-      (super.noSuchMethod(Invocation.getter(#mapId), returnValue: 0) as int);
+  int get mapId => (super.noSuchMethod(Invocation.getter(#mapId),
+      returnValue: 0, returnValueForMissingStub: 0) as int);
   @override
   set mapId(int? _mapId) =>
       super.noSuchMethod(Invocation.setter(#mapId, _mapId),
@@ -109,20 +120,23 @@
 class MockPolylinesController extends _i1.Mock
     implements _i3.PolylinesController {
   @override
-  Map<_i4.PolylineId, _i3.PolylineController> get lines =>
-      (super.noSuchMethod(Invocation.getter(#lines),
-              returnValue: <_i4.PolylineId, _i3.PolylineController>{})
-          as Map<_i4.PolylineId, _i3.PolylineController>);
+  Map<_i4.PolylineId, _i3.PolylineController> get lines => (super.noSuchMethod(
+          Invocation.getter(#lines),
+          returnValue: <_i4.PolylineId, _i3.PolylineController>{},
+          returnValueForMissingStub: <_i4.PolylineId, _i3.PolylineController>{})
+      as Map<_i4.PolylineId, _i3.PolylineController>);
   @override
   _i2.GMap get googleMap => (super.noSuchMethod(Invocation.getter(#googleMap),
-      returnValue: _FakeGMap_0()) as _i2.GMap);
+      returnValue: _FakeGMap_0(this, Invocation.getter(#googleMap)),
+      returnValueForMissingStub:
+          _FakeGMap_0(this, Invocation.getter(#googleMap))) as _i2.GMap);
   @override
   set googleMap(_i2.GMap? _googleMap) =>
       super.noSuchMethod(Invocation.setter(#googleMap, _googleMap),
           returnValueForMissingStub: null);
   @override
-  int get mapId =>
-      (super.noSuchMethod(Invocation.getter(#mapId), returnValue: 0) as int);
+  int get mapId => (super.noSuchMethod(Invocation.getter(#mapId),
+      returnValue: 0, returnValueForMissingStub: 0) as int);
   @override
   set mapId(int? _mapId) =>
       super.noSuchMethod(Invocation.setter(#mapId, _mapId),
@@ -152,18 +166,21 @@
   @override
   Map<_i4.MarkerId, _i3.MarkerController> get markers =>
       (super.noSuchMethod(Invocation.getter(#markers),
-              returnValue: <_i4.MarkerId, _i3.MarkerController>{})
+              returnValue: <_i4.MarkerId, _i3.MarkerController>{},
+              returnValueForMissingStub: <_i4.MarkerId, _i3.MarkerController>{})
           as Map<_i4.MarkerId, _i3.MarkerController>);
   @override
   _i2.GMap get googleMap => (super.noSuchMethod(Invocation.getter(#googleMap),
-      returnValue: _FakeGMap_0()) as _i2.GMap);
+      returnValue: _FakeGMap_0(this, Invocation.getter(#googleMap)),
+      returnValueForMissingStub:
+          _FakeGMap_0(this, Invocation.getter(#googleMap))) as _i2.GMap);
   @override
   set googleMap(_i2.GMap? _googleMap) =>
       super.noSuchMethod(Invocation.setter(#googleMap, _googleMap),
           returnValueForMissingStub: null);
   @override
-  int get mapId =>
-      (super.noSuchMethod(Invocation.getter(#mapId), returnValue: 0) as int);
+  int get mapId => (super.noSuchMethod(Invocation.getter(#mapId),
+      returnValue: 0, returnValueForMissingStub: 0) as int);
   @override
   set mapId(int? _mapId) =>
       super.noSuchMethod(Invocation.setter(#mapId, _mapId),
@@ -191,7 +208,7 @@
   @override
   bool isInfoWindowShown(_i4.MarkerId? markerId) =>
       (super.noSuchMethod(Invocation.method(#isInfoWindowShown, [markerId]),
-          returnValue: false) as bool);
+          returnValue: false, returnValueForMissingStub: false) as bool);
   @override
   void bindToMap(int? mapId, _i2.GMap? googleMap) =>
       super.noSuchMethod(Invocation.method(#bindToMap, [mapId, googleMap]),
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.mocks.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.mocks.dart
index 18012f4..04cbc4a 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.mocks.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.mocks.dart
@@ -1,7 +1,8 @@
-// Mocks generated by Mockito 5.2.0 from annotations
+// Mocks generated by Mockito 5.3.0 from annotations
 // in google_maps_flutter_web_integration_tests/integration_test/google_maps_plugin_test.dart.
 // Do not manually edit this file.
 
+// ignore_for_file: no_leading_underscores_for_library_prefixes
 import 'dart:async' as _i2;
 
 import 'package:google_maps/google_maps.dart' as _i5;
@@ -19,16 +20,29 @@
 // ignore_for_file: prefer_const_constructors
 // ignore_for_file: unnecessary_parenthesis
 // ignore_for_file: camel_case_types
+// ignore_for_file: subtype_of_sealed_class
 
-class _FakeStreamController_0<T> extends _i1.Fake
-    implements _i2.StreamController<T> {}
+class _FakeStreamController_0<T> extends _i1.SmartFake
+    implements _i2.StreamController<T> {
+  _FakeStreamController_0(Object parent, Invocation parentInvocation)
+      : super(parent, parentInvocation);
+}
 
-class _FakeLatLngBounds_1 extends _i1.Fake implements _i3.LatLngBounds {}
+class _FakeLatLngBounds_1 extends _i1.SmartFake implements _i3.LatLngBounds {
+  _FakeLatLngBounds_1(Object parent, Invocation parentInvocation)
+      : super(parent, parentInvocation);
+}
 
-class _FakeScreenCoordinate_2 extends _i1.Fake
-    implements _i3.ScreenCoordinate {}
+class _FakeScreenCoordinate_2 extends _i1.SmartFake
+    implements _i3.ScreenCoordinate {
+  _FakeScreenCoordinate_2(Object parent, Invocation parentInvocation)
+      : super(parent, parentInvocation);
+}
 
-class _FakeLatLng_3 extends _i1.Fake implements _i3.LatLng {}
+class _FakeLatLng_3 extends _i1.SmartFake implements _i3.LatLng {
+  _FakeLatLng_3(Object parent, Invocation parentInvocation)
+      : super(parent, parentInvocation);
+}
 
 /// A class which mocks [GoogleMapController].
 ///
@@ -36,19 +50,23 @@
 class MockGoogleMapController extends _i1.Mock
     implements _i4.GoogleMapController {
   @override
-  _i2.StreamController<_i3.MapEvent<Object?>> get stream =>
-      (super.noSuchMethod(Invocation.getter(#stream),
-              returnValue: _FakeStreamController_0<_i3.MapEvent<Object?>>())
-          as _i2.StreamController<_i3.MapEvent<Object?>>);
+  _i2.StreamController<_i3.MapEvent<Object?>> get stream => (super.noSuchMethod(
+      Invocation.getter(#stream),
+      returnValue: _FakeStreamController_0<_i3.MapEvent<Object?>>(
+          this, Invocation.getter(#stream)),
+      returnValueForMissingStub: _FakeStreamController_0<_i3.MapEvent<Object?>>(
+          this, Invocation.getter(#stream))) as _i2
+      .StreamController<_i3.MapEvent<Object?>>);
   @override
-  _i2.Stream<_i3.MapEvent<Object?>> get events =>
-      (super.noSuchMethod(Invocation.getter(#events),
-              returnValue: Stream<_i3.MapEvent<Object?>>.empty())
-          as _i2.Stream<_i3.MapEvent<Object?>>);
+  _i2.Stream<_i3.MapEvent<Object?>> get events => (super.noSuchMethod(
+          Invocation.getter(#events),
+          returnValue: _i2.Stream<_i3.MapEvent<Object?>>.empty(),
+          returnValueForMissingStub: _i2.Stream<_i3.MapEvent<Object?>>.empty())
+      as _i2.Stream<_i3.MapEvent<Object?>>);
   @override
   bool get isInitialized =>
-      (super.noSuchMethod(Invocation.getter(#isInitialized), returnValue: false)
-          as bool);
+      (super.noSuchMethod(Invocation.getter(#isInitialized),
+          returnValue: false, returnValueForMissingStub: false) as bool);
   @override
   void debugSetOverrides(
           {_i4.DebugCreateMapFunction? createMap,
@@ -78,29 +96,43 @@
           returnValueForMissingStub: null);
   @override
   _i2.Future<_i3.LatLngBounds> getVisibleRegion() => (super.noSuchMethod(
-          Invocation.method(#getVisibleRegion, []),
-          returnValue: Future<_i3.LatLngBounds>.value(_FakeLatLngBounds_1()))
-      as _i2.Future<_i3.LatLngBounds>);
+      Invocation.method(#getVisibleRegion, []),
+      returnValue: _i2.Future<_i3.LatLngBounds>.value(
+          _FakeLatLngBounds_1(this, Invocation.method(#getVisibleRegion, []))),
+      returnValueForMissingStub: _i2.Future<_i3.LatLngBounds>.value(
+          _FakeLatLngBounds_1(
+              this, Invocation.method(#getVisibleRegion, [])))) as _i2
+      .Future<_i3.LatLngBounds>);
   @override
   _i2.Future<_i3.ScreenCoordinate> getScreenCoordinate(_i3.LatLng? latLng) =>
       (super.noSuchMethod(Invocation.method(#getScreenCoordinate, [latLng]),
-              returnValue:
-                  Future<_i3.ScreenCoordinate>.value(_FakeScreenCoordinate_2()))
+              returnValue: _i2.Future<_i3.ScreenCoordinate>.value(
+                  _FakeScreenCoordinate_2(
+                      this, Invocation.method(#getScreenCoordinate, [latLng]))),
+              returnValueForMissingStub: _i2.Future<_i3.ScreenCoordinate>.value(
+                  _FakeScreenCoordinate_2(
+                      this, Invocation.method(#getScreenCoordinate, [latLng]))))
           as _i2.Future<_i3.ScreenCoordinate>);
   @override
   _i2.Future<_i3.LatLng> getLatLng(_i3.ScreenCoordinate? screenCoordinate) =>
       (super.noSuchMethod(Invocation.method(#getLatLng, [screenCoordinate]),
-              returnValue: Future<_i3.LatLng>.value(_FakeLatLng_3()))
-          as _i2.Future<_i3.LatLng>);
+          returnValue: _i2.Future<_i3.LatLng>.value(_FakeLatLng_3(
+              this, Invocation.method(#getLatLng, [screenCoordinate]))),
+          returnValueForMissingStub: _i2.Future<_i3.LatLng>.value(_FakeLatLng_3(
+              this, Invocation.method(#getLatLng, [screenCoordinate])))) as _i2
+          .Future<_i3.LatLng>);
   @override
   _i2.Future<void> moveCamera(_i3.CameraUpdate? cameraUpdate) =>
       (super.noSuchMethod(Invocation.method(#moveCamera, [cameraUpdate]),
-          returnValue: Future<void>.value(),
-          returnValueForMissingStub: Future<void>.value()) as _i2.Future<void>);
+              returnValue: _i2.Future<void>.value(),
+              returnValueForMissingStub: _i2.Future<void>.value())
+          as _i2.Future<void>);
   @override
   _i2.Future<double> getZoomLevel() =>
       (super.noSuchMethod(Invocation.method(#getZoomLevel, []),
-          returnValue: Future<double>.value(0.0)) as _i2.Future<double>);
+              returnValue: _i2.Future<double>.value(0.0),
+              returnValueForMissingStub: _i2.Future<double>.value(0.0))
+          as _i2.Future<double>);
   @override
   void updateCircles(_i3.CircleUpdates? updates) =>
       super.noSuchMethod(Invocation.method(#updateCircles, [updates]),
@@ -128,7 +160,7 @@
   @override
   bool isInfoWindowShown(_i3.MarkerId? markerId) =>
       (super.noSuchMethod(Invocation.method(#isInfoWindowShown, [markerId]),
-          returnValue: false) as bool);
+          returnValue: false, returnValueForMissingStub: false) as bool);
   @override
   void dispose() => super.noSuchMethod(Invocation.method(#dispose, []),
       returnValueForMissingStub: null);
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart
index 90195ec..e4c4dd7 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/markers_test.dart
@@ -5,8 +5,8 @@
 import 'dart:async';
 import 'dart:convert';
 import 'dart:html' as html;
-import 'dart:js_util' show getProperty;
 import 'dart:typed_data';
+import 'dart:ui';
 
 import 'package:flutter_test/flutter_test.dart';
 import 'package:google_maps/google_maps.dart' as gmaps;
@@ -155,22 +155,46 @@
       controller.addMarkers(markers);
 
       expect(controller.markers.length, 1);
-      expect(controller.markers[const MarkerId('1')]?.marker?.icon, isNotNull);
+      final gmaps.Icon? icon =
+          controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?;
+      expect(icon, isNotNull);
 
-      final String blobUrl = getProperty<String>(
-        controller.markers[const MarkerId('1')]!.marker!.icon!,
-        'url',
-      );
-
+      final String blobUrl = icon!.url!;
       expect(blobUrl, startsWith('blob:'));
 
       final http.Response response = await http.get(Uri.parse(blobUrl));
-
       expect(response.bodyBytes, bytes,
           reason:
               'Bytes from the Icon blob must match bytes used to create Marker');
     });
 
+    // https://github.com/flutter/flutter/issues/73789
+    testWidgets('markers with custom bitmap icon pass size to sdk',
+        (WidgetTester tester) async {
+      final Uint8List bytes = const Base64Decoder().convert(iconImageBase64);
+      final Set<Marker> markers = <Marker>{
+        Marker(
+          markerId: const MarkerId('1'),
+          icon: BitmapDescriptor.fromBytes(bytes, size: const Size(20, 30)),
+        ),
+      };
+
+      controller.addMarkers(markers);
+
+      expect(controller.markers.length, 1);
+      final gmaps.Icon? icon =
+          controller.markers[const MarkerId('1')]?.marker?.icon as gmaps.Icon?;
+      expect(icon, isNotNull);
+
+      final gmaps.Size size = icon!.size!;
+      final gmaps.Size scaledSize = icon.scaledSize!;
+
+      expect(size.width, 20);
+      expect(size.height, 30);
+      expect(scaledSize.width, 20);
+      expect(scaledSize.height, 30);
+    });
+
     // https://github.com/flutter/flutter/issues/67854
     testWidgets('InfoWindow snippet can have links',
         (WidgetTester tester) async {
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart
index 250bb54..2b09950 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart
+++ b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/convert.dart
@@ -228,14 +228,25 @@
   // and the marker.infoWindow.anchor property.
 }
 
-// Computes the options for a new [gmaps.Marker] from an incoming set of options
-// [marker], and the existing marker registered with the map: [currentMarker].
-// Preserves the position from the [currentMarker], if set.
-gmaps.MarkerOptions _markerOptionsFromMarker(
-  Marker marker,
-  gmaps.Marker? currentMarker,
-) {
-  final List<Object?> iconConfig = marker.icon.toJson() as List<Object?>;
+// Attempts to extract a [gmaps.Size] from `iconConfig[sizeIndex]`.
+gmaps.Size? _gmSizeFromIconConfig(List<Object?> iconConfig, int sizeIndex) {
+  gmaps.Size? size;
+  if (iconConfig.length >= sizeIndex + 1) {
+    final List<Object?>? rawIconSize = iconConfig[sizeIndex] as List<Object?>?;
+    if (rawIconSize != null) {
+      size = gmaps.Size(
+        rawIconSize[0] as num?,
+        rawIconSize[1] as num?,
+      );
+    }
+  }
+  return size;
+}
+
+// Converts a [BitmapDescriptor] into a [gmaps.Icon] that can be used in Markers.
+gmaps.Icon? _gmIconFromBitmapDescriptor(BitmapDescriptor bitmapDescriptor) {
+  final List<Object?> iconConfig = bitmapDescriptor.toJson() as List<Object?>;
+
   gmaps.Icon? icon;
 
   if (iconConfig != null) {
@@ -243,17 +254,11 @@
       assert(iconConfig.length >= 2);
       // iconConfig[2] contains the DPIs of the screen, but that information is
       // already encoded in the iconConfig[1]
-
       icon = gmaps.Icon()
         ..url = ui.webOnlyAssetManager.getAssetUrl(iconConfig[1]! as String);
 
-      // iconConfig[3] may contain the [width, height] of the image, if passed!
-      if (iconConfig.length >= 4 && iconConfig[3] != null) {
-        final List<Object?> rawIconSize = iconConfig[3]! as List<Object?>;
-        final gmaps.Size size = gmaps.Size(
-          rawIconSize[0] as num?,
-          rawIconSize[1] as num?,
-        );
+      final gmaps.Size? size = _gmSizeFromIconConfig(iconConfig, 3);
+      if (size != null) {
         icon
           ..size = size
           ..scaledSize = size;
@@ -264,8 +269,26 @@
       // Create a Blob from bytes, but let the browser figure out the encoding
       final Blob blob = Blob(<dynamic>[bytes]);
       icon = gmaps.Icon()..url = Url.createObjectUrlFromBlob(blob);
+
+      final gmaps.Size? size = _gmSizeFromIconConfig(iconConfig, 2);
+      if (size != null) {
+        icon
+          ..size = size
+          ..scaledSize = size;
+      }
     }
   }
+
+  return icon;
+}
+
+// Computes the options for a new [gmaps.Marker] from an incoming set of options
+// [marker], and the existing marker registered with the map: [currentMarker].
+// Preserves the position from the [currentMarker], if set.
+gmaps.MarkerOptions _markerOptionsFromMarker(
+  Marker marker,
+  gmaps.Marker? currentMarker,
+) {
   return gmaps.MarkerOptions()
     ..position = currentMarker?.position ??
         gmaps.LatLng(
@@ -277,7 +300,7 @@
     ..visible = marker.visible
     ..opacity = marker.alpha
     ..draggable = marker.draggable
-    ..icon = icon;
+    ..icon = _gmIconFromBitmapDescriptor(marker.icon);
   // TODO(ditman): Compute anchor properly, otherwise infowindows attach to the wrong spot.
   // Flat and Rotation are not supported directly on the web.
 }
diff --git a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml
index 9670e0f..731b905 100644
--- a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml
+++ b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml
@@ -2,7 +2,7 @@
 description: Web platform implementation of google_maps_flutter
 repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_flutter/google_maps_flutter_web
 issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22
-version: 0.4.0+1
+version: 0.4.0+2
 
 environment:
   sdk: ">=2.12.0 <3.0.0"
@@ -22,7 +22,7 @@
   flutter_web_plugins:
     sdk: flutter
   google_maps: ^6.1.0
-  google_maps_flutter_platform_interface: ^2.2.0
+  google_maps_flutter_platform_interface: ^2.2.2
   sanitize_html: ^2.0.0
   stream_transform: ^2.0.0