23

J'essaie de créer une extension Chrome qui remplace le bookmarklet Delicious. Je sais qu'il existe déjà une extension qui le fait, mais le problème avec cette extension est qu'après avoir mis en signet un site, la fenêtre contextuelle reste ouverte (par opposition à l'utilisation du bookmarklet, où le popup se ferme après l'envoi du formulaire. l'extension et a couru dans le même problèmeFermeture de la fenêtre contextuelle créée par l'extension Google Chrome

Voici mon code:.

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'); 
} 

Lorsque je clique sur le bouton délicieux, le menu contextuel se présente bien et je peux enregistrer le signet, mais après que je clique sur « Enregistrer », la fenêtre ne se ferme pas. Les deux alertes apparaissent, mais self.close() ne semble pas faire quoi que ce soit. Lorsque je supprime la vérification de l'URL dans contentscript.js, la fenêtre contextuelle apparaît comme normale, la première alerte se déclenche immédiatement, puis la fenêtre se ferme automatiquement (comme il se doit).

Pourquoi cela ne fonctionne-t-il pas? Il ne semble pas que Chrome m'empêche de faire self.close(). Delicious fait-il quelque chose? Est-ce autre chose?

Les fichiers sont ici si vous voulez les: [lien supprimé car drop.io est sorti des affaires]

+0

La fenêtre se ferme automatiquement pour moi. Je cours une version assez par défaut de Chrome si cela fait une différence. –

Répondre

18

Essayez window.close(), mais ce ne serait probablement pas travailler non plus. Lorsque vous créez une fenêtre normale (plutôt qu'une fenêtre d'action du navigateur), vous pouvez la fermer à l'aide de chrome.tabs.remove() à partir d'une page d'arrière-plan. Vous pouvez également détecter cette fenêtre à partir d'une page d'arrière-plan. Quelque chose comme:

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

Je ne suis pas sûr de savoir comment Chrome traite les fenêtres créées si - sous forme d'onglets ou fenêtres. Si comme les fenêtres alors le code ci-dessus sera un peu différent.

+0

Cela fonctionne parfaitement, merci. –

+8

window.close() fonctionne. Si vous voulez fermer la fenêtre après avoir envoyé une demande à un autre onglet, assurez-vous de fermer la fenêtre contextuelle dans le rappel et l'onglet doit contenir au moins une réponse vide. –

9

J'ai trouvé un travail très facile à faire. Vous venez de définir l'onglet sélectionné True et la Popup disparaît, comme ça ...

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

Ne fonctionne pas pour moi. – Nakilon

+4

'chrome.tabs.getSelected' est obsolète maintenant. –

0

J'ai trouvé cette solution: chrome.tabs.update({ active: true }); Cette ligne de code ferme la fenêtre de l'action du navigateur. Vous n'avez même pas besoin de passer tab.id là parce que par défaut il est défini sur id de l'onglet en cours. Je l'exécute en page d'arrière-plan mais semble pouvoir être exécuté partout dans l'extension.

+0

Cela n'a malheureusement pas fonctionné pour moi. Je suis mise à jour à partir du code getSelected() similaire affiché sur cette page et j'ai écrit ce code en m'attendant exactement à ce que cela fonctionne, d'après ce que disent les docs. – offthat

+0

Cela peut dépendre de nombreuses circonstances. Où mettez-vous l'appel de cette méthode? Peut-être à l'intérieur d'un gestionnaire de rappel qui n'a pas appelé et ainsi de suite ... –

+0

J'ai fini par stocker juste une référence à la popup, de sorte que je pourrais juste appeler popupRef.Close() et cela a fait l'affaire. – offthat

Questions connexes