fix: iframe srcDoc was not able to postMessage that can be received by onMessageReceived event. Match iframe by object not origin (#11809)
This commit is contained in:
parent
35b1546f78
commit
b019fbae6f
|
|
@ -75,16 +75,25 @@ function IframeComponent(props: IframeComponentProps) {
|
||||||
widgetId,
|
widgetId,
|
||||||
} = props;
|
} = props;
|
||||||
|
|
||||||
|
const frameRef = useRef<HTMLIFrameElement>(null);
|
||||||
|
|
||||||
const isFirstRender = useRef(true);
|
const isFirstRender = useRef(true);
|
||||||
|
|
||||||
const [message, setMessage] = useState("");
|
const [message, setMessage] = useState("");
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
const handler = (event: MessageEvent) => {
|
||||||
|
const iframeWindow =
|
||||||
|
frameRef.current?.contentWindow ||
|
||||||
|
frameRef.current?.contentDocument?.defaultView;
|
||||||
|
// Accept messages only from the current iframe
|
||||||
|
if (event.source !== iframeWindow) return;
|
||||||
|
onMessageReceived(event);
|
||||||
|
};
|
||||||
// add a listener
|
// add a listener
|
||||||
window.addEventListener("message", onMessageReceived, false);
|
window.addEventListener("message", handler, false);
|
||||||
// clean up
|
// clean up
|
||||||
return () =>
|
return () => window.removeEventListener("message", handler, false);
|
||||||
window.removeEventListener("message", onMessageReceived, false);
|
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
@ -129,9 +138,9 @@ function IframeComponent(props: IframeComponentProps) {
|
||||||
{message ? (
|
{message ? (
|
||||||
message
|
message
|
||||||
) : srcDoc ? (
|
) : srcDoc ? (
|
||||||
<iframe src={source} srcDoc={srcDoc} title={title} />
|
<iframe ref={frameRef} src={source} srcDoc={srcDoc} title={title} />
|
||||||
) : (
|
) : (
|
||||||
<iframe src={source} title={title} />
|
<iframe ref={frameRef} src={source} title={title} />
|
||||||
)}
|
)}
|
||||||
</IframeContainer>
|
</IframeContainer>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -162,11 +162,6 @@ class IframeWidget extends BaseWidget<IframeWidgetProps, WidgetState> {
|
||||||
};
|
};
|
||||||
|
|
||||||
handleMessageReceive = (event: MessageEvent) => {
|
handleMessageReceive = (event: MessageEvent) => {
|
||||||
// Accept messages only from the current iframe
|
|
||||||
if (!this.props.source?.includes(event.origin)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.props.updateWidgetMetaProperty("message", event.data, {
|
this.props.updateWidgetMetaProperty("message", event.data, {
|
||||||
triggerPropertyName: "onMessageReceived",
|
triggerPropertyName: "onMessageReceived",
|
||||||
dynamicString: this.props.onMessageReceived,
|
dynamicString: this.props.onMessageReceived,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user