diff --git a/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart b/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart
index 2b0f44468..59ef80dd5 100644
--- a/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart
+++ b/core/lib/presentation/views/html_viewer/html_content_viewer_on_web_widget.dart
@@ -385,11 +385,7 @@ class _HtmlContentViewerOnWebState extends State
}
}
- String _getRandString(int len) {
- var random = math.Random.secure();
- var values = List.generate(len, (i) => random.nextInt(255));
- return base64UrlEncode(values);
- }
+
String _generateHtmlDocument(String content) {
final webViewActionScripts = '''
@@ -531,7 +527,7 @@ class _HtmlContentViewerOnWebState extends State
}
void _setUpWeb() {
- _createdViewId = _getRandString(10);
+ _createdViewId = HtmlUtils.getRandString(10);
_htmlData = _generateHtmlDocument(widget.contentHtml);
_webInit = Future.value(true);
diff --git a/core/lib/utils/html/html_utils.dart b/core/lib/utils/html/html_utils.dart
index 370137532..8b6d60960 100644
--- a/core/lib/utils/html/html_utils.dart
+++ b/core/lib/utils/html/html_utils.dart
@@ -48,7 +48,7 @@ class HtmlUtils {
editor.parentNode.replaceChild(newEditor, editor);''',
name: 'unregisterDropListener');
- static const registerSelectionChangeListener = (
+ static ({String name, String script})registerSelectionChangeListener(String viewId) => (
script: '''
let lastSelectedText = '';
@@ -58,6 +58,7 @@ class HtmlUtils {
window.parent.postMessage(
JSON.stringify({
...data,
+ viewId: '$viewId',
name: 'onSelectionChange',
}),
"*"
@@ -902,4 +903,10 @@ class HtmlUtils {
}
}
}
+
+ static String getRandString(int len) {
+ var random = Random.secure();
+ var values = List.generate(len, (i) => random.nextInt(255));
+ return base64UrlEncode(values);
+ }
}
diff --git a/lib/features/composer/presentation/widgets/mobile/mobile_editor_widget.dart b/lib/features/composer/presentation/widgets/mobile/mobile_editor_widget.dart
index d4c8c2def..79daaa71a 100644
--- a/lib/features/composer/presentation/widgets/mobile/mobile_editor_widget.dart
+++ b/lib/features/composer/presentation/widgets/mobile/mobile_editor_widget.dart
@@ -37,6 +37,13 @@ class MobileEditorWidget extends StatefulWidget {
class _MobileEditorState extends State with TextSelectionMixin {
HtmlEditorApi? _editorApi;
+ late String _createdViewId;
+
+ @override
+ void initState() {
+ super.initState();
+ _createdViewId = HtmlUtils.getRandString(10);
+ }
@override
void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged;
@@ -45,8 +52,11 @@ class _MobileEditorState extends State with TextSelectionMix
final webViewController = _editorApi?.webViewController;
if (webViewController == null) return;
+ final registerSelectionChange =
+ HtmlUtils.registerSelectionChangeListener(_createdViewId);
+
webViewController.addJavaScriptHandler(
- handlerName: HtmlUtils.registerSelectionChangeListener.name,
+ handlerName: registerSelectionChange.name,
callback: (args) {
if (!mounted) return;
@@ -58,7 +68,7 @@ class _MobileEditorState extends State with TextSelectionMix
);
await webViewController.evaluateJavascript(
- source: HtmlUtils.registerSelectionChangeListener.script,
+ source: registerSelectionChange.script,
);
}
diff --git a/lib/features/composer/presentation/widgets/web/web_editor_widget.dart b/lib/features/composer/presentation/widgets/web/web_editor_widget.dart
index aa3f3bfc8..a0e177d0f 100644
--- a/lib/features/composer/presentation/widgets/web/web_editor_widget.dart
+++ b/lib/features/composer/presentation/widgets/web/web_editor_widget.dart
@@ -91,14 +91,20 @@ class _WebEditorState extends State with TextSelectionMixin {
double _signatureTooltipLeft = 0;
bool _signatureTooltipReady = false;
+ late String _createdViewId;
+
@override
void Function(TextSelectionData?)? get onSelectionChanged => widget.onTextSelectionChanged;
@override
void initState() {
super.initState();
+ _createdViewId = HtmlUtils.getRandString(10);
_editorController = widget.editorController;
-
+
+ final registerSelectionChange =
+ HtmlUtils.registerSelectionChangeListener(_createdViewId);
+
_editorListener = (event) {
try {
if (event is MessageEvent) {
@@ -106,7 +112,8 @@ class _WebEditorState extends State with TextSelectionMixin {
if (data['name'] == HtmlUtils.registerDropListener.name) {
_editorController.evaluateJavascriptWeb(HtmlUtils.removeLineHeight1px.name);
- } else if (data['name'] == HtmlUtils.registerSelectionChangeListener.name) {
+ } else if (data['name'] == registerSelectionChange.name
+ && data['viewId'] == _createdViewId) {
handleSelectionChange(data);
}
}
@@ -182,8 +189,8 @@ class _WebEditorState extends State with TextSelectionMixin {
script: HtmlUtils.unregisterDropListener.script,
),
WebScript(
- name: HtmlUtils.registerSelectionChangeListener.name,
- script: HtmlUtils.registerSelectionChangeListener.script,
+ name: HtmlUtils.registerSelectionChangeListener(_createdViewId).name,
+ script: HtmlUtils.registerSelectionChangeListener(_createdViewId).script,
),
WebScript(
name: HtmlUtils.collapseSelectionToEnd.name,
@@ -209,7 +216,7 @@ class _WebEditorState extends State with TextSelectionMixin {
_editorController.evaluateJavascriptWeb(
HtmlUtils.registerDropListener.name);
_editorController.evaluateJavascriptWeb(
- HtmlUtils.registerSelectionChangeListener.name);
+ HtmlUtils.registerSelectionChangeListener(_createdViewId).name);
_editorListenerRegistered = true;
}
},