23

Estoy intentando crear una extensión de Chrome que sustituya al marcador de Delicious. Sé que ya hay una extensión que lo hace, pero el problema con esa extensión es que después de marcar un sitio, la ventana emergente permanece abierta (en lugar de usar el bookmarklet, donde la ventana emergente se cierra después de enviar el formulario. Recreé el extensión y se encontró con el mismo problemaVentana emergente de cierre creada por la extensión de Google Chrome

Aquí está mi código:.

manifest.json:

{ 
    "name": "Delicious", 
    "version": "1.0", 
    "description": "Bookmark a site on Delicious", 
    "background_page": "background.html", 
    "permissions": [ 
    "tabs" 
    ], 
    "browser_action": { 
    "default_icon": "delicious.png" 
    }, 
    "content_scripts": [ 
    { 
     "matches": ["http://www.delicious.com/save*"], 
     "js": ["contentscript.js"] 
    } 
    ] 
} 

background.html:

<html><script> 
chrome.browserAction.onClicked.addListener(function(tab) { 
    chrome.tabs.getSelected(null, function(tab) { 
    w = window.open('http://delicious.com/save?url='+ 
      encodeURIComponent(tab.url)+ 
      '&title='+encodeURIComponent(tab.title)+ 
      '&v=5&noui=1&jump=close', 
     'deliciousuiv5', 
     'location=yes,links=no,scrollbars=no,toolbar=no,width=550,height=550'); 
    }); 
}); 
</script></html> 

contentscript.js:

if (document.URL == 'http://www.delicious.com/save') 
{ 
    alert('closing...'); 
    self.close(); 
    alert('should have closed by now'); 
} 

Al hacer clic en el botón delicioso, la ventana emergente sube muy bien y puedo guardar el marcador, pero después de hacer clic en "Guardar", la ventana emergente no se cierra. Ambas alertas aparecen, pero self.close() no parece hacer nada. Cuando elimino la comprobación de URL en contentscript.js, la ventana emergente aparece normalmente, la primera alerta se dispara de inmediato y luego la ventana emergente se cierra sola (como debería).

¿Por qué no funciona? Parece que Chrome no me impide hacer self.close(). ¿Está haciendo Delicious algo? ¿Es algo más?

Los archivos están aquí si quieres ellos: [link eliminado por drop.io salió del negocio]

+0

La ventana se cierra automáticamente. Estoy ejecutando una versión bastante predeterminada de Chrome si hace alguna diferencia. –

Respuesta

18

Trate window.close(), pero que probablemente no funcionaría bien.

Como está creando una ventana normal (en lugar de una ventana emergente de acción del navegador), puede cerrarla usando chrome.tabs.remove() desde una página de fondo. También puede detectar esta ventana desde una página de fondo. Algo como:

chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { 
    if(changeInfo.status == "loading") { 
     if(tab.url == "http://www.delicious.com/save") { 
      chrome.tabs.remove(tabId); 
     } 
    } 
}); 

No estoy seguro de cómo trata Chrome a las ventanas creadas, como pestañas o ventanas. Si como ventanas, el código anterior será un poco diferente.

+0

Eso funciona perfectamente, gracias. –

+8

window.close() funciona. Si desea cerrar la ventana emergente después de enviar una solicitud a otra pestaña, asegúrese de cerrar la ventana emergente en la devolución de llamada y la pestaña debe enviarse al menos con una respuesta vacía. –

9

Encontré un trabajo muy fácil para esto. Que acaba de establecer la pestaña seleccionada en True y el emergente desaparece, así ...

// remove popup by selecting the tab 
chrome.tabs.getSelected(null, function(tab) { 
    chrome.tabs.update(tab.id, { selected: true }) 
}); 
+1

No funciona para mí. – Nakilon

+4

'chrome.tabs.getSelected' ahora está obsoleto. –

0

que he encontrado esta solución: chrome.tabs.update({ active: true }); Esta sola línea de código cierra la ventana emergente de la acción del navegador. Incluso no es necesario pasar tab.id allí porque de manera predeterminada está configurado a id de la pestaña actual. Lo ejecuto en la página de fondo, pero parece que se puede ejecutar en todas partes de la extensión.

+0

Desafortunadamente, esto no funcionó para mí. Estoy actualizando desde un código getSelected() similar publicado en esta página y escribí este código esperando exactamente que funcione, según lo que dicen los documentos. – offthat

+0

Puede depender de muchas circunstancias. ¿Dónde pones la llamada de este método? Tal vez dentro de algún controlador de devolución de llamada que no se llama y así sucesivamente ... –

+0

Terminé simplemente almacenando una referencia a la ventana emergente, por lo que podría simplemente llamar a popupRef.Close() y que hizo el truco. – offthat

Cuestiones relacionadas