diff --git a/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart b/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart index f8576bd27d..e0fb76bdeb 100644 --- a/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart +++ b/packages/flutter_tools/lib/src/build_runner/resident_web_runner.dart @@ -384,6 +384,34 @@ class ResidentWebRunner extends ResidentRunner { } } + @override + Future debugTogglePlatform() async { + try { + final vmservice.Response response = await _vmService.callServiceExtension( + 'ext.flutter.platformOverride'); + final String currentPlatform = response.json['value']; + String nextPlatform; + switch (currentPlatform) { + case 'android': + nextPlatform = 'iOS'; + break; + case 'iOS': + nextPlatform = 'android'; + break; + } + if (nextPlatform == null) { + return; + } + await _vmService.callServiceExtension( + 'ext.flutter.platformOverride', args: { + 'value': nextPlatform, + }); + printStatus('Switched operating system to $nextPlatform'); + } on vmservice.RPCError { + return; + } + } + @override Future debugDumpSemanticsTreeInInverseHitTestOrder() async { try { diff --git a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart index 8ae8e286ec..a399e1d389 100644 --- a/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart +++ b/packages/flutter_tools/test/general.shard/resident_web_runner_test.dart @@ -435,6 +435,26 @@ void main() { args: {'enabled': true})).called(1); })); + test('debugTogglePlatform', () => testbed.run(() async { + _setupMocks(); + final BufferLogger bufferLogger = logger; + final Completer connectionInfoCompleter = Completer(); + unawaited(residentWebRunner.run( + connectionInfoCompleter: connectionInfoCompleter, + )); + await connectionInfoCompleter.future; + when(mockVmService.callServiceExtension('ext.flutter.platformOverride')) + .thenAnswer((Invocation _) async { + return Response.parse({'value': 'iOS'}); + }); + + await residentWebRunner.debugTogglePlatform(); + + expect(bufferLogger.statusText, contains('Switched operating system to android')); + verify(mockVmService.callServiceExtension('ext.flutter.platformOverride', + args: {'value': 'android'})).called(1); + })); + test('cleanup of resources is safe to call multiple times', () => testbed.run(() async { _setupMocks(); bool debugClosed = false;