Iniettare script nella scheda attiva

Questo tutorial crea un'estensione che semplifica lo stile delle pagine di documentazione delle estensioni di Chrome e del Chrome Web Store, in modo che siano più facili da leggere.

In questa guida spieghiamo come:

  • Utilizza il service worker dell'estensione come coordinatore degli eventi.
  • Proteggere la privacy degli utenti tramite l'autorizzazione "activeTab".
  • Esegui il codice quando l'utente fa clic sull'icona della barra degli strumenti dell'estensione.
  • Inserisci e rimuovi un foglio di stile utilizzando l'API Scripting.
  • Utilizza una scorciatoia da tastiera per eseguire il codice.

Prima di iniziare

Questa guida presuppone che tu abbia esperienza di base nello sviluppo web. Consulta Hello World per un'introduzione al flusso di lavoro di sviluppo delle estensioni.

Crea l'estensione

Per iniziare, crea una nuova directory chiamata focus-mode per contenere i file dell'estensione. Puoi scaricare il codice sorgente completo su GitHub.

Passaggio 1: aggiungi i dati e le icone dell'estensione

Crea un file manifest.json. Copia e incolla il seguente codice:

{
  "manifest_version": 3,
  "name": "Focus Mode",
  "description": "Enable focus mode on Chrome's official Extensions and Chrome Web Store documentation.",
  "version": "1.0",
  "icons": {
    "16": "images/icon-16.png",
    "32": "images/icon-32.png",
    "48": "images/icon-48.png",
    "128": "images/icon-128.png"
  }
}

Crea una cartella images, quindi scarica le icone al suo interno.

Passaggio 2: inizializza l'estensione

Le estensioni possono monitorare gli eventi del browser in background utilizzando il service worker dell'estensione. I service worker sono ambienti JavaScript speciali che gestiscono gli eventi e terminano quando non sono necessari.

Inizia registrando il service worker nel file manifest.json:

{
  ...
  "background": {
    "service_worker": "background.js"
  },
  ...
}

Crea un file denominato background.js e aggiungi il seguente codice:

chrome.runtime.onInstalled.addListener(() => {
  chrome.action.setBadgeText({
    text: "OFF",
  });
});

Il primo evento che il service worker ascolterà è runtime.onInstalled(). Questo metodo consente all'estensione di impostare uno stato iniziale o completare alcune attività durante l'installazione. Le estensioni possono utilizzare l'API Storage e IndexedDB per archiviare lo stato dell'applicazione. In questo caso, poiché gestiamo solo due stati, utilizziamo il testo del badge dell'azione per monitorare se l'estensione è "ON" o "OFF".

Passaggio 3: attiva l'azione dell'estensione

L'azione dell'estensione controlla l'icona della barra degli strumenti dell'estensione. Quando l'utente seleziona l'icona dell'estensione, viene eseguito il codice (come in questo esempio) o viene visualizzato un popup.

Aggiungi il seguente codice per dichiarare l'azione dell'estensione nel file manifest.json:

{
  ...
  "action": {
    "default_icon": {
      "16": "images/icon-16.png",
      "32": "images/icon-32.png",
      "48": "images/icon-48.png",
      "128": "images/icon-128.png"
    }
  },
  ...
}

Utilizzare l'autorizzazione activeTab per proteggere la privacy degli utenti

L'autorizzazione activeTab concede all'estensione la possibilità temporanea di eseguire codice nella scheda attiva. Consente inoltre l'accesso alle proprietà sensibili della scheda corrente.

Questa autorizzazione viene attivata quando l'utente richiama l'estensione. In questo caso, l'utente richiama l'estensione facendo clic sull'azione dell'estensione.

💡 Quali altre interazioni utente attivano l'autorizzazione activeTab nella mia estensione?

  • Premendo una combinazione di tasti di scelta rapida.
  • Selezionare una voce del menu contestuale.
  • Accettare un suggerimento dalla omnibox.
  • Apertura di un popup dell'estensione.

L'autorizzazione "activeTab" consente agli utenti di scegliere intenzionalmente di eseguire l'estensione nella scheda attiva, proteggendo così la privacy dell'utente. Un altro vantaggio è che non attiva un avviso relativo alle autorizzazioni.

Per utilizzare l'autorizzazione "activeTab", aggiungila all'array di autorizzazioni del manifest:

{
  ...
  "permissions": ["activeTab"],
  ...
}

Passaggio 4: monitora lo stato della scheda corrente

Dopo che l'utente ha fatto clic sull'azione dell'estensione, questa controlla se l'URL corrisponde a una pagina di documentazione. Successivamente, controllerà lo stato della scheda corrente e imposterà lo stato successivo. Aggiungi il codice seguente a background.js:

const extensions = 'https://developer.chrome.com/docs/extensions';
const webstore = 'https://developer.chrome.com/docs/webstore';

chrome.action.onClicked.addListener(async (tab) => {
  if (tab.url.startsWith(extensions) || tab.url.startsWith(webstore)) {
    // Retrieve the action badge to check if the extension is 'ON' or 'OFF'
    const prevState = await chrome.action.getBadgeText({ tabId: tab.id });
    // Next state will always be the opposite
    const nextState = prevState === 'ON' ? 'OFF' : 'ON';

    // Set the action badge to the next state
    await chrome.action.setBadgeText({
      tabId: tab.id,
      text: nextState,
    });
  }
});

Passaggio 5: aggiungi o rimuovi il foglio di stile

Ora è il momento di modificare il layout della pagina. Crea un file denominato focus-mode.css e includi il seguente codice:

* {
  display: none !important;
}

html,
body,
*:has(article),
article,
article * {
  display: revert !important;
}

[role='navigation'] {
  display: none !important;
}

article {
  margin: auto;
  max-width: 700px;
}

Inserisci o rimuovi il foglio di stile utilizzando l'API Scripting. Inizia dichiarando l'autorizzazione "scripting" nel manifest:

{
  ...
  "permissions": ["activeTab", "scripting"],
  ...
}

Infine, in background.js aggiungi il seguente codice per modificare il layout della pagina:

  ...
    if (nextState === "ON") {
      // Insert the CSS file when the user turns the extension on
      await chrome.scripting.insertCSS({
        files: ["focus-mode.css"],
        target: { tabId: tab.id },
      });
    } else if (nextState === "OFF") {
      // Remove the CSS file when the user turns the extension off
      await chrome.scripting.removeCSS({
        files: ["focus-mode.css"],
        target: { tabId: tab.id },
      });
    }
  }
});

(Facoltativo) Assegna una scorciatoia da tastiera

Per divertimento, aggiungi una scorciatoia per attivare o disattivare più facilmente la modalità Niente distrazioni. Aggiungi la chiave "commands" al manifest.

{
  ...
  "commands": {
    "_execute_action": {
      "suggested_key": {
        "default": "Ctrl+B",
        "mac": "Command+B"
      }
    }
  }
}

Il tasto "_execute_action" esegue lo stesso codice dell'evento action.onClicked(), quindi non è necessario codice aggiuntivo.

Verifica che funzioni

Verifica che la struttura dei file del progetto sia simile alla seguente:

I contenuti della cartella della modalità Focus: manifest.json, background.js, focus-mode.css e la cartella delle immagini.

Caricare l'estensione in locale

Per caricare un'estensione non pacchettizzata in modalità sviluppatore, segui i passaggi descritti in Hello World.

Testare l'estensione

Apri una delle seguenti pagine:

Poi, fai clic sull'azione dell'estensione. Se hai configurato una scorciatoia da tastiera, puoi testarla premendo Ctrl+B o Cmd+B.

Dovrebbe passare da questo:

Estensione della modalità Niente distrazioni DISATTIVATA
Estensione della modalità Niente distrazioni disattivata

In:

Estensione della modalità Niente distrazioni ON
Estensione della modalità Niente distrazioni su

Potenziali miglioramenti

In base a ciò che hai imparato oggi, prova a svolgere una delle seguenti attività:

  • Migliora il foglio di stile CSS.
  • Assegna una scorciatoia da tastiera diversa.
  • Modificare il layout del tuo blog o sito di documentazione preferito.

Continua a creare

Congratulazioni per aver completato questo tutorial 🎉. Continua a migliorare le tue competenze completando gli altri tutorial di questa serie:

Estensione Obiettivi didattici
Tempo di lettura Inserisci automaticamente un elemento in un insieme specifico di pagine.
Tabs Manager Crea un popup che gestisce le schede del browser.

Continua a esplorare

Ci auguriamo che ti sia piaciuto creare questa estensione Chrome e che tu sia entusiasta di continuare il tuo percorso di apprendimento nello sviluppo di estensioni. Ti consigliamo i seguenti percorsi di apprendimento: