UNPKG

matrix-react-sdk

Version:
102 lines (93 loc) 11.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.FileDownloader = exports.DEFAULT_STYLES = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const DEFAULT_STYLES = exports.DEFAULT_STYLES = { imgSrc: "", imgStyle: null, // css props style: "", textContent: "" }; // set up the iframe as a singleton so we don't have to figure out destruction of it down the line. let managedIframe; let onLoadPromise; function getManagedIframe() { if (managedIframe) return { iframe: managedIframe, onLoadPromise }; managedIframe = document.createElement("iframe"); // Need to append the iframe in order for the browser to load it. document.body.appendChild(managedIframe); // Dev note: the reassignment warnings are entirely incorrect here. managedIframe.style.display = "none"; // @ts-ignore // noinspection JSConstantReassignment managedIframe.sandbox = "allow-scripts allow-downloads"; onLoadPromise = new Promise(resolve => { managedIframe.onload = () => { resolve(); }; managedIframe.src = "usercontent/"; // XXX: Should come from the skin }); return { iframe: managedIframe, onLoadPromise }; } // TODO: If we decide to keep the download link behaviour, we should bring the style management into here. /** * Helper to handle safe file downloads. This operates off an iframe for reasons described * by the blob helpers. By default, this will use a hidden iframe to manage the download * through a user content wrapper, but can be given an iframe reference if the caller needs * additional control over the styling/position of the iframe itself. */ class FileDownloader { /** * Creates a new file downloader * @param iframeFn Function to get a pre-configured iframe. Set to null to have the downloader * use a generic, hidden, iframe. */ constructor(iframeFn) { (0, _defineProperty2.default)(this, "onLoadPromise", void 0); this.iframeFn = iframeFn; } get iframe() { const iframe = this.iframeFn?.(); if (!iframe) { const managed = getManagedIframe(); this.onLoadPromise = managed.onLoadPromise; return managed.iframe; } this.onLoadPromise = undefined; return iframe; } async download({ blob, name, autoDownload = true, opts = DEFAULT_STYLES }) { const iframe = this.iframe; // get the iframe first just in case we need to await onload if (this.onLoadPromise) await this.onLoadPromise; iframe.contentWindow?.postMessage(_objectSpread(_objectSpread({}, opts), {}, { blob: blob, download: name, auto: autoDownload }), "*"); } } exports.FileDownloader = FileDownloader; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1NUWUxFUyIsImV4cG9ydHMiLCJpbWdTcmMiLCJpbWdTdHlsZSIsInN0eWxlIiwidGV4dENvbnRlbnQiLCJtYW5hZ2VkSWZyYW1lIiwib25Mb2FkUHJvbWlzZSIsImdldE1hbmFnZWRJZnJhbWUiLCJpZnJhbWUiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJkaXNwbGF5Iiwic2FuZGJveCIsIlByb21pc2UiLCJyZXNvbHZlIiwib25sb2FkIiwic3JjIiwiRmlsZURvd25sb2FkZXIiLCJjb25zdHJ1Y3RvciIsImlmcmFtZUZuIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJtYW5hZ2VkIiwidW5kZWZpbmVkIiwiZG93bmxvYWQiLCJibG9iIiwibmFtZSIsImF1dG9Eb3dubG9hZCIsIm9wdHMiLCJjb250ZW50V2luZG93IiwicG9zdE1lc3NhZ2UiLCJfb2JqZWN0U3ByZWFkIiwiYXV0byJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9GaWxlRG93bmxvYWRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5leHBvcnQgdHlwZSBHZXRJZnJhbWVGbiA9ICgpID0+IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbDtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RZTEVTID0ge1xuICAgIGltZ1NyYzogXCJcIixcbiAgICBpbWdTdHlsZTogbnVsbCBhcyBzdHJpbmcgfCBudWxsLCAvLyBjc3MgcHJvcHNcbiAgICBzdHlsZTogXCJcIixcbiAgICB0ZXh0Q29udGVudDogXCJcIixcbn07XG5cbnR5cGUgRG93bmxvYWRPcHRpb25zID0ge1xuICAgIGJsb2I6IEJsb2I7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGF1dG9Eb3dubG9hZD86IGJvb2xlYW47XG4gICAgb3B0cz86IHR5cGVvZiBERUZBVUxUX1NUWUxFUztcbn07XG5cbi8vIHNldCB1cCB0aGUgaWZyYW1lIGFzIGEgc2luZ2xldG9uIHNvIHdlIGRvbid0IGhhdmUgdG8gZmlndXJlIG91dCBkZXN0cnVjdGlvbiBvZiBpdCBkb3duIHRoZSBsaW5lLlxubGV0IG1hbmFnZWRJZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50O1xubGV0IG9uTG9hZFByb21pc2U6IFByb21pc2U8dm9pZD47XG5mdW5jdGlvbiBnZXRNYW5hZ2VkSWZyYW1lKCk6IHsgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudDsgb25Mb2FkUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB9IHtcbiAgICBpZiAobWFuYWdlZElmcmFtZSkgcmV0dXJuIHsgaWZyYW1lOiBtYW5hZ2VkSWZyYW1lLCBvbkxvYWRQcm9taXNlIH07XG5cbiAgICBtYW5hZ2VkSWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcblxuICAgIC8vIE5lZWQgdG8gYXBwZW5kIHRoZSBpZnJhbWUgaW4gb3JkZXIgZm9yIHRoZSBicm93c2VyIHRvIGxvYWQgaXQuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtYW5hZ2VkSWZyYW1lKTtcblxuICAgIC8vIERldiBub3RlOiB0aGUgcmVhc3NpZ25tZW50IHdhcm5pbmdzIGFyZSBlbnRpcmVseSBpbmNvcnJlY3QgaGVyZS5cblxuICAgIG1hbmFnZWRJZnJhbWUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU0NvbnN0YW50UmVhc3NpZ25tZW50XG4gICAgbWFuYWdlZElmcmFtZS5zYW5kYm94ID0gXCJhbGxvdy1zY3JpcHRzIGFsbG93LWRvd25sb2Fkc1wiO1xuXG4gICAgb25Mb2FkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIG1hbmFnZWRJZnJhbWUub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICBtYW5hZ2VkSWZyYW1lLnNyYyA9IFwidXNlcmNvbnRlbnQvXCI7IC8vIFhYWDogU2hvdWxkIGNvbWUgZnJvbSB0aGUgc2tpblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgaWZyYW1lOiBtYW5hZ2VkSWZyYW1lLCBvbkxvYWRQcm9taXNlIH07XG59XG5cbi8vIFRPRE86IElmIHdlIGRlY2lkZSB0byBrZWVwIHRoZSBkb3dubG9hZCBsaW5rIGJlaGF2aW91ciwgd2Ugc2hvdWxkIGJyaW5nIHRoZSBzdHlsZSBtYW5hZ2VtZW50IGludG8gaGVyZS5cblxuLyoqXG4gKiBIZWxwZXIgdG8gaGFuZGxlIHNhZmUgZmlsZSBkb3dubG9hZHMuIFRoaXMgb3BlcmF0ZXMgb2ZmIGFuIGlmcmFtZSBmb3IgcmVhc29ucyBkZXNjcmliZWRcbiAqIGJ5IHRoZSBibG9iIGhlbHBlcnMuIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCB1c2UgYSBoaWRkZW4gaWZyYW1lIHRvIG1hbmFnZSB0aGUgZG93bmxvYWRcbiAqIHRocm91Z2ggYSB1c2VyIGNvbnRlbnQgd3JhcHBlciwgYnV0IGNhbiBiZSBnaXZlbiBhbiBpZnJhbWUgcmVmZXJlbmNlIGlmIHRoZSBjYWxsZXIgbmVlZHNcbiAqIGFkZGl0aW9uYWwgY29udHJvbCBvdmVyIHRoZSBzdHlsaW5nL3Bvc2l0aW9uIG9mIHRoZSBpZnJhbWUgaXRzZWxmLlxuICovXG5leHBvcnQgY2xhc3MgRmlsZURvd25sb2FkZXIge1xuICAgIHByaXZhdGUgb25Mb2FkUHJvbWlzZT86IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbGUgZG93bmxvYWRlclxuICAgICAqIEBwYXJhbSBpZnJhbWVGbiBGdW5jdGlvbiB0byBnZXQgYSBwcmUtY29uZmlndXJlZCBpZnJhbWUuIFNldCB0byBudWxsIHRvIGhhdmUgdGhlIGRvd25sb2FkZXJcbiAgICAgKiB1c2UgYSBnZW5lcmljLCBoaWRkZW4sIGlmcmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBpZnJhbWVGbj86IEdldElmcmFtZUZuKSB7fVxuXG4gICAgcHJpdmF0ZSBnZXQgaWZyYW1lKCk6IEhUTUxJRnJhbWVFbGVtZW50IHtcbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5pZnJhbWVGbj8uKCk7XG4gICAgICAgIGlmICghaWZyYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtYW5hZ2VkID0gZ2V0TWFuYWdlZElmcmFtZSgpO1xuICAgICAgICAgICAgdGhpcy5vbkxvYWRQcm9taXNlID0gbWFuYWdlZC5vbkxvYWRQcm9taXNlO1xuICAgICAgICAgICAgcmV0dXJuIG1hbmFnZWQuaWZyYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Mb2FkUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGlmcmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWQoeyBibG9iLCBuYW1lLCBhdXRvRG93bmxvYWQgPSB0cnVlLCBvcHRzID0gREVGQVVMVF9TVFlMRVMgfTogRG93bmxvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuaWZyYW1lOyAvLyBnZXQgdGhlIGlmcmFtZSBmaXJzdCBqdXN0IGluIGNhc2Ugd2UgbmVlZCB0byBhd2FpdCBvbmxvYWRcbiAgICAgICAgaWYgKHRoaXMub25Mb2FkUHJvbWlzZSkgYXdhaXQgdGhpcy5vbkxvYWRQcm9taXNlO1xuICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgICAgICBibG9iOiBibG9iLFxuICAgICAgICAgICAgICAgIGRvd25sb2FkOiBuYW1lLFxuICAgICAgICAgICAgICAgIGF1dG86IGF1dG9Eb3dubG9hZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIipcIixcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJTyxNQUFNQSxjQUFjLEdBQUFDLE9BQUEsQ0FBQUQsY0FBQSxHQUFHO0VBQzFCRSxNQUFNLEVBQUUsRUFBRTtFQUNWQyxRQUFRLEVBQUUsSUFBcUI7RUFBRTtFQUNqQ0MsS0FBSyxFQUFFLEVBQUU7RUFDVEMsV0FBVyxFQUFFO0FBQ2pCLENBQUM7QUFTRDtBQUNBLElBQUlDLGFBQWdDO0FBQ3BDLElBQUlDLGFBQTRCO0FBQ2hDLFNBQVNDLGdCQUFnQkEsQ0FBQSxFQUFnRTtFQUNyRixJQUFJRixhQUFhLEVBQUUsT0FBTztJQUFFRyxNQUFNLEVBQUVILGFBQWE7SUFBRUM7RUFBYyxDQUFDO0VBRWxFRCxhQUFhLEdBQUdJLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLFFBQVEsQ0FBQzs7RUFFaEQ7RUFDQUQsUUFBUSxDQUFDRSxJQUFJLENBQUNDLFdBQVcsQ0FBQ1AsYUFBYSxDQUFDOztFQUV4Qzs7RUFFQUEsYUFBYSxDQUFDRixLQUFLLENBQUNVLE9BQU8sR0FBRyxNQUFNOztFQUVwQztFQUNBO0VBQ0FSLGFBQWEsQ0FBQ1MsT0FBTyxHQUFHLCtCQUErQjtFQUV2RFIsYUFBYSxHQUFHLElBQUlTLE9BQU8sQ0FBRUMsT0FBTyxJQUFLO0lBQ3JDWCxhQUFhLENBQUNZLE1BQU0sR0FBRyxNQUFNO01BQ3pCRCxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFDRFgsYUFBYSxDQUFDYSxHQUFHLEdBQUcsY0FBYyxDQUFDLENBQUM7RUFDeEMsQ0FBQyxDQUFDO0VBRUYsT0FBTztJQUFFVixNQUFNLEVBQUVILGFBQWE7SUFBRUM7RUFBYyxDQUFDO0FBQ25EOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1hLGNBQWMsQ0FBQztFQUd4QjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ1dDLFdBQVdBLENBQVNDLFFBQXNCLEVBQUU7SUFBQSxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsS0FBeEJGLFFBQXNCLEdBQXRCQSxRQUFzQjtFQUFHO0VBRXBELElBQVliLE1BQU1BLENBQUEsRUFBc0I7SUFDcEMsTUFBTUEsTUFBTSxHQUFHLElBQUksQ0FBQ2EsUUFBUSxHQUFHLENBQUM7SUFDaEMsSUFBSSxDQUFDYixNQUFNLEVBQUU7TUFDVCxNQUFNZ0IsT0FBTyxHQUFHakIsZ0JBQWdCLENBQUMsQ0FBQztNQUNsQyxJQUFJLENBQUNELGFBQWEsR0FBR2tCLE9BQU8sQ0FBQ2xCLGFBQWE7TUFDMUMsT0FBT2tCLE9BQU8sQ0FBQ2hCLE1BQU07SUFDekI7SUFDQSxJQUFJLENBQUNGLGFBQWEsR0FBR21CLFNBQVM7SUFDOUIsT0FBT2pCLE1BQU07RUFDakI7RUFFQSxNQUFha0IsUUFBUUEsQ0FBQztJQUFFQyxJQUFJO0lBQUVDLElBQUk7SUFBRUMsWUFBWSxHQUFHLElBQUk7SUFBRUMsSUFBSSxHQUFHL0I7RUFBZ0MsQ0FBQyxFQUFpQjtJQUM5RyxNQUFNUyxNQUFNLEdBQUcsSUFBSSxDQUFDQSxNQUFNLENBQUMsQ0FBQztJQUM1QixJQUFJLElBQUksQ0FBQ0YsYUFBYSxFQUFFLE1BQU0sSUFBSSxDQUFDQSxhQUFhO0lBQ2hERSxNQUFNLENBQUN1QixhQUFhLEVBQUVDLFdBQVcsQ0FBQUMsYUFBQSxDQUFBQSxhQUFBLEtBRXRCSCxJQUFJO01BQ1BILElBQUksRUFBRUEsSUFBSTtNQUNWRCxRQUFRLEVBQUVFLElBQUk7TUFDZE0sSUFBSSxFQUFFTDtJQUFZLElBRXRCLEdBQ0osQ0FBQztFQUNMO0FBQ0o7QUFBQzdCLE9BQUEsQ0FBQW1CLGNBQUEsR0FBQUEsY0FBQSIsImlnbm9yZUxpc3QiOltdfQ==