Skip to content

Commit

Permalink
Implement the VM service getFlagList API (#2438)
Browse files Browse the repository at this point in the history
  • Loading branch information
elliette authored May 29, 2024
1 parent 7eeebbb commit a97c2a1
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 15 deletions.
1 change: 1 addition & 0 deletions dwds/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
- Fix bug where debugging clients are not aware of service extensions when connecting to a new web app. - [#2388](https://github.com/dart-lang/webdev/pull/2388)
- Respect the value of `pause_isolates_on_start` during page-refreshes. - [#2431](https://github.com/dart-lang/webdev/pull/2431)
- Fix issue where DAP clients wouldn't resume after a restart. - [#2441](https://github.com/dart-lang/webdev/pull/2441)
- Add implementation for the VM Service's `getFlagList` API. - [#2438](https://github.com/dart-lang/webdev/pull/2438)

## 24.0.0

Expand Down
41 changes: 26 additions & 15 deletions dwds/lib/src/services/chrome_proxy_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,17 @@ class ChromeProxyService implements VmServiceInterface {

StreamSubscription<ConsoleAPIEvent>? _consoleSubscription;

bool _pauseIsolatesOnStart = false;
/// The flags that can be set at runtime via [setFlag] and their respective
/// values.
final Map<String, bool> _currentVmServiceFlags = {
_pauseIsolatesOnStartFlag: false,
};

/// The value of the [_pauseIsolatesOnStartFlag].
///
/// This value can be updated at runtime via [setFlag].
bool get pauseIsolatesOnStart => _pauseIsolatesOnStart;
bool get pauseIsolatesOnStart =>
_currentVmServiceFlags[_pauseIsolatesOnStartFlag] ?? false;

/// Whether or not the connected app has a pending restart.
bool get hasPendingRestart => _resumeAfterRestartEventsController.hasListener;
Expand Down Expand Up @@ -775,9 +780,22 @@ ${globalToolConfiguration.loadStrategy.loadModuleSnippet}("dart_sdk").developer.
}

@override
Future<FlagList> getFlagList() async {
// VM flags do not apply to web apps.
return FlagList(flags: []);
Future<FlagList> getFlagList() {
return wrapInErrorHandlerAsync(
'getFlagList',
_getFlagList,
);
}

Future<FlagList> _getFlagList() {
final flags = _currentVmServiceFlags.entries.map<Flag>(
(entry) => Flag(
name: entry.key,
valueAsString: '${entry.value}',
),
);

return Future.value(FlagList(flags: flags.toList()));
}

@override
Expand Down Expand Up @@ -1231,14 +1249,12 @@ ${globalToolConfiguration.loadStrategy.loadModuleSnippet}("dart_sdk").developer.
);

Future<Success> _setFlag(String name, String value) async {
if (!_supportedVmServiceFlags.contains(name)) {
if (!_currentVmServiceFlags.containsKey(name)) {
return _rpcNotSupportedFuture('setFlag');
}

if (name == _pauseIsolatesOnStartFlag) {
assert(value == 'true' || value == 'false');
_pauseIsolatesOnStart = value == 'true';
}
assert(value == 'true' || value == 'false');
_currentVmServiceFlags[name] = value == 'true';

return Success();
}
Expand Down Expand Up @@ -1716,8 +1732,3 @@ const _stderrTypes = ['error'];
const _stdoutTypes = ['log', 'info', 'warning'];

const _pauseIsolatesOnStartFlag = 'pause_isolates_on_start';

/// The flags that can be set at runtime via [setFlag].
const _supportedVmServiceFlags = {
_pauseIsolatesOnStartFlag,
};
32 changes: 32 additions & 0 deletions dwds/test/chrome_proxy_service_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2097,6 +2097,38 @@ void main() {
});
});

group('getFlagList', () {
List<String> stringifyFlags(FlagList flagList) {
return flagList.flags
?.map((flag) => '${flag.name} -> ${flag.valueAsString}')
.toList() ??
[];
}

test('returns expected default values', () async {
final service = context.service;
final flagList = await service.getFlagList();
expect(
stringifyFlags(flagList),
containsAll([
'pause_isolates_on_start -> false',
]),
);
});

test('returns any modified flag values', () async {
final service = context.service;
await service.setFlag('pause_isolates_on_start', 'true');
final flagList = await service.getFlagList();
expect(
stringifyFlags(flagList),
containsAll([
'pause_isolates_on_start -> true',
]),
);
});
});

group('streamListen/onEvent', () {
late ChromeProxyService service;

Expand Down

0 comments on commit a97c2a1

Please sign in to comment.