mainly refactoring & addons

This commit is contained in:
Fabian Freund
2024-10-29 10:03:24 +01:00
parent 91a4319b28
commit 0710116feb
127 changed files with 4234 additions and 1815 deletions
@@ -0,0 +1,128 @@
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_mozilla_components/src/extensions/subject.dart';
import 'package:flutter_mozilla_components/src/pigeons/gecko.g.dart';
import 'package:rxdart/rxdart.dart';
typedef ExtensionDataEvent = ({String extensionId, WebExtensionData? data});
typedef ExtensionIconEvent = ({String extensionId, Uint8List bytes});
final _apiInstance = GeckoAddonsApi();
class GeckoAddonService extends GeckoAddonEvents {
final GeckoAddonsApi _api;
final _browserExtensionSubject = ReplaySubject<ExtensionDataEvent>();
final _pageExtensionSubject = ReplaySubject<ExtensionDataEvent>();
final _browserIconSubject = ReplaySubject<ExtensionIconEvent>();
final _pageIconSubject = ReplaySubject<ExtensionIconEvent>();
Stream<ExtensionDataEvent> get browserExtensionStream =>
_browserExtensionSubject.stream;
Stream<ExtensionDataEvent> get pageExtensionStream =>
_pageExtensionSubject.stream;
Stream<ExtensionIconEvent> get browserIconStream =>
_browserIconSubject.stream;
Stream<ExtensionIconEvent> get pageIconStream => _pageIconSubject.stream;
Future<void> startAddonManagerActivity() {
return _api.startAddonManagerActivity();
}
Future<void> invokeAddonAction(
String extensionId,
WebExtensionActionType actionType,
) {
return _api.invokeAddonAction(extensionId, actionType);
}
@override
void onRemoveWebExtensionAction(
int timestamp,
String extensionId,
WebExtensionActionType actionType,
) {
switch (actionType) {
case WebExtensionActionType.browser:
_browserExtensionSubject.addWhenMoreRecent(
timestamp,
extensionId,
(extensionId: extensionId, data: null),
);
case WebExtensionActionType.page:
_pageExtensionSubject.addWhenMoreRecent(
timestamp,
extensionId,
(extensionId: extensionId, data: null),
);
}
}
@override
void onUpdateWebExtensionIcon(
int timestamp,
String extensionId,
WebExtensionActionType actionType,
Uint8List icon,
) {
switch (actionType) {
case WebExtensionActionType.browser:
_browserIconSubject.addWhenMoreRecent(
timestamp,
extensionId,
(extensionId: extensionId, bytes: icon),
);
case WebExtensionActionType.page:
_pageIconSubject.addWhenMoreRecent(
timestamp,
extensionId,
(extensionId: extensionId, bytes: icon),
);
}
}
@override
void onUpsertWebExtensionAction(
int timestamp,
String extensionId,
WebExtensionActionType actionType,
WebExtensionData extensionData,
) {
switch (actionType) {
case WebExtensionActionType.browser:
_browserExtensionSubject.addWhenMoreRecent(
timestamp,
extensionId,
(extensionId: extensionId, data: extensionData),
);
case WebExtensionActionType.page:
_pageExtensionSubject.addWhenMoreRecent(
timestamp,
extensionId,
(extensionId: extensionId, data: extensionData),
);
}
}
GeckoAddonService.setUp({
BinaryMessenger? binaryMessenger,
GeckoAddonsApi? api,
String messageChannelSuffix = '',
}) : _api = api ?? _apiInstance {
GeckoAddonEvents.setUp(
this,
binaryMessenger: binaryMessenger,
messageChannelSuffix: messageChannelSuffix,
);
}
void dispose() {
unawaited(_browserExtensionSubject.close());
unawaited(_pageExtensionSubject.close());
unawaited(_browserIconSubject.close());
unawaited(_pageIconSubject.close());
}
}
@@ -1,5 +1,6 @@
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_mozilla_components/src/extensions/subject.dart';
import 'package:flutter_mozilla_components/src/pigeons/gecko.g.dart';
import 'package:rxdart/rxdart.dart';
@@ -12,8 +13,6 @@ 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 _viewStateSubject = BehaviorSubject.seeded(false);
final _engineStateSubject = BehaviorSubject.seeded(false);
@@ -48,35 +47,20 @@ class GeckoEventService extends GeckoStateEvents {
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 onViewReadyStateChange(int timestamp, bool state) {
_addWhenMoreRecent(_viewStateSubject, timestamp, null, state);
_viewStateSubject.addWhenMoreRecent(timestamp, null, state);
}
@override
void onEngineReadyStateChange(int timestamp, bool state) {
_addWhenMoreRecent(_engineStateSubject, timestamp, null, state);
_engineStateSubject.addWhenMoreRecent(timestamp, null, state);
}
// Overridden methods
@override
void onTabListChange(int timestamp, List<String?> tabIds) {
_addWhenMoreRecent(
_tabListSubject,
_tabListSubject.addWhenMoreRecent(
timestamp,
null,
tabIds.nonNulls.toList(),
@@ -85,18 +69,17 @@ class GeckoEventService extends GeckoStateEvents {
@override
void onSelectedTabChange(int timestamp, String? id) {
_addWhenMoreRecent(_selectedTabSubject, timestamp, id, id);
_selectedTabSubject.addWhenMoreRecent(timestamp, id, id);
}
@override
void onTabContentStateChange(int timestamp, TabContentState state) {
_addWhenMoreRecent(_tabContentSubject, timestamp, state.id, state);
_tabContentSubject.addWhenMoreRecent(timestamp, state.id, state);
}
@override
void onHistoryStateChange(int timestamp, String id, HistoryState state) {
_addWhenMoreRecent(
_historySubject,
_historySubject.addWhenMoreRecent(
timestamp,
id,
(tabId: id, history: state),
@@ -109,8 +92,7 @@ class GeckoEventService extends GeckoStateEvents {
String id,
ReaderableState state,
) {
_addWhenMoreRecent(
_readerableSubject,
_readerableSubject.addWhenMoreRecent(
timestamp,
id,
(tabId: id, readerable: state),
@@ -123,8 +105,7 @@ class GeckoEventService extends GeckoStateEvents {
String id,
SecurityInfoState state,
) {
_addWhenMoreRecent(
_securityInfoSubject,
_securityInfoSubject.addWhenMoreRecent(
timestamp,
id,
(tabId: id, securityInfo: state),
@@ -133,13 +114,12 @@ class GeckoEventService extends GeckoStateEvents {
@override
void onIconChange(int timestamp, String id, Uint8List? bytes) {
_addWhenMoreRecent(_iconSubject, timestamp, id, (tabId: id, bytes: bytes));
_iconSubject.addWhenMoreRecent(timestamp, id, (tabId: id, bytes: bytes));
}
@override
void onThumbnailChange(int timestamp, String id, Uint8List? bytes) {
_addWhenMoreRecent(
_thumbnailSubject,
_thumbnailSubject.addWhenMoreRecent(
timestamp,
id,
(tabId: id, bytes: bytes),
@@ -148,8 +128,7 @@ class GeckoEventService extends GeckoStateEvents {
@override
void onFindResults(int timestamp, String id, List<FindResultState?> results) {
_addWhenMoreRecent(
_findResultsSubject,
_findResultsSubject.addWhenMoreRecent(
timestamp,
id,
(tabId: id, results: results.nonNulls.toList()),
@@ -158,8 +137,7 @@ class GeckoEventService extends GeckoStateEvents {
@override
void onTabAdded(int timestamp, String tabId) {
_addWhenMoreRecent(
_tabAddedSubject,
_tabAddedSubject.addWhenMoreRecent(
timestamp,
null,
tabId,
@@ -120,12 +120,12 @@ class GeckoSessionService {
return _api.purgeHistory();
}
Future<Uint8List?> requestScreenshot() {
Future<Uint8List?> requestScreenshot(bool sendBack) {
if (tabId != null) {
throw Exception('Screenshot only allowed for selected (visible) tab.');
}
return _api.requestScreenshot();
return _api.requestScreenshot(sendBack);
}
Future<void> updateLastAccess({