Firefox Extension Hogyan
A HupWiki-ből...
A how to alapját a Mozilla Wiki angol nyelvű Building an Extension szócikka szolgálja. Elsődleges dokumentációs forrásként a Mozilla Wikije tekinthető.
Ez a tutorial egy nagyon egyszerű példán keresztül próbál meg bevezetni a Firefox extension készítés alapjaiba. Az elkészülő extension a status barhoz fog egy "Hello, World!" részt hozzáadni.
A tutorial-ban kiadott parancsokat Bash shellben adtam ki.
A tutorial segítségével Firefox 1.5 vagy későbbi verziókhoz készíthetünk extensiont.
Tartalomjegyzék |
A fejlesztői környezet beállítása
Az extensionök ZIPpel vannak csomagolva, melyeknek a kiterjesztése XPI (ejtsd zippy).
Egy XPI file általában következőket tartalmazza (extensiontől függően hiányozhatnak vagy más file-okat is tartalmazhat):
exampleExt.xpi: /install.rdf /components/* /components/cmdline.js /defaults/ /defaults/preferences/*.js /plugins/* /chrome.manifest /chrome/icons/default/* /chrome/ /chrome/content/
Az példánkban is hasonló felépítést fogunk alkalmazni. Mielőtt bármit elkezdenénk, hozzunk létre egy könyvtárat, ahol majd a fejlesztést végezzük:
$ mkdir -p ~/extensions/exampleExt
Ebbe könyvtárat létre kell hoznunk egy chrome és azon belül egy content nevű könyvtárat.
$ mkdir -p ~/extensions/exampleExt/chrome/content
Az extension root könyvtárában hozzunk létre további két file-t chrome.manifest és install.rdf néven:
$ touch ~/extensions/exampleExt/{chrome.manifest,install.rdf}
A végén a következő struktúrát kell kapnunk:
<ext path>/ install.rdf chrome.manifest chrome/ content/
Install.rdf elkészítése
Az install.rdf file tartalmazza az extension adatait, így pl. annak honlapját, verziószámát, a szerző nevét és azt, hogy mely alkalmazások mely verziószámával kompatibilis. Nyissuk meg az install.rdf file-t és másoljuk bele a következőket:
<?xml version="1.0"?> <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> <Description about="urn:mozilla:install-manifest"> <em:id>sample@example.net</em:id> <em:version>1.0</em:version> <em:type>2</em:type> <!-- Célalkalmazások a támogatott minimum és maximum verziókkal, amelyekre az extension installálható --> <!-- Firefox --> <em:targetApplication> <Description> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <em:minVersion>1.5</em:minVersion> <em:maxVersion>3.0.*</em:maxVersion> </Description> </em:targetApplication> <!-- Meta-adatok az extensionről --> <em:name>sample</em:name> <em:description>A test extension</em:description> <em:creator>Your Name Here</em:creator> <em:homepageURL>http://www.example.com/</em:homepageURL> </Description> </RDF>
- sample@example.com Az extension egyedi azonosítója. Lehet e-mail cím formátumú, viszont nem kell, hogy létező e-mail cím legyen. A feladata, hogy az extensiont azonosítsa. Használhatunk továbbá GUID formát is.
- <em:type>2</em:type> a 2 jelenti, hogy ez egy extension. Theme esetében az értéknek 4-nek kell lennie.
- {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - Firefox alkalmazás azonosítója
- 1.5 A minimum Firefox verzió, amellyel az extension együtt fog működni. Állítsuk arra a verzióra, amelynek támogatását vállaljuk, amely alatt teszteljük és amelyhez javításokat készítünk.
- 3.0.* A maximum Firefox verzió, amellyel az extension együtt fog működni. Ez az érték ne legyen nagyobb a legfrissebb elérhető verziónál. A példa szerint, az extension működni fog a Firefox 3.0-val és az utólagos 3.0.x kiadásokkal.
(Firefox 3.0.1 esetén ne állítsd min- és maxverziókat 3.0.*-ra, mert az installálás nem fog sikerülni. Állítsd az em:minVersion-t 3-ra az em:maxVersion-t 3.0.*-ra.)
Mentsük el a filet.
A böngésző kiterjesztése XUL-lel
A Firefox UI-ja JavaScriptben és XUL-ben van megírva. Az XUL egy XML alapú leíró nyelv, aminek segítségével leírhatjuk a felület elemeit, widgeteit, mint a gombokat, menüket, tool barokat stb.
A böngésző XUL-ben van implementálva, a file neve browser.xul ($FIREFOX_INSTALL_DIR/chrome/browser.jar fileon belül: content/browser/browser.xul). Ebben a fileban találhatjuk a böngésző elemeit, pl. a tool bart vagy status bart. A statusbar a következőképpen néz ki:
<statusbar id="status-bar"> ... <statusbarpanel> ... </statusbar>
A <statusbar id="status-bar"> a "merge point" (magyarul talán beolvasztási pont FIXME) az XUL overlaybe. A merge-pointtal határozhatjuk meg, hogy az extensionünk új elemeit a böngészőben hová szeretnénk elhelyezni. Így, ha a statusbarhoz szeretnénk adni egy gombot, képet, szöveget, akkor a fenti merge point-ot kell hivatkozási alapul venni. Lássuk hogyan:
XUL Overlay dokumentum
Az XUL Overlay egy .xul file, amelyben dokumentum töredékeket, új elemeket definiálhatunk, amiket hozzáadhatunk a már meglévő "master" dokumentumhoz - gyakorlatilag a böngészőhöz. Ezekben határozhatjuk meg a widgeteket, amelyek a böngészőt ki fogják egészíteni.
XUL Overlay dokumentum példa
<?xml version="1.0"?> <overlay id="sample" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <statusbar id="status-bar"> <statusbarpanel id="my-panel" label="Hello, World"/> </statusbar> </overlay>
A status-bar ID-vel ellátott <statusbar> elem határozza meg azt a pontot, ahová az új elemet hozzá szeretnénk adni. Hasonló módon lehet új gombokat adni a tool barhoz vagy új menüpontot beszúrni a Tools vagy a jobb gombra előbukkanó menübe is.
A <statusbarpanel> elem az a widget, amit a csatolási ponthoz, tehát a statusbarhoz szeretnénk adni.
Vegyük ezt a példa kódot, és másoljuk be egy sample.xul nevű fileba, amit mentsünk el a chrome/content könyvtárba.
Chrome URI-k
Az XUL fileok "Chrome Csomagok" részei - a felhasználó felület részeit összefogó csomagok, melyeket chrome://URI formában lehet betölteni. Az efféle URI-k használatára azért van szükség, hogy a csomagokat platformtól és telepítési útvonaltól függetlenül is be lehessen tölteni.
A böngésző ablak elérési útja például chrome://browser/content/browser.xul - próbáld ki, hogy beírod a Firefox location barjába.
A Chrome URI-k több részből épülnek fel:
- Az URI legelején található a chrome, ami megmondja a Firefox hálózati libraryjének, hogy ez egy Chrome URI. Ez jelzi, hogy miképpen legyen kezelve az URI tartalma. Ha chrome helyett például http-t használunk, a Firefox azt egy weboldalként fogja azt kezelni.
- A második része a csomagnév (a fenti példában browser), ami az UI komponens csomagnevét határozza meg (gyakorlatilag az extension neve). Minden alkalmazás (extension, theme, stb.) esetében ennek a névnek egyedinek kell lennie, hogy elkerüljük a keveredéseket.
- Harmadik részként a hivatkozott adat adat típusa. Három féle típus létezik:
- content (tartalom) XUL, JavaScript, stb. ami leírja az alkalmazás struktúráját és viselkedését
- locale (honosítás) DTD, .properties fileok, melyek a fordításhoz tartalmaznak stringeket
- skin (téma) CSS és képek amelyek meghatározzák a felhasználói felület külsejét
- Végül a betöltendő file elérési útvonalát (path)
Tehát pl. a chrome://foo/skin/bar.png betölti a foo theme skin részéből a bar.png filet.
Amikor valamilyen tartalmat Chrome URI-val töltesz be, a Firefox Chrome Registry-t használja hogy ezeket az URI-kat lefordítsa a forrásfájlok tényleges helyére a merevlemezen.
Chrome.manifest elkészítése
A chrome.manifest file szolgál arra, hogy az extension elemeit beregisztráljuk a chrome-ba. A chrome a böngészőablak azon interface elemeinek a gyűjteménye, melyek az ablak tartalmán (~weboldal) kívül helyezkednek el. Tool barok, menük, folyamatjelző sávok és az ablak címsora mind a chrome részei. Részletes leírás a chromeról
Nyissuk meg a chrome.manifest file-t, melyet az extension root könyvtárába készítettünk, majd másoljuk bele a következőt:
content sample chrome/content/
Ügyeljünk a záró /-re, anélkül a csomag nem lesz regisztrálva!
Ezzel meghatározzuk
- A tartalom típusát a chrome csomagban
- A chrome csomag nevét. A csomag neve mindig legyen kisbetűs, mert a Firefox és a Thunderbird nem támogatja a kis- nagybetűs csomagneveket a 2. verzióban és előtte.
- A chrome csomag fájljainak helyét
Tehát ez a sor megmondja, hogy a chrome/content útvonal alatt találhatjuk "sample" nevű chrome csomaghoz a content file-ok. Az útvonal relatív a chrome.manifesthez képest.
A content, locale és skin file-ok a content, locale és skin nevű könyvtárakon belül kell legyenek, melyeket a chrome könyvtárban kell elhelyezni.
Mentsük el a file-t. Amikor a böngészőt elindítjuk az extensionnel, ez fogja regisztrálni a chrome csomagot.
Overlay regisztrálása
Szükségünk van arra, hogy a Firefox az overlayünket a böngésző ablakába betöltse. Ehhez adjuk hozzá a chrome.manifesthez a következő sort:
overlay chrome://browser/content/browser.xul chrome://sample/content/sample.xul
Ez megmondja a Firefoxnak, hogy adja hozzá a sample.xul-t a browser.xul-hez, amikor a browser.xul betöltődik.
Tesztelés
Először szükségünk van arra, hogy a Firefoxot tudassuk az extensionről. Firefox 2.0 és újabb verziók esetében rávehetjük a Firefoxot, hogy a abból a könyvtárból töltse be az extensiont, ahol fejlesztjük azt.
- Keressük meg és lépjünk be az alapértelmezett profile könyvtárba. Pl.:~/.mozilla/firefox/<profile_id>.default/
- Nyissuk meg extensions könyvtárat. Ha nincs ilyen könyvtár, akkor hozzunk létre egyet.
- Hozzunk létre egy új textfile-t, és tegyük bele az fejlesztői könyvtár elérési útját. Pl. ~/extensions/my_extension/. Mentsük el a file-t, a neve legyen az extension ID-je, pl. sample@example.net
(Ne felejtsük el a záró /-t! Enélkül az extension nem lesz regisztrálva.)
Most indítsuk el a Firefoxot. A Firefox érzékelni fogja a text linket az extension könyvtárban és installálni fogja az extensiont. Amikor a böngésző ablak megjelenik egy "Hello, World!" szöveget kell látnod a status bar jobb oldalán.
Ha most megszerkesztjük az xul file-t, a böngésző újraindítása után látnunk kell a változásokat.
Csomagolás
Ha az extension működik, itt az ideje, hogy csomagot csináljunk belőle.
A csomagok zip file-ok, legegyszerűbb terminálban a zip parancs használatával elkészíteni a csomagot.
zip sample.xpi chrome.manifest install.rdf chrome/content/overlay.xul
Defaults/preferences/
A defaults/preferences/ könyvtárban lévő file-lal lehet különböző, az extensionhöz tartozó beállítások alapértelmezett értékeit beállítani, melyek később módosíthatóak az about:configból vagy (ha készítünk hozzá) beállítópanelen keresztül. A böngésző induláskor automatikusan beolvassa az ebben a könyvtárban lévő file-okat. Preferences API
Néhány példa egy ilyen file tartalmára:
pref("extensions.sample.username", "Joe"); //a string pref pref("extensions.sample.sort", 2); //an int pref pref("extensions.sample.showAdvanced", true); //a boolean pref
Honosítás
Ha szeretnéd, hogy az extension lefordítható legyen, a felület stringjeit ennek megfelelően kell kezelni. https://developer.mozilla.org/en/XUL_Tutorial/Localization
A honosítási információk nyelvenként külön könyvtárban vannak eltárolva. Ezért hozzunk létre egy locale nevű könyvtárat a chrome könyvtárban (a content könyvtár mellé), melybe hozzuk létre minden nyelvhez a hozzá tartozó könyvtárat, pl en-US. Ezután szerkesszük meg a chrome.manifest file-t, hogy beregisztráljuk az extension nyelvi file-jait a chrome-ba.
locale sample en-US chrome/locale/en-US/
A létrehozott könyvtárban készítsünk egy .dtd (vagy .ent) file-t, melybe az XUL file-okhoz tartozó fordításokat helyezhetjük:
<!ENTITY button.label "Click Me!"> <!ENTITY button.accesskey "C">
Ezután készítsünk egy hivatkozást az overlay.xul-ba mely a nyelvi file-ra mutat:
<!DOCTYPE window SYSTEM "chrome://packagename/locale/filename.ent">
Ezt helyezzük a file tetejére, de az <?xml version="1.0"?> után.
XUL file-ban a következőképpen hivatkozhatunk ezekre a stringekre:
<button label="&button.label;" accesskey="&button.accesskey;"/>
Ha JavaScriptből szeretnénk stringet elérni, készítenünk kell egy .properties file-t. Ennek a file-nak minden sora egy lefordítható string:
kulcs=érték kulcs2=ertek %S
A kulcs egy azonosító, melyre a scriptben hivatkozunk, az érték pedig a string, amit ki szeretnénk majd íratni. A file-ra ugyancsak egy hivatkozást kell készítenünk, melyet a stringbundleset és stringbundle taggel valósíthatunk meg:
<stringbundleset id="sample-stringset"> <stringbundle id="sample-strings" src="chrome://grwatcher/locale/filename.properties" /> </stringbundleset>
A JavaScriptben a stringbundle ID-je alapján kell hivatkoznunk rá:
sample_strings = document.getElementById('sample-strings');
Majd értéket a következőképpen olvashatunk ki:
sample_strings.getString('kulcs') sample_strings.getFormattedString('kulcs2', [valtozo])
A visszatérési érték a lefordított string lesz. További részletek
JavaScript overlaybe illesztése
Ha extensiont készítünk, minden bizonnyal szeretnénk annak a megjelenésen kívül valami funkciót is adni. A Firefoxban erre JavaScriptet használunk, melyet a chrome/content/ könyvtárba hozzunk létre, például overlay.js néven. Tartalma legyen nagyon egyszerű:
alert('Hello, World');
Ahhoz a JavaScripthez hozzáférjünk, az overlay.xul-en keresztül be kell csatolnunk a chrome-ba:
<script type="application/x-javascript" src="chrome://sample/content/overlay.js" />
Ha ezzel megvagyunk, akkor a következő indításkor a Firefox egy "Hello, World" feliratú alert window-val fogad majd.
Külső hivatkozások
Megjegyzések a hogyanról
A how to semmiképpen nem tekinthető referenciának, csupán megpróbál segítséget nyújtani az elinduláshoz. Megeshet, hogy félrefordításokat, helytelen és érthetetlen fogalmazásokat vagy teljes ostobaságokat tartalmaz. Ebben az esetben javítsd nyugodtan vagy írj a szócikk Vitalapjára, esetleg vedd fel velem (Ajnasz) a kapcsolatot.