@proca/widget
Version:
Proca is an open-source campaign toolkit designed to empower activists and organisations in their digital advocacy efforts. It provides a flexible and customisable platform for creating and managing online petitions, email campaigns, and other forms of di
83 lines (69 loc) • 1.85 kB
JavaScript
//https://mstdn.social/embed.js
// @ts-check
(function () {
"use strict";
/**
* @param {() => void} loaded
*/
var ready = function (loaded) {
if (document.readyState === "complete") {
loaded();
} else {
document.addEventListener("readystatechange", function () {
if (document.readyState === "complete") {
loaded();
}
});
}
};
ready(function () {
/** @type {Map<number, HTMLIFrameElement>} */
var iframes = new Map();
window.addEventListener("message", function (e) {
var data = e.data || {};
if (
typeof data !== "object" ||
data.type !== "setHeight" ||
!iframes.has(data.id)
) {
return;
}
var iframe = iframes.get(data.id);
if ("source" in e && iframe.contentWindow !== e.source) {
return;
}
iframe.height = data.height;
});
[].forEach.call(
document.querySelectorAll("iframe.proca-embed"),
function (iframe) {
// select unique id for each iframe
var id = 0,
failCount = 0,
idBuffer = new Uint32Array(1);
while (id === 0 || iframes.has(id)) {
id = crypto.getRandomValues(idBuffer)[0];
failCount++;
if (failCount > 100) {
// give up and assign (easily guessable) unique number if getRandomValues is broken or no luck
id = -(iframes.size + 1);
break;
}
}
iframes.set(id, iframe);
iframe.scrolling = "no";
iframe.style.overflow = "hidden";
iframe.onload = function () {
iframe.contentWindow.postMessage(
{
type: "setHeight",
id: id,
},
"*"
);
};
iframe.onload();
}
);
});
})();