Zaktualizuj kod

Aktualizacje niezwiązane z innymi problemami

To jest pierwsza z 3 sekcji opisujących zmiany wymagane w przypadku kodu, który nie jest częścią skryptu usługi rozszerzenia. Ta sekcja dotyczy wymaganych zmian w kodzie, które nie są związane z innymi problemami. Kolejne 2 sekcje dotyczą zastępowania zablokowanych żądań sieciowych i zwiększania bezpieczeństwa.

Zastąp tablicę.executeScript() funkcją scripting.executeScript()

W platformie Manifest V3 interfejs executeScript() zostaje przeniesiony z interfejsu tabs API do interfejsu API scripting. Wymaga to wprowadzenia zmian w uprawnieniach w pliku manifestu, a nie tylko rzeczywistych zmian kodu.

W przypadku metody executeScript() potrzebujesz:

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

Metoda scripting.executeScript() działa podobnie do metody tabs.executeScript(). Istnieje kilka różnic.

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

Ten przykład pokazuje, jak to zrobić.

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

chrome.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();

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

W instancji roboczej usługi rozszerzenia.

Zastąp karty tab.insertCSS() i tab.removeCSS() interfejsami scripting.insertCSS() i scripting.removeCSS()

W platformie Manifest V3 insertCSS() i removeCSS() przechodzą z interfejsu tabs API na scripting API. Wymaga to wprowadzenia zmian w uprawnieniach w pliku manifestu, a także zmian w kodzie:

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

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

  • Przy ich wywoływaniu przekazujesz obiekt CSSInjection zamiast InjectDetails.
  • Funkcja tabId jest teraz przekazywana jako element CSSInjection.target zamiast jako argument metody.

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

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

W pliku skryptu działającego w tle.

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

W instancji roboczej usługi rozszerzenia.

Zastąp Działania przeglądarki i Działania na stronie działaniami

Działania w przeglądarce i na stronie były w Manifest V2 oddzielnymi pojęciami. Choć początkowo pełnili oni różne role, z czasem różnice między nimi rosły. W platformie Manifest V3 te koncepcje są skonsolidowane w interfejsie API Action. Wymaga to wprowadzenia zmian w kodzie manifest.json i kodzie rozszerzenia, które różnią się od tego, co należałoby umieścić w skrypcie tła platformy Manifest V2.

Działania w aplikacji Manifest V3 najbardziej przypominają działania przeglądarki. ale interfejs API action nie udostępnia hide() ani show(), tak jak miało to miejsce w przypadku pageAction. Jeśli nadal potrzebujesz działań na stronie, możesz emulować je za pomocą treści deklaratywnych albo wywołać enable() lub disable(), podając identyfikator karty.

Zastąp „browser_action” i „page_action” ze słowem „action”

W manifest.json zastąp pola "browser_action" i "page_action" polem "action". Zapoznaj się z informacjami o polu "action".

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

  ...
}

Zastąp interfejsy API browserAction i pageAction interfejsami action API

Jeśli platforma Manifest V2 używa interfejsów API browserAction i pageAction, musisz użyć interfejsu API action.

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

Zastępowanie wywołań zwrotnych obietnicami

W platformie Manifest V3 wiele metod interfejsu API rozszerzeń zwraca obietnice. Obiekt Promise to serwer proxy lub obiekt zastępczy wartości zwracanej przez metodę asynchroniczną. Jeśli nie korzystasz jeszcze z usługi Promises, zapoznaj się z informacjami na ten temat w MDN. Na tej stronie opisujemy, co musisz wiedzieć, aby używać ich w rozszerzeniu do Chrome.

Aby zapewnić zgodność wsteczną, wiele metod nadal obsługuje wywołania zwrotne po dodaniu obsługi obietnic. Pamiętaj, że nie można użyć obu w tym samym wywołaniu funkcji. Jeśli przekażesz wywołanie zwrotne, funkcja nie zwróci obietnicy, a jeśli chcesz, aby obietnica została zwrócona, nie zwróci wywołania zwrotnego. Niektóre funkcje interfejsu API, takie jak detektory zdarzeń, nadal będą wymagać wywołań zwrotnych. Aby sprawdzić, czy metoda obsługuje obietnice, wyszukaj obiekt „Promise” .

Aby przekonwertować wywołanie zwrotne na obietnicę, usuń wywołanie zwrotne i obsługuje zwróconą obietnicę. Przykład poniżej pochodzi z przykładu opcjonalnych uprawnień (newtab.js). Wersja wywołania zwrotnego pokazuje, jak powinno wyglądać wywołanie request() z przykładu z wywołaniem zwrotnym. Pamiętaj, że wersję obiecaną można zmodyfikować przy użyciu funkcji asynchronicznej i poczekać.

Oddzwanianie
chrome.permissions.request(newPerms, (granted) => {
  if (granted) {
    console.log('granted');
  } else {
    console.log('not granted');
  }
});
Obietnica
const newPerms = { permissions: ['topSites'] };
chrome.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 ze skryptami usługi rozszerzenia tylko za pomocą przekazywania wiadomości. Dlatego musisz zastąpić połączenia, które oczekują kontekstu w tle, a w szczególności:

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

Skrypty rozszerzeń powinny wykorzystywać przekazywanie komunikatów do komunikacji między skryptem service worker a innymi częściami rozszerzenia. Obecnie można to zrobić za pomocą narzędzia sendMessage() i zaimplementowania chrome.runtime.onMessage w skrypcie usługi rozszerzenia. Długoterminowo warto zastąpić te wywołania funkcją postMessage() i modułem obsługi zdarzeń wiadomości skryptu service worker.

Zastąp nieobsługiwane interfejsy API

Wymienione poniżej metody i właściwości muszą zostać zmienione w pliku manifestu V3.

Metoda lub właściwość platformy Manifest V2 Zastąp
chrome.extension.connect() chrome.runtime.connect()
chrome.extension.connectNative() chrome.runtime.connectNative()
chrome.extension.getExtensionTabs() chrome.extension.getViews()
chrome.extension.getURL() chrome.runtime.getURL()
chrome.extension.lastError Jeśli metody zwracają obietnice, użyj funkcji promise.catch()
chrome.extension.onConnect chrome.runtime.onConnect
chrome.extension.onConnectExternal chrome.runtime.onConnectExternal
chrome.extension.onMessage chrome.runtime.onMessage
chrome.extension.onRequest chrome.runtime.onMessage
chrome.extension.onRequestExternal chrome.runtime.onMessageExternal
chrome.extension.sendMessage() chrome.runtime.sendMessage()
chrome.extension.sendNativeMessage() chrome.runtime.sendNativeMessage()
chrome.extension.sendRequest() chrome.runtime.sendMessage()
chrome.runtime.onSuspend (skrypty w tle) Nieobsługiwane w instancjach roboczych usługi rozszerzenia. Zamiast tego użyj zdarzenia dotyczącego dokumentu beforeunload.
chrome.tabs.getAllInWindow() chrome.tabs.query()
chrome.tabs.getSelected() chrome.tabs.query()
chrome.tabs.onActiveChanged chrome.tabs.onActivated
chrome.tabs.onHighlightChanged chrome.tabs.onHighlighted
chrome.tabs.onSelectionChanged chrome.tabs.onActivated
chrome.tabs.sendRequest() chrome.runtime.sendMessage()
chrome.tabs.Tab.selected chrome.tabs.Tab.highlighted