perf(tabs): release stale image and tab state
Pixel 10 APK / build (push) Successful in 37m12s

This commit is contained in:
Codex
2026-08-10 17:59:50 +02:00
parent 03227320f4
commit aab2bc0cee
10 changed files with 203 additions and 8 deletions
@@ -32,15 +32,18 @@ import 'package:weblibre/extensions/uri.dart';
import 'package:weblibre/features/geckoview/domain/entities/states/tab.dart';
import 'package:weblibre/features/geckoview/domain/entities/tab_container_selection.dart';
import 'package:weblibre/features/geckoview/domain/providers.dart';
import 'package:weblibre/features/geckoview/domain/providers/desktop_mode.dart';
import 'package:weblibre/features/geckoview/domain/providers/pending_tab_selection.dart';
import 'package:weblibre/features/geckoview/domain/providers/restore_complete.dart';
import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart';
import 'package:weblibre/features/geckoview/domain/providers/tab_detail_state.dart';
import 'package:weblibre/features/geckoview/domain/providers/tab_list.dart';
import 'package:weblibre/features/geckoview/domain/providers/tab_session.dart';
import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart';
import 'package:weblibre/features/geckoview/features/browser/domain/controllers/home_target_controller.dart';
import 'package:weblibre/features/geckoview/features/browser/domain/providers.dart';
import 'package:weblibre/features/geckoview/features/browser/domain/services/browser_data.dart';
import 'package:weblibre/features/geckoview/features/find_in_page/domain/repositories/find_in_page.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/database/database.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/entities/isolation_context.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/entities/tab_mode.dart';
@@ -1211,6 +1214,21 @@ class TabRepository extends _$TabRepository {
ref.listen(
tabListProvider,
(previous, next) async {
final activeTabIds = next.value.toSet();
final removedTabIds = previous?.value
.where((tabId) => !activeTabIds.contains(tabId))
.toSet();
if (removedTabIds != null) {
for (final tabId in removedTabIds) {
// These families are keepAlive so tab-specific state survives while
// a tab is merely in the background. Once Gecko confirms removal,
// keeping their services and listeners serves no purpose.
ref.invalidate(tabSessionProvider(tabId: tabId));
ref.invalidate(desktopModeProvider(tabId));
ref.invalidate(findInPageRepositoryProvider(tabId));
}
}
if (_suppressNextReclose) {
_suppressNextReclose = false;
// Drop tombstones for the tabs that just came back via undo so