diff --git a/app/soapbox/components/safe-embed.tsx b/app/soapbox/components/safe-embed.tsx new file mode 100644 index 000000000..2404ea7ae --- /dev/null +++ b/app/soapbox/components/safe-embed.tsx @@ -0,0 +1,49 @@ +import React, { useEffect, useRef } from 'react'; + +interface ISafeEmbed { + /** Styles for the outer frame element. */ + className?: string, + /** Space-separate list of restrictions to ALLOW for the iframe. */ + sandbox?: string, + /** Unique title for the iframe. */ + title: string, + /** HTML body to embed. */ + html?: string, +} + +/** Safely embeds arbitrary HTML content on the page (by putting it in an iframe). */ +const SafeEmbed: React.FC = ({ + className, + sandbox, + title, + html, +}) => { + const iframe = useRef(null); + + useEffect(() => { + const iframeDocument = iframe.current?.contentWindow?.document; + + if (iframeDocument && html) { + iframeDocument.open(); + iframeDocument.write(html); + iframeDocument.close(); + iframeDocument.body.style.margin = '0'; + + const innerFrame = iframeDocument.querySelector('iframe'); + if (innerFrame) { + innerFrame.width = '100%'; + } + } + }, [iframe.current, html]); + + return ( +