Skip to content

Commit d3d1ae7

Browse files
committed
Refine network cancellation logic and related tests.
1 parent 5de8e82 commit d3d1ae7

5 files changed

Lines changed: 25 additions & 28 deletions

File tree

packages/devtools_app/lib/src/screens/network/network_request_inspector_views.dart

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -707,28 +707,30 @@ class NetworkRequestOverviewView extends StatelessWidget {
707707
];
708708
}
709709

710+
Duration? get _totalDuration => (data as DartIOHttpRequestData).duration;
711+
710712
Widget _buildTimingRow(
711713
Color color,
712-
String label,
713-
Duration duration,
714-
Duration totalDuration,
714+
String segmentLabel,
715+
Duration segmentDuration,
715716
) {
716-
final flex = (duration.inMicroseconds / totalDuration.inMicroseconds * 100)
717-
.round();
717+
final totalDuration = _totalDuration!;
718+
final flex =
719+
(segmentDuration.inMicroseconds / totalDuration.inMicroseconds * 100)
720+
.round();
718721
return Flexible(
719722
flex: flex,
720723
child: DevToolsTooltip(
721-
message: '$label - ${durationText(duration)}',
724+
message: '$segmentLabel - ${durationText(segmentDuration)}',
722725
child: Container(height: _timingGraphHeight, color: color),
723726
),
724727
);
725728
}
726729

727730
Widget _buildHttpTimeGraph() {
728731
final data = this.data as DartIOHttpRequestData;
729-
final requestDuration = data.duration;
730-
if (requestDuration == null ||
731-
requestDuration.inMicroseconds == 0 ||
732+
if (_totalDuration == null ||
733+
_totalDuration!.inMicroseconds == 0 ||
732734
data.instantEvents.isEmpty) {
733735
return Container(
734736
key: httpTimingGraphKey,
@@ -751,18 +753,14 @@ class NetworkRequestOverviewView extends StatelessWidget {
751753
final timingWidgets = <Widget>[];
752754
for (final instant in data.instantEvents) {
753755
final duration = instant.timeRange.duration;
754-
timingWidgets.add(
755-
_buildTimingRow(nextColor(), instant.name, duration, requestDuration),
756-
);
756+
timingWidgets.add(_buildTimingRow(nextColor(), instant.name, duration));
757757
}
758758
final duration = Duration(
759759
microseconds:
760760
data.endTimestamp!.microsecondsSinceEpoch -
761761
data.instantEvents.last.timestamp.microsecondsSinceEpoch,
762762
);
763-
timingWidgets.add(
764-
_buildTimingRow(nextColor(), 'Response', duration, requestDuration),
765-
);
763+
timingWidgets.add(_buildTimingRow(nextColor(), 'Response', duration));
766764
return Row(key: httpTimingGraphKey, children: timingWidgets);
767765
}
768766

packages/devtools_app/lib/src/shared/http/http_request_data.dart

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,7 @@ class DartIOHttpRequestData extends NetworkRequest {
165165

166166
@override
167167
Duration? get duration {
168-
if (inProgress || !isValid) {
169-
return null;
170-
}
168+
if (inProgress || !isValid) return null;
171169
return _endTime?.difference(_request.startTime);
172170
}
173171

@@ -253,10 +251,14 @@ class DartIOHttpRequestData extends NetworkRequest {
253251
return connectionInfo != null ? connectionInfo[_localPortKey] : null;
254252
}
255253

254+
/// True if the HTTP request hasn't completed yet, determined by
255+
/// `isRequestComplete` / `isResponseComplete` from the profile data.
256256
@override
257257
bool get inProgress {
258258
if (_isCancelled) return false;
259-
return _request.endTime == null;
259+
return _hasError
260+
? !_request.isRequestComplete
261+
: !_request.isResponseComplete;
260262
}
261263

262264
/// All instant events logged to the timeline for this HTTP request.
@@ -333,10 +335,7 @@ class DartIOHttpRequestData extends NetworkRequest {
333335

334336
if (_hasError) return 'Error';
335337

336-
final statusCode = _request.response?.statusCode;
337-
if (statusCode != null) return statusCode.toString();
338-
339-
return null;
338+
return _request.response?.statusCode.toString();
340339
}
341340

342341
@override

packages/devtools_app/test/screens/network/network_model_test.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -540,15 +540,15 @@ void main() {
540540
);
541541

542542
test(
543-
'request without response and endTime is complete but not cancelled',
543+
'request without response and endTime remains in progress and not cancelled',
544544
() {
545545
final pendingRequest = DartIOHttpRequestData(
546546
HttpProfileRequest.parse(Map<String, dynamic>.of(httpGetPendingJson))!,
547547
requestFullDataFromVmService: false,
548548
);
549549

550550
expect(pendingRequest.status, isNull);
551-
expect(pendingRequest.inProgress, false);
551+
expect(pendingRequest.inProgress, true);
552552
expect(pendingRequest.duration, isNull);
553553
},
554554
);
@@ -582,7 +582,7 @@ void main() {
582582
);
583583

584584
expect(cancelledWithStatusRequest.status, isNot('Cancelled'));
585-
expect(cancelledWithStatusRequest.inProgress, false);
585+
expect(cancelledWithStatusRequest.inProgress, true);
586586
expect(cancelledWithStatusRequest.status, '200');
587587
expect(cancelledWithStatusRequest.didFail, false);
588588
});

packages/devtools_app/test/screens/network/network_profiler_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ void main() {
407407
expect(find.text('Method: '), findsOneWidget);
408408
expect(find.text('GET'), findsOneWidget);
409409
expect(find.text('Status: '), findsOneWidget);
410-
expect(find.text('Cancelled'), findsOneWidget);
410+
expect(find.text('Error'), findsOneWidget);
411411
expect(find.text('Port: '), findsNothing);
412412
expect(find.text('Content type: '), findsNothing);
413413

packages/devtools_app/test/test_infra/test_data/http_get_cancelled_json.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2020 The Flutter Authors
1+
// Copyright 2026 The Flutter Authors
22
// Use of this source code is governed by a BSD-style license that can be
33
// found in the LICENSE file or at https://developers.google.com/open-source/licenses/bsd.
44

0 commit comments

Comments
 (0)