one step closer
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user