TF-3911 Remove window event listeners to prevent memory leaks in Email View
This commit is contained in:
@@ -141,7 +141,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb>
|
|||||||
_handleHyperLinkEvent(data['url']);
|
_handleHyperLinkEvent(data['url']);
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logError('_HtmlContentViewerOnWebState::_handleMessageEvent:Exception = $e');
|
logError('$runtimeType::_handleMessageEvent:Exception = $e');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,6 +162,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb>
|
|||||||
dynamic data,
|
dynamic data,
|
||||||
ScrollController controller,
|
ScrollController controller,
|
||||||
) {
|
) {
|
||||||
|
try {
|
||||||
final deltaY = data['deltaY'] ?? 0.0;
|
final deltaY = data['deltaY'] ?? 0.0;
|
||||||
final target = controller.offset + deltaY;
|
final target = controller.offset + deltaY;
|
||||||
|
|
||||||
@@ -185,6 +186,9 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb>
|
|||||||
controller.jumpTo(target);
|
controller.jumpTo(target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::_handleIframeOnScrollChangedListener:Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _handleIframeOnScrollEndListener(
|
void _handleIframeOnScrollEndListener(
|
||||||
@@ -271,19 +275,23 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb>
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _handleOnIFrameKeyboardEvent(dynamic data) {
|
void _handleOnIFrameKeyboardEvent(dynamic data) {
|
||||||
|
try {
|
||||||
final shortcut = KeyShortcut(
|
final shortcut = KeyShortcut(
|
||||||
key: data['key'] as String,
|
key: data['key'] as String,
|
||||||
code: data['code'] as String,
|
code: data['code'] as String,
|
||||||
shift: data['shift'] == true,
|
shift: data['shift'] == true,
|
||||||
);
|
);
|
||||||
log('_HtmlContentViewerOnWebState::_handleOnIFrameKeyboardEvent:📥 Shortcut pressed: $shortcut');
|
log('$runtimeType::_handleOnIFrameKeyboardEvent:📥 Shortcut pressed: $shortcut');
|
||||||
widget.onIFrameKeyboardShortcutAction?.call(shortcut);
|
widget.onIFrameKeyboardShortcutAction?.call(shortcut);
|
||||||
|
} catch (e) {
|
||||||
|
logError('$runtimeType::_handleOnIFrameKeyboardEvent: Exception = $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void didUpdateWidget(covariant HtmlContentViewerOnWeb oldWidget) {
|
void didUpdateWidget(covariant HtmlContentViewerOnWeb oldWidget) {
|
||||||
super.didUpdateWidget(oldWidget);
|
super.didUpdateWidget(oldWidget);
|
||||||
log('_HtmlContentViewerOnWebState::didUpdateWidget():Old-Direction: ${oldWidget.direction} | Current-Direction: ${widget.direction}');
|
log('$runtimeType::didUpdateWidget():Old-Direction: ${oldWidget.direction} | Current-Direction: ${widget.direction}');
|
||||||
if (widget.contentHtml != oldWidget.contentHtml ||
|
if (widget.contentHtml != oldWidget.contentHtml ||
|
||||||
widget.direction != oldWidget.direction) {
|
widget.direction != oldWidget.direction) {
|
||||||
_setUpWeb();
|
_setUpWeb();
|
||||||
@@ -311,6 +319,7 @@ class _HtmlContentViewerOnWebState extends State<HtmlContentViewerOnWeb>
|
|||||||
window.addEventListener('load', handleOnLoad);
|
window.addEventListener('load', handleOnLoad);
|
||||||
window.addEventListener('pagehide', (event) => {
|
window.addEventListener('pagehide', (event) => {
|
||||||
window.parent.removeEventListener('message', handleMessage, false);
|
window.parent.removeEventListener('message', handleMessage, false);
|
||||||
|
window.removeEventListener('load', handleOnLoad);
|
||||||
});
|
});
|
||||||
|
|
||||||
function handleMessage(e) {
|
function handleMessage(e) {
|
||||||
|
|||||||
@@ -286,7 +286,13 @@ class HtmlInteraction {
|
|||||||
}, {
|
}, {
|
||||||
passive: false,
|
passive: false,
|
||||||
});
|
});
|
||||||
window.addEventListener('keydown', function(e) {
|
window.addEventListener('keydown', disableZoomControl);
|
||||||
|
|
||||||
|
window.addEventListener('pagehide', (event) => {
|
||||||
|
window.removeEventListener('keydown', disableZoomControl);
|
||||||
|
});
|
||||||
|
|
||||||
|
function disableZoomControl(event) {
|
||||||
if (event.metaKey || event.ctrlKey) {
|
if (event.metaKey || event.ctrlKey) {
|
||||||
switch (event.key) {
|
switch (event.key) {
|
||||||
case '=':
|
case '=':
|
||||||
@@ -295,7 +301,7 @@ class HtmlInteraction {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
</script>
|
</script>
|
||||||
''';
|
''';
|
||||||
|
|
||||||
@@ -381,7 +387,13 @@ class HtmlInteraction {
|
|||||||
|
|
||||||
static String scriptHandleIframeKeyboardListener(String viewId) => '''
|
static String scriptHandleIframeKeyboardListener(String viewId) => '''
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
window.addEventListener('keydown', function (event) {
|
window.addEventListener('keydown', handleIframeKeydown);
|
||||||
|
|
||||||
|
window.addEventListener('pagehide', (event) => {
|
||||||
|
window.removeEventListener('keydown', handleIframeKeydown);
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleIframeKeydown(event) {
|
||||||
const payload = {
|
const payload = {
|
||||||
view: '$viewId',
|
view: '$viewId',
|
||||||
type: 'toDart: iframeKeydown',
|
type: 'toDart: iframeKeydown',
|
||||||
@@ -390,7 +402,7 @@ class HtmlInteraction {
|
|||||||
shift: event.shiftKey
|
shift: event.shiftKey
|
||||||
};
|
};
|
||||||
window.parent.postMessage(JSON.stringify(payload), "*");
|
window.parent.postMessage(JSON.stringify(payload), "*");
|
||||||
});
|
}
|
||||||
</script>
|
</script>
|
||||||
''';
|
''';
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user