Maison  >  Questions et réponses  >  le corps du texte

Réinjecter les scripts de contenu : une étape nécessaire après une mise à niveau ou une installation d'une extension Chrome

<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粉066224086P粉066224086422 Il y a quelques jours521

répondre à tous(2)je répondrai

  • P粉807239416

    P粉8072394162023-08-25 11:24:31

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

    répondre
    0
  • P粉158473780

    P粉1584737802023-08-25 00:54:45

    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.

    répondre
    0
  • Annulerrépondre