Tengo una aplicación Electron donde cargo sitios externos en un BrowswerView alojado en un BrowserWindow . Invariablemente, cada sitio tiene un reproductor de video usando una etiqueta <video> . Normalmente, puede acceder al DOM usando executeJavaScript y hacer cosas como esta:
document.querySelectorAll('video').forEach(input => { input.pause() })Esto pausaría todo el video en reproducción en el sitio. El problema es que un sitio molesto en particular carga el reproductor de video en un iframe que se encuentra en un subdominio diferente.
Introduzca CORS. No puedo acceder al contenedor de video sin presionar el temido Blocked a frame with origin "https://www.whatever.com" from accessing a cross-origin frame.
Aquí está mi pregunta: en las herramientas de desarrollo de Chrome, puede seleccionar el contexto de un menú desplegable tan claramente que es posible elegir el contexto del cliente. Mientras ejecuto esto en Electron, me gustaría creer que hay una forma de cambiar de contexto. No estoy buscando ejecutar el código de origen cruzado, sino directamente en el marco, solo necesito una forma de elegirlo.
Miré mainFrame.frames pero no veo cómo se llega a los contenidos web del marco webContents .
¿Alguna pista sobre esto?
Básicamente hice patito de goma con esta cosa. Después de escribir esto, lo descubrí. Volví a mirar los métodos de instancia y vi que executeJavascript es uno de ellos, por lo que no necesito acceder a webContents en absoluto...
Así que esto funciona y pensé en compartir:
view.webContents.mainFrame.frames.forEach(frame => { const url = new URL(frame.url) if (url.host === 'sub.whatever.com') { frame.executeJavaScript('myCodeHere') } }) Usé el nombre de host en mi instancia, pero podría usar frame.processId en su lugar.