Detaljan uvid u razvoj proširenja za preglednike pomoću Manifesta V3 i JavaScript API-ja. Naučite kako izraditi moćna i sigurna proširenja za moderne preglednike.
Razvoj proširenja za preglednike: Manifest V3 i JavaScript API-ji
Proširenja za preglednike su mali softverski programi koji prilagođavaju iskustvo pregledavanja. Mogu dodati nove značajke, mijenjati sadržaj web stranica, blokirati oglase i još mnogo toga. S dolaskom Manifesta V3, način na koji se proširenja izrađuju i funkcioniraju doživio je značajne promjene. Ovaj sveobuhvatni vodič istražit će razvoj proširenja za preglednike koristeći Manifest V3 i JavaScript API-je, pružajući vam znanje za stvaranje moćnih i sigurnih proširenja za moderne preglednike.
Što su proširenja za preglednike?
Proširenja za preglednike su u suštini mini-aplikacije koje se izvršavaju unutar web preglednika. Proširuju funkcionalnost preglednika i neprimjetno se integriraju s web stranicama. Proširenja se pišu koristeći standardne web tehnologije kao što su HTML, CSS i JavaScript, što ih čini relativno dostupnima web programerima.
Primjeri popularnih proširenja za preglednike uključuju:
- Blokatori oglasa: Blokiraju oglase na web stranicama, poboljšavajući brzinu pregledavanja i smanjujući ometanja.
- Upravitelji lozinkama: Sigurno pohranjuju i upravljaju lozinkama, automatski ih popunjavajući na web stranicama.
- Proširenja za bilješke: Omogućuju korisnicima vođenje bilješki i njihovo spremanje izravno s web stranica.
- Alati za produktivnost: Povećavaju produktivnost pružajući značajke poput upravljanja zadacima, praćenja vremena i načina rada za fokusiranje.
- Alati za prevođenje jezika: Prevođenje web stranica na različite jezike jednim klikom. Primjer: Google Translate proširenje.
- VPN proširenja: Preusmjeravaju internetski promet kako bi se zaobišla geografska ograničenja i povećala privatnost.
Važnost Manifesta V3
Manifest V3 je najnovija verzija manifest datoteke, što je JSON datoteka koja opisuje proširenje pregledniku. Ona ocrtava naziv proširenja, verziju, dopuštenja, pozadinske skripte i druge bitne metapodatke. Manifest V3 uvodi nekoliko ključnih promjena u usporedbi sa svojim prethodnikom, Manifestom V2, prvenstveno se usredotočujući na sigurnost i performanse.
Ključne promjene u Manifestu V3:
- Servisni radnici (Service Workers): Manifest V3 zamjenjuje pozadinske stranice sa servisnim radnicima. Servisni radnici su skripte vođene događajima koje se izvršavaju u pozadini bez potrebe za postojanom stranicom. Učinkovitiji su i troše manje resursa od pozadinskih stranica.
- Declarative Net Request API: Ovaj API omogućuje proširenjima modificiranje mrežnih zahtjeva bez njihovog izravnog presretanja. Poboljšava sigurnost i performanse prebacivanjem logike filtriranja na preglednik.
- Stroža sigurnosna politika sadržaja (CSP): Manifest V3 nameće stroža CSP pravila kako bi se spriječilo izvršavanje proizvoljnog koda, dodatno poboljšavajući sigurnost.
- API-ji temeljeni na obećanjima (Promise-based APIs): Mnogi API-ji sada se temelje na obećanjima, što olakšava upravljanje asinkronim operacijama.
Zašto prijelaz na Manifest V3?
- Poboljšana sigurnost: Manifest V3 je dizajniran kako bi poboljšao sigurnost proširenja za preglednike i zaštitio korisnike od zlonamjernog koda.
- Poboljšane performanse: Servisni radnici i Declarative Net Request API doprinose boljim performansama i smanjenoj potrošnji resursa.
- Veća privatnost: Manifest V3 ima za cilj dati korisnicima više kontrole nad njihovim podacima i privatnošću.
Postavljanje razvojnog okruženja
Prije nego što počnete razvijati proširenja za preglednike, morate postaviti svoje razvojno okruženje. To uključuje instaliranje uređivača koda, odabir preglednika za testiranje i razumijevanje osnovne strukture datoteka proširenja.
1. Uređivač koda
Odaberite uređivač koda s kojim vam je ugodno raditi. Popularne opcije uključuju:
- Visual Studio Code (VS Code): Besplatan i moćan uređivač koda s izvrsnom podrškom za JavaScript i druge web tehnologije.
- Sublime Text: Brz i prilagodljiv uređivač koda sa širokim rasponom dodataka.
- Atom: Besplatan i open-source uređivač koda koji je razvio GitHub.
2. Preglednik za testiranje
Odaberite preglednik za testiranje vaših proširenja. Chrome i Firefox su najpopularniji izbori, jer nude robusne alate za razvojne programere i podršku za razvoj proširenja.
3. Osnovna struktura datoteka
Proširenje za preglednik obično se sastoji od sljedećih datoteka:
- manifest.json: Ova datoteka sadrži metapodatke proširenja, kao što su naziv, verzija, dopuštenja i pozadinske skripte.
- background.js (ili skripta servisnog radnika): Ova skripta se izvršava u pozadini i obrađuje događaje poput akcija preglednika i klikova na kontekstni izbornik.
- content.js: Ova skripta se izvršava u kontekstu web stranica i može mijenjati njihov sadržaj.
- popup.html: Ova datoteka definira korisničko sučelje skočnog prozora proširenja.
- popup.js: Ova skripta upravlja logikom skočnog prozora proširenja.
- options.html: Ova datoteka definira korisničko sučelje stranice s opcijama proširenja.
- options.js: Ova skripta upravlja logikom stranice s opcijama proširenja.
- ikone: Ovo su ikone koje se koriste za predstavljanje proširenja u alatnoj traci preglednika i na stranici za upravljanje proširenjima.
Izrada vašeg prvog proširenja: "Pozdrav, svijete!"
Izradimo jednostavno "Pozdrav, svijete!" proširenje kako bismo demonstrirali osnovne principe razvoja proširenja za preglednike.
1. Izradite Manifest datoteku (manifest.json)
Izradite datoteku naziva `manifest.json` u novom direktoriju i dodajte sljedeći kod:
{
"manifest_version": 3,
"name": "Pozdrav, svijete!",
"version": "1.0",
"description": "Jednostavno 'Pozdrav, svijete!' proširenje",
"permissions": [
"storage"
],
"action": {
"default_popup": "popup.html",
"default_icon": {
"16": "images/icon16.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
},
"icons": {
"16": "images/icon16.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
}
Objašnjenje:
- `manifest_version`: Određuje verziju manifest datoteke (3 za Manifest V3).
- `name`: Naziv proširenja.
- `version`: Broj verzije proširenja.
- `description`: Kratak opis proširenja.
- `permissions`: Niz dopuštenja koja proširenje zahtijeva (npr. "storage").
- `action`: Definira svojstva skočnog prozora proširenja, uključujući zadanu datoteku skočnog prozora i ikone.
- `icons`: Određuje putanje do ikona proširenja.
2. Izradite Popup datoteku (popup.html)
Izradite datoteku naziva `popup.html` u istom direktoriju i dodajte sljedeći kod:
<!DOCTYPE html>
<html>
<head>
<title>Pozdrav, svijete!</title>
<style>
body {
width: 200px;
padding: 10px;
font-family: sans-serif;
}
</style>
</head>
<body>
<h1>Pozdrav, svijete!</h1>
<p>Ovo je jednostavno proširenje za preglednik.</p>
</body>
</html>
Ova datoteka definira korisničko sučelje skočnog prozora proširenja, koji će prikazati poruku "Pozdrav, svijete!".
3. Izradite slike ikona
Izradite tri slike ikona sa sljedećim veličinama: 16x16, 48x48 i 128x128 piksela. Spremite ih kao `icon16.png`, `icon48.png` i `icon128.png` u `images` direktorij unutar vašeg direktorija proširenja.
4. Učitajte proširenje u svoj preglednik
Chrome:
- Otvorite Chrome i idite na `chrome://extensions`.
- Omogućite "Razvojni način rada" u gornjem desnom kutu.
- Kliknite "Učitaj raspakirano" i odaberite direktorij koji sadrži datoteke vašeg proširenja.
Firefox:
- Otvorite Firefox i idite na `about:debugging#/runtime/this-firefox`.
- Kliknite "Učitaj privremeni dodatak..." i odaberite datoteku `manifest.json`.
Vaše "Pozdrav, svijete!" proširenje sada bi trebalo biti instalirano i vidljivo u alatnoj traci preglednika. Kliknite na ikonu proširenja da biste otvorili skočni prozor i vidjeli poruku "Pozdrav, svijete!".
Rad s JavaScript API-jima
Proširenja za preglednike mogu komunicirati s preglednikom i web stranicama pomoću JavaScript API-ja. Ovi API-ji pružaju pristup različitim funkcionalnostima, kao što su:
- Tabs API: Omogućuje upravljanje karticama preglednika, uključujući stvaranje, ažuriranje i pretraživanje kartica.
- Storage API: Pruža način za trajno pohranjivanje i dohvaćanje podataka unutar proširenja.
- Alarms API: Omogućuje zakazivanje zadataka za izvršavanje u određeno vrijeme.
- Notifications API: Omogućuje prikazivanje obavijesti korisniku.
- Context Menus API: Omogućuje dodavanje prilagođenih stavki u kontekstni izbornik preglednika (izbornik desnog klika).
- Web Request API (Declarative Net Request u Manifestu V3): Omogućuje presretanje i modificiranje mrežnih zahtjeva.
- Scripting API: Omogućuje umetanje skripti u web stranice.
Primjer: Korištenje Storage API-ja
Izradimo proširenje koje pohranjuje i dohvaća ime korisnika pomoću Storage API-ja.
1. Ažurirajte Manifest datoteku (manifest.json)
Provjerite uključuje li niz `permissions` u vašoj `manifest.json` datoteci vrijednost `"storage"`:
{
"manifest_version": 3,
"name": "Primjer pohrane",
"version": "1.0",
"description": "Proširenje koje koristi Storage API",
"permissions": [
"storage"
],
"action": {
"default_popup": "popup.html"
},
"icons": {
"16": "images/icon16.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
}
2. Izradite Popup datoteku (popup.html)
Izradite ili ažurirajte svoju `popup.html` datoteku sa sljedećim sadržajem:
<!DOCTYPE html>
<html>
<head>
<title>Primjer pohrane</title>
<style>
body {
width: 250px;
padding: 10px;
font-family: sans-serif;
}
</style>
</head>
<body>
<h1>Primjer pohrane</h1>
<label for="name">Unesite svoje ime:</label>
<input type="text" id="name">
<button id="save">Spremi</button>
<p id="greeting"></p>
<script src="popup.js"></script>
</body>
</html>
3. Izradite Popup skriptu (popup.js)
Izradite datoteku naziva `popup.js` i dodajte sljedeći kod:
document.addEventListener('DOMContentLoaded', () => {
const nameInput = document.getElementById('name');
const saveButton = document.getElementById('save');
const greeting = document.getElementById('greeting');
// Učitaj spremljeno ime iz pohrane
chrome.storage.sync.get('name', (data) => {
if (data.name) {
nameInput.value = data.name;
greeting.textContent = `Pozdrav, ${data.name}!`;
}
});
// Spremi ime u pohranu kada se klikne gumb
saveButton.addEventListener('click', () => {
const name = nameInput.value;
chrome.storage.sync.set({ name: name }, () => {
greeting.textContent = `Pozdrav, ${name}!`;
});
});
});
Objašnjenje:
- Skripta osluškuje događaj `DOMContentLoaded` kako bi osigurala da je DOM u potpunosti učitan prije izvršavanja koda.
- Dohvaća reference na polje za unos, gumb za spremanje i odlomak za pozdrav.
- Učitava spremljeno ime iz pohrane koristeći `chrome.storage.sync.get()`.
- Sprema ime u pohranu kada se klikne gumb za spremanje koristeći `chrome.storage.sync.set()`.
- Ažurira odlomak s pozdravom spremljenim ili unesenim imenom.
Ponovno učitajte proširenje u svom pregledniku. Sada, kada otvorite skočni prozor, možete unijeti svoje ime, spremiti ga i vidjeti poruku s pozdravom. Ime će biti spremljeno u pohranu proširenja i učitat će se sljedeći put kada otvorite skočni prozor.
Primjer: Korištenje Tabs API-ja
Izradimo proširenje koje prikazuje URL trenutne kartice u skočnom prozoru.
1. Ažurirajte Manifest datoteku (manifest.json)
Dodajte dopuštenje `"tabs"` u niz `permissions` u vašoj `manifest.json` datoteci:
{
"manifest_version": 3,
"name": "Primjer kartica",
"version": "1.0",
"description": "Proširenje koje koristi Tabs API",
"permissions": [
"tabs"
],
"action": {
"default_popup": "popup.html"
},
"icons": {
"16": "images/icon16.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
}
2. Izradite Popup datoteku (popup.html)
Izradite ili ažurirajte svoju `popup.html` datoteku sa sljedećim sadržajem:
<!DOCTYPE html>
<html>
<head>
<title>Primjer kartica</title>
<style>
body {
width: 300px;
padding: 10px;
font-family: sans-serif;
}
</style>
</head>
<body>
<h1>Primjer kartica</h1>
<p>URL trenutne kartice:</p>
<p id="url"></p>
<script src="popup.js"></script>
</body>
</html>
3. Izradite Popup skriptu (popup.js)
Izradite datoteku naziva `popup.js` i dodajte sljedeći kod:
document.addEventListener('DOMContentLoaded', () => {
const urlDisplay = document.getElementById('url');
// Dohvati URL trenutne kartice
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
const tab = tabs[0];
urlDisplay.textContent = tab.url;
});
});
Objašnjenje:
- Skripta osluškuje događaj `DOMContentLoaded`.
- Koristi `chrome.tabs.query()` za dohvaćanje trenutno aktivne kartice u trenutnom prozoru.
- Dohvaća URL kartice i prikazuje ga u odlomku `url`.
Ponovno učitajte proširenje u svom pregledniku. Sada, kada otvorite skočni prozor, prikazat će se URL trenutne kartice.
Pozadinske skripte i servisni radnici
U Manifestu V3, pozadinske skripte zamijenjene su servisnim radnicima. Servisni radnici su skripte vođene događajima koje se izvršavaju u pozadini bez potrebe za postojanom stranicom. Učinkovitiji su i troše manje resursa od pozadinskih stranica.
Ključne značajke servisnih radnika:
- Vođeni događajima: Servisni radnici odgovaraju na događaje kao što su akcije preglednika, alarmi i poruke iz sadržajnih skripti.
- Asinkroni: Servisni radnici koriste asinkrone API-je kako bi izbjegli blokiranje glavne niti.
- Prekidaju se kada su neaktivni: Servisni radnici se prekidaju kada aktivno ne obrađuju događaje, čime se štede resursi.
Primjer: Korištenje servisnog radnika
Izradimo proširenje koje prikazuje obavijest kada se preglednik pokrene.
1. Ažurirajte Manifest datoteku (manifest.json)
Ažurirajte svoju `manifest.json` datoteku sa sljedećim sadržajem:
{
"manifest_version": 3,
"name": "Primjer servisnog radnika",
"version": "1.0",
"description": "Proširenje koje koristi servisnog radnika",
"permissions": [
"notifications"
],
"background": {
"service_worker": "background.js"
},
"icons": {
"16": "images/icon16.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
}
Objašnjenje:
- Svojstvo `"background"` određuje putanju do skripte servisnog radnika (`background.js`).
- Niz `"permissions"` uključuje `"notifications"`, što je potrebno za prikazivanje obavijesti.
2. Izradite skriptu servisnog radnika (background.js)
Izradite datoteku naziva `background.js` i dodajte sljedeći kod:
chrome.runtime.onStartup.addListener(() => {
// Prikaži obavijest kada se preglednik pokrene
chrome.notifications.create('startup-notification', {
type: 'basic',
iconUrl: 'images/icon48.png',
title: 'Preglednik je pokrenut',
message: 'Preglednik je pokrenut.',
});
});
Objašnjenje:
- Skripta osluškuje događaj `chrome.runtime.onStartup`, koji se pokreće kada se preglednik pokrene.
- Koristi `chrome.notifications.create()` za prikazivanje obavijesti s navedenim svojstvima.
Ponovno učitajte proširenje u svom pregledniku. Sada, kada ponovno pokrenete preglednik, trebali biste vidjeti obavijest od proširenja.
Sadržajne skripte (Content Scripts)
Sadržajne skripte su JavaScript datoteke koje se izvršavaju u kontekstu web stranica. Mogu pristupiti i mijenjati DOM web stranica, omogućujući vam prilagodbu ponašanja i izgleda web stranica.
Ključne značajke sadržajnih skripti:
- Pristup DOM-u: Sadržajne skripte mogu pristupiti i manipulirati DOM-om web stranica.
- Izolacija od skripti web stranice: Sadržajne skripte se izvršavaju u izoliranom okruženju, sprječavajući sukobe sa skriptama web stranice.
- Komunikacija s pozadinskim skriptama: Sadržajne skripte mogu komunicirati s pozadinskim skriptama koristeći prosljeđivanje poruka.
Primjer: Korištenje sadržajne skripte
Izradimo proširenje koje mijenja boju pozadine web stranica u svijetloplavu.
1. Ažurirajte Manifest datoteku (manifest.json)
Ažurirajte svoju `manifest.json` datoteku sa sljedećim sadržajem:
{
"manifest_version": 3,
"name": "Primjer sadržajne skripte",
"version": "1.0",
"description": "Proširenje koje koristi sadržajnu skriptu",
"permissions": [
"activeTab",
"scripting"
],
"background": {
"service_worker": "background.js"
},
"content_scripts": [
{
"matches": [""],
"js": ["content.js"]
}
],
"icons": {
"16": "images/icon16.png",
"48": "images/icon48.png",
"128": "images/icon128.png"
}
}
Objašnjenje:
- Svojstvo `"content_scripts"` određuje niz sadržajnih skripti koje će se umetnuti u web stranice.
- `"matches"` određuje URL-ove u koje bi se sadržajna skripta trebala umetnuti (`
` odgovara svim URL-ovima). - `"js"` određuje putanju do sadržajne skripte (`content.js`).
- Niz `"permissions"` uključuje `"activeTab"` i `"scripting"`, koji su potrebni za umetanje skripti.
2. Izradite sadržajnu skriptu (content.js)
Izradite datoteku naziva `content.js` i dodajte sljedeći kod:
document.body.style.backgroundColor = 'lightblue';
3. Izradite servisnog radnika (background.js)
Izradite datoteku naziva `background.js` i dodajte sljedeći kod:
chrome.action.onClicked.addListener((tab) => {
chrome.scripting.executeScript({
target: { tabId: tab.id },
function: () => {
document.body.style.backgroundColor = 'lightblue';
}
});
});
Objašnjenje:
- Sadržajna skripta jednostavno postavlja boju pozadine elementa `body` na svijetloplavu.
- Servisni radnik osluškuje događaj klika i izvršava funkciju unutar trenutne kartice koja mijenja boju pozadine.
Ponovno učitajte proširenje u svom pregledniku. Sada, kada otvorite bilo koju web stranicu, boja pozadine bit će svijetloplava.
Otklanjanje pogrešaka (Debugging) u proširenjima za preglednike
Otklanjanje pogrešaka u proširenjima za preglednike ključan je dio procesa razvoja. Chrome i Firefox pružaju izvrsne alate za razvojne programere za otklanjanje pogrešaka u proširenjima.
Otklanjanje pogrešaka u Chromeu:
- Otvorite Chrome i idite na `chrome://extensions`.
- Omogućite "Razvojni način rada" u gornjem desnom kutu.
- Kliknite "Pregledaj pozadinsku stranicu" za svoje proširenje. Ovo će otvoriti Chrome DevTools za pozadinsku skriptu.
- Za otklanjanje pogrešaka u sadržajnim skriptama, otvorite web stranicu gdje je sadržajna skripta umetnuta, a zatim otvorite Chrome DevTools za tu stranicu. Trebali biste vidjeti svoju sadržajnu skriptu na popisu u panelu "Sources".
Otklanjanje pogrešaka u Firefoxu:
- Otvorite Firefox i idite na `about:debugging#/runtime/this-firefox`.
- Pronađite svoje proširenje na popisu i kliknite "Inspect". Ovo će otvoriti Firefox Developer Tools za proširenje.
- Za otklanjanje pogrešaka u sadržajnim skriptama, otvorite web stranicu gdje je sadržajna skripta umetnuta, a zatim otvorite Firefox Developer Tools za tu stranicu. Trebali biste vidjeti svoju sadržajnu skriptu na popisu u panelu "Debugger".
Uobičajene tehnike otklanjanja pogrešaka:
- Ispis u konzolu: Koristite `console.log()` za ispis poruka u konzolu.
- Točke prekida (Breakpoints): Postavite točke prekida u svom kodu kako biste pauzirali izvršavanje i pregledali varijable.
- Izvorne mape (Source maps): Koristite izvorne mape za otklanjanje pogrešaka u vašem kodu u izvornom obliku, čak i ako je minificiran ili transpiliran.
- Obrada pogrešaka: Implementirajte obradu pogrešaka kako biste uhvatili i zabilježili pogreške.
Objavljivanje vašeg proširenja
Nakon što ste razvili i testirali svoje proširenje, možete ga objaviti na Chrome Web Storeu ili Firefox Add-ons tržištu.
Objavljivanje na Chrome Web Storeu:
- Kreirajte razvojni račun na Chrome Web Storeu.
- Zapakirajte svoje proširenje u `.zip` datoteku.
- Učitajte `.zip` datoteku na Chrome Web Store.
- Navedite potrebne metapodatke, kao što su naziv proširenja, opis i snimke zaslona.
- Pošaljite svoje proširenje na pregled.
Objavljivanje na Firefox Add-ons tržištu:
- Kreirajte razvojni račun na Firefox Add-ons tržištu.
- Zapakirajte svoje proširenje u `.zip` datoteku.
- Učitajte `.zip` datoteku na Firefox Add-ons tržište.
- Navedite potrebne metapodatke, kao što su naziv proširenja, opis i snimke zaslona.
- Pošaljite svoje proširenje na pregled.
Najbolje prakse za objavljivanje:
- Napišite jasan i sažet opis svog proširenja.
- Pružite visokokvalitetne snimke zaslona i videozapise kako biste prikazali značajke svog proširenja.
- Temeljito testirajte svoje proširenje prije slanja.
- Brzo odgovarajte na recenzije i povratne informacije korisnika.
- Održavajte svoje proširenje ažuriranim s najnovijim verzijama preglednika i sigurnosnim zakrpama.
Sigurnosna razmatranja
Sigurnost je ključan aspekt razvoja proširenja za preglednike. Proširenja mogu potencijalno pristupiti osjetljivim korisničkim podacima i mijenjati sadržaj web stranica, stoga je bitno slijediti najbolje sigurnosne prakse kako bi se korisnici zaštitili od zlonamjernog koda.
Ključna sigurnosna razmatranja:
- Minimizirajte dopuštenja: Tražite samo ona dopuštenja koja vaše proširenje doista treba.
- Validirajte korisnički unos: Sanitizirajte i validirajte sav korisnički unos kako biste spriječili napade cross-site scripting (XSS).
- Koristite HTTPS: Uvijek koristite HTTPS za komunikaciju s udaljenim poslužiteljima.
- Sigurnosna politika sadržaja (CSP): Nametnite strogi CSP kako biste spriječili izvršavanje proizvoljnog koda.
- Redovito ažurirajte svoje proširenje: Održavajte svoje proširenje ažuriranim s najnovijim sigurnosnim zakrpama.
Slijedeći ove sigurnosne smjernice, možete pomoći osigurati da je vaše proširenje za preglednik sigurno i zaštićeno za korisnike.
Zaključak
Razvoj proširenja za preglednike koristeći Manifest V3 i JavaScript API-je nudi moćan način za prilagodbu iskustva pregledavanja i dodavanje novih značajki web preglednicima. Razumijevanjem ključnih koncepata, API-ja i najboljih praksi navedenih u ovom vodiču, možete stvoriti moćna i sigurna proširenja koja povećavaju produktivnost, poboljšavaju sigurnost i pružaju bolje iskustvo pregledavanja korisnicima diljem svijeta. Kako se web nastavlja razvijati, proširenja za preglednike igrat će sve važniju ulogu u oblikovanju budućnosti online interakcija. Iskoristite prilike koje pruža Manifest V3 i bogatstvo JavaScript API-ja za izradu inovativnih i vrijednih proširenja.