Skip to content

Commit d02e127

Browse files
a7medevahmedAlaaInstabug
authored andcommitted
fix: use a fallback for empty screen names (#505)
* fix: fallback to N/A when for empty screen names * test: add test for empty screen fallback * chore: add changelog item
1 parent 94a6e5b commit d02e127

File tree

6 files changed

+35
-7
lines changed

6 files changed

+35
-7
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
- Add support for masking screen names captured by Instabug through the `Instabug.setScreenNameMaskingCallback` API ([#500](https://github.com/Instabug/Instabug-Flutter/pull/500)).
88
- Add support for tracing network requests from Instabug to services like Datadog and New Relic ([#481](https://github.com/Instabug/Instabug-Flutter/pull/481)).
99

10+
### Fixed
11+
12+
- Fixed an issue with empty screen names captured in `InstabugNavigatorObserver` and fallback to `N/A` when the screen name is empty ([#505](https://github.com/Instabug/Instabug-Flutter/pull/505)), closes [#504](https://github.com/Instabug/Instabug-Flutter/issues/504).
13+
1014
## [13.3.0](https://github.com/Instabug/Instabug-Flutter/compare/v13.2.0...v13.3.0) (August 5, 2024)
1115

1216
### Added

lib/src/utils/instabug_navigator_observer.dart

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:instabug_flutter/instabug_flutter.dart';
33
import 'package:instabug_flutter/src/models/instabug_route.dart';
44
import 'package:instabug_flutter/src/modules/instabug.dart';
55
import 'package:instabug_flutter/src/utils/instabug_logger.dart';
6+
import 'package:instabug_flutter/src/utils/repro_steps_constants.dart';
67
import 'package:instabug_flutter/src/utils/screen_loading/screen_loading_manager.dart';
78
import 'package:instabug_flutter/src/utils/screen_name_masker.dart';
89

@@ -11,7 +12,10 @@ class InstabugNavigatorObserver extends NavigatorObserver {
1112

1213
void screenChanged(Route newRoute) {
1314
try {
14-
final screenName = newRoute.settings.name.toString();
15+
final rawScreenName = newRoute.settings.name.toString().trim();
16+
final screenName = rawScreenName.isEmpty
17+
? ReproStepsConstants.emptyScreenFallback
18+
: rawScreenName;
1519
final maskedScreenName = ScreenNameMasker.I.mask(screenName);
1620

1721
final route = InstabugRoute(
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class ReproStepsConstants {
2+
static const emptyScreenFallback = 'N/A';
3+
}

lib/src/utils/screen_loading/screen_loading_manager.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,15 @@ class ScreenLoadingManager {
110110
@internal
111111
String sanitizeScreenName(String screenName) {
112112
const characterToBeRemoved = '/';
113-
final lastIndex = screenName.length - 1;
114113
var sanitizedScreenName = screenName;
115114

116115
if (screenName == characterToBeRemoved) {
117116
return 'ROOT_PAGE';
118117
}
119-
if (screenName[0] == characterToBeRemoved) {
118+
if (screenName.startsWith(characterToBeRemoved)) {
120119
sanitizedScreenName = sanitizedScreenName.substring(1);
121120
}
122-
if (screenName[lastIndex] == characterToBeRemoved) {
121+
if (screenName.endsWith(characterToBeRemoved)) {
123122
sanitizedScreenName =
124123
sanitizedScreenName.substring(0, sanitizedScreenName.length - 1);
125124
}

lib/src/utils/screen_name_masker.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:flutter/material.dart';
2+
import 'package:instabug_flutter/src/utils/repro_steps_constants.dart';
23

34
typedef ScreenNameMaskingCallback = String Function(String screen);
45

@@ -14,8 +15,6 @@ class ScreenNameMasker {
1415
/// Shorthand for [instance]
1516
static ScreenNameMasker get I => instance;
1617

17-
static const emptyScreenNameFallback = "N/A";
18-
1918
ScreenNameMaskingCallback? _screenNameMaskingCallback;
2019

2120
@visibleForTesting
@@ -37,7 +36,7 @@ class ScreenNameMasker {
3736
final maskedScreen = _screenNameMaskingCallback!(screen).trim();
3837

3938
if (maskedScreen.isEmpty) {
40-
return emptyScreenNameFallback;
39+
return ReproStepsConstants.emptyScreenFallback;
4140
}
4241

4342
return maskedScreen;

test/utils/instabug_navigator_observer_test.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,25 @@ void main() {
9292
});
9393
});
9494

95+
test('should fallback to "N/A" when the screen name is empty', () {
96+
fakeAsync((async) {
97+
final route = createRoute('');
98+
const fallback = 'N/A';
99+
100+
observer.didPush(route, previousRoute);
101+
102+
async.elapse(const Duration(milliseconds: 1000));
103+
104+
verify(
105+
mScreenLoadingManager.startUiTrace(fallback, fallback),
106+
).called(1);
107+
108+
verify(
109+
mHost.reportScreenChange(fallback),
110+
).called(1);
111+
});
112+
});
113+
95114
test('should mask screen name when masking callback is set', () {
96115
const maskedScreen = 'maskedScreen';
97116

0 commit comments

Comments
 (0)