Réinjecter les scripts de contenu : une étape nécessaire après une mise à niveau ou une installation d'une extension Chrome
P粉066224086
P粉066224086 2023-08-24 12:03:01
0
2
598
<p>Après l'installation ou la mise à niveau d'une extension Chrome que je développe, le script de contenu (spécifié dans le manifeste) n'est pas réinjecté, une actualisation de la page est donc nécessaire pour que l'extension fonctionne correctement. Existe-t-il un moyen de forcer la réinjection du script ? </p> <p>Je pense que je pourrais les réinjecter en les supprimant par programme du manifeste, puis en traitant la page à injecter dans une page d'arrière-plan, mais ce n'est pas une bonne solution. </p> <p>Je ne souhaite pas actualiser automatiquement les onglets de l'utilisateur car cela pourrait entraîner une perte de données. Safari actualise automatiquement toutes les pages lorsqu'une extension est installée ou mise à niveau. </p>
P粉066224086
P粉066224086

répondre à tous(2)
P粉807239416

La seule façon de forcer l'injection d'un script de contenu sans actualiser la page est l'injection programmatique.

Vous pouvez utiliser l'API Tags de Chrome pour obtenir toutes vos balises et y injecter du code. Par exemple, vous pouvez stocker un numéro de version dans le stockage local et chaque fois que vous vérifiez si le numéro de version dans la page d'arrière-plan est obsolète (si c'est le cas), vous pouvez obtenir toutes les balises actives et injecter votre code par programme, ou autre. solutions pour garantir la mise à jour de votre extension.

Utilisez le code suivant pour obtenir toutes les balises :
chrome.tabs.query

et injectez votre code dans toutes les pages
chrome.tabs.executeScript(tabId, {file: "content_script.js"});

P粉158473780

Il existe un moyen de faire en sorte que les extensions contenant beaucoup de scripts de contenu continuent de fonctionner correctement après la mise à niveau et de les rendre actives immédiatement après l'installation.

Installation/Mise à niveau

La façon de l'installer consiste simplement à parcourir tous les onglets de toutes les fenêtres et à injecter par programme un script dans l'onglet avec l'URL correspondante.

ManifestV3

manifest.json :

"background": {"service_worker": "background.js"},
"permissions": ["scripting"],
"host_permissions": ["<all_urls>"],

Ces host_permissions doivent être les mêmes que celles du script de contenu matches.

background.js :

chrome.runtime.onInstalled.addListener(async () => {
  for (const cs of chrome.runtime.getManifest().content_scripts) {
    for (const tab of await chrome.tabs.query({url: cs.matches})) {
      chrome.scripting.executeScript({
        target: {tabId: tab.id},
        files: cs.js,
      });
    }
  }
});

Il s'agit d'un exemple simplifié et ne traite pas des cadres. Vous pouvez utiliser l'API getAllFrames et faire correspondre les URL vous-même, consultez la documentation pour les modèles de correspondance.

ManifestV2

Évidemment, vous devez le faire dans une page d'arrière-plan ou une page d'événementscript déclaré dans manifest.json :

"background": {
    "scripts": ["background.js"]
},

background.js :

// Add a `manifest` property to the `chrome` object.
chrome.manifest = chrome.runtime.getManifest();

var injectIntoTab = function (tab) {
    // You could iterate through the content scripts here
    var scripts = chrome.manifest.content_scripts[0].js;
    var i = 0, s = scripts.length;
    for( ; i < s; i++ ) {
        chrome.tabs.executeScript(tab.id, {
            file: scripts[i]
        });
    }
}

// Get all windows
chrome.windows.getAll({
    populate: true
}, function (windows) {
    var i = 0, w = windows.length, currentWindow;
    for( ; i < w; i++ ) {
        currentWindow = windows[i];
        var j = 0, t = currentWindow.tabs.length, currentTab;
        for( ; j < t; j++ ) {
            currentTab = currentWindow.tabs[j];
            // Skip chrome:// and https:// pages
            if( ! currentTab.url.match(/(chrome|https):\/\//gi) ) {
                injectIntoTab(currentTab);
            }
        }
    }
});

Faits historiques intéressants

Dans l'ancien Chrome 26 et versions antérieures, les scripts de contenu peuvent restaurer les connexions aux scripts d'arrière-plan. Cela a été corrigé en 2013http://crbug.com/168263. Vous pouvez voir un exemple de cette technique dans une version antérieure de cette réponse.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal