Wstawianie skryptów na aktywnej karcie

W tym samouczku utworzysz rozszerzenie, które upraszcza stylizację stron dokumentacji rozszerzeń Chrome i Chrome Web Store, aby ułatwić ich czytanie.

Z tego przewodnika dowiesz się, jak:

  • Użyj procesu roboczego usługi rozszerzenia jako koordynatora zdarzeń.
  • Chroń prywatność użytkowników za pomocą uprawnienia "activeTab".
  • Uruchamia kod, gdy użytkownik kliknie ikonę paska narzędzi rozszerzenia.
  • Wstawianie i usuwanie arkusza stylów za pomocą interfejsu Scripting API.
  • Użyj skrótu klawiszowego, aby wykonać kod.

Zanim rozpoczniesz

W tym przewodniku zakładamy, że masz podstawowe doświadczenie w zakresie tworzenia stron internetowych. Zapoznaj się z artykułem Hello World, aby poznać przepływ pracy związany z tworzeniem rozszerzeń.

Tworzenie rozszerzenia

Na początek utwórz nowy katalog o nazwie focus-mode, w którym będą przechowywane pliki rozszerzenia. Pełny kod źródłowy możesz pobrać z GitHub.

Krok 1. Dodaj dane i ikony rozszerzenia

Utwórz plik manifest.json. Skopiuj i wklej ten kod:

{
  "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"
  }
}

Utwórz images folder, a następnie pobierz do niego ikony.

Krok 2. Zainicjuj rozszerzenie

Rozszerzenia mogą monitorować zdarzenia w przeglądarce w tle za pomocą procesu roboczego rozszerzenia. Service worker to specjalne środowiska JavaScript, które obsługują zdarzenia i kończą działanie, gdy nie są potrzebne.

Zacznij od zarejestrowania skryptu service worker w pliku manifest.json:

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

Utwórz plik o nazwie background.js i dodaj ten kod:

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

Pierwszym zdarzeniem, na które będzie nasłuchiwać nasz service worker, jest runtime.onInstalled(). Ta metoda umożliwia rozszerzeniu ustawienie stanu początkowego lub wykonanie niektórych zadań podczas instalacji. Rozszerzenia mogą używać Storage APIIndexedDB do przechowywania stanu aplikacji. W tym przypadku obsługujemy tylko 2 stany, więc używamy tekstu plakietki działania, aby śledzić, czy rozszerzenie jest „WŁĄCZONE” czy „WYŁĄCZONE”.

Krok 3. Włącz działanie rozszerzenia

Działanie rozszerzenia kontroluje ikonę rozszerzenia na pasku narzędzi. Gdy użytkownik wybierze ikonę rozszerzenia, uruchomi się kod (jak w tym przykładzie) lub wyświetli się wyskakujące okienko.

Dodaj ten kod, aby zadeklarować działanie rozszerzenia w pliku 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"
    }
  },
  ...
}

Używanie uprawnienia activeTab do ochrony prywatności użytkowników

Uprawnienie activeTab przyznaje rozszerzeniu tymczasową możliwość uruchamiania kodu na aktywnej karcie. Umożliwia też dostęp do informacji poufnych na bieżącej karcie.

To uprawnienie jest włączane, gdy użytkownik wywoła rozszerzenie. W tym przypadku użytkownik wywołuje rozszerzenie, klikając działanie rozszerzenia.

💡 Jakie inne interakcje użytkownika w moim rozszerzeniu włączają uprawnienie activeTab?

  • naciśnięcie kombinacji skrótu klawiszowego,
  • wybranie elementu menu kontekstowego;
  • akceptowanie sugestii z omniboksu;
  • Otwieranie wyskakującego okienka rozszerzenia.

Uprawnienie "activeTab" umożliwia użytkownikom świadome wybranie opcji uruchomienia rozszerzenia na aktywnej karcie, co chroni prywatność użytkownika. Kolejną zaletą jest to, że nie powoduje wyświetlania ostrzeżenia o uprawnieniach.

Aby użyć uprawnienia "activeTab", dodaj je do tablicy uprawnień w pliku manifestu:

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

Krok 4. Śledzenie stanu bieżącej karty

Gdy użytkownik kliknie działanie rozszerzenia, sprawdzi ono, czy adres URL pasuje do strony dokumentacji. Następnie sprawdzi stan bieżącej karty i ustawi kolejny stan. Dodaj do pliku background.js ten kod:

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

Krok 5. Dodaj lub usuń arkusz stylów

Teraz nadszedł czas na zmianę układu strony. Utwórz plik o nazwie focus-mode.css i dodaj do niego ten kod:

* {
  display: none !important;
}

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

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

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

Wstaw lub usuń arkusz stylów za pomocą interfejsu Scripting API. Zacznij od zadeklarowania uprawnienia "scripting" w pliku manifestu:

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

Na koniec w background.js dodaj ten kod, aby zmienić układ strony:

  ...
    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 },
      });
    }
  }
});

(Opcjonalnie) Przypisz skrót klawiszowy

Dla zabawy dodaj skrót, aby łatwiej włączać i wyłączać tryb skupienia. Dodaj klawisz "commands" do pliku manifestu.

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

Klucz "_execute_action" uruchamia ten sam kod co zdarzenie action.onClicked(), więc nie jest potrzebny żaden dodatkowy kod.

Sprawdzanie działania

Sprawdź, czy struktura plików projektu wygląda tak:

Zawartość folderu trybu skupienia: manifest.json, background.js, focus-mode.css i folder z obrazami.

Wczytywanie rozszerzenia lokalnie

Aby załadować rozpakowane rozszerzenie w trybie programisty, wykonaj czynności opisane w sekcji Hello World.

Testowanie rozszerzenia

Otwórz dowolną z tych stron:

Następnie kliknij działanie rozszerzenia. Jeśli skonfigurujesz skrót klawiszowy, możesz go przetestować, naciskając Ctrl+B lub Cmd+B.

Powinien on wyglądać tak:

Rozszerzenie Tryb pełnej koncentracji WYŁĄCZONE
Wyłączone rozszerzenie trybu pełnej koncentracji

Do tego:

Rozszerzenie Tryb pełnej koncentracji WŁĄCZONE
Rozszerzenie trybu pełnej koncentracji włączone

Potencjalne ulepszenia

Na podstawie zdobytej dziś wiedzy spróbuj wykonać dowolne z tych zadań:

  • Ulepsz arkusz stylów CSS.
  • przypisać inny skrót klawiszowy;
  • Zmień układ ulubionego bloga lub witryny z dokumentacją.

Dalej rozwijaj

Gratulujemy ukończenia tego samouczka 🎉. Rozwijaj dalej swoje umiejętności, wykonując inne samouczki z tej serii:

Rozszerzenie Czego się nauczysz
Czas czytania automatycznie wstawiać element na określonym zestawie stron;
Menedżer kart Utwórz wyskakujące okienko, które zarządza kartami przeglądarki.

Przeglądaj dalej

Mamy nadzieję, że tworzenie tego rozszerzenia do Chrome było dla Ciebie przyjemnością i że z entuzjazmem będziesz kontynuować naukę tworzenia rozszerzeń. Zalecamy te ścieżki szkoleniowe:

  • przewodniku dla deweloperów znajdziesz dziesiątki dodatkowych linków do dokumentów związanych z zaawansowanym tworzeniem rozszerzeń.
  • Rozszerzenia mają dostęp do zaawansowanych interfejsów API, które nie są dostępne w otwartej sieci. Dokumentacja interfejsów API Chrome zawiera opis każdego interfejsu API.