Zaktualizuj kod

aktualizacje, które nie są zwią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 funkcję tabs.executeScript() funkcją scripting.executeScript().

W pliku manifestu w wersji 3 interfejs executeScript() przechodzi z interfejsu tabs na interfejs 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 uprawnienie "activeTab".

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

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

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 workerze 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 uprawnienie "activeTab".

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

  • Przy ich wywoływaniu przekazujesz obiekt CSSInjection zamiast InjectDetails.
  • Argument tabId jest teraz przekazywany jako element klasy CSSInjection.target, a nie 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ępowanie działań przeglądarki i działań na stronie akcjami

Działania w przeglądarce i na stronie były w Manifest V2 oddzielnymi pojęciami. Chociaż na początku miały odrębne role, z czasem różnice między nimi zacierały się. 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” wartością „action”.

W manifest.json zastąp pola "browser_action" i "page_action" polem "action". Informacje o polu "action" znajdziesz w dokumentacji.

(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 wersji Manifest V3 wiele metod interfejsu API rozszerzenia 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żesz używać obu tych funkcji w tym samym wywołaniu funkcji. Jeśli przekazujesz funkcję wywołania zwrotnego, funkcja nie zwróci obietnicy. Jeśli chcesz, aby zwrócona została obietnica, nie przekazuj funkcji 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 pola „Promise”. .

Aby przekształcić wywołanie zwrotne w obietnice, usuń wywołanie zwrotne i obsługuj zwróconą obietnicę. Przykład poniżej pochodzi z przykładowych uprawnień opcjonalnych (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 Manifest V2

Inne konteksty rozszerzeń mogą wchodzić w interakcje z pracownikami usługi rozszerzenia tylko za pomocą przekazywania wiadomości. W związku z tym musisz zastąpić wywołania, które wymagają kontekstu tła. Dotyczy to:

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

Skrypty rozszerzenia powinny używać przekazywania wiadomości do komunikacji między usługą w tle 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. W długim okresie czasu powinieneś zastąpić te wywołania za pomocą postMessage()obsługi zdarzeń wiadomości w usługach workera.

Zastępowanie nieobsługiwanych interfejsów API

Metody i właściwości wymienione poniżej 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 W przypadku metod zwracających obietnice użyj 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 rozszerzeniach z workerami usługowymi. 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