diff --git a/plugins/libs/plugins-runtime/src/lib/api/index.ts b/plugins/libs/plugins-runtime/src/lib/api/index.ts index 6d452d2ddc..b24c2328f3 100644 --- a/plugins/libs/plugins-runtime/src/lib/api/index.ts +++ b/plugins/libs/plugins-runtime/src/lib/api/index.ts @@ -68,8 +68,21 @@ export function createApi( }, sendMessage(message: unknown) { + let cloneableMessage: unknown; + + try { + cloneableMessage = structuredClone(message); + } catch (err) { + console.error( + 'plugin sendMessage: the message could not be cloned. ' + + 'Ensure the message does not contain functions, DOM nodes, or other non-serializable values.', + err, + ); + return; + } + const event = new CustomEvent('message', { - detail: message, + detail: cloneableMessage, }); plugin.getModal()?.dispatchEvent(event); diff --git a/plugins/libs/plugins-runtime/src/lib/modal/plugin-modal.ts b/plugins/libs/plugins-runtime/src/lib/modal/plugin-modal.ts index b9a9183c8b..3346175212 100644 --- a/plugins/libs/plugins-runtime/src/lib/modal/plugin-modal.ts +++ b/plugins/libs/plugins-runtime/src/lib/modal/plugin-modal.ts @@ -129,7 +129,14 @@ export class PluginModalElement extends HTMLElement { return; } - iframe.contentWindow.postMessage((e as CustomEvent).detail, '*'); + try { + iframe.contentWindow.postMessage((e as CustomEvent).detail, '*'); + } catch (err) { + console.error( + 'plugin modal: failed to send message to iframe via postMessage.', + err, + ); + } }); this.shadowRoot.appendChild(this.wrapper);