@ -1,6 +1,11 @@
// @ts-check
( function ( ) {
( function ( ) {
'use strict' ;
'use strict' ;
/ * *
* @ param { ( ) => void } loaded
* /
var ready = function ( loaded ) {
var ready = function ( loaded ) {
if ( [ 'interactive' , 'complete' ] . indexOf ( document . readyState ) !== - 1 ) {
if ( [ 'interactive' , 'complete' ] . indexOf ( document . readyState ) !== - 1 ) {
loaded ( ) ;
loaded ( ) ;
@ -10,25 +15,42 @@
} ;
} ;
ready ( function ( ) {
ready ( function ( ) {
var iframes = [ ] ;
/** @type {Map<number, HTMLIFrameElement>} */
var iframes = new Map ( ) ;
window . addEventListener ( 'message' , function ( e ) {
window . addEventListener ( 'message' , function ( e ) {
var data = e . data || { } ;
var data = e . data || { } ;
if ( data . type !== 'setHeight' || ! iframes [ data . id ] || window . location . origin !== e . origin || data . id . toString ( ) === '__proto__' ) {
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 ;
return ;
}
}
iframes [ data . id ] . height = data . height ;
iframe . height = data . height ;
} ) ;
} ) ;
[ ] . forEach . call ( document . querySelectorAll ( 'iframe.mastodon-embed' ) , function ( iframe ) {
[ ] . forEach . call ( document . querySelectorAll ( 'iframe.mastodon-embed' ) , function ( iframe ) {
iframe . scrolling = 'no' ;
// select unique id for each iframe
iframe . style . overflow = 'hidden' ;
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 . push ( iframe ) ;
iframes . set( id , iframe ) ;
var id = iframes . length - 1 ;
iframe . scrolling = 'no' ;
iframe . style . overflow = 'hidden' ;
iframe . onload = function ( ) {
iframe . onload = function ( ) {
iframe . contentWindow . postMessage ( {
iframe . contentWindow . postMessage ( {