Skip to content

Commit 1d9ee98

Browse files
denrasebuenaflor
andauthored
Apply beforeBreadcrumb on native iOS crumbs (#1914)
* apply beforeBreadcrumb on native iOS crumbs --------- Co-authored-by: Giancarlo Buenaflor <[email protected]>
1 parent bffc2c5 commit 1d9ee98

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
### Features
1212

1313
- Use `recordHttpBreadcrumbs` to set iOS `enableNetworkBreadcrumbs` ([#1884](https://github.com/getsentry/sentry-dart/pull/1884))
14+
- Apply `beforeBreadcrumb` on native iOS crumbs ([#1914](https://github.com/getsentry/sentry-dart/pull/1914))
1415
- Add `maxQueueSize` to limit the number of unawaited events sent to Sentry ([#1868](https://github.com/getsentry/sentry-dart/pull/1868))
1516

1617
### Improvements

flutter/lib/src/integrations/load_contexts_integration.dart

+11-1
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,23 @@ class _LoadContextsIntegrationEventProcessor implements EventProcessor {
155155
final breadcrumbsJson =
156156
List<Map<dynamic, dynamic>>.from(breadcrumbsList);
157157
final breadcrumbs = <Breadcrumb>[];
158+
final beforeBreadcrumb = _options.beforeBreadcrumb;
158159

159160
for (final breadcrumbJson in breadcrumbsJson) {
160161
final breadcrumb = Breadcrumb.fromJson(
161162
Map<String, dynamic>.from(breadcrumbJson),
162163
);
163-
breadcrumbs.add(breadcrumb);
164+
165+
if (beforeBreadcrumb != null) {
166+
final processedBreadcrumb = beforeBreadcrumb(breadcrumb);
167+
if (processedBreadcrumb != null) {
168+
breadcrumbs.add(processedBreadcrumb);
169+
}
170+
} else {
171+
breadcrumbs.add(breadcrumb);
172+
}
164173
}
174+
165175
event = event.copyWith(breadcrumbs: breadcrumbs);
166176
}
167177

flutter/test/integrations/load_contexts_integration_test.dart

+36
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,42 @@ void main() {
8888
expect(event.breadcrumbs!.length, 1);
8989
expect(event.breadcrumbs!.first.message, 'event');
9090
});
91+
92+
test('apply beforeBreadcrumb to native breadcrumbs', () async {
93+
fixture.options.enableScopeSync = true;
94+
fixture.options.beforeBreadcrumb = (breadcrumb, {hint}) {
95+
if (breadcrumb?.message == 'native-mutated') {
96+
return breadcrumb?.copyWith(message: 'native-mutated-applied');
97+
} else {
98+
return null;
99+
}
100+
};
101+
102+
final eventBreadcrumb = Breadcrumb(message: 'event');
103+
var event = SentryEvent(breadcrumbs: [eventBreadcrumb]);
104+
105+
final nativeMutatedBreadcrumb = Breadcrumb(message: 'native-mutated');
106+
final nativeDeletedBreadcrumb = Breadcrumb(message: 'native-deleted');
107+
Map<String, dynamic> loadContexts = {
108+
'breadcrumbs': [
109+
nativeMutatedBreadcrumb.toJson(),
110+
nativeDeletedBreadcrumb.toJson(),
111+
]
112+
};
113+
114+
final future = Future.value(loadContexts);
115+
when(fixture.methodChannel.invokeMethod<dynamic>('loadContexts'))
116+
.thenAnswer((_) => future);
117+
// ignore: deprecated_member_use
118+
_channel.setMockMethodCallHandler((MethodCall methodCall) async {});
119+
120+
final integration = LoadContextsIntegration(fixture.methodChannel);
121+
integration.call(fixture.hub, fixture.options);
122+
event = (await fixture.options.eventProcessors.first.apply(event))!;
123+
124+
expect(event.breadcrumbs!.length, 1);
125+
expect(event.breadcrumbs!.first.message, 'native-mutated-applied');
126+
});
91127
});
92128
}
93129

0 commit comments

Comments
 (0)