Suponiendo una extensión y una página secundaria, una página secundaria no tiene idea de quién la cargó y la extensión no puede saber cuándo se cargó la página secundaria. Por lo tanto, no es posible crear un postMessage entre los dos de manera confiable porque una extensión nunca tendrá el mismo dominio que una página secundaria.
Tengo una extensión que debe funcionar entre navegadores. La extensión tiene un botón que abre otra página window.open('https://subdomain.mydomain.com) . Esa página se abre en una nueva pestaña. Desafortunadamente, debido a que una extensión no tiene un dominio, el navegador trata la página web y la extensión como dominios diferentes, lo que significa que no tengo acceso a la mayoría de las API debido a las protecciones entre dominios.
window.referrer es una cadena vacía en la página secundaria.
window.opener solo funciona en Chrome pero no en Firefox.
window.postMessage('test message', 'chrome-extension://my-id'); Esto no funciona en la página secundaria y no sé por qué, ya que el objetivo solo sería la extensión.
window.postMessage('test message','*'); Esto tampoco devuelve el mensaje a la extensión aunque no se especifique el origen y debería enviarlo a todas partes.
externally_connectable que se agrega al manifiesto. Esto no funciona porque Firefox aún no lo tiene implementado.
La única forma en que puedo pensar en hacerlo es hacer que el padre abra la página secundaria y luego haga un tipo de mensaje de ping como (editado)
const w = window.open('https://sub.mydomain.com'); setInterval(() => { w.postMessage('test message', 'https://sub.mydomain.com'); }, 1000);En el niño, tendría un oyente de mensajes como
window.addEventListener('message', (event) => { event.source.postMessage('message back to ext', event.origin); });Creo que en ese momento, puede usar el evento para enviar un mensaje a la página principal. Sin embargo, la basura de Firefox recolecta la variable de la ventana antes de que pueda comenzar el intervalo establecido y, por lo tanto, nunca enviamos un mensaje.
¿Alguien ha encontrado una buena solución a este problema todavía?