Zaktualizuj kod

Aktualizacje, które nie są związane z innymi problemami

To jest pierwsza z 3 sekcji opisujących zmiany niezbędne w kodzie, który nie jest częścią skryptu service worker rozszerzenia. Ta sekcja dotyczy wymaganych zmian w kodzie, które nie są związane z innymi problemami. W 2 kolejnych sekcjach omawiamy zastępowanie blokowania żądań internetowych i zwiększanie bezpieczeństwa.

Zastąp tab.executeScript() wskazówką scripting.executeScript()

W platformie Manifest V3 migracja executeScript() z interfejsu API tabs do interfejsu API scripting. Wymaga to modyfikacji uprawnień w pliku manifestu, a nie tylko samych zmian w kodzie.

W przypadku metody executeScript() potrzebujesz:

  • Uprawnienie "scripting".
  • Uprawnienia dotyczące hosta lub uprawnienie "activeTab".

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

  • Stara metoda umożliwia przyjmowanie tylko 1 pliku, a nowa umożliwia pobranie tablicy plików.
  • Zamiast InjectDetails przekazujesz też obiekt ScriptInjection. Istnieje między nimi wiele różnic. Na przykład element tabId jest teraz przekazywany jako element elementu 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 w tle.

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

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

w skrypcie service worker rozszerzenia.

Zastąp zakładki.insertCSS() i Tabs.removeCSS() skryptami scripting.insertCSS() i scripting.removeCSS()

W platformie Manifest V3 interfejsy insertCSS() i removeCSS() przenoszą się z interfejsu API tabs do scripting API. Wymaga to wprowadzenia zmian w uprawnieniach w pliku manifestu oraz zmian w kodzie:

  • Uprawnienie "scripting".
  • Uprawnienia dotyczące hosta lub uprawnienie "activeTab".

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

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

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

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

W pliku skryptu w tle.

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

w skrypcie service worker rozszerzenia.

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

W platformie Manifest V2 działania przeglądarki i działania strony były osobnymi pojęciami. Chociaż zaczynali od różnych ról, z czasem różnice między nimi zmniejszyły się. W platformie Manifest V3 te pojęcia są skonsolidowane w interfejsie Action API. Wymaga to zmian w manifest.json i kodzie rozszerzenia w inny sposób niż w skrypcie działającym w tle platformy Manifest V2.

Akcje w pliku manifestu w wersji 3 najbardziej przypominają działania przeglądarki, jednak interfejs API action nie udostępnia funkcji hide() i show(), tak jak pageAction. Jeśli nadal potrzebujesz działań na stronie, możesz emulować je za pomocą treści deklaracyjnych lub wywołać metodę enable() lub disable() za pomocą identyfikatora karty.

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

W manifest.json zastąp pola "browser_action" i "page_action" polem "action". Zapoznaj się z materiałami referencyjnymi na temat informacji 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 interfejsem API działania

Tam, gdzie Twój plik Manifest V2 używał interfejsów API browserAction i pageAction, należy teraz używać 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 zdarzyło Ci się jeszcze korzystać z Promise, przeczytaj o nich informacje w MDN. Na tej stronie opisujemy, co musisz wiedzieć, aby używać ich w rozszerzeniu do Chrome.

Aby zapewnić zgodność wsteczną, po dodaniu obsługi obietnicy wiele metod nadal obsługuje wywołania zwrotne. 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 otrzymać zwrot, nie zwróci ona wywołania zwrotnego. Niektóre funkcje interfejsu API, takie jak detektory zdarzeń, będą nadal wymagać wywołań zwrotnych. Aby sprawdzić, czy metoda obsługuje obietnice, poszukaj etykiety „Promise” w jej dokumentacji API.

Aby przekształcić z wywołania zwrotnego w obietnicę, usuń wywołanie zwrotne i zajmij się zwróconą obietnicą. Poniższy przykład został zaczerpnięty z przykładu uprawnień opcjonalnych, a konkretnie newtab.js. Wersja wywołania zwrotnego pokazuje, jak mogłoby wyglądać przykładowe wywołanie request() z wywołaniem zwrotnym. Pamiętaj, że wersję obiecaną można napisać ponownie przy użyciu 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 w tle platformy Manifest V2

Inne konteksty rozszerzeń mogą wchodzić w interakcje z skryptami service worker rozszerzeń tylko za pomocą funkcji przekazywania wiadomości. W związku z tym musisz zastąpić połączenia, które wymagają kontekstu, a zwłaszcza:

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

Skrypty rozszerzeń powinny korzystać z przekazywania wiadomości do komunikacji między skryptem service worker a innymi częściami rozszerzenia. Obecnie wiąże się to z użyciem funkcji sendMessage() i implementacją chrome.runtime.onMessage w skrypcie usługi rozszerzeń. W przyszłości warto zastąpić te wywołania funkcją postMessage() oraz modułem obsługi zdarzeń wiadomości skryptu service worker.

Zastąp nieobsługiwane interfejsy API

W platformie Manifest V3 należy zmienić wymienione poniżej metody i właściwości.

Metoda lub właściwość platformy Manifest V2 Zamień na
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 gdy metody zwracają 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.onRequest
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 działające w tle) Nieobsługiwane w skryptach service worker rozszerzeń. Zamiast tego użyj zdarzenia 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