Un embed, y la política de frames que la aplicación nunca tuvo

/embed es el conversor sin nada alrededor, para una página que quiera alojarlo, y habla con su anfitrión mediante postMessage. Añadirlo obligó a escribir la regla que faltaba: cualquier otra ruta se niega ahora a ser puesta en un frame, algo que antes no decía ninguna.

Una zona para soltar el archivo, el documento resultante, un botón de copiar y otro de descargar. Eso es todo /embed: sin cabecera, sin pie, sin blog, sin cuenta, sin historial — nada que se parezca a nuestra navegación apareciendo dentro de la página de otra persona.

Lo que controla el anfitrión

?conversion= decide con qué conversión se abre el frame, y ?theme=dark o ?theme=light decide su aspecto. El aspecto lo elige el anfitrión y no el sistema operativo del visitante, porque un widget que sigue al sistema aterriza como un rectángulo oscuro en una página clara para la mitad del público.

Los resultados vuelven por postMessage a la ventana superior, y cada mensaje lleva source: 'TransformPipe' — un anfitrión que escucha en window oye a cada frame que tiene y a sus propios scripts, así que sin un nombre que comprobar, el primer manejador que alguien escriba dispara con el mensaje de otro. Al cargar se envía un mensaje, para que un anfitrión pueda esperar al frame en vez de adivinar un tiempo de espera. Comprueba event.origin en tu extremo.

Por qué insertarlo en un frame y no hacer de proxy

La conversión corre en el navegador del visitante, exactamente como aquí. Tu lector suelta un archivo y este no llega ni a tu servidor ni al nuestro. Quien quiera conversión en el servidor debe llamar a la API; lo que ofrece el embed es lo único que una API no puede, que el archivo nunca salga de la máquina en la que está.

También es anónimo a propósito. El embed se representa en lugar de la aplicación, no como la aplicación con su interfaz oculta, y se sitúa por encima de la parte que le pregunta al servidor quién ha iniciado sesión — así que una página en cualquier dominio que lo inserte nunca provoca una petición con credenciales hacia nosotros. Tampoco hay aviso de cookies dentro: pedir consentimiento dentro de la página de otro es pedirlo en su nombre.

Todo lo demás se niega ahora a ser insertado en un frame

El embed necesitaba una regla frame-ancestors, y escribirla dejó al descubierto que ninguna ruta había tenido nunca una. Cualquier otra dirección dice ahora que no — frame-ancestors 'none' y X-Frame-Options: DENY — así que el conversor que tiene una cuenta detrás no puede insertarse en un frame de ninguna manera. /embed y sus traducciones (/de/embed y las demás) permiten cualquier antecesor y llevan noindex, porque un conversor sin interfaz no es una página a la que nadie debería llegar desde una búsqueda.

Guardar un documento, compartirlo y el historial se quedan en transformpipe.com. El embed no tiene sesión con la que alcanzarlos, y eso es diseño, no una limitación.

Relacionado: convertir Markdown a HTML en JavaScript, y si un conversor online es seguro.