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; } },