improved error logging

This commit is contained in:
Fabian Freund
2025-06-23 22:19:50 +02:00
parent 66ac66cbd2
commit 9351dc3852
21 changed files with 410 additions and 199 deletions
@@ -1,5 +1,6 @@
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/features/geckoview/domain/providers.dart'; import 'package:weblibre/features/geckoview/domain/providers.dart';
part 'selected_tab.g.dart'; part 'selected_tab.g.dart';
@@ -10,14 +11,22 @@ class SelectedTab extends _$SelectedTab {
String? build() { String? build() {
final eventSerivce = ref.watch(eventServiceProvider); final eventSerivce = ref.watch(eventServiceProvider);
ref.listen(fireImmediately: true, engineReadyStateProvider, ( ref.listen(
previous, fireImmediately: true,
next, engineReadyStateProvider,
) async { (previous, next) async {
if (next) { if (next) {
await GeckoTabService().syncEvents(onSelectedTabChange: true); await GeckoTabService().syncEvents(onSelectedTabChange: true);
} }
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to engineReadyStateProvider',
error: error,
stackTrace: stackTrace,
);
},
);
final selectedTabSub = eventSerivce.selectedTabEvents.listen((tabId) { final selectedTabSub = eventSerivce.selectedTabEvents.listen((tabId) {
state = tabId; state = tabId;
@@ -6,7 +6,7 @@ part of 'selected_tab.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$selectedTabHash() => r'12b670dd76c3416e8d62bafd63bf69a83a603e3a'; String _$selectedTabHash() => r'26d1bb90c777d7011f4f27f7b962584a4a62a0a7';
/// See also [SelectedTab]. /// See also [SelectedTab].
@ProviderFor(SelectedTab) @ProviderFor(SelectedTab)
@@ -1,6 +1,7 @@
import 'package:fast_equatable/fast_equatable.dart'; import 'package:fast_equatable/fast_equatable.dart';
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/features/geckoview/domain/providers.dart'; import 'package:weblibre/features/geckoview/domain/providers.dart';
part 'tab_list.g.dart'; part 'tab_list.g.dart';
@@ -11,14 +12,22 @@ class TabList extends _$TabList {
EquatableValue<List<String>> build() { EquatableValue<List<String>> build() {
final eventService = ref.watch(eventServiceProvider); final eventService = ref.watch(eventServiceProvider);
ref.listen(fireImmediately: true, engineReadyStateProvider, ( ref.listen(
previous, fireImmediately: true,
next, engineReadyStateProvider,
) async { (previous, next) async {
if (next) { if (next) {
await GeckoTabService().syncEvents(onTabListChange: true); await GeckoTabService().syncEvents(onTabListChange: true);
} }
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to eventServiceProvider',
error: error,
stackTrace: stackTrace,
);
},
);
final tabListSub = eventService.tabListEvents.listen((tabs) { final tabListSub = eventService.tabListEvents.listen((tabs) {
final equatableTabs = EquatableValue(tabs); final equatableTabs = EquatableValue(tabs);
@@ -6,7 +6,7 @@ part of 'tab_list.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$tabListHash() => r'9507bcc75dc69a55aba14334cdef0128a5fcf252'; String _$tabListHash() => r'0b9ca1e089a59895df4cbf28691c2849a7004f08';
/// See also [TabList]. /// See also [TabList].
@ProviderFor(TabList) @ProviderFor(TabList)
@@ -5,6 +5,7 @@ import 'package:nullability/nullability.dart';
import 'package:riverpod/riverpod.dart'; import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:rxdart/rxdart.dart'; import 'package:rxdart/rxdart.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/features/geckoview/domain/entities/states/find_result.dart'; import 'package:weblibre/features/geckoview/domain/entities/states/find_result.dart';
import 'package:weblibre/features/geckoview/domain/entities/states/history.dart'; import 'package:weblibre/features/geckoview/domain/entities/states/history.dart';
import 'package:weblibre/features/geckoview/domain/entities/states/readerable.dart'; import 'package:weblibre/features/geckoview/domain/entities/states/readerable.dart';
@@ -155,10 +156,10 @@ class TabStates extends _$TabStates {
}), }),
]; ];
ref.listen(fireImmediately: true, engineReadyStateProvider, ( ref.listen(
previous, fireImmediately: true,
next, engineReadyStateProvider,
) async { (previous, next) async {
if (next) { if (next) {
await GeckoTabService().syncEvents( await GeckoTabService().syncEvents(
onTabContentStateChange: true, onTabContentStateChange: true,
@@ -169,7 +170,15 @@ class TabStates extends _$TabStates {
onFindResults: true, onFindResults: true,
); );
} }
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to engineReadyStateProvider',
error: error,
stackTrace: stackTrace,
);
},
);
ref.onDispose(() async { ref.onDispose(() async {
for (final sub in subscriptions) { for (final sub in subscriptions) {
@@ -158,7 +158,7 @@ final selectedTabStateProvider = AutoDisposeProvider<TabState?>.internal(
@Deprecated('Will be removed in 3.0. Use Ref instead') @Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element // ignore: unused_element
typedef SelectedTabStateRef = AutoDisposeProviderRef<TabState?>; typedef SelectedTabStateRef = AutoDisposeProviderRef<TabState?>;
String _$tabStatesHash() => r'bd2c3d9f3e11b75a1ca53a3fc4510c3c3df80021'; String _$tabStatesHash() => r'e4d2f2b4ddd65beac8a1fd0d22bad1e0a26b41bd';
/// See also [TabStates]. /// See also [TabStates].
@ProviderFor(TabStates) @ProviderFor(TabStates)
@@ -253,17 +253,27 @@ class TabRepository extends _$TabRepository {
); );
}); });
ref.listen(fireImmediately: true, selectedTabProvider, ( ref.listen(
previous, fireImmediately: true,
tabId, selectedTabProvider,
) async { (previous, tabId) async {
if (tabId != null) { if (tabId != null) {
_previousTabId = previous; _previousTabId = previous;
await db.tabDao.touchTab(tabId, timestamp: DateTime.now()); await db.tabDao.touchTab(tabId, timestamp: DateTime.now());
} }
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to selectedTabProvider',
error: error,
stackTrace: stackTrace,
);
},
);
ref.listen(tabListProvider, (previous, next) async { ref.listen(
tabListProvider,
(previous, next) async {
//Only sync tabs if there has been a previous value or is not empty //Only sync tabs if there has been a previous value or is not empty
final syncTabs = final syncTabs =
next.value.isNotEmpty || (previous?.value.isNotEmpty ?? false); next.value.isNotEmpty || (previous?.value.isNotEmpty ?? false);
@@ -275,12 +285,22 @@ class TabRepository extends _$TabRepository {
if (syncTabs) { if (syncTabs) {
await db.tabDao.syncTabs(retainTabIds: next.value); await db.tabDao.syncTabs(retainTabIds: next.value);
} }
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to tabListProvider',
error: error,
stackTrace: stackTrace,
);
},
);
final tabStateDebouncer = Debouncer(const Duration(seconds: 3)); final tabStateDebouncer = Debouncer(const Duration(seconds: 3));
Map<String, TabState>? debounceStartValue; Map<String, TabState>? debounceStartValue;
ref.listen(tabStatesProvider, (previous, next) { ref.listen(
tabStatesProvider,
(previous, next) {
//Since state changes occure pretty often and our map always contains //Since state changes occure pretty often and our map always contains
//the latest state, we cache the value before starting debouncing and //the latest state, we cache the value before starting debouncing and
//later diff to that, to avoid frequent database writes //later diff to that, to avoid frequent database writes
@@ -291,9 +311,19 @@ class TabRepository extends _$TabRepository {
tabStateDebouncer.eventOccured(() async { tabStateDebouncer.eventOccured(() async {
await db.tabDao.updateTabs(debounceStartValue, next); await db.tabDao.updateTabs(debounceStartValue, next);
}); });
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to tabStatesProvider',
error: error,
stackTrace: stackTrace,
);
},
);
ref.listen(engineBoundIntentStreamProvider, (previous, next) { ref.listen(
engineBoundIntentStreamProvider,
(previous, next) {
next.whenData((value) async { next.whenData((value) async {
switch (value) { switch (value) {
case SharedUrl(): case SharedUrl():
@@ -304,11 +334,21 @@ class TabRepository extends _$TabRepository {
await ref.read(defaultSearchBangDataProvider.future); await ref.read(defaultSearchBangDataProvider.future);
_tabFromIntent.add( _tabFromIntent.add(
await addTab(url: defaultSearchBang?.getTemplateUrl(value.text)), await addTab(
url: defaultSearchBang?.getTemplateUrl(value.text),
),
); );
} }
}); });
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to engineBoundIntentStreamProvider',
error: error,
stackTrace: stackTrace,
);
},
);
ref.onDispose(() async { ref.onDispose(() async {
tabStateDebouncer.dispose(); tabStateDebouncer.dispose();
@@ -6,7 +6,7 @@ part of 'tab.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$tabRepositoryHash() => r'db220096fef5d125a698063e9a88272db92e75c5'; String _$tabRepositoryHash() => r'1d8e1c2cf9bd1ed5ad698c992bd8a1bba80f8115';
/// See also [TabRepository]. /// See also [TabRepository].
@ProviderFor(TabRepository) @ProviderFor(TabRepository)
@@ -1,6 +1,7 @@
import 'package:flutter/material.dart' show ThemeMode; import 'package:flutter/material.dart' show ThemeMode;
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/features/user/domain/repositories/engine_settings.dart'; import 'package:weblibre/features/user/domain/repositories/engine_settings.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart'; import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
@@ -29,12 +30,19 @@ class EngineSettingsReplicationService
await _service.preferredColorScheme(theme); await _service.preferredColorScheme(theme);
}, },
onError: (error, stackTrace) {
logger.e(
'Error listening to generalSettingsRepositoryProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
ref.listen(fireImmediately: true, engineSettingsRepositoryProvider, ( ref.listen(
previous, fireImmediately: true,
next, engineSettingsRepositoryProvider,
) async { (previous, next) async {
if (initialSettingsSent && previous != null) { if (initialSettingsSent && previous != null) {
if (previous.javascriptEnabled != next.javascriptEnabled) { if (previous.javascriptEnabled != next.javascriptEnabled) {
await _service.javascriptEnabled(next.javascriptEnabled); await _service.javascriptEnabled(next.javascriptEnabled);
@@ -91,6 +99,14 @@ class EngineSettingsReplicationService
await _service.setDefaultSettings(next); await _service.setDefaultSettings(next);
initialSettingsSent = true; initialSettingsSent = true;
} }
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to engineSettingsRepositoryProvider',
error: error,
stackTrace: stackTrace,
);
},
);
} }
} }
@@ -7,7 +7,7 @@ part of 'engine_settings_replication.dart';
// ************************************************************************** // **************************************************************************
String _$engineSettingsReplicationServiceHash() => String _$engineSettingsReplicationServiceHash() =>
r'559d9dce006a4c9b66de5aceedf9ca8f5d8e12b1'; r'31b5b79e429bfedb9c6b57050cd2d99407914228';
/// See also [EngineSettingsReplicationService]. /// See also [EngineSettingsReplicationService].
@ProviderFor(EngineSettingsReplicationService) @ProviderFor(EngineSettingsReplicationService)
@@ -2,6 +2,7 @@ import 'package:fast_equatable/fast_equatable.dart';
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:nullability/nullability.dart'; import 'package:nullability/nullability.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart'; import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart';
import 'package:weblibre/features/tor/domain/services/tor_proxy.dart'; import 'package:weblibre/features/tor/domain/services/tor_proxy.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart'; import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
@@ -22,6 +23,13 @@ class ProxySettingsReplication extends _$ProxySettingsReplication {
await _service.setProxyPort(next); await _service.setProxyPort(next);
} }
}, },
onError: (error, stackTrace) {
logger.e(
'Error listening to torProxyServiceProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
ref.listen( ref.listen(
@@ -46,6 +54,13 @@ class ProxySettingsReplication extends _$ProxySettingsReplication {
} }
} }
}, },
onError: (error, stackTrace) {
logger.e(
'Error listening to containersWithCountProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
ref.listen( ref.listen(
@@ -60,6 +75,13 @@ class ProxySettingsReplication extends _$ProxySettingsReplication {
await _service.removeContainerProxy('private'); await _service.removeContainerProxy('private');
} }
}, },
onError: (error, stackTrace) {
logger.e(
'Error listening to generalSettingsRepositoryProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
} }
} }
@@ -7,7 +7,7 @@ part of 'proxy_settings_replication.dart';
// ************************************************************************** // **************************************************************************
String _$proxySettingsReplicationHash() => String _$proxySettingsReplicationHash() =>
r'cd3a7573abfa0b32562289c02e77f0b44e88a8ae'; r'4476bab659f09de0866d0b3ae10d54ccb996335d';
/// See also [ProxySettingsReplication]. /// See also [ProxySettingsReplication].
@ProviderFor(ProxySettingsReplication) @ProviderFor(ProxySettingsReplication)
@@ -156,48 +156,104 @@ class _BrowserViewState extends ConsumerState<BrowserView>
fireImmediately: true, fireImmediately: true,
tabRepositoryProvider, tabRepositoryProvider,
(previous, next) {}, (previous, next) {},
onError: (error, stackTrace) {
logger.e(
'Error listening to tabRepositoryProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
ref.listenManual( ref.listenManual(
fireImmediately: true, fireImmediately: true,
selectionActionServiceProvider, selectionActionServiceProvider,
(previous, next) {}, (previous, next) {},
onError: (error, stackTrace) {
logger.e(
'Error listening to selectionActionServiceProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
ref.listenManual( ref.listenManual(
fireImmediately: true, fireImmediately: true,
webExtensionsStateProvider(WebExtensionActionType.browser), webExtensionsStateProvider(WebExtensionActionType.browser),
(previous, next) {}, (previous, next) {},
onError: (error, stackTrace) {
logger.e(
'Error listening to webExtensionsStateProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
ref.listenManual( ref.listenManual(
fireImmediately: true, fireImmediately: true,
webExtensionsStateProvider(WebExtensionActionType.page), webExtensionsStateProvider(WebExtensionActionType.page),
(previous, next) {}, (previous, next) {},
onError: (error, stackTrace) {
logger.e(
'Error listening to webExtensionsStateProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
ref.listenManual( ref.listenManual(
fireImmediately: true, fireImmediately: true,
cacheRepositoryProvider, cacheRepositoryProvider,
(previous, next) {}, (previous, next) {},
onError: (error, stackTrace) {
logger.e(
'Error listening to cacheRepositoryProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
ref.listenManual( ref.listenManual(
fireImmediately: true, fireImmediately: true,
engineSettingsReplicationServiceProvider, engineSettingsReplicationServiceProvider,
(previous, next) {}, (previous, next) {},
onError: (error, stackTrace) {
logger.e(
'Error listening to engineSettingsReplicationServiceProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
ref.listenManual( ref.listenManual(
fireImmediately: true, fireImmediately: true,
proxySettingsReplicationProvider, proxySettingsReplicationProvider,
(previous, next) {}, (previous, next) {},
onError: (error, stackTrace) {
logger.e(
'Error listening to proxySettingsReplicationProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
ref.listenManual( ref.listenManual(
fireImmediately: true, fireImmediately: true,
articleContentProcessorServiceProvider, articleContentProcessorServiceProvider,
(previous, next) {}, (previous, next) {},
onError: (error, stackTrace) {
logger.e(
'Error listening to articleContentProcessorServiceProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
} }
@@ -1,5 +1,6 @@
import 'package:nullability/nullability.dart'; import 'package:nullability/nullability.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart'; import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart';
import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart'; import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart';
import 'package:weblibre/features/geckoview/features/find_in_page/domain/entities/find_in_page_state.dart'; import 'package:weblibre/features/geckoview/features/find_in_page/domain/entities/find_in_page_state.dart';
@@ -45,7 +46,9 @@ class FindInPageController extends _$FindInPageController {
@override @override
FindInPageState build() { FindInPageState build() {
ref.listen(selectedTabStateProvider, (previous, next) async { ref.listen(
selectedTabStateProvider,
(previous, next) async {
if (state.visible && state.lastSearchText.isNotEmpty) { if (state.visible && state.lastSearchText.isNotEmpty) {
if (previous != null && next != null) { if (previous != null && next != null) {
final loadingOrReloading = final loadingOrReloading =
@@ -58,7 +61,15 @@ class FindInPageController extends _$FindInPageController {
} }
} }
} }
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to selectedTabStateProvider',
error: error,
stackTrace: stackTrace,
);
},
);
return FindInPageState.hidden(); return FindInPageState.hidden();
} }
@@ -7,7 +7,7 @@ part of 'find_in_page.dart';
// ************************************************************************** // **************************************************************************
String _$findInPageControllerHash() => String _$findInPageControllerHash() =>
r'b75a1edb4c25246bf2a5f5c9a807d6151b23856e'; r'de69a752c0472b5e3803fb0410fb8caee2c3ff7e';
/// See also [FindInPageController]. /// See also [FindInPageController].
@ProviderFor(FindInPageController) @ProviderFor(FindInPageController)
@@ -1,6 +1,7 @@
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:riverpod/riverpod.dart'; import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart'; import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart'; import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/providers.dart'; import 'package:weblibre/features/geckoview/features/tabs/data/providers.dart';
@@ -75,15 +76,27 @@ class SelectedContainer extends _$SelectedContainer {
@override @override
String? build() { String? build() {
ref.listen(containersWithCountProvider, (previous, next) { ref.listen(
containersWithCountProvider,
(previous, next) {
if (state != null && next.valueOrNull != null) { if (state != null && next.valueOrNull != null) {
if (!next.value!.any((container) => container.id == state)) { if (!next.value!.any((container) => container.id == state)) {
clearContainer(); clearContainer();
} }
} }
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to containersWithCountProvider',
error: error,
stackTrace: stackTrace,
);
},
);
ref.listen(selectedTabProvider, (previous, next) async { ref.listen(
selectedTabProvider,
(previous, next) async {
if (next != null) { if (next != null) {
final tabContainerId = await ref final tabContainerId = await ref
.read(tabDataRepositoryProvider.notifier) .read(tabDataRepositoryProvider.notifier)
@@ -97,7 +110,16 @@ class SelectedContainer extends _$SelectedContainer {
} }
} }
} }
}, fireImmediately: true); },
fireImmediately: true,
onError: (error, stackTrace) {
logger.e(
'Error listening to selectedTabProvider',
error: error,
stackTrace: stackTrace,
);
},
);
return null; return null;
} }
@@ -25,7 +25,7 @@ final selectedContainerDataProvider =
@Deprecated('Will be removed in 3.0. Use Ref instead') @Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element // ignore: unused_element
typedef SelectedContainerDataRef = AutoDisposeStreamProviderRef<ContainerData?>; typedef SelectedContainerDataRef = AutoDisposeStreamProviderRef<ContainerData?>;
String _$selectedContainerHash() => r'07f534f8570135cdc47a2332d0eba9ff6fc5cf44'; String _$selectedContainerHash() => r'42af7531ad6e81ee33729704c3f6bd15919f78db';
/// See also [SelectedContainer]. /// See also [SelectedContainer].
@ProviderFor(SelectedContainer) @ProviderFor(SelectedContainer)
@@ -4,6 +4,7 @@ import 'dart:ui';
import 'package:flutter_background_service/flutter_background_service.dart'; import 'package:flutter_background_service/flutter_background_service.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:rxdart/rxdart.dart'; import 'package:rxdart/rxdart.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/features/geckoview/features/browser/domain/providers/lifecycle.dart'; import 'package:weblibre/features/geckoview/features/browser/domain/providers/lifecycle.dart';
import 'package:weblibre/features/tor/utils/tor_entrypoint.dart'; import 'package:weblibre/features/tor/utils/tor_entrypoint.dart';
@@ -108,10 +109,10 @@ class TorProxyService extends _$TorProxyService {
await _tor.initializeService(); await _tor.initializeService();
ref.listen(fireImmediately: true, browserViewLifecycleProvider, ( ref.listen(
previous, fireImmediately: true,
next, browserViewLifecycleProvider,
) { (previous, next) {
switch (next) { switch (next) {
case AppLifecycleState.resumed: case AppLifecycleState.resumed:
if (_timerPaused) { if (_timerPaused) {
@@ -127,7 +128,15 @@ class TorProxyService extends _$TorProxyService {
_timerPaused = true; _timerPaused = true;
} }
} }
}); },
onError: (error, stackTrace) {
logger.e(
'Error listening to browserViewLifecycleProvider',
error: error,
stackTrace: stackTrace,
);
},
);
ref.onDispose(() async { ref.onDispose(() async {
_heartbeatUpdate?.cancel(); _heartbeatUpdate?.cancel();
@@ -6,7 +6,7 @@ part of 'tor_proxy.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$torProxyServiceHash() => r'95cabaa03ea777a2a6cfb46629be334cde3f7a7e'; String _$torProxyServiceHash() => r'f991652e4e228d3e7fdc09a6088b6c5427d6231c';
/// See also [TorProxyService]. /// See also [TorProxyService].
@ProviderFor(TorProxyService) @ProviderFor(TorProxyService)
@@ -1,5 +1,6 @@
import 'package:riverpod/riverpod.dart'; import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:weblibre/core/logger.dart';
import 'package:weblibre/data/models/web_page_info.dart'; import 'package:weblibre/data/models/web_page_info.dart';
import 'package:weblibre/domain/services/generic_website.dart'; import 'package:weblibre/domain/services/generic_website.dart';
@@ -31,6 +32,13 @@ class CompletePageInfo extends _$CompletePageInfo {
state = next; state = next;
} }
}, },
onError: (error, stackTrace) {
logger.e(
'Error listening to pageInfoProvider',
error: error,
stackTrace: stackTrace,
);
},
); );
return (cached != null) ? AsyncData(cached) : const AsyncLoading(); return (cached != null) ? AsyncData(cached) : const AsyncLoading();
@@ -157,7 +157,7 @@ class _PageInfoProviderElement
bool get isImageRequest => (origin as PageInfoProvider).isImageRequest; bool get isImageRequest => (origin as PageInfoProvider).isImageRequest;
} }
String _$completePageInfoHash() => r'483e134d5191679804574ee853a367c3e9f4baf8'; String _$completePageInfoHash() => r'24dd5e32eac379ae9190de068a674fa1ee485d56';
abstract class _$CompletePageInfo abstract class _$CompletePageInfo
extends BuildlessAutoDisposeNotifier<AsyncValue<WebPageInfo>> { extends BuildlessAutoDisposeNotifier<AsyncValue<WebPageInfo>> {