one step closer

This commit is contained in:
Fabian Freund
2024-10-22 07:27:37 +02:00
parent c4d93e8fe7
commit 8d351e55c0
92 changed files with 3829 additions and 2694 deletions
@@ -10,4 +10,8 @@ class GeckoBrowserService {
Future<void> showNativeFragment() {
return _api.showNativeFragment();
}
Future<void> onTrimMemory(int level) {
return _api.onTrimMemory(level);
}
}
@@ -12,22 +12,31 @@ typedef ThumbnailEvent = ({String tabId, Uint8List? bytes});
typedef FindResultsEvent = ({String tabId, List<FindResultState> results});
class GeckoEventService extends GeckoStateEvents {
final _lastEventTimes = <Subject, Map<dynamic, int>>{};
// Stream controllers
final _fragmentStateSubject = BehaviorSubject.seeded(false);
final _viewStateSubject = BehaviorSubject.seeded(false);
final _engineStateSubject = BehaviorSubject.seeded(false);
final _tabListSubject = BehaviorSubject<List<String>>();
final _selectedTabSubject = BehaviorSubject<String?>();
final _tabContentSubject = BehaviorSubject<TabContentState>();
final _historySubject = BehaviorSubject<HistoryEvent>();
final _readerableSubject = BehaviorSubject<ReaderableEvent>();
final _securityInfoSubject = BehaviorSubject<SecurityInfoEvent>();
final _iconSubject = BehaviorSubject<IconEvent>();
final _thumbnailSubject = BehaviorSubject<ThumbnailEvent>();
final _findResultsSubject = BehaviorSubject<FindResultsEvent>();
final _tabContentSubject = ReplaySubject<TabContentState>();
final _historySubject = ReplaySubject<HistoryEvent>();
final _securityInfoSubject = ReplaySubject<SecurityInfoEvent>();
final _readerableSubject = ReplaySubject<ReaderableEvent>();
final _iconSubject = PublishSubject<IconEvent>();
final _thumbnailSubject = PublishSubject<ThumbnailEvent>();
final _findResultsSubject = PublishSubject<FindResultsEvent>();
final _tabAddedSubject = PublishSubject<String>();
// Event streams
Stream<bool> get fragmentReadyStateEvents => _fragmentStateSubject.stream;
Stream<List<String>> get tabListEvents => _tabListSubject.stream;
Stream<String?> get selectedTabEvents => _selectedTabSubject.stream;
ValueStream<bool> get viewReadyStateEvents => _viewStateSubject.stream;
ValueStream<bool> get engineReadyStateEvents => _engineStateSubject.stream;
ValueStream<List<String>> get tabListEvents => _tabListSubject.stream;
ValueStream<String?> get selectedTabEvents => _selectedTabSubject.stream;
Stream<TabContentState> get tabContentEvents => _tabContentSubject.stream;
Stream<HistoryEvent> get historyEvents => _historySubject.stream;
Stream<ReaderableEvent> get readerableEvents => _readerableSubject.stream;
@@ -37,55 +46,124 @@ class GeckoEventService extends GeckoStateEvents {
Stream<ThumbnailEvent> get thumbnailEvents => _thumbnailSubject.stream;
Stream<FindResultsEvent> get findResultsEvent => _findResultsSubject.stream;
Stream<String> get tabAddedStream => _tabAddedSubject.stream;
void _addWhenMoreRecent<T>(
Subject<T> subject,
int timestamp,
dynamic identifier,
T value,
) {
_lastEventTimes[subject] ??= {};
if ((_lastEventTimes[subject]?[identifier] ?? 0) < timestamp) {
_lastEventTimes[subject]![identifier] = timestamp;
subject.add(value);
}
}
@override
void onFragmentReadyStateChange(bool state) {
_fragmentStateSubject.add(state);
void onViewReadyStateChange(int timestamp, bool state) {
_addWhenMoreRecent(_viewStateSubject, timestamp, null, state);
}
@override
void onEngineReadyStateChange(int timestamp, bool state) {
_addWhenMoreRecent(_engineStateSubject, timestamp, null, state);
}
// Overridden methods
@override
void onTabListChange(List<String?> tabIds) {
_tabListSubject.add(tabIds.nonNulls.toList());
void onTabListChange(int timestamp, List<String?> tabIds) {
_addWhenMoreRecent(
_tabListSubject,
timestamp,
null,
tabIds.nonNulls.toList(),
);
}
@override
void onSelectedTabChange(String? id) {
_selectedTabSubject.add(id);
void onSelectedTabChange(int timestamp, String? id) {
_addWhenMoreRecent(_selectedTabSubject, timestamp, id, id);
}
@override
void onTabContentStateChange(TabContentState state) {
_tabContentSubject.add(state);
void onTabContentStateChange(int timestamp, TabContentState state) {
_addWhenMoreRecent(_tabContentSubject, timestamp, state.id, state);
}
@override
void onHistoryStateChange(String id, HistoryState state) {
_historySubject.add((tabId: id, history: state));
void onHistoryStateChange(int timestamp, String id, HistoryState state) {
_addWhenMoreRecent(
_historySubject,
timestamp,
id,
(tabId: id, history: state),
);
}
@override
void onReaderableStateChange(String id, ReaderableState state) {
_readerableSubject.add((tabId: id, readerable: state));
void onReaderableStateChange(
int timestamp,
String id,
ReaderableState state,
) {
_addWhenMoreRecent(
_readerableSubject,
timestamp,
id,
(tabId: id, readerable: state),
);
}
@override
void onSecurityInfoStateChange(String id, SecurityInfoState state) {
_securityInfoSubject.add((tabId: id, securityInfo: state));
void onSecurityInfoStateChange(
int timestamp,
String id,
SecurityInfoState state,
) {
_addWhenMoreRecent(
_securityInfoSubject,
timestamp,
id,
(tabId: id, securityInfo: state),
);
}
@override
void onIconChange(String id, Uint8List? bytes) {
_iconSubject.add((tabId: id, bytes: bytes));
void onIconChange(int timestamp, String id, Uint8List? bytes) {
_addWhenMoreRecent(_iconSubject, timestamp, id, (tabId: id, bytes: bytes));
}
@override
void onThumbnailChange(String id, Uint8List? bytes) {
_thumbnailSubject.add((tabId: id, bytes: bytes));
void onThumbnailChange(int timestamp, String id, Uint8List? bytes) {
_addWhenMoreRecent(
_thumbnailSubject,
timestamp,
id,
(tabId: id, bytes: bytes),
);
}
@override
void onFindResults(String id, List<FindResultState?> results) {
_findResultsSubject.add((tabId: id, results: results.nonNulls.toList()));
void onFindResults(int timestamp, String id, List<FindResultState?> results) {
_addWhenMoreRecent(
_findResultsSubject,
timestamp,
id,
(tabId: id, results: results.nonNulls.toList()),
);
}
@override
void onTabAdded(int timestamp, String tabId) {
_addWhenMoreRecent(
_tabAddedSubject,
timestamp,
null,
tabId,
);
}
GeckoEventService.setUp({
@@ -109,5 +187,6 @@ class GeckoEventService extends GeckoStateEvents {
unawaited(_iconSubject.close());
unawaited(_thumbnailSubject.close());
unawaited(_findResultsSubject.close());
unawaited(_tabAddedSubject.close());
}
}
@@ -11,14 +11,14 @@ class GeckoTabService {
GeckoTabService({GeckoTabsApi? api}) : _api = api ?? _apiInstance;
Future<void> syncEvents({
bool onSelectedTabChange = true,
bool onTabListChange = true,
bool onTabContentStateChange = true,
bool onIconChange = true,
bool onSecurityInfoStateChange = true,
bool onHistoryStateChange = true,
bool onFindResults = true,
bool onThumbnailChange = true,
bool onSelectedTabChange = false,
bool onTabListChange = false,
bool onTabContentStateChange = false,
bool onIconChange = false,
bool onSecurityInfoStateChange = false,
bool onHistoryStateChange = false,
bool onFindResults = false,
bool onThumbnailChange = false,
}) {
return _api.syncEvents(
onSelectedTabChange: onSelectedTabChange,