Javascript-forum
Service-Worker feuert nicht immer - Druckversion

+- Javascript-forum (https://javascript-forum.de)
+-- Forum: Add-ons (https://javascript-forum.de/forumdisplay.php?fid=31)
+--- Forum: Hilfe bei Add-ons programmieren (https://javascript-forum.de/forumdisplay.php?fid=49)
+--- Thema: Service-Worker feuert nicht immer (/showthread.php?tid=2348)

Seiten: Seiten: 1 2


Service-Worker feuert nicht immer - Oly - 14.05.2023

Hallo zusammen,

habe ein kleines Problem und finde keine Lösung. Sobald mein Service-Worker inaktiv ist, geht nix mehr. Habe ein Kontent-Menu und es läuft alles gut, bis der Service-Worker einmal inaktiv ist.
Was kann ich tun, damit er vorher aktiviert wird und meine Funktionen dann ihre Funktion aufnehmen? Hat jemand einen Tipp für mich?

Code:
function updateContextMenus(){
    chrome.contextMenus.removeAll(function(){
        chrome.storage.sync.get(function(storage){
            if(storage['items']==undefined) storage['items'] = {};
            var items = storage['items'];
            for(key in items){
                chrome.contextMenus.create({'title': items[key]['item-title'],  "contexts": ['editable'], 'id': key }, function (){});
            }
        });
    });
}

chrome.action.onClicked.addListener(function (tab){
    if(tab.url=="https://de.zir-online.com/start"){
    
    chrome.runtime.openOptionsPage();
}
});


var TABID;

chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
console.log("Status: "+changeInfo.status)
console.log("ID: "+tabId)
    if(changeInfo.status==='complete'||changeInfo.status==='loading') TABID=tabId;

    
});



chrome.contextMenus.onClicked.addListener(function (info){
    chrome.storage.sync.get(function(storage){
        // get text to paste from storage
        //console.log(storage['items']);
        if(storage['items']==undefined) return;
        var items = storage['items'];
        var key = info['menuItemId'];
         var  text = items[key]['item-content'];
        
        console.log("Background: items: "+items+" key: "+key+" text: "+text+ "ID: "+TABID);
            chrome.tabs.sendMessage(TABID, {
                message: text
            });
            
        
        
    });
});

chrome.storage.onChanged.addListener(function(changes, areaName){
    if(areaName == 'sync'){
        updateContextMenus();
    }
});

updateContextMenus();



RE: Service-Worker feuert nicht immer - AndreasB - 15.05.2023

Es tut mir leid, aber mit Service Workern kenne ich mich nicht so gut aus. Ich versuche trotzdem zu helfen.

Ein Paar Verständnisfragen:
1. Zeigt die Konsole irgendwelche 
2. Den Code den ich hier sehe, ist das der komplette Code deines Workers?
3. Kannst du mal den Teil zeigen, wo der Worker Installiert und Aktiviert wird?


RE: Service-Worker feuert nicht immer - Oly - 15.05.2023

Guten Morgen,

ja das ist der Code und wüsste nicht das explizit etwas installiert wird ausser in der Manifest halt.
Code:
"background": {
        "service_worker": "background.js"
    },

habe die Vermutung, das wenn der Service Worker einmal inaktiv ist/war das er mit irgendetwas nicht mehr klar kommt die ID zu ermitteln.

Dann bekomme ich diesen Fehler.

Error handling response: TypeError: Error in invocation of tabs.sendMessage(integer tabId, any message, optional object options, optional function callback): No matching signature.

solange er aktiv ist und ich ihn aktiv halte, läuft alles gut

Hatte schonmal die Idee, an den Worker eine Message zu senden, das er vorher aktiviert wird um das Problem zu lösen.

und manchmal bekomme ich diese Fehlermeldung:

Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist.

Was meine Vermutung noch mehr bestärkt


RE: Service-Worker feuert nicht immer - AndreasB - 15.05.2023

1.
(15.05.2023, 07:44)Oly schrieb: habe die Vermutung, das wenn der Service Worker einmal inaktiv ist/war das er mit irgendetwas nicht mehr klar kommt die ID zu ermitteln.

Dann bekomme ich diesen Fehler.

Error handling response: TypeError: Error in invocation of tabs.sendMessage(integer tabId, any message, optional object options, optional function callback): No matching signature.

Das liegt woh daran. dass du keine tabId übergibst.

Code:
chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
console.log("Status: "+changeInfo.status)
console.log("ID: "+tabId)

// Hier weist du den Wert der Variablen zu.
// Allerdings geschieht dies in dem Callback von onUpdated.addListener.
// Dadurch ist die Variable außerhalb nicht verfügbar.
// (Das ist eine asynchroner Zugriff auf die Daten)

if(changeInfo.status==='complete'||changeInfo.status==='loading') TABID=tabId;


});

Was gibt denn die Zeile
Code:
console.log("Background: items: "+items+" key: "+key+" text: "+text+ "ID: "+TABID);
Auf der Konsole aus?


Und:
2:
(15.05.2023, 07:44)Oly schrieb: Hatte schonmal die Idee, an den Worker eine Message zu senden, das er vorher aktiviert wird um das Problem zu lösen.

und manchmal bekomme ich diese Fehlermeldung:

Uncaught (in promise) Error: Could not establish connection. Receiving end does not exist.

Da bin ich wirklich überfragt.
Ein wenig Googlen hat das hier ergeben:
https://stackoverflow.com/questions/10994324/chrome-extension-content-script-re-injection-after-upgrade-or-install
Hilft dir das weiter?
Hört sich so an, als ob das deinem Problem sehr ähnlich ist.


RE: Service-Worker feuert nicht immer - Oly - 15.05.2023

Code:
console.log("Background: items: "+items+" key: "+key+" text: "+text+ "ID: "+TABID);
Diese Zeile gibt zur Kontrolle das aus, was ich später weiter verarbeiten möchte. Klappt aber nur wenn der SW noch nicht inaktiv war.
Und ja, es wird daran liegen , das sich wohl mit den Tabs ändert und die ID nicht mehr zu ermitteln ist, warum auch immer.

Den Link schaue ich mir noch an


RE: Service-Worker feuert nicht immer - Oly - 16.05.2023

Moin Moin,

habe es jetzt mal mit dem Code Snipes ausprobiert da er für mich logisch klang

Code:
chrome.runtime.onInstalled.addListener(installScript);

function installScript(details){
    console.log('Installing content script in all tabs.');
    let params = {
        currentWindow: true
    };
    chrome.tabs.query(params, function gotTabs(tabs){
        let contentjsFile = chrome.runtime.getManifest().content_scripts[0].js[0];
        
        for (let index = 0; index < tabs.length; index++) {
            chrome.tabs.executeScript(tabs[index].id, {
                File: contentjsFile
            },
            result => {
                const lastErr = chrome.runtime.lastError;
                if (lastErr) {
                    console.error('tab: ' + tabs[index].id + ' lastError: ' + JSON.stringify(lastErr));
                }
            })
        }
    });   
}

doch leider läuft er nicht.

Fehler 
Code:
Error handling response: TypeError: chrome.tabs.executeScript is not a function
    at gotTabs
und bekomme ihn nicht weg

ob dieser Code überhaupt mein Problem beheben könnte, weiss ich gerade nicht. So gut kenne ich mich da auch noch nicht aus. Habe aber rausgefunden, das er nur beim aller ersten Mal ausgeführt, wenn die gewünschte Seite aufgerufen wird. Da läuft eh alles noch tacko. Als zweites würde der Code nur wieder ausgeführt, wenn ich in den Erweiterungen die Erweiterung aktualisiere. Also brauche ich den Code nicht, denn wenn ich die Seite neu aufrufe oder die Erweiterung aktualisiere, läuft es ja eh.
Aber das ist jetzt nur eine Theorie von mir, da ich gerade Planlos bin


RE: Service-Worker feuert nicht immer - AndreasB - 16.05.2023

(16.05.2023, 06:30)Oly schrieb: Fehler 
Code:
Error handling response: TypeError: chrome.tabs.executeScript is not a function at gotTabs
Bedeutet, dass das Objekt chrome.tabs keine Property mit dem Namen executeScript hat, oder dass der Wert der Property keine Funktion ist.

Lass dir mal über
Code:
console.log(chrome.tabs);
Den Inhalt ausgeben und schaue, was der Wert ist.


Übrigens, sollte File in File: contentjsFile kleingeschrieben werden.
so:
Code:
{
  file: contentjsFile,
},



RE: Service-Worker feuert nicht immer - Oly - 17.05.2023

Moin,

habe mal folgenden Code für Manifest V3 geändert.
Code:
chrome.runtime.onInstalled.addListener(installScript);

function installScript(details){
    // console.log('Installing content script in all tabs.');
    let params = {
        currentWindow: true
    };

    chrome.tabs.query(params, function gotTabs(tabs){
    

        let contentjsFile = chrome.runtime.getManifest().content_scripts[0].js[0];
        for (let index = 0; index < tabs.length; index++) {
            
            chrome.scripting.executeScript(
                {
                  target: {tabId: tabs[index].id},
                  files: [contentjsFile]}),
            result => {
                const lastErr = chrome.runtime.lastError;
                if (lastErr) {
                    console.error('tab: ' + tabs[index].id + ' lastError: ' + JSON.stringify(lastErr));
                }
            }
        }}
    )};
alles, bis jetzt soweit gut.
Habe jetzt nur das Problem, das jetzt jedes Mal ein Fehler gefeuert wird, die nicht dem Filter von "host_permissions" " entspricht.

Ausschnitt meiner Manifest V3

Code:
   "content_scripts": [{
        "matches": ["https://de.zir-online.com/*"],
        "js": ["content.js"]
    }],
    "host_permissions": ["https://de.zir-online.com/*"]
wie kann ich das noch verhindern?


RE: Service-Worker feuert nicht immer - Oly - 17.05.2023

habe es mit einer If Abfrage hinbekommen.

Code:
function installScript(details){
    // console.log('Installing content script in all tabs.');
    let params = {
        currentWindow: true
    };

    chrome.tabs.query(params, function gotTabs(tabs){
    

        let contentjsFile = chrome.runtime.getManifest().content_scripts[0].js[0];
        for (let index = 0; index < tabs.length; index++) {
            if(tabs[index].url.indexOf("https://de.zir-online.com/")!=-1){
            chrome.scripting.executeScript(
                {
                  target: {tabId: tabs[index].id},
                  files: [contentjsFile]}),
            result => {
                const lastErr = chrome.runtime.lastError;
                if (lastErr) {
                    console.error('tab: ' + tabs[index].id + ' lastError: ' + JSON.stringify(lastErr));
                }
            }
    }}
    })
};

mal sehen ob es jetzt mein Problem lösen wird.


RE: Service-Worker feuert nicht immer - AndreasB - 17.05.2023

Das sollte klappen.

Da 
Code:
chrome.scripting.executeScript

Ein Promise zurückgibt, solltest du den auch mit:
Code:
chrome.scripting.executeScript(
    {
        target: {tabId: tabs[index].id},
        files: [contentjsFile]
    }
).catch((lastError) => {
    console.error('tab: ' + tabs[index].id + ' lastError: ' + JSON.stringify(lastError));
})

abfangen können.