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..deecab62c7e 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,24 @@ 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, + defaultValue: false, + ), + ]; + @override Map> createQueryFilterArgs() => { methodFilterId: QueryFilterArgument( @@ -237,7 +249,6 @@ class NetworkController extends DevToolsScreenController } } - @visibleForTesting void processNetworkTrafficHelper( List sockets, List? httpRequests, @@ -438,7 +449,7 @@ class NetworkController extends DevToolsScreenController super.filterData(filter); serviceConnection.errorBadgeManager.clearErrorCount(NetworkScreen.id); final queryFilter = filter.queryFilter; - if (queryFilter.isEmpty) { + if (filter.isEmpty) { _currentNetworkRequests.value.forEach(_checkForError); filteredData ..clear() @@ -449,6 +460,11 @@ class NetworkController extends DevToolsScreenController ..clear() ..addAll( _currentNetworkRequests.value.where((NetworkRequest r) { + final filteredOutBySettingFilters = filter.settingFilters.any( + (settingFilter) => !settingFilter.includeData(r), + ); + if (filteredOutBySettingFilters) return false; + final filteredOutByQueryFilterArgument = queryFilter.filterArguments .any((argument) => !argument.matchesValue(r)); if (filteredOutByQueryFilterArgument) return false; diff --git a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md index 9963ddc8ee3..26d92bf669a 100644 --- a/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md +++ b/packages/devtools_app/release_notes/NEXT_RELEASE_NOTES.md @@ -15,7 +15,7 @@ To learn more about DevTools, check out the ## General updates -TODO: Remove this section if there are not any updates. +- TODO: Remove this section if there are not any updates. ## Inspector updates @@ -39,8 +39,7 @@ TODO: Remove this section if there are not any updates. ## Network profiler updates -- Fix crash in the Network tab when viewing binary multipart request or -response bodies. [#9680](https://github.com/flutter/devtools/pull/9680) +- Added a filter setting to hide HTTP-profiler socket data. [#9698](https://github.com/flutter/devtools/pull/9698) ## Logging 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..1cc1d6d69a4 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,37 @@ 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 using activeFilter. + final socketFilter = controller.activeFilter.value.settingFilters[0]; + socketFilter.setting.value = true; + controller.setActiveFilter(); + + 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(); + expect(controller.filteredData.value, hasLength(numRequests)); + }); }); group('CurrentNetworkRequests', () {