Skip to content

Commit 9265adf

Browse files
Use default service extension states in UI even when they are not available (#9813)
1 parent dc1d7ad commit 9265adf

3 files changed

Lines changed: 61 additions & 7 deletions

File tree

packages/devtools_app/lib/src/service/service_extension_widgets.dart

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -538,12 +538,9 @@ class _ServiceExtensionCheckboxState extends State<ServiceExtensionCheckbox>
538538
void _onMainIsolateChanged() => _initExtensionState();
539539

540540
void _initExtensionState() {
541-
if (serviceConnection.serviceManager.serviceExtensionManager
542-
.isServiceExtensionAvailable(widget.serviceExtension.extension)) {
543-
final state = serviceConnection.serviceManager.serviceExtensionManager
544-
.getServiceExtensionState(widget.serviceExtension.extension);
545-
_setValueFromState(state.value);
546-
}
541+
final state = serviceConnection.serviceManager.serviceExtensionManager
542+
.getServiceExtensionState(widget.serviceExtension.extension);
543+
_setValueFromState(state.value);
547544

548545
unawaited(
549546
serviceConnection.serviceManager.serviceExtensionManager

packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ TODO: Remove this section if there are not any updates.
2424

2525
## Performance updates
2626

27-
TODO: Remove this section if there are not any updates.
27+
- Fixed an issue where 'More Debug Options' showed options as unselected in
28+
profile mode even when selected. [#9813](https://github.com/flutter/devtools/issues/9813)
2829

2930
## CPU profiler updates
3031

packages/devtools_app/test/service/service_extension_widgets_test.dart

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,62 @@ void main() {
222222
expect(toggle.value, false, reason: 'The extension is disabled.');
223223
});
224224
});
225+
226+
group('ServiceExtensionCheckbox', () {
227+
testWidgets('shows value state even when unavailable', (
228+
WidgetTester tester,
229+
) async {
230+
final ext = extensions.disableClipLayers;
231+
final customFake = _UnavailableServiceExtensionManager();
232+
customFake.makeUnavailable(ext.extension);
233+
234+
// Override the serviceExtensionManager on mockServiceManager
235+
when(mockServiceManager.serviceExtensionManager).thenReturn(customFake);
236+
237+
// Set state to enabled: false (which means clips not disabled -> checked true)
238+
await customFake.setServiceExtensionState(
239+
ext.extension,
240+
enabled: false,
241+
value: false,
242+
);
243+
244+
final checkbox = ServiceExtensionCheckbox(serviceExtension: ext);
245+
await tester.pumpWidget(wrap(Scaffold(body: Center(child: checkbox))));
246+
await tester.pumpAndSettle();
247+
248+
final checkboxFinder = find.byType(Checkbox);
249+
expect(checkboxFinder, findsOneWidget);
250+
251+
final checkboxWidget = tester.widget<Checkbox>(checkboxFinder);
252+
expect(checkboxWidget.value, isTrue);
253+
expect(checkboxWidget.onChanged, isNull);
254+
});
255+
});
256+
}
257+
258+
base class _UnavailableServiceExtensionManager
259+
extends FakeServiceExtensionManager {
260+
final _unavailableExtensions = <String>{};
261+
262+
void makeUnavailable(String name) {
263+
_unavailableExtensions.add(name);
264+
}
265+
266+
@override
267+
Future<bool> waitForServiceExtensionAvailable(String name) {
268+
if (_unavailableExtensions.contains(name)) {
269+
return Future.value(false);
270+
}
271+
return super.waitForServiceExtensionAvailable(name);
272+
}
273+
274+
@override
275+
bool isServiceExtensionAvailable(String name) {
276+
if (_unavailableExtensions.contains(name)) {
277+
return false;
278+
}
279+
return super.isServiceExtensionAvailable(name);
280+
}
225281
}
226282

227283
void registerServiceExtension(

0 commit comments

Comments
 (0)