diff --git a/packages/devtools_app/lib/src/screens/network/network_controller.dart b/packages/devtools_app/lib/src/screens/network/network_controller.dart index 62fd5c537eb..89d6eaa020e 100644 --- a/packages/devtools_app/lib/src/screens/network/network_controller.dart +++ b/packages/devtools_app/lib/src/screens/network/network_controller.dart @@ -91,12 +91,25 @@ class NetworkController extends DevToolsScreenController return null; } + static const hideHttpSocketsFilterId = 'network-hide-http-sockets'; + static const methodFilterId = 'network-method-filter'; static const statusFilterId = 'network-status-filter'; static const typeFilterId = 'network-type-filter'; + @override + SettingFilters createSettingFilters() => [ + ToggleFilter( + id: hideHttpSocketsFilterId, + name: 'Hide HTTP profiler sockets', + includeCallback: (request) => + !(request is Socket && request.socketType == 'tcp'), + defaultValue: false, + ), + ]; + @override Map> createQueryFilterArgs() => { methodFilterId: QueryFilterArgument( @@ -167,7 +180,6 @@ class NetworkController extends DevToolsScreenController PeriodicDebouncer? _pollingTimer; - @visibleForTesting bool get isPolling => _pollingTimer != null; static const _pollingDuration = Duration(milliseconds: 2000); @@ -237,7 +249,6 @@ class NetworkController extends DevToolsScreenController } } - @visibleForTesting void processNetworkTrafficHelper( List sockets, List? httpRequests, @@ -437,18 +448,30 @@ class NetworkController extends DevToolsScreenController void filterData(Filter filter) { super.filterData(filter); serviceConnection.errorBadgeManager.clearErrorCount(NetworkScreen.id); + + // Apply setting filters (e.g. hide HTTP profiler tcp sockets toggle). + final settingFiltersList = filter.settingFilters; + final allRequests = _currentNetworkRequests.value.where((r) { + if (settingFiltersList != null) { + for (final settingFilter in settingFiltersList) { + if (!settingFilter.includeData(r)) return false; + } + } + return true; + }).toList(); + final queryFilter = filter.queryFilter; if (queryFilter.isEmpty) { - _currentNetworkRequests.value.forEach(_checkForError); + allRequests.forEach(_checkForError); filteredData ..clear() - ..addAll(_currentNetworkRequests.value); + ..addAll(allRequests); return; } filteredData ..clear() ..addAll( - _currentNetworkRequests.value.where((NetworkRequest r) { + allRequests.where((NetworkRequest r) { final filteredOutByQueryFilterArgument = queryFilter.filterArguments .any((argument) => !argument.matchesValue(r)); if (filteredOutByQueryFilterArgument) return false; diff --git a/packages/devtools_app/lib/src/screens/network/network_screen.dart b/packages/devtools_app/lib/src/screens/network/network_screen.dart index 5171c5e6736..f0340b75ced 100644 --- a/packages/devtools_app/lib/src/screens/network/network_screen.dart +++ b/packages/devtools_app/lib/src/screens/network/network_screen.dart @@ -600,4 +600,4 @@ class TimestampColumn extends ColumnData { String getDisplayValue(NetworkRequest dataObject) { return formatDateTime(dataObject.startTimestamp!); } -} +} \ No newline at end of file diff --git a/packages/devtools_app/lib/src/shared/analytics/constants/_network_constants.dart b/packages/devtools_app/lib/src/shared/analytics/constants/_network_constants.dart index e991e5b098d..31cc775e845 100644 --- a/packages/devtools_app/lib/src/shared/analytics/constants/_network_constants.dart +++ b/packages/devtools_app/lib/src/shared/analytics/constants/_network_constants.dart @@ -4,4 +4,4 @@ part of '../constants.dart'; -enum NetworkEvent { downloadAsHar } +enum NetworkEvent { downloadAsHar, hideHttpSockets } diff --git a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md index b98ca752ea0..b15222553a2 100644 --- a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md +++ b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md @@ -15,7 +15,9 @@ To learn more about DevTools, check out the ## General updates -TODO: Remove this section if there are not any updates. + +- Removed @visibleForTesting annotation from NetworkController and fixed analyzer warnings in network_screen.dart/network_controller.dart. + This improves code clarity and resolves unnecessary analyzer warnings. ## Inspector updates diff --git a/packages/devtools_app/test/screens/network/network_controller_test.dart b/packages/devtools_app/test/screens/network/network_controller_test.dart index a66bffae707..e2afbea055b 100644 --- a/packages/devtools_app/test/screens/network/network_controller_test.dart +++ b/packages/devtools_app/test/screens/network/network_controller_test.dart @@ -259,6 +259,47 @@ void main() { expect(profile, hasLength(numRequests)); expect(controller.filteredData.value, hasLength(2)); }); + + test('filterData hides tcp sockets via setting filter', () async { + await controller.startRecording(); + await controller.networkService.refreshNetworkData(); + + const numRequests = 9; + const numTcpSockets = 2; + + expect(controller.filteredData.value, hasLength(numRequests)); + + // Enable the hide HTTP sockets toggle filter. + final socketFilter = controller.settingFilters + .whereType>() + .firstWhere((f) => f.id == NetworkController.hideHttpSocketsFilterId); + + // Pass the updated setting filters through setActiveFilter so the + // base class FilterControllerMixin picks them up and re-filters. + socketFilter.setting.value = true; + controller.setActiveFilter( + settingFilters: controller.settingFilters + .whereType>() + .toList(), + ); + + expect(controller.filteredData.value, hasLength(numRequests - numTcpSockets)); + + final tcpSockets = controller.filteredData.value + .whereType() + .where((s) => s.socketType == 'tcp') + .toList(); + expect(tcpSockets, isEmpty); + + // Disable and verify sockets are restored. + socketFilter.setting.value = false; + controller.setActiveFilter( + settingFilters: controller.settingFilters + .whereType>() + .toList(), + ); + expect(controller.filteredData.value, hasLength(numRequests)); + }); }); group('CurrentNetworkRequests', () { @@ -430,4 +471,4 @@ void main() { }); }); }); -} +} \ No newline at end of file