Zaktualizuj kod

Aktualizacje niezwiązane z innymi problemami

To pierwsza z 3 sekcji opisujących zmiany, które należy wprowadzić w kodzie, który nie jest częścią skryptu service worker rozszerzenia. Ta sekcja zawiera wymagane zmiany w kodzie, które nie są związane z innymi problemami. W kolejnych 2 sekcjach omówimy zastępowanie blokowania żądań stron i zwiększanie bezpieczeństwa.

Zastąpienie funkcji tabs.executeScript() funkcją scripting.executeScript()

W platformie Manifest V3 executeScript() przechodzi z interfejsu tabs API do interfejsu scripting API. Wymaga to zmian uprawnień w pliku manifestu oraz zmian w kodzie.

W przypadku metody executeScript() potrzebujesz:

  • Uprawnienie "scripting".
  • Uprawnienia hosta lub uprawnienie "activeTab".

Metoda scripting.executeScript() działa podobnie jak w przypadku tabs.executeScript(). Istnieje kilka różnic.

  • Stara metoda mogła przyjmować tylko jeden plik, a nowa może przyjmować tablicę plików.
  • Przekazujesz też obiekt ScriptInjection zamiast InjectDetails. Istnieje między nimi wiele różnic. Na przykład tabId jest teraz przekazywany jako element ScriptInjection.target, a nie jako argument metody.

Przykład pokazuje, jak to zrobić.

(platforma) Manifest V2
async function getCurrentTab() {/* ... */}
let tab = await getCurrentTab();

browser.tabs.executeScript(
  tab.id,
  {
    file: 'content-script.js'
  }
);

W pliku skryptu działającego w tle.

(platforma) Manifest V3
async function getCurrentTab()
let tab = await getCurrentTab();

browser.scripting.executeScript({
  target: {tabId: tab.id},
  files: ['content-script.js']
});

W skrypcie service worker rozszerzenia.

Zastąpienie funkcji tabs.insertCSS() i tabs.removeCSS() funkcjami scripting.insertCSS() i scripting.removeCSS()

W pliku manifestu w wersji 3 funkcje insertCSS() i removeCSS() są przenoszone z interfejsu tabs API do scripting API. Oprócz zmian w kodzie wymaga to zmian uprawnień w pliku manifestu:

  • Uprawnienie "scripting".
  • Uprawnienia hosta lub uprawnienie "activeTab".

Funkcje w interfejsie scripting API są podobne do funkcji w tabs. Istnieje kilka różnic.

  • Podczas wywoływania tych metod przekazujesz obiekt CSSInjection zamiast InjectDetails.
  • tabId jest teraz przekazywany jako element CSSInjection.target, a nie jako argument metody.

Przykład pokazuje, jak to zrobić w przypadku insertCSS(). Procedura w przypadku removeCSS() jest taka sama.

(platforma) Manifest V2
browser.tabs.insertCSS(tabId, injectDetails, () => {
  // callback code
});

W pliku skryptu działającego w tle.

(platforma) Manifest V3
const insertPromise = await browser.scripting.insertCSS({
  files: ["style.css"],
  target: { tabId: tab.id }
});
// Remaining code. 

W skrypcie service worker rozszerzenia.

Zastępowanie działań w przeglądarce i działań na stronie działaniami

W (platformie) Manifest V2 działania przeglądarki i działania na stronie były odrębnymi pojęciami. Chociaż początkowo pełniły różne funkcje, z czasem różnice między nimi zmalały. W platformie Manifest V3 te koncepcje są połączone w interfejsie Action API. Wymaga to zmian w manifest.json i kodzie rozszerzenia, które różnią się od tych, które umieściłbyś w skrypcie tła Manifest V2.

Działania w Manifest V3 są najbardziej podobne do działań przeglądarki, ale interfejs action API nie udostępnia hide() i show(), tak jak robił to interfejs pageAction. Jeśli nadal potrzebujesz działań na stronie, możesz emulować je za pomocą treści deklaratywnych lub wywołać funkcję enable() lub disable() z identyfikatorem karty.

Zastąp „browser_action” i „page_action” wartością „action”

W manifest.json zastąp pola "browser_action" i "page_action" polem "action". Więcej informacji o polu "action" znajdziesz w odwołaniu.

(platforma) Manifest V2
{
  ...
  "page_action": { ... },
  "browser_action": {
    "default_popup": "popup.html"
   }
  ...
}
(platforma) Manifest V3
{
  ...
  "action": {
    "default_popup": "popup.html"
  }

  ...
}

Zastąpienie interfejsów browserAction i pageAction interfejsem action API

W miejscach, w których platforma Manifest V2 używała interfejsów API browserAction i pageAction, należy teraz używać interfejsu API action.

(platforma) Manifest V2
browser.browserAction.onClicked.addListener(tab => { ... });
browser.pageAction.onClicked.addListener(tab => { ... });
(platforma) Manifest V3
browser.action.onClicked.addListener(tab => { ... });

Zastępowanie wywołań zwrotnych obietnicami

W rozszerzeniach Manifest V3 wiele metod interfejsu API zwraca obietnice. Obietnica to obiekt zastępczy wartości zwracanej przez metodę asynchroniczną. Jeśli nigdy nie korzystałeś(-aś) z obiektów Promise, możesz przeczytać o nich w MDN. Na tej stronie znajdziesz informacje, które pomogą Ci używać ich w rozszerzeniu do Chrome.

W celu zapewnienia zgodności wstecznej wiele metod nadal obsługuje wywołania zwrotne po dodaniu obsługi obietnic. Pamiętaj, że nie możesz używać obu tych opcji w tym samym wywołaniu funkcji. Jeśli przekażesz wywołanie zwrotne, funkcja nie zwróci obietnicy. Jeśli chcesz, aby funkcja zwracała obietnicę, nie przekazuj wywołania zwrotnego. Niektóre funkcje interfejsu API, takie jak detektory zdarzeń, nadal będą wymagać wywołań zwrotnych. Aby sprawdzić, czy dana metoda obsługuje obietnice, poszukaj w jej dokumentacji API etykiety „Promise”.

Aby przekształcić wywołanie zwrotne w obietnicę, usuń wywołanie zwrotne i obsłuż zwróconą obietnicę. Poniższy przykład pochodzi z przykładowego kodu dotyczącego uprawnień opcjonalnych, a konkretnie z newtab.js. Wersja wywołania zwrotnego pokazuje, jak wyglądałoby wywołanie request() w przykładzie z wywołaniem zwrotnym. Pamiętaj, że wersję obietnicy można przepisać za pomocą funkcji async i await.

Oddzwanianie
browser.permissions.request(newPerms, (granted) => {
  if (granted) {
    console.log('granted');
  } else {
    console.log('not granted');
  }
});
Promise
const newPerms = { permissions: ['topSites'] };
browser.permissions.request(newPerms)
.then((granted) => {
  if (granted) {
    console.log('granted');
  } else {
    console.log('not granted');
  }
});

Zastąp funkcje, które oczekują kontekstu tła platformy Manifest V2

Inne konteksty rozszerzeń mogą wchodzić w interakcje z procesami roboczymi rozszerzeń tylko za pomocą przekazywania wiadomości. Dlatego musisz zastąpić wywołania, które oczekują kontekstu w tle, a mianowicie:

  • browser.runtime.getBackgroundPage()
  • browser.extension.getBackgroundPage()
  • browser.extension.getExtensionTabs()

Skrypty rozszerzenia powinny używać przekazywania wiadomości do komunikacji między skryptem service worker a innymi częściami rozszerzenia. Obecnie można to osiągnąć, używając sendMessage() i wdrażając browser.runtime.onMessage w skrypcie service worker rozszerzenia. W dłuższej perspektywie zastąp te wywołania funkcją postMessage() i procedurą obsługi zdarzenia message w usłudze Service Worker.

Zastępowanie nieobsługiwanych interfejsów API

Metody i właściwości wymienione poniżej muszą zostać zmienione w platformie Manifest V3.

Metoda lub właściwość platformy Manifest V2 Zastąp
browser.extension.connect() browser.runtime.connect()
browser.extension.connectNative() browser.runtime.connectNative()
browser.extension.getExtensionTabs() browser.extension.getViews()
browser.extension.getURL() browser.runtime.getURL()
browser.extension.lastError W przypadku metod zwracających obietnice używaj promise.catch().
browser.extension.onConnect browser.runtime.onConnect
browser.extension.onConnectExternal browser.runtime.onConnectExternal
browser.extension.onMessage browser.runtime.onMessage
browser.extension.onRequest browser.runtime.onMessage
browser.extension.onRequestExternal browser.runtime.onMessageExternal
browser.extension.sendMessage() browser.runtime.sendMessage()
browser.extension.sendNativeMessage() browser.runtime.sendNativeMessage()
browser.extension.sendRequest() browser.runtime.sendMessage()
browser.runtime.onSuspend (skrypty działające w tle) Nieobsługiwane w przypadku procesów roboczych usługi rozszerzenia. Zamiast tego użyj zdarzenia dokumentu beforeunload.
browser.tabs.getAllInWindow() browser.tabs.query()
browser.tabs.getSelected() browser.tabs.query()
browser.tabs.onActiveChanged browser.tabs.onActivated
browser.tabs.onHighlightChanged browser.tabs.onHighlighted
browser.tabs.onSelectionChanged browser.tabs.onActivated
browser.tabs.sendRequest() browser.runtime.sendMessage()
browser.tabs.Tab.selected browser.tabs.Tab.highlighted