web-dev-qa-db-fra.com

Comment puis-je ouvrir la fenêtre contextuelle de mon extension avec JavaScript?

J'essaie d'écrire une fonction JavaScript qui ouvrira mon extension, comme lorsque vous cliquez sur l'icône de l'extension. Je sais comment ouvrir mon extension dans un nouvel onglet:

var url = "chrome-extension://kelodmiboakdjlbcdfoceeiafckgojel/login.html";
window.open(url);

Mais je veux ouvrir une fenêtre contextuelle dans le coin supérieur droit du navigateur, comme lorsque vous cliquez sur l'icône de l'extension.

36
Yuqing Huang

L'équipe de développement de Chromium a explicitement déclaré qu'elle n'activerait pas cette fonctionnalité. Voir Demande de fonctionnalité: ouvrir une bulle contextuelle d’extension par programme :

La philosophie des popups d'action de navigateur et de page est qu'ils doivent être déclenchés par une action de l'utilisateur. Notre suggestion est d'utiliser la nouvelle fonctionnalité de notifications HTML ...

Les notifications du bureau peuvent être utilisées progressivement pour présenter à l'utilisateur une petite page HTML semblable à votre popup. Ce n'est pas une substitution parfaite, mais cela peut fournir le type de fonctionnalité dont vous avez besoin.

26
apsillers

L'équipe Chrome a créé une méthode pour ouvrir la fenêtre contextuelle par programmation, mais elle n'est activée qu'en tant qu'API privée, et les projets de mise à disposition générale sont bloqués pour des raisons de sécurité.

Alors, à partir de mars 2018 pour l'instant, vous ne pouvez toujours pas le faire.

19
Xan

La réponse courte est que vous ne pouvez pas ouvrir browserAction par programme. Mais vous pouvez créer un dialog avec votre script de contenu qui émule votre browserAction et que cet affichage n'est pas lu (par programme). Cependant, vous ne pourrez pas accéder au background page de votre extension directement à partir de cette fenêtre contextuelle, contrairement à votre popup.html. Vous devrez pass message à la place de votre extension.

6
Juzer Ali

Comme mentionné, il n'y a pas d'API publique pour cela.

Une solution de contournement que j'ai trouvée consiste à lancer l'extension sous la forme d'une iframe à l'intérieur d'un script de contenu avec un clic de bouton. Dans ce cas, le script d'arrière-plan émet l'URL d'extension du script de contenu à définir comme src de l'iframe, comme ci-dessous.

background.js

browser.runtime.onMessage.addListener((request) => {
  if (request.open) {
    return new Promise(resolve => {
      chrome.browserAction.getPopup({}, (popup) => {
        return resolve(popup)
      })
    })
  }
})

content-scipt.js

const i = document.createElement('iframe')
const b = document.createElement('button')
const p = document.getElementById('some-id')

b.innerHTML = 'Open'
b.addEventListener('click', (evt) => {
  evt.preventDefault()
  chrome.runtime.sendMessage({ open: true }, (response) => {
    i.src = response
    p.appendChild(i)
  })
})
p.appendChild(b)

Cela ouvre l'extension dans le DOM de la page sur laquelle le script est exécuté. Vous devrez également ajouter ce qui suit au manifeste.

manifeste.json

....
"web_accessible_resources": [
  "popup.html"
]
....
0
camwhite