mainly refactoring & addons
This commit is contained in:
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user