diff --git a/app/lib/features/geckoview/domain/providers/selected_tab.dart b/app/lib/features/geckoview/domain/providers/selected_tab.dart index d3474583..a9e8b019 100644 --- a/app/lib/features/geckoview/domain/providers/selected_tab.dart +++ b/app/lib/features/geckoview/domain/providers/selected_tab.dart @@ -1,5 +1,6 @@ import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:weblibre/core/logger.dart'; import 'package:weblibre/features/geckoview/domain/providers.dart'; part 'selected_tab.g.dart'; @@ -10,14 +11,22 @@ class SelectedTab extends _$SelectedTab { String? build() { final eventSerivce = ref.watch(eventServiceProvider); - ref.listen(fireImmediately: true, engineReadyStateProvider, ( - previous, - next, - ) async { - if (next) { - await GeckoTabService().syncEvents(onSelectedTabChange: true); - } - }); + ref.listen( + fireImmediately: true, + engineReadyStateProvider, + (previous, next) async { + if (next) { + await GeckoTabService().syncEvents(onSelectedTabChange: true); + } + }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to engineReadyStateProvider', + error: error, + stackTrace: stackTrace, + ); + }, + ); final selectedTabSub = eventSerivce.selectedTabEvents.listen((tabId) { state = tabId; diff --git a/app/lib/features/geckoview/domain/providers/selected_tab.g.dart b/app/lib/features/geckoview/domain/providers/selected_tab.g.dart index 73714fc7..10b87276 100644 --- a/app/lib/features/geckoview/domain/providers/selected_tab.g.dart +++ b/app/lib/features/geckoview/domain/providers/selected_tab.g.dart @@ -6,7 +6,7 @@ part of 'selected_tab.dart'; // RiverpodGenerator // ************************************************************************** -String _$selectedTabHash() => r'12b670dd76c3416e8d62bafd63bf69a83a603e3a'; +String _$selectedTabHash() => r'26d1bb90c777d7011f4f27f7b962584a4a62a0a7'; /// See also [SelectedTab]. @ProviderFor(SelectedTab) diff --git a/app/lib/features/geckoview/domain/providers/tab_list.dart b/app/lib/features/geckoview/domain/providers/tab_list.dart index 42934e3f..0ce998b4 100644 --- a/app/lib/features/geckoview/domain/providers/tab_list.dart +++ b/app/lib/features/geckoview/domain/providers/tab_list.dart @@ -1,6 +1,7 @@ import 'package:fast_equatable/fast_equatable.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:weblibre/core/logger.dart'; import 'package:weblibre/features/geckoview/domain/providers.dart'; part 'tab_list.g.dart'; @@ -11,14 +12,22 @@ class TabList extends _$TabList { EquatableValue> build() { final eventService = ref.watch(eventServiceProvider); - ref.listen(fireImmediately: true, engineReadyStateProvider, ( - previous, - next, - ) async { - if (next) { - await GeckoTabService().syncEvents(onTabListChange: true); - } - }); + ref.listen( + fireImmediately: true, + engineReadyStateProvider, + (previous, next) async { + if (next) { + 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 equatableTabs = EquatableValue(tabs); diff --git a/app/lib/features/geckoview/domain/providers/tab_list.g.dart b/app/lib/features/geckoview/domain/providers/tab_list.g.dart index 78b33134..a187dbac 100644 --- a/app/lib/features/geckoview/domain/providers/tab_list.g.dart +++ b/app/lib/features/geckoview/domain/providers/tab_list.g.dart @@ -6,7 +6,7 @@ part of 'tab_list.dart'; // RiverpodGenerator // ************************************************************************** -String _$tabListHash() => r'9507bcc75dc69a55aba14334cdef0128a5fcf252'; +String _$tabListHash() => r'0b9ca1e089a59895df4cbf28691c2849a7004f08'; /// See also [TabList]. @ProviderFor(TabList) diff --git a/app/lib/features/geckoview/domain/providers/tab_state.dart b/app/lib/features/geckoview/domain/providers/tab_state.dart index 5097b984..134149cf 100644 --- a/app/lib/features/geckoview/domain/providers/tab_state.dart +++ b/app/lib/features/geckoview/domain/providers/tab_state.dart @@ -5,6 +5,7 @@ import 'package:nullability/nullability.dart'; import 'package:riverpod/riverpod.dart'; import 'package:riverpod_annotation/riverpod_annotation.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/history.dart'; import 'package:weblibre/features/geckoview/domain/entities/states/readerable.dart'; @@ -155,21 +156,29 @@ class TabStates extends _$TabStates { }), ]; - ref.listen(fireImmediately: true, engineReadyStateProvider, ( - previous, - next, - ) async { - if (next) { - await GeckoTabService().syncEvents( - onTabContentStateChange: true, - onIconChange: true, - onThumbnailChange: true, - onSecurityInfoStateChange: true, - onHistoryStateChange: true, - onFindResults: true, + ref.listen( + fireImmediately: true, + engineReadyStateProvider, + (previous, next) async { + if (next) { + await GeckoTabService().syncEvents( + onTabContentStateChange: true, + onIconChange: true, + onThumbnailChange: true, + onSecurityInfoStateChange: true, + onHistoryStateChange: true, + onFindResults: true, + ); + } + }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to engineReadyStateProvider', + error: error, + stackTrace: stackTrace, ); - } - }); + }, + ); ref.onDispose(() async { for (final sub in subscriptions) { diff --git a/app/lib/features/geckoview/domain/providers/tab_state.g.dart b/app/lib/features/geckoview/domain/providers/tab_state.g.dart index 28cc61e1..941cd70e 100644 --- a/app/lib/features/geckoview/domain/providers/tab_state.g.dart +++ b/app/lib/features/geckoview/domain/providers/tab_state.g.dart @@ -158,7 +158,7 @@ final selectedTabStateProvider = AutoDisposeProvider.internal( @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element typedef SelectedTabStateRef = AutoDisposeProviderRef; -String _$tabStatesHash() => r'bd2c3d9f3e11b75a1ca53a3fc4510c3c3df80021'; +String _$tabStatesHash() => r'e4d2f2b4ddd65beac8a1fd0d22bad1e0a26b41bd'; /// See also [TabStates]. @ProviderFor(TabStates) diff --git a/app/lib/features/geckoview/domain/repositories/tab.dart b/app/lib/features/geckoview/domain/repositories/tab.dart index 4a2732b8..782dfb77 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.dart @@ -253,62 +253,102 @@ class TabRepository extends _$TabRepository { ); }); - ref.listen(fireImmediately: true, selectedTabProvider, ( - previous, - tabId, - ) async { - if (tabId != null) { - _previousTabId = previous; - await db.tabDao.touchTab(tabId, timestamp: DateTime.now()); - } - }); + ref.listen( + fireImmediately: true, + selectedTabProvider, + (previous, tabId) async { + if (tabId != null) { + _previousTabId = previous; + 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 { - //Only sync tabs if there has been a previous value or is not empty - final syncTabs = - next.value.isNotEmpty || (previous?.value.isNotEmpty ?? false); + ref.listen( + tabListProvider, + (previous, next) async { + //Only sync tabs if there has been a previous value or is not empty + final syncTabs = + next.value.isNotEmpty || (previous?.value.isNotEmpty ?? false); - if (_previousTabId != null && !next.value.contains(_previousTabId)) { - _previousTabId = null; - } + if (_previousTabId != null && !next.value.contains(_previousTabId)) { + _previousTabId = null; + } - if (syncTabs) { - await db.tabDao.syncTabs(retainTabIds: next.value); - } - }); + if (syncTabs) { + 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)); Map? debounceStartValue; - ref.listen(tabStatesProvider, (previous, next) { - //Since state changes occure pretty often and our map always contains - //the latest state, we cache the value before starting debouncing and - //later diff to that, to avoid frequent database writes - if (!tabStateDebouncer.isDebouncing) { - debounceStartValue = previous; - } - - tabStateDebouncer.eventOccured(() async { - await db.tabDao.updateTabs(debounceStartValue, next); - }); - }); - - ref.listen(engineBoundIntentStreamProvider, (previous, next) { - next.whenData((value) async { - switch (value) { - case SharedUrl(): - _tabFromIntent.add(await addTab(url: value.url)); - case SharedText(): - final defaultSearchBang = - ref.read(selectedBangDataProvider()) ?? - await ref.read(defaultSearchBangDataProvider.future); - - _tabFromIntent.add( - await addTab(url: defaultSearchBang?.getTemplateUrl(value.text)), - ); + ref.listen( + tabStatesProvider, + (previous, next) { + //Since state changes occure pretty often and our map always contains + //the latest state, we cache the value before starting debouncing and + //later diff to that, to avoid frequent database writes + if (!tabStateDebouncer.isDebouncing) { + debounceStartValue = previous; } - }); - }); + + tabStateDebouncer.eventOccured(() async { + await db.tabDao.updateTabs(debounceStartValue, next); + }); + }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to tabStatesProvider', + error: error, + stackTrace: stackTrace, + ); + }, + ); + + ref.listen( + engineBoundIntentStreamProvider, + (previous, next) { + next.whenData((value) async { + switch (value) { + case SharedUrl(): + _tabFromIntent.add(await addTab(url: value.url)); + case SharedText(): + final defaultSearchBang = + ref.read(selectedBangDataProvider()) ?? + await ref.read(defaultSearchBangDataProvider.future); + + _tabFromIntent.add( + await addTab( + url: defaultSearchBang?.getTemplateUrl(value.text), + ), + ); + } + }); + }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to engineBoundIntentStreamProvider', + error: error, + stackTrace: stackTrace, + ); + }, + ); ref.onDispose(() async { tabStateDebouncer.dispose(); diff --git a/app/lib/features/geckoview/domain/repositories/tab.g.dart b/app/lib/features/geckoview/domain/repositories/tab.g.dart index d94565e1..40e58bc6 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.g.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.g.dart @@ -6,7 +6,7 @@ part of 'tab.dart'; // RiverpodGenerator // ************************************************************************** -String _$tabRepositoryHash() => r'db220096fef5d125a698063e9a88272db92e75c5'; +String _$tabRepositoryHash() => r'1d8e1c2cf9bd1ed5ad698c992bd8a1bba80f8115'; /// See also [TabRepository]. @ProviderFor(TabRepository) diff --git a/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart b/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart index 19ce2add..c39e6a4d 100644 --- a/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart +++ b/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart' show ThemeMode; import 'package:flutter_mozilla_components/flutter_mozilla_components.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/general_settings.dart'; @@ -29,68 +30,83 @@ class EngineSettingsReplicationService await _service.preferredColorScheme(theme); }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to generalSettingsRepositoryProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); - ref.listen(fireImmediately: true, engineSettingsRepositoryProvider, ( - previous, - next, - ) async { - if (initialSettingsSent && previous != null) { - if (previous.javascriptEnabled != next.javascriptEnabled) { - await _service.javascriptEnabled(next.javascriptEnabled); + ref.listen( + fireImmediately: true, + engineSettingsRepositoryProvider, + (previous, next) async { + if (initialSettingsSent && previous != null) { + if (previous.javascriptEnabled != next.javascriptEnabled) { + await _service.javascriptEnabled(next.javascriptEnabled); + } + if (previous.trackingProtectionPolicy != + next.trackingProtectionPolicy) { + await _service.trackingProtectionPolicy( + next.trackingProtectionPolicy, + ); + } + if (previous.httpsOnlyMode != next.httpsOnlyMode) { + await _service.httpsOnlyMode(next.httpsOnlyMode); + } + if (previous.globalPrivacyControlEnabled != + next.globalPrivacyControlEnabled) { + await _service.globalPrivacyControlEnabled( + next.globalPrivacyControlEnabled, + ); + } + if (previous.preferredColorScheme != next.preferredColorScheme) { + await _service.preferredColorScheme(next.preferredColorScheme); + } + if (previous.cookieBannerHandlingMode != + next.cookieBannerHandlingMode) { + await _service.cookieBannerHandlingMode( + next.cookieBannerHandlingMode, + ); + } + if (previous.cookieBannerHandlingModePrivateBrowsing != + next.cookieBannerHandlingModePrivateBrowsing) { + await _service.cookieBannerHandlingModePrivateBrowsing( + next.cookieBannerHandlingModePrivateBrowsing, + ); + } + if (previous.cookieBannerHandlingGlobalRules != + next.cookieBannerHandlingGlobalRules) { + await _service.cookieBannerHandlingGlobalRules( + next.cookieBannerHandlingGlobalRules, + ); + } + if (previous.cookieBannerHandlingGlobalRulesSubFrames != + next.cookieBannerHandlingGlobalRulesSubFrames) { + await _service.cookieBannerHandlingGlobalRulesSubFrames( + next.cookieBannerHandlingGlobalRulesSubFrames, + ); + } + if (previous.webContentIsolationStrategy != + next.webContentIsolationStrategy) { + await _service.webContentIsolationStrategy( + next.webContentIsolationStrategy, + ); + } + } else { + await _service.setDefaultSettings(next); + initialSettingsSent = true; } - if (previous.trackingProtectionPolicy != - next.trackingProtectionPolicy) { - await _service.trackingProtectionPolicy( - next.trackingProtectionPolicy, - ); - } - if (previous.httpsOnlyMode != next.httpsOnlyMode) { - await _service.httpsOnlyMode(next.httpsOnlyMode); - } - if (previous.globalPrivacyControlEnabled != - next.globalPrivacyControlEnabled) { - await _service.globalPrivacyControlEnabled( - next.globalPrivacyControlEnabled, - ); - } - if (previous.preferredColorScheme != next.preferredColorScheme) { - await _service.preferredColorScheme(next.preferredColorScheme); - } - if (previous.cookieBannerHandlingMode != - next.cookieBannerHandlingMode) { - await _service.cookieBannerHandlingMode( - next.cookieBannerHandlingMode, - ); - } - if (previous.cookieBannerHandlingModePrivateBrowsing != - next.cookieBannerHandlingModePrivateBrowsing) { - await _service.cookieBannerHandlingModePrivateBrowsing( - next.cookieBannerHandlingModePrivateBrowsing, - ); - } - if (previous.cookieBannerHandlingGlobalRules != - next.cookieBannerHandlingGlobalRules) { - await _service.cookieBannerHandlingGlobalRules( - next.cookieBannerHandlingGlobalRules, - ); - } - if (previous.cookieBannerHandlingGlobalRulesSubFrames != - next.cookieBannerHandlingGlobalRulesSubFrames) { - await _service.cookieBannerHandlingGlobalRulesSubFrames( - next.cookieBannerHandlingGlobalRulesSubFrames, - ); - } - if (previous.webContentIsolationStrategy != - next.webContentIsolationStrategy) { - await _service.webContentIsolationStrategy( - next.webContentIsolationStrategy, - ); - } - } else { - await _service.setDefaultSettings(next); - initialSettingsSent = true; - } - }); + }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to engineSettingsRepositoryProvider', + error: error, + stackTrace: stackTrace, + ); + }, + ); } } diff --git a/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.g.dart b/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.g.dart index d9d4cd89..c2ba1006 100644 --- a/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.g.dart +++ b/app/lib/features/geckoview/features/browser/domain/services/engine_settings_replication.g.dart @@ -7,7 +7,7 @@ part of 'engine_settings_replication.dart'; // ************************************************************************** String _$engineSettingsReplicationServiceHash() => - r'559d9dce006a4c9b66de5aceedf9ca8f5d8e12b1'; + r'31b5b79e429bfedb9c6b57050cd2d99407914228'; /// See also [EngineSettingsReplicationService]. @ProviderFor(EngineSettingsReplicationService) diff --git a/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.dart b/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.dart index 3abff8e0..7d4a4465 100644 --- a/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.dart +++ b/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.dart @@ -2,6 +2,7 @@ import 'package:fast_equatable/fast_equatable.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:nullability/nullability.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/tor/domain/services/tor_proxy.dart'; import 'package:weblibre/features/user/domain/repositories/general_settings.dart'; @@ -22,6 +23,13 @@ class ProxySettingsReplication extends _$ProxySettingsReplication { await _service.setProxyPort(next); } }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to torProxyServiceProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); 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( @@ -60,6 +75,13 @@ class ProxySettingsReplication extends _$ProxySettingsReplication { await _service.removeContainerProxy('private'); } }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to generalSettingsRepositoryProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); } } diff --git a/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.g.dart b/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.g.dart index 6d00cceb..d8956c16 100644 --- a/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.g.dart +++ b/app/lib/features/geckoview/features/browser/domain/services/proxy_settings_replication.g.dart @@ -7,7 +7,7 @@ part of 'proxy_settings_replication.dart'; // ************************************************************************** String _$proxySettingsReplicationHash() => - r'cd3a7573abfa0b32562289c02e77f0b44e88a8ae'; + r'4476bab659f09de0866d0b3ae10d54ccb996335d'; /// See also [ProxySettingsReplication]. @ProviderFor(ProxySettingsReplication) diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart index 850d5287..dee2927e 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart @@ -156,48 +156,104 @@ class _BrowserViewState extends ConsumerState fireImmediately: true, tabRepositoryProvider, (previous, next) {}, + onError: (error, stackTrace) { + logger.e( + 'Error listening to tabRepositoryProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); ref.listenManual( fireImmediately: true, selectionActionServiceProvider, (previous, next) {}, + onError: (error, stackTrace) { + logger.e( + 'Error listening to selectionActionServiceProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); ref.listenManual( fireImmediately: true, webExtensionsStateProvider(WebExtensionActionType.browser), (previous, next) {}, + onError: (error, stackTrace) { + logger.e( + 'Error listening to webExtensionsStateProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); ref.listenManual( fireImmediately: true, webExtensionsStateProvider(WebExtensionActionType.page), (previous, next) {}, + onError: (error, stackTrace) { + logger.e( + 'Error listening to webExtensionsStateProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); ref.listenManual( fireImmediately: true, cacheRepositoryProvider, (previous, next) {}, + onError: (error, stackTrace) { + logger.e( + 'Error listening to cacheRepositoryProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); ref.listenManual( fireImmediately: true, engineSettingsReplicationServiceProvider, (previous, next) {}, + onError: (error, stackTrace) { + logger.e( + 'Error listening to engineSettingsReplicationServiceProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); ref.listenManual( fireImmediately: true, proxySettingsReplicationProvider, (previous, next) {}, + onError: (error, stackTrace) { + logger.e( + 'Error listening to proxySettingsReplicationProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); ref.listenManual( fireImmediately: true, articleContentProcessorServiceProvider, (previous, next) {}, + onError: (error, stackTrace) { + logger.e( + 'Error listening to articleContentProcessorServiceProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); } diff --git a/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart b/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart index 2fbc119a..a9ed180f 100644 --- a/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart +++ b/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart @@ -1,5 +1,6 @@ import 'package:nullability/nullability.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/tab_state.dart'; import 'package:weblibre/features/geckoview/features/find_in_page/domain/entities/find_in_page_state.dart'; @@ -45,20 +46,30 @@ class FindInPageController extends _$FindInPageController { @override FindInPageState build() { - ref.listen(selectedTabStateProvider, (previous, next) async { - if (state.visible && state.lastSearchText.isNotEmpty) { - if (previous != null && next != null) { - final loadingOrReloading = - previous.isLoading == true && next.isLoading == false; - final tabSwitchWithoutResults = - previous.id != next.id && !next.findResultState.hasMatches; + ref.listen( + selectedTabStateProvider, + (previous, next) async { + if (state.visible && state.lastSearchText.isNotEmpty) { + if (previous != null && next != null) { + final loadingOrReloading = + previous.isLoading == true && next.isLoading == false; + final tabSwitchWithoutResults = + previous.id != next.id && !next.findResultState.hasMatches; - if (loadingOrReloading || tabSwitchWithoutResults) { - await findAll(text: state.lastSearchText!); + if (loadingOrReloading || tabSwitchWithoutResults) { + await findAll(text: state.lastSearchText!); + } } } - } - }); + }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to selectedTabStateProvider', + error: error, + stackTrace: stackTrace, + ); + }, + ); return FindInPageState.hidden(); } diff --git a/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.g.dart b/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.g.dart index b2cc8e74..782f1aa9 100644 --- a/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.g.dart +++ b/app/lib/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.g.dart @@ -7,7 +7,7 @@ part of 'find_in_page.dart'; // ************************************************************************** String _$findInPageControllerHash() => - r'b75a1edb4c25246bf2a5f5c9a807d6151b23856e'; + r'de69a752c0472b5e3803fb0410fb8caee2c3ff7e'; /// See also [FindInPageController]. @ProviderFor(FindInPageController) diff --git a/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.dart b/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.dart index 3e4b575d..d1a6f4e4 100644 --- a/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.dart +++ b/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.dart @@ -1,6 +1,7 @@ import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:riverpod/riverpod.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/features/tabs/data/models/container_data.dart'; import 'package:weblibre/features/geckoview/features/tabs/data/providers.dart'; @@ -75,29 +76,50 @@ class SelectedContainer extends _$SelectedContainer { @override String? build() { - ref.listen(containersWithCountProvider, (previous, next) { - if (state != null && next.valueOrNull != null) { - if (!next.value!.any((container) => container.id == state)) { - clearContainer(); - } - } - }); - - ref.listen(selectedTabProvider, (previous, next) async { - if (next != null) { - final tabContainerId = await ref - .read(tabDataRepositoryProvider.notifier) - .containerTabId(next); - - if (tabContainerId != stateOrNull) { - if (tabContainerId != null) { - await setContainerId(tabContainerId); - } else { + ref.listen( + containersWithCountProvider, + (previous, next) { + if (state != null && next.valueOrNull != null) { + if (!next.value!.any((container) => container.id == state)) { clearContainer(); } } - } - }, fireImmediately: true); + }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to containersWithCountProvider', + error: error, + stackTrace: stackTrace, + ); + }, + ); + + ref.listen( + selectedTabProvider, + (previous, next) async { + if (next != null) { + final tabContainerId = await ref + .read(tabDataRepositoryProvider.notifier) + .containerTabId(next); + + if (tabContainerId != stateOrNull) { + if (tabContainerId != null) { + await setContainerId(tabContainerId); + } else { + clearContainer(); + } + } + } + }, + fireImmediately: true, + onError: (error, stackTrace) { + logger.e( + 'Error listening to selectedTabProvider', + error: error, + stackTrace: stackTrace, + ); + }, + ); return null; } diff --git a/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.g.dart b/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.g.dart index fa3c7c7a..46301af3 100644 --- a/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.g.dart +++ b/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.g.dart @@ -25,7 +25,7 @@ final selectedContainerDataProvider = @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element typedef SelectedContainerDataRef = AutoDisposeStreamProviderRef; -String _$selectedContainerHash() => r'07f534f8570135cdc47a2332d0eba9ff6fc5cf44'; +String _$selectedContainerHash() => r'42af7531ad6e81ee33729704c3f6bd15919f78db'; /// See also [SelectedContainer]. @ProviderFor(SelectedContainer) diff --git a/app/lib/features/tor/domain/services/tor_proxy.dart b/app/lib/features/tor/domain/services/tor_proxy.dart index 788ebd1d..185400fa 100644 --- a/app/lib/features/tor/domain/services/tor_proxy.dart +++ b/app/lib/features/tor/domain/services/tor_proxy.dart @@ -4,6 +4,7 @@ import 'dart:ui'; import 'package:flutter_background_service/flutter_background_service.dart'; import 'package:riverpod_annotation/riverpod_annotation.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/tor/utils/tor_entrypoint.dart'; @@ -108,26 +109,34 @@ class TorProxyService extends _$TorProxyService { await _tor.initializeService(); - ref.listen(fireImmediately: true, browserViewLifecycleProvider, ( - previous, - next, - ) { - switch (next) { - case AppLifecycleState.resumed: - if (_timerPaused) { - _enableHeartbeatTimer(); - } - case AppLifecycleState.detached: - case AppLifecycleState.inactive: - case AppLifecycleState.hidden: - case AppLifecycleState.paused: - case null: - if (_heartbeatUpdate?.isActive == true) { - _heartbeatUpdate?.cancel(); - _timerPaused = true; - } - } - }); + ref.listen( + fireImmediately: true, + browserViewLifecycleProvider, + (previous, next) { + switch (next) { + case AppLifecycleState.resumed: + if (_timerPaused) { + _enableHeartbeatTimer(); + } + case AppLifecycleState.detached: + case AppLifecycleState.inactive: + case AppLifecycleState.hidden: + case AppLifecycleState.paused: + case null: + if (_heartbeatUpdate?.isActive == true) { + _heartbeatUpdate?.cancel(); + _timerPaused = true; + } + } + }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to browserViewLifecycleProvider', + error: error, + stackTrace: stackTrace, + ); + }, + ); ref.onDispose(() async { _heartbeatUpdate?.cancel(); diff --git a/app/lib/features/tor/domain/services/tor_proxy.g.dart b/app/lib/features/tor/domain/services/tor_proxy.g.dart index 6bec9e75..25eb9524 100644 --- a/app/lib/features/tor/domain/services/tor_proxy.g.dart +++ b/app/lib/features/tor/domain/services/tor_proxy.g.dart @@ -6,7 +6,7 @@ part of 'tor_proxy.dart'; // RiverpodGenerator // ************************************************************************** -String _$torProxyServiceHash() => r'95cabaa03ea777a2a6cfb46629be334cde3f7a7e'; +String _$torProxyServiceHash() => r'f991652e4e228d3e7fdc09a6088b6c5427d6231c'; /// See also [TorProxyService]. @ProviderFor(TorProxyService) diff --git a/app/lib/presentation/controllers/website_title.dart b/app/lib/presentation/controllers/website_title.dart index ed1fb990..bd08fc81 100644 --- a/app/lib/presentation/controllers/website_title.dart +++ b/app/lib/presentation/controllers/website_title.dart @@ -1,5 +1,6 @@ import 'package:riverpod/riverpod.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/domain/services/generic_website.dart'; @@ -31,6 +32,13 @@ class CompletePageInfo extends _$CompletePageInfo { state = next; } }, + onError: (error, stackTrace) { + logger.e( + 'Error listening to pageInfoProvider', + error: error, + stackTrace: stackTrace, + ); + }, ); return (cached != null) ? AsyncData(cached) : const AsyncLoading(); diff --git a/app/lib/presentation/controllers/website_title.g.dart b/app/lib/presentation/controllers/website_title.g.dart index de81d47a..8d3b338d 100644 --- a/app/lib/presentation/controllers/website_title.g.dart +++ b/app/lib/presentation/controllers/website_title.g.dart @@ -157,7 +157,7 @@ class _PageInfoProviderElement bool get isImageRequest => (origin as PageInfoProvider).isImageRequest; } -String _$completePageInfoHash() => r'483e134d5191679804574ee853a367c3e9f4baf8'; +String _$completePageInfoHash() => r'24dd5e32eac379ae9190de068a674fa1ee485d56'; abstract class _$CompletePageInfo extends BuildlessAutoDisposeNotifier> {