<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
    </head>
    <body>
        <iframe id="iframe" sandbox="allow-scripts allow-downloads allow-downloads-without-user-activation"></iframe>
        <script type="text/javascript">
            const iframeHtml = `
            <!DOCTYPE html>
            <html>
                <head>
                    <meta charset="utf-8">
                </head>
                <body>
                    <button id="download">Download</button>
                    <a id="link" href="#">Link to progamatically click</a>
                    <script type="text/javascript">
                        var link = document.getElementById("link");
                        var button = document.getElementById("download");
                        async function download(blob, filename) {
                            const slice = blob.slice(0, 1);
                            const reader = new FileReader();
                            reader.readAsArrayBuffer(slice);
                            const buffer = await new Promise((resolve, reject) => {
                                reader.addEventListener("abort", () => reject(new Error("aborted")));
                                reader.addEventListener("error", e => reject(e.error));
                                reader.addEventListener("load", e => resolve(e.target.result));
                            });
                            document.body.appendChild(document.createTextNode("buffer: " + new Uint8Array(buffer)[0] + " (" + buffer.byteLength + ")"));
                            var url = URL.createObjectURL(blob);
                            link.href = url;
                            link.download = filename;
                            link.innerText = url;
                            link.click();
                            URL.revokeObjectURL(url);
                        }
                        button.addEventListener("click", async function(event) {
                            try {
                                await download(new Blob(["a message from the iframe"], {type: "text/plain"}), "hello world.txt");
                            } catch (err) {
                                document.body.appendChild(document.createTextNode(err.toString()));
                            }
                        });
                    </${"script"}>
                </body>
            </html>`;
            document.getElementById("iframe").setAttribute("srcdoc", iframeHtml);
        </script>
    </body>
</html>