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ż obiektScriptInjection
. Istnieje między nimi wiele różnic. Na przykład elementtabId
jest teraz przekazywany jako element elementuScriptInjection.target
, a nie jako argument metody.
Przykład pokazuje, jak to zrobić.
async function getCurrentTab() {/* ... */} let tab = await getCurrentTab(); chrome.tabs.executeScript( tab.id, { file: 'content-script.js' } );
async function getCurrentTab() let tab = await getCurrentTab(); chrome.scripting.executeScript({ target: {tabId: tab.id}, files: ['content-script.js'] });
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
zamiastInjectDetails
. - Element
tabId
jest teraz przekazywany jako element elementuCSSInjection.target
, a nie jako argument metody.
Przykład pokazuje, jak to zrobić w przypadku insertCSS()
. Procedura removeCSS()
jest taka sama.
chrome.tabs.insertCSS(tabId, injectDetails, () => { // callback code });
const insertPromise = await chrome.scripting.insertCSS({ files: ["style.css"], target: { tabId: tab.id } }); // Remaining code.
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"
.
{ ... "page_action": { ... }, "browser_action": { "default_popup": "popup.html" } ... }
{ ... "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
.
chrome.browserAction.onClicked.addListener(tab => { ... }); chrome.pageAction.onClicked.addListener(tab => { ... });
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ć.
chrome.permissions.request(newPerms, (granted) => { if (granted) { console.log('granted'); } else { console.log('not granted'); } });
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 |