setting to exclude proxy from global routing

This commit is contained in:
Fabian Freund
2026-05-27 09:23:18 +02:00
parent 2812c24f35
commit 7275ac9400
27 changed files with 661 additions and 65 deletions
@@ -1,6 +1,7 @@
import 'dart:async';
import 'dart:ui';
import 'package:drift/drift.dart';
import 'package:drift/native.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter_tor/flutter_tor.dart';
@@ -9,6 +10,8 @@ import 'package:weblibre/data/database/functions/lexo_rank_functions.dart';
import 'package:weblibre/data/database/functions/url_functions.dart';
import 'package:weblibre/features/geckoview/features/browser/domain/services/proxy_settings_replication.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/database/database.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/entities/tab_mode.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/entities/tab_source.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/models/site_assignment.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/providers.dart';
@@ -82,12 +85,168 @@ void main() {
]);
},
);
test('bypassed containers sync explicit direct routing', () async {
final bypassedContainer = _container(
id: 'container-1',
contextId: 'context-a',
bypassGlobalProxy: true,
);
final db = TabDatabase(
NativeDatabase.memory(
setup: (database) {
registerLexorankFunctions(database);
registerUrlFunctions(database);
},
),
);
final containerProxyRepository = _FakeContainerProxyRepository();
final containerRepository = _FakeContainerRepository([bypassedContainer]);
final container = ProviderContainer(
overrides: [
tabDatabaseProvider.overrideWith((ref) => db),
containerProxyRepositoryProvider.overrideWith(
() => containerProxyRepository,
),
containerRepositoryProvider.overrideWith(() => containerRepository),
torProxyServiceProvider.overrideWith(_FakeTorProxyService.new),
proxyRoutingSettingsWithDefaultsProvider.overrideWith(
(ref) => ProxyRoutingSettings.withDefaults(
regularTabsMode: ProxyRegularTabRoutingMode.all,
regularTabsProxyConnectionId: const TorProxyConnectionId(),
),
),
watchContainersWithCountProvider.overrideWith(
(ref) => Stream.value([bypassedContainer]),
),
watchAllAssignedSitesProvider.overrideWith(
(ref) => Stream.value(const <SiteAssignment>[]),
),
watchIsolatedContextContainerMapProvider.overrideWith(
(ref) => Stream.value(const <String, Set<String>>{}),
),
],
);
addTearDown(() async {
container.dispose();
await db.close();
});
final subscription = container.listen<void>(
proxySettingsReplicationProvider,
(previous, next) {},
fireImmediately: true,
);
addTearDown(subscription.close);
await pumpEventQueue();
expect(containerProxyRepository.setContainerDirectConnectionCalls, [
('context-a', 'context-a'),
]);
expect(containerProxyRepository.setContainerProxyCalls, [
('general', const TorProxyConnectionId().encode()),
]);
});
test(
'mixed bypassed and inherited isolated containers do not bypass globally',
() async {
final bypassedContainer = _container(
id: 'container-direct',
contextId: 'context-direct',
bypassGlobalProxy: true,
);
final inheritedContainer = _container(
id: 'container-inherit',
contextId: 'context-inherit',
);
final db = TabDatabase(
NativeDatabase.memory(
setup: (database) {
registerLexorankFunctions(database);
registerUrlFunctions(database);
},
),
);
await db.containerDao.addContainer(bypassedContainer);
await db.containerDao.addContainer(inheritedContainer);
await db.tabDao.insertTab(
'tab-direct',
source: TabSource.manual,
parentId: const Value(null),
containerId: const Value('container-direct'),
tabMode: Value(TabMode.isolated('isolation-a')),
);
await db.tabDao.insertTab(
'tab-inherit',
source: TabSource.manual,
parentId: const Value(null),
containerId: const Value('container-inherit'),
tabMode: Value(TabMode.isolated('isolation-a')),
);
final containerProxyRepository = _FakeContainerProxyRepository();
final containers = [bypassedContainer, inheritedContainer];
final containerRepository = _FakeContainerRepository(containers);
final container = ProviderContainer(
overrides: [
tabDatabaseProvider.overrideWith((ref) => db),
containerProxyRepositoryProvider.overrideWith(
() => containerProxyRepository,
),
containerRepositoryProvider.overrideWith(() => containerRepository),
torProxyServiceProvider.overrideWith(_FakeTorProxyService.new),
proxyRoutingSettingsWithDefaultsProvider.overrideWith(
(ref) => ProxyRoutingSettings.withDefaults(
regularTabsMode: ProxyRegularTabRoutingMode.all,
regularTabsProxyConnectionId: const TorProxyConnectionId(),
),
),
watchContainersWithCountProvider.overrideWith(
(ref) => Stream.value(containers),
),
watchAllAssignedSitesProvider.overrideWith(
(ref) => Stream.value(const <SiteAssignment>[]),
),
watchIsolatedContextContainerMapProvider.overrideWith(
(ref) => Stream.value(const {
'isolation-a': {'container-direct', 'container-inherit'},
}),
),
],
);
addTearDown(() async {
container.dispose();
await db.close();
});
final subscription = container.listen<void>(
proxySettingsReplicationProvider,
(previous, next) {},
fireImmediately: true,
);
addTearDown(subscription.close);
await pumpEventQueue();
expect(containerProxyRepository.setContainerDirectConnectionCalls, [
('context-direct', 'context-direct'),
]);
expect(
containerProxyRepository.setContainerProxyCalls,
contains(('general', const TorProxyConnectionId().encode())),
);
expect(
containerProxyRepository.setContainerDirectConnectionCalls,
isNot(contains(('isolation-a', 'context-direct'))),
);
},
);
}
ContainerDataWithCount _container({
required String id,
required String contextId,
required ProxyConnectionId proxyConnectionId,
ProxyConnectionId? proxyConnectionId,
bool bypassGlobalProxy = false,
}) {
return ContainerDataWithCount(
id: id,
@@ -97,6 +256,7 @@ ContainerDataWithCount _container({
metadata: ContainerMetadata.withDefaults(
contextualIdentity: contextId,
proxyConnectionId: proxyConnectionId,
bypassGlobalProxy: bypassGlobalProxy,
),
tabCount: 0,
);
@@ -104,6 +264,7 @@ ContainerDataWithCount _container({
class _FakeContainerProxyRepository extends ContainerProxyRepository {
final setContainerProxyCalls = <(String, String)>[];
final setContainerDirectConnectionCalls = <(String, String)>[];
@override
Future<void> setTorProxyPort(int? port) async {}
@@ -116,6 +277,14 @@ class _FakeContainerProxyRepository extends ContainerProxyRepository {
setContainerProxyCalls.add((contextId, proxyId));
}
@override
Future<void> setContainerDirectConnection(
String contextId, {
required String scopeId,
}) async {
setContainerDirectConnectionCalls.add((contextId, scopeId));
}
@override
Future<void> clearContainerProxy(String contextId) async {}