webentwicklung-frage-antwort-db.com.de

Wie kann ich das Popup meiner Erweiterung mit JavaScript öffnen?

Ich versuche, eine JavaScript-Funktion zu schreiben, die meine Erweiterung öffnet, als würde das Erweiterungssymbol angeklickt. Ich kann meine Erweiterung in einem neuen Tab öffnen:

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

Ich möchte jedoch ein Popup-Fenster in der oberen rechten Ecke des Browsers öffnen, z. B. wenn auf das Erweiterungssymbol geklickt wird.

36
Yuqing Huang

Das Chromium-Entwicklerteam hat ausdrücklich erklärt, dass sie diese Funktionalität nicht aktivieren werden. Siehe Funktionsanforderung: Erweiterungs-Popup-Blase programmatisch öffnen :

Die Philosophie für Browser- und Seitenaktions-Popups besteht darin, dass sie durch Benutzeraktionen ausgelöst werden müssen. Unser Vorschlag ist die Verwendung der neuen HTML-Benachrichtigungsfunktion ...

Desktopbenachrichtigungen kann programmgesteuert verwendet werden, um dem Benutzer eine kleine HTML-Seite anzuzeigen, die Ihrem Popup ähnelt. Es ist kein perfekter Ersatz, aber es bietet möglicherweise die Art von Funktionalität, die Sie benötigen.

26
apsillers

Das Chrome-Team did erstellt eine Methode zum programmgesteuerten Öffnen des Popup-Fensters, die jedoch nur als private API aktiviert ist, und Pläne, allgemein verfügbar zu machen, stehen geblieben aus Sicherheitsgründen.

So, stand März 2018 ab jetzt können Sie es immer noch nicht tun.

19
Xan

Kurze Antwort ist, dass Sie browserAction nicht programmgesteuert öffnen können. Sie können jedoch ein dialog mit Ihrem Inhaltsskript erstellen, das Ihre browserAction emuliert und diese (programmgesteuert) anzeigt. Sie können jedoch nicht background page auf Ihre Erweiterung direkt von diesem Popup aus zugreifen wie auf popup.html. Sie müssen stattdessen pass message zu Ihrer Erweiterung.

6
Juzer Ali

Wie erwähnt gibt es dafür keine öffentliche API.

Eine Problemumgehung, die ich mir ausgedacht habe, ist das Starten der Erweiterung als iframe innerhalb eines content-Skripts mit einem Klick. Dabei gibt das Hintergrundskript die Erweiterungs-URL an das Inhaltsskript aus, das als src des iframe festgelegt werden soll, etwa unten.

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)

Dadurch wird die Erweiterung im DOM der Seite geöffnet, auf der das Skript ausgeführt wird. Sie müssen auch das Manifest unten hinzufügen.

manifest.json

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