• No results found

Applications on Mozilla Platform

N/A
N/A
Protected

Academic year: 2021

Share "Applications on Mozilla Platform"

Copied!
62
0
0

Loading.... (view fulltext now)

Full text

(1)

VYSOK ´

E U ˇ

CEN´I TECHNICK ´

E V BRN ˇ

E

BRNO UNIVERSITY OF TECHNOLOGY

FAKULTA INFORMA ˇ

CN´ICH TECHNOLOGI´I

´

USTAV INFORMA ˇ

CN´ICH SYST ´

EM ˚

U

FACULTY OF INFORMATION TECHNOLOGY DEPARTMENT OF INFORMATION SYSTEMS

APLIKACE NA PLATFORM ˇ

E MOZILLA

APPLICATIONS ON MOZILLA PLATFORM

DIPLOMOV ´

A PR ´

ACE

MASTER’S THESIS

AUTOR PR ´

ACE

Bc. JAN KUP ˇ

C´IK

AUTHOR

VEDOUC´I PR ´

ACE

Ing. RADEK BURGET, Ph.D.

SUPERVISOR

(2)

Zad´

an´ı diplomov´

e pr´

ace

ˇ

Reˇsitel: Kupˇc´ık Jan, Bc. Obor: Informaˇcn´ı syst´emy

T´ema: Aplikace na platformˇe Mozilla Kategorie: Web

Pokyny:

1. Seznamte se s aplikaˇcn´ı platformou Mozilla

2. Prostudujte technologie RDF, XUL a JavaScript v kontextu v´yvoje aplikac´ı na t´eto plat-formˇe

3. Navrhnˇete rozˇs´ıˇren´ı prohl´ıˇzeˇce Firefox pro sledov´an´ı zmˇen na webov´ych str´ank´ach vyuˇz´ıvaj´ıc´ı popsan´ych technologi´ı

4. Implementujte navrˇzen´e rozˇs´ıˇren´ı na platformˇe Mozilla 5. Proved’te shrnut´ı v´ysledk˚u a navrhnˇete dalˇs´ı moˇzn´e ´upravy Literatura:

• Dokumentace dostupn´a na Mozilla.org

Pˇri obhajobˇe semestr´aln´ı ˇc´asti diplomov´eho projektu je poˇzadov´ano: • Body 1 aˇz 3

Podrobn´e z´avazn´e pokyny pro vypracov´an´ı diplomov´e pr´ace naleznete na adrese http://www.fit.vutbr.cz/info/szz

Technick´a zpr´ava diplomov´e pr´ace mus´ı obsahovat formulaci c´ıle, charakteristiku souˇcasn´eho stavu, teo-retick´a a odborn´a v´ychodiska ˇreˇsen´ych probl´em˚u a specifikaci etap, kter´e byly vyˇreˇseny v r´amci roˇcn´ıkov´eho a semestr´aln´ıho projektu (30 aˇz 40% celkov´eho rozsahu technick´e zpr´avy).

Student odevzd´a v jednom v´ytisku technickou zpr´avu a v elektronick´e podobˇe zdrojov´y text technick´e zpr´avy, ´

uplnou programovou dokumentaci a zdrojov´e texty program˚u. Informace v elektronick´e podobˇe budou uloˇzeny na standardn´ım pamˇet’ov´em m´ediu (disketa, CD-ROM), kter´e bude vloˇzeno do p´ısemn´e zpr´avy tak, aby nemohlo doj´ıt k jeho ztr´atˇe pˇri bˇeˇzn´e manipulaci.

Vedouc´ı: Burget Radek, Ing., Ph.D., UIFS FIT VUT Datum zad´an´ı: 28. ´unora 2006

(3)

Licenˇ

cn´ı smlouva

Licenˇcn´ı smlouva v kompletn´ım znˇen´ı je uloˇzena v archivu Fakulty informaˇcn´ıch technologi´ı Vysok´eho uˇcen´ı technick´eho v Brnˇe.

V´yˇnatek z licenˇcn´ı smlouvy:

ˇ

Cl´anek 2

Udˇelen´ı licenˇcn´ıho opr´avnˇen´ı

1. Autor touto smlouvou poskytuje nabyvateli opr´avnˇen´ı (licenci) k v´ykonu pr´ava uveden´e d´ılo nev´ydˇeleˇcnˇe uˇz´ıt, archivovat a zpˇr´ıstupnit ke studijn´ım, v´yukov´ym a v´yzkumn´ym ´uˇcel˚um vˇcetnˇe poˇrizov´an´ı v´ypis˚u, opis˚u a rozmnoˇzenin.

2. Licence je poskytov´ana celosvˇetovˇe, pro celou dobu trv´an´ı autorsk´ych a majetkov´ych pr´av k d´ılu.

3. Autor souhlas´ı se zveˇrejnˇen´ım d´ıla v datab´azi pˇr´ıstupn´e v mezin´arodn´ı s´ıti:  ihned po uzavˇren´ı t´eto smlouvy

 1 rok po uzavˇren´ı t´eto smlouvy  3 roky po uzavˇren´ı t´eto smlouvy  5 let po uzavˇren´ı t´eto smlouvy  10 let po uzavˇren´ı t´eto smlouvy

(z d˚uvodu utajen´ı v nˇem obsaˇzen´ych informac´ı).

4. Nev´ydˇeleˇcn´e zveˇrejˇnov´an´ı d´ıla nabyvatelem v souladu s ustanoven´ım § 47b z´akona ˇc. 111/1998 Sb., v platn´em znˇen´ı, nevyˇzaduje licenci a nabyvatel je k nˇemu povinen a opr´avnˇen ze z´akona.

(4)

Abstrakt

C´ılem t´eto diplomov´e pr´ace je sezn´amit se s aplikaˇcn´ı platformou Mozilla – jej´ı struk-turou, technologiemi, kter´e vyuˇz´ıv´a, a zp˚usobem v´yvoje samostatnˇe bˇeˇz´ıc´ıch i rozˇsiˇruj´ıc´ıch aplikac´ı, kter´e tuto platformu vyuˇz´ıvaj´ı (napˇr. webov´y prohl´ıˇzeˇc Firefox, poˇstovn´ı klient Thunderbird). Pr´ace zahrnuje relevantn´ı informace o vyuˇz´ıvan´ych jazyc´ıch, kter´ymi jsou XUL, CSS, JavaScript, RDF/XML a dalˇs´ı. Jsou zde tak´e rozebr´any objektovˇe orientovan´e principy pouˇziteln´e v jazyce JavaScript v.1.7. Dalˇs´ı ˇc´asti se vˇenuj´ı problematice tvorby a vyuˇz´ıvan´ı komponent platformy i aplikac´ı. Informace o platformˇe jsou zavrˇseny uve-den´ım moˇznost´ı ladˇen´ı a n´asledn´eho pˇrevodu do distribuovateln´e podoby. Tyto znalosti jsou n´aslednˇe pouˇzity pˇri tvorbˇe aplikace umoˇzˇnuj´ıc´ı sledov´an´ı zmˇen dokument˚u v s´ıt’ov´em prostˇred´ı. Lze zde naj´ıt jej´ı n´avrh a nˇekter´e detaily implementace vztahuj´ıc´ı se k obecn´emu v´yvoji aplikac´ı na uveden´e platformˇe.

Kl´ıˇ

cov´

a slova

Mozilla, XUL, XBL, JavaScript, XPCOM, IDL, RDF, XML, XPI

Abstract

The goal of the thesis is to study the Mozilla application platform – its structure, used technology, and the ways of development of standalone applications and extensions for the applications based on this platform (e.g. the Firefox web browser, the Thunderbird e-mail client). The thesis also contains relevant information about the used programming languages such as XUL, CSS, JavaScipt, RDF/XML and others. It describes the object oriented principles available in the JavaScript v.1.7 language. Next parts are dedicated to creating and using the platform components and the applications. The information about the platform is concluded by a presentation of the debugging and deployment possibilities. This knowledge is used to create an application able to watch changes of documents in a network environment. The thesis describes the application design and some details related to the general development of applications based on the discussed platform.

Keywords

Mozilla, XUL, XBL, JavaScript, XPCOM, IDL, RDF, XML, XPI

Citace

(5)

Aplikace na platformˇ

e Mozilla

Prohl´

sen´ı

Prohlaˇsuji, ˇze jsem tuto diplomovou pr´aci vypracoval samostatnˇe pod veden´ım pana Ing. Radka Burgeta, Ph.D. Uvedl jsem vˇsechny liter´arn´ı prameny a publikace, ze kter´ych jsem ˇcerpal. . . . . Jan Kupˇc´ık 22. kvˇetna 2007 c Jan Kupˇc´ık, 2007.

Tato pr´ace vznikla jako ˇskoln´ı d´ılo na Vysok´em uˇcen´ı technick´em v Brnˇe, Fakultˇe informaˇcn´ıch technologi´ı. Pr´ace je chr´anˇena autorsk´ym z´akonem a jej´ı uˇzit´ı bez udˇelen´ı opr´avnˇen´ı autorem je nez´akonn´e, s v´yjimkou z´akonem definovan´ych pˇr´ıpad˚u.

(6)

Obsah

1 Uvod´ 2

1.1 Pˇrehled n´asleduj´ıc´ıch kapitol . . . 3

1.2 Form´atov´an´ı textu . . . 5

2 Souˇcasn´y stav 6 3 Architektura platformy Mozilla 8 4 Tvorba uˇzivatelsk´eho rozhran´ı 10 4.1 Obsah XUL . . . 11

4.1.1 Urˇcen´ı vzhledu . . . 12

4.1.2 Podpora pro definici chov´an´ı . . . 12

4.2 Kask´adov´e styly . . . 14

4.3 Definice extern´ıch ˇretˇezc˚u . . . 15

4.3.1 DTD entity . . . 15

4.3.2 Textov´e konstanty . . . 16

4.3.3 Volba aktivn´ıho jazyka. . . 16

5 Programov´an´ı chov´an´ı 17 5.1 Programovac´ı jazyky . . . 17

5.1.1 Objektov´e programov´an´ı v jazyce JavaScript . . . 18

5.2 XPCOM . . . 22

5.2.1 Moˇzn´e probl´emy . . . 23

5.2.2 Vytv´aˇren´ı komponent . . . 24

5.2.3 Bezpeˇcnost . . . 27

6 Datov´a ´uloˇziˇstˇe, RDF 29 6.1 Ukl´ad´an´ı znalost´ı . . . 29

6.2 Dotazov´an´ı . . . 31

6.3 Podpora v XPCOM . . . 31

7 Ladˇen´ı a testov´an´ı aplikac´ı 33 7.1 Konfigurace prohl´ıˇzeˇce Firefox. . . 33

7.2 Uprava aplikace´ . . . 34

7.3 Ladˇen´ı uˇzivatelsk´eho rozhran´ı . . . 35

7.4 Ladˇen´ı k´odu aplikace . . . 35

7.5 Ladˇen´ı komponent . . . 36

(7)

8 Distribuce aplikac´ı 39

9 Aplikace DocWatcher 41

9.1 N´avrh aplikace . . . 42

9.1.1 Stanoven´ı poˇzadavk˚u. . . 42

9.1.2 Architektura aplikace . . . 42

9.1.3 Ukl´ad´an´ı entit do datab´aze . . . 43

9.2 Detaily implementace . . . 45

9.2.1 Datov´a vrstva. . . 45

9.2.2 Uˇzivatelsk´e rozhran´ı . . . 46

9.2.3 Hlavn´ı okno aplikace . . . 46

9.2.4 Dialogov´e okno vlastnost´ı odkazu . . . 47

9.2.5 Proces kontroly . . . 48

9.3 Z´avˇereˇcn´e pozn´amky . . . 51

(8)

Kapitola 1

´

Uvod

V´yvoj kaˇzd´eho softwarov´eho produktu zaˇc´ın´a stanoven´ım poˇzadavk˚u, kter´e by mˇel splˇnovat. Mezi tyto poˇzadavky tak´e bezesporu patˇr´ı v´ybˇer operaˇcn´ıch syst´em˚u a hardwarov´ych architektur, na kter´ych mus´ı v´ysledn´y produkt fungovat. Na z´akladˇe tohoto v´ybˇeru a stanoven´ych cenov´ych n´aklad˚u je pak potˇreba zvolit, zda aplikace bude vyuˇz´ıvat pouze aplikaˇcn´ı programov´e rozhran´ı podporovan´ych operaˇcn´ıch syst´em˚u, zda bude postavena na nˇejak´e multiplatformn´ı programov´e knihovnˇe, nebo bude pracovat v urˇcit´em aplikaˇcn´ım prostˇred´ı, jehoˇz sluˇzby bude vyuˇz´ıvat. Toto rozhodnut´ı je kl´ıˇcov´e, protoˇze m´a vliv na bu-douc´ı architekturu aplikace, m˚uˇze omezovat mnoˇzinu vhodn´ych programovac´ıch jazyk˚u, ve f´azi provozu m˚uˇze ovlivnit v´ykonnost, pouˇzitelnost a dalˇs´ı parametry.

V´ybˇer vhodn´e programov´e z´akladny pro nov´y software byl ˇreˇsen i roku 1998 v Mozilla Organization. Doˇslo totiˇz k uvolnˇen´ı vˇetˇsiny zdrojov´ych k´od˚u prohl´ıˇzeˇce Netscape Com-municator 5.0 pod licenci Open source a n´aslednˇe bylo rozhodnuto, ˇze zdrojov´y k´od je jiˇz natolik neudrˇzovateln´y, ˇze je potˇreba jej cel´y pˇrepsat. Cel´y projekt byl vˇsak tak ambici´ozn´ı a rozs´ahl´y, ˇze aˇz po ˇctyˇrech letech byl vyd´an nov´y webov´y prohl´ıˇzeˇc Mozilla 1.0. D˚uvodem zdrˇzen´ı byl fakt, ˇze jako z´aklad nebyla pouˇzita ˇz´adn´a st´avaj´ıc´ı knihovna, avˇsak byla vyvi-nuta zcela nov´a z´akladna pro internetov´e aplikace s plnˇe programovateln´ym uˇzivatelsk´ym rozhran´ım a modul´arn´ı architekturou – vznikla aplikaˇcn´ı platforma Mozilla.

Postupem ˇcasu pˇribyly nov´e aplikace, kter´e tuto platformu vyuˇz´ıvaj´ı. Jde napˇr. o Sea-Monkey (n´astupce Mozilla Suite, k jehoˇz ukonˇcen´ı doˇslo v roce 2003), velice ´uspˇeˇsn´y we-bov´y prohl´ıˇzeˇc Firefox, poˇstovn´ı klient Thunderbird, HTML editor Nvu, hudebn´ı pˇrehr´avaˇc Songbird, SIP klient ZAP a dalˇs´ı.

Aˇckoli se aplikaˇcn´ı platforma Mozilla dobˇre hod´ı pro vytv´aˇren´ı nov´ych volnˇe ˇsiˇriteln´ych desktopov´ych aplikac´ı v s´ıt’ov´em prostˇred´ı, je v´yvoj´aˇri dost pˇrehl´ıˇzena. D˚uvodem m˚uˇze b´yt neznalost – existuje m´alo tˇech, kteˇr´ı v´ı, co vˇsechno se nach´az´ı za prohl´ıˇzeˇcem Firefox, a tak´e vˇetˇs´ı n´aroky na studium t´eto problematiky – v s´ıti Internet lze naj´ıt nemal´e mnoˇzstv´ı n´avod˚u, jak vytvoˇrit jednoduchou aplikaci, avˇsak aktu´aln´ı ucelen´y popis vytv´aˇren´ı sloˇzitˇejˇs´ı aplikace nepˇrin´aˇs´ı ˇz´adn´y z nich. Jeden ze dvou c´ıl˚u t´eto diplomov´e pr´ace je proto nav´azat na publikaci [1] a doplnit shrom´aˇzdˇen´e informace a odkazy na zdroje platn´e pro v´yvoj aplikac´ı na platformˇe Mozilla s j´adrem odpov´ıdaj´ıc´ım XULRunner v.1.8, upozornit na chyby v j´adˇre, kter´e dosud nebyly opraveny a nekorektn´ı informace uv´est na spr´avnou m´ıru. Pr´ace tedy rozeb´ır´a problematiku vytv´aˇren´ı samostatnˇe bˇeˇz´ıc´ıch aplikac´ı pro XULRunner i rozˇsiˇruj´ıc´ıch aplikac´ı (oznaˇcovan´e jako extensions), ukazuje nˇekter´e principy vytv´aˇren´ı uˇzivatelsk´eho rozhran´ı, programov´an´ı chov´an´ı, tvorbu komponent syst´emu a pr´aci s datov´ymi ´uloˇziˇsti ve form´atu RDF. Nemal´a ˇc´ast je vˇenovan´a ladˇen´ı aplikac´ı a vˇse je zavrˇseno informacemi o moˇznostech pˇrevodu do distribuovateln´e podoby a spr´avˇe aktualizac´ı.

(9)

Druh´ym c´ılem pr´ace je vyuˇz´ıt nabyt´e znalosti a vytvoˇrit rozˇs´ıˇruj´ıc´ı aplikaci pro vybran´e aplikace zaloˇzen´e na platformˇe Mozilla, kter´a m´a ˇreˇsit neexistenci volnˇe ˇsiˇriteln´eho multi-platformn´ıho n´astroje pro sledov´an´ı zmˇen dokument˚u v s´ıt’ov´em prostˇred´ı. Pouˇzit´ı tohoto rozˇs´ıˇren´ı si lze ve svˇetˇe elektronick´ych dokument˚u pˇredstavit t´emˇeˇr kdekoli – chtˇeli bychom si udrˇzovat pˇrehled o cen´ach urˇcit´ych produkt˚u, hl´ıdat si vyd´an´ı nov´ych verz´ı program˚u, zjiˇst’ovat, zda se na f´orech hovoˇr´ı o t´ematech, kter´a n´as zaj´ımaj´ı. Studenty m˚uˇze zaj´ımat, zda pˇribyly nebo byly zmˇenˇeny informace na str´ank´ach pˇredmˇet˚u, je-li jiˇz opravena zkouˇska, kter´e nov´e kulturn´ı akce ˇskola pˇripravuje. Diplomov´a pr´ace tedy d´ale obsahuje n´avrh a nˇekter´e d˚uleˇzit´e aspekty implementace z hlediska obecn´eho v´yvoje aplikac´ı pro tuto plat-formu. N´astroj pro sledov´an´ı zmˇen dokument˚u byl pojmenov´an DocWatcher.

Diplomov´a pr´ace navazuje na pˇredchoz´ı semestr´aln´ı projekt, ve kter´em byly uvedeny z´akladn´ı informace o v´yvoji aplikac´ı na platformˇe Mozilla. Tato pr´ace uveden´e informace rozˇsiˇruje pˇredevˇs´ım o poznatky z praktick´eho pouˇz´ıv´an´ı, pˇrid´any jsou kapitoly o XPCOM a ladˇen´ı aplikac´ı. Druh´a ˇc´ast, n´avrh aplikace DocWatcher, je ze semestr´aln´ıho projektu pˇrebr´an a m´ırnˇe upraven tak, aby vyhovoval vlastnostem platformy Mozilla. Doplnˇeny jsou pak informace t´ykaj´ıc´ı se implementace aplikace a p´ar z´avˇereˇcn´ych pozn´amek, kter´e mohou v´yvoj´aˇri pomoci.

1.1

rehled n´

asleduj´ıc´ıch kapitol

• Souˇcasn´y stav – uv´ad´ı programov´e knihovny a softwarov´e platformy, kter´e jsou dos-tupn´e pro n´avrh nov´ych aplikac´ı.

• Architektura platformy Mozilla – zab´yv´a se architekturou platformy Mozilla, uv´ad´ı zjednoduˇsen´y diagram n´avaznosti jednotliv´ych vrstev a vysvˇetluje jejich funkci. • Tvorba uˇzivatelsk´eho rozhran´ı – obsahuje informace o zp˚usobu vytv´aˇren´ı

uˇzivatelsk´ych rozhran´ı vyuˇz´ıvaj´ıc´ıch jazyk XUL, odliˇsnostech v definic´ıch kask´adov´ych styl˚u a popisuje, jak aplikaci pˇripravit pro provoz ve v´ıcejazyˇcn´em prostˇred´ı.

• Programov´an´ı chov´an´ı – vypisuje seznam podporovan´ych jazyk˚u, kter´e lze vyuˇz´ıvat pˇri programov´an´ı a n´aslednˇe se detailnˇe zab´yv´a moˇznostmi jazyka JavaScript, pˇredevˇs´ım zp˚usobem realizac´ı objektovˇe orientovan´ych princip˚u. N´aslednˇe se vˇenuje vyuˇz´ıv´an´ı a tvorbˇe vlastn´ıch komponent.

• Datov´a ´uloˇziˇstˇe, RDF – pˇredstavuje principy jazyka RDF/XML, uv´ad´ı, jak´ym zp˚usobem lze zapisovat znalosti a jak´e prostˇredky platforma pro pr´aci s nimi poskytuje.

• Ladˇen´ı a testov´an´ı aplikac´ı – informuje o zp˚usobech ladˇen´ı a testov´an´ı aplikac´ı vyuˇz´ıvaj´ıc´ıch jazyk JavaScript, kter´e prostˇredky lze vyuˇz´ıt, nutn´e ´upravy k´odu a nastaven´ı prostˇred´ı.

• Distribuce aplikac´ı – popisuje adres´aˇrovou strukturu, kterou je vhodn´e dodrˇzovat a ukazuje, jak pˇrev´est sadu soubor˚u do podoby, kterou lze pˇredat uˇzivatel˚um.

• Aplikace DocWatcher – stanovuje poˇzadavky kladen´e na tuto aplikaci, uv´ad´ı jej´ı struk-turu, pojedn´av´a o zp˚usobu ˇreˇsen´ı uˇzivatelsk´eho rozhran´ı a nˇekter´ych aspekt˚u chov´an´ı aplikace a popisuje vybran´e aspekty implementace, kter´e jsou d˚uleˇzit´e z pohledu obecn´eho v´yvoje aplikac´ı na t´eto platformˇe.

(10)
(11)

1.2

Form´

atov´

an´ı textu

Pro lepˇs´ı ˇcitelnost jsou v textu pouˇzity r˚uzn´e typy p´ısma.

• identifik´atory, hodnoty konstant, kl´ıˇcov´a slova a v´ypisy k´odu • slovn´ı vyj´adˇren´ı v angliˇctinˇe

(12)

Kapitola 2

Souˇ

casn´

y stav

Existuje nˇekolik moˇzn´ych cest, kter´ymi se m˚uˇze ub´ırat v´yvoj nov´ych softwarov´ych projekt˚u. Prvn´ı z nich je vhodn´a pro aplikace, na kter´e jsou kladeny zvl´aˇstn´ı poˇzadavky z hlediska funkˇcnosti, v´ykonnosti nebo tˇreba grafick´eho uˇzivatelsk´eho rozhran´ı (GUI). Tyto aplikace vyuˇz´ıvaj´ı pˇr´ımo sluˇzeb operaˇcn´ıho syst´emu, na kter´em bˇeˇz´ı, pomoc´ı vol´an´ı funkc´ı aplikaˇcn´ıho programov´eho rozhran´ı (API). Uveden´y zp˚usob je vyuˇz´ıv´an napˇr´ıklad u syst´emov´ych komponent dan´eho operaˇcn´ıho syst´emu, kde m´a program´ator moˇznost detailnˇe ˇr´ıdit vˇsechny procesy, kter´e se zde prov´adˇej´ı. Obecnˇe je na t´eto ´urovni tak´e vyuˇz´ıv´an neobjektov´y jazyk C, jehoˇz pˇrekladem a optimalizac´ı se d´a dos´ahnout rychlejˇs´ı odezvy a vyˇsˇs´ıho v´ypoˇcetn´ıho v´ykonu. Nev´yhodou ovˇsem m˚uˇze b´yt vˇetˇs´ı ˇcasov´a n´aroˇcnost tvorby projektu zp˚usoben´a vyˇsˇs´ım mnoˇzstv´ım zdrojov´eho k´odu, kter´y poˇzadovanou funkˇcnost implementuje. S t´ım n´aslednˇe tak´e souvis´ı zv´yˇsen´e mnoˇzstv´ı ´usil´ı, kter´e je potˇreba vynaloˇzit k odladˇen´ı a otestov´an´ı tohoto k´odu a z´aroveˇn d´ıky pouˇzit´ı jazyka C m˚uˇze struktura programu pˇri vˇetˇs´ıch zmˇen´ach rychleji degradovat.

Uveden´e nev´yhody m˚uˇzeme ˇc´asteˇcnˇe eliminovat vyuˇzit´ım programov´ych knihoven, napˇr´ıklad nab´ızej´ıc´ıch podporu pro snadnˇejˇs´ı pˇr´ıstup k uˇzivatelsk´emu rozhran´ı. Toto je druh´a cesta. Knihovny, v operaˇcn´ım syst´emu Windows jmenujme MFC1, pak zapouzdˇruj´ı vol´an´ı API funkc´ı do logick´ych celk˚u, vytv´aˇrej´ı tedy vyˇsˇs´ı ´uroveˇn abstrakce. D´ıky toho, ˇze se zde jiˇz uplatˇnuj´ı objektov´e jazyky, jako je C++, je proces v´yvoje rychlejˇs´ı a k´od aplikace robustnˇejˇs´ı, neˇz kdyby byla pouˇzita pˇr´ımo vol´an´ı API funkc´ı.

Tˇret´ı varianta, kter´a st´ale v´ıce z´ısk´av´a na oblibˇe, je vystavˇen´ı aplikace na vhodn´e ap-likaˇcn´ı platformˇe. V tomto pˇr´ıpadˇe program jiˇz ke sv´e ˇcinnosti pouˇz´ıv´a API zcela minim´alnˇe, nebo v˚ubec, protoˇze platforma abstrahuje vˇetˇsinu potˇrebn´ych ˇc´ast´ı operaˇcn´ıho syst´emu – nab´ız´ı vlastn´ı tˇr´ıdy zapouzdˇruj´ıc´ı GUI, pr´aci se soubory, pˇr´ıstup k s´ıt’ov´ym prostˇredk˚um, spr´avu pamˇeti a proces˚u, komunikaci mezi procesy a dalˇs´ı. Aplikaˇcn´ı platforma tedy tvoˇr´ı vrstvu, kter´a oddˇeluje aplikaci od operaˇcn´ıho syst´emu. Tato vrstva se skl´ad´a ze dvou ˇc´ast´ı – rozhran´ı, kter´e je dostupn´e aplikaci a kter´e je z´aroveˇn nemˇenn´e, a d´ale vlastn´ı k´od platformy, kter´y implementuje nab´ızen´e sluˇzby. Jestliˇze je platforma oznaˇcena jako multiplatformn´ı, lze hostuj´ıc´ı aplikace provozovat na podporovan´ych operaˇcn´ıch syst´emech a hardwarov´ych architektur´ach. V tomto pˇr´ıpadˇe je pouze jin´a implementace t´eto platformy, avˇsak d´ıky nezmˇenˇen´eho rozhran´ı nen´ı nutn´e mˇenit zdrojov´y k´od aplikace.

Dle typu programovac´ıch jazyk˚u lze n´aslednˇe rozdˇelit softwarov´e platformy na tˇri skupiny. Prvn´ı tvoˇr´ı platformy, kde jsou hostitelsk´e aplikace ps´any v pˇreloˇziteln´em jazyce do bin´arn´ıho k´odu procesoru, na kter´em bude program spuˇstˇen – napˇr´ıklad C++. Pro

1

(13)

pˇrenos mezi r˚uzn´ymi syst´emy nen´ı potˇreba zasahovat do zdrojov´ych k´od˚u, avˇsak je nutn´a jejich kompilace pomoc´ı kompil´atoru urˇcen´eho pro v´yslednou hardwarovou architekturu a operaˇcn´ı syst´em. Aplikace jsou kompatibiln´ı pouze na ´urovni API. Do t´eto skupiny patˇr´ı napˇr´ıklad QT2, wxWidgets3 a dalˇs´ı.

D´ale existuj´ı platformy, kde zdrojov´y k´od hostitelsk´e aplikace nen´ı kompilov´an do nativn´ıho k´odu procesoru, ale do speci´aln´ıho mezik´odu, kter´y je distribuov´an. Uˇzivatel si nainstaluje platformu urˇcenou pro jeho syst´emovou konfiguraci a ta po spuˇstˇen´ı aplikace automaticky za bˇehu pˇrekl´ad´a mezik´od do nativn´ıho k´odu procesoru, pˇriˇcemˇz ten je n´aslednˇe spuˇstˇen. Proces, kter´y tuto ˇcinnost prov´ad´ı, se naz´yv´a Just-In-Time (JIT) kompil´ator. V´yhodou je tedy jedin´a spustiteln´a verze softwarov´eho produktu pro podporovan´e syst´emov´e konfigurace, avˇsak za cenu nutnosti m´ıt nainstalovan´e dan´e bˇehov´e prostˇred´ı na poˇc´ıtaˇci a pomalejˇs´ıch reakc´ı programu pˇri jeho spuˇstˇen´ı. Sem patˇr´ı Java4, .NET Framework5.

Do posledn´ı skupiny se ˇrad´ı platformy vyuˇz´ıvaj´ıc´ı jazyky, kter´e nejsou pˇred distribuc´ı kompilov´any. Aplikace jsou tedy ˇs´ıˇreny s k´odem v otevˇren´e textov´e podobˇe. Po spuˇstˇen´ı aplikace je zdrojov´y k´od v pˇr´ıpadˇe potˇreby vybalen a bˇehov´e prostˇred´ı platformy n´aslednˇe prov´ad´ı interpretaci k´odu. Toto ˇreˇsen´ı je nejpomalejˇs´ı ze vˇsech v´yˇse uveden´ych a hod´ı se pro nen´aroˇcn´e aplikace, kter´e jsou volnˇe ˇsiˇriteln´e a prozrazen´ı k´odu je irelevantn´ı. Pod-statnou nav´yhodou je pak problematick´a kontrola nejen syntaktick´ych chyb, protoˇze k´od je vyhodnocov´an aˇz v pr˚ubˇehu interpretace, a tak na chyby je program´ator upozornˇen aˇz v okamˇziku jejich potencion´aln´ıho spuˇstˇen´ı. Z´astupcem je napˇr´ıklad aplikaˇcn´ı platforma Mozilla6. Obecnˇe sem m˚uˇzeme zaˇradit i dalˇs´ı skriptovac´ı jazyky; pak je jen ot´azka, jak bohat´e aplikaˇcn´ı rozhran´ı dan´y interpret k´odu nab´ız´ı.

Aˇckoli by se mohlo zd´at, ˇze platforma Mozilla d´ıky v´yˇse uveden´ym vlastnostem nen´ı pˇr´ıliˇs vhodn´a pro ˇsirˇs´ı pouˇzit´ı, opak je pravdou. D˚ukazem jsou napˇr´ıklad ´uspˇeˇsn´y webov´y prohl´ıˇzeˇc Firefox nebo poˇstovn´ı klient Thunderbird. Tato platforma nab´ız´ı jednoduch´y zp˚usob programov´an´ı zaloˇzen´y na jazyku XML, kter´y definuje uˇzivatelsk´e rozhran´ı, a jazyku JavaScript, jenˇz je pouˇz´ıv´an pro definov´an´ı chov´an´ı aplikace. V´ysledek lze beze zmˇeny spustit na v´ıce neˇz 10 operaˇcn´ıch syst´emech, viz [1,16]. Hlavn´ı v´yhodou je vˇsak pˇr´ıtomnost komponent umoˇzˇnuj´ıc´ıch zobrazit (X)HTML dokument, aktivnˇe se na nˇej napojit a praco-vat s jeho obsahem. Pr´avˇe tato vlastnost a vysok´y poˇcet podporovan´ych syst´em˚u vyzdvihuj´ı platformu Mozilla nad ostatn´ı.

Bohat´y seznam dostupn´ych podp˚urn´ych knihoven i softwarov´ych platforem lze naj´ıt v [25]. 2http://www.trolltech.com/ 3 http://www.wxwidgets.org/ 4http://java.sun.com/ 5 http://msdn2.microsoft.com/en-us/netframework/default.aspx 6 http://xulplanet.com/

(14)

Kapitola 3

Architektura platformy Mozilla

Zjednoduˇsen´e sch´ema architektury je uvedeno na obr´azku3.1. Podrobnˇejˇs´ı pohled lze naj´ıt v [1]. Komponenty m˚uˇzeme rozdˇelit do nˇekolika vrstev. Nejn´ıˇze poloˇzen´a, kter´a komunikuje s operaˇcn´ım syst´emem, se naz´yv´a back-end. Nach´az´ı se zde velk´e mnoˇzstv´ı komponent, coˇz jsou tˇr´ıdy implementovan´e v programovac´ım jazyce C++ a pˇreloˇzen´e pro konkr´etn´ı operaˇcn´ı syst´em. Tyto komponenty pak tvoˇr´ı j´adro cel´e aplikaˇcn´ı platformy. Mezi nˇe patˇr´ı napˇr´ıklad:

• Komponenty j´adra – definice datov´ych typ˚u, spr´avce komponent a rozhran´ı, kompo-nenty umoˇzˇnuj´ıc´ı pr´aci se soubory a datov´ymi toky, ˇr´ızen´ı proces˚u, vl´aken, ˇcasovaˇc˚u, v´yjimek a ud´alost´ı.

• Komponenty pro pr´aci v s´ıt’ov´em prostˇred´ı – podpora zn´am´ych s´ıt’ov´ych protokol˚u, soket˚u, ˇr´ızen´ı vyrovn´avac´ıch pamˇet´ı, proxy, spr´avce cookies, kooperace s webov´ymi sluˇzbami, sluˇzby pro stahov´an´ı obsahu, moˇznost otev´ır´an´ı ZIP a JAR arch´ıv˚u. • Komponenty pro podporu v´yvoje aplikac´ı – spr´avce oken, vestavˇen´y webov´y prohl´ıˇzeˇc,

pˇr´ıstup k historii a profil˚um, RDF datab´aze, nativn´ı podpora XML, DOM, HTML, XUL, SVG.

• Komponenty souvisej´ıc´ı s elektronickou poˇstou – odes´ıl´an´ı, pˇrij´ım´an´ı a spr´ava poˇsty a diskuzn´ıch skupin, podpora adres´aˇre, protokol˚u LDAP, IMAP, POP3.

• A dalˇs´ı komponenty zahrnuj´ıc´ı napˇr´ıklad ˇr´ızen´ı a interpretace k´odu v jazyce JavaScript, spr´ava bezpeˇcnosti a napojen´ı na vyˇsˇs´ı vrstvu XPCOM.

Nad t´ımto blokem leˇz´ı syst´em zvan´y Cross Platform Component Object Model (XPCOM). Ten zpˇr´ıstupˇnuje komponenty vyˇsˇs´ım vrstv´am platformy tak, ˇze pˇr´ıstup k nim jiˇz nen´ı z´avisl´y na pouˇzit´em operaˇcn´ım syst´emu. Protoˇze XPCOM je pˇr´ımo dosaˇziteln´e pouze pomoc´ı programovac´ıch jazyk˚u C, C++, existuje zde jeˇstˇe tenk´a vrstva XPConnect poskytuj´ıc´ı rozhran´ı pro JavaScript.

Pro zcela pˇrenositeln´y k´od je potˇreba jist´ym zp˚usobem adresovat poˇzadovan´e kompo-nenty. Proto m´a kaˇzd´a komponenta d´ıky XPCOM sv˚uj jedineˇcn´y identifik´ator, tzv. Con-tractID. Je ve tvaru @mozilla.org/component-name;1. Ten je mapov´an pˇres objekt URL do prostoru, ve kter´em se jiˇz nach´az´ı aplikace napsan´e v jazyce JavaScript. Kromˇe tohoto propojen´ı existuje jeˇstˇe druh´y typ spojen´ı vyuˇz´ıvaj´ıc´ı identifik´ator˚u RDF, kter´e mapuj´ı URL na urˇcit´y z´aznam v otevˇren´e RDF datab´azi.

(15)

Vrstva oznaˇcen´a Overlays zodpov´ıd´a za rozˇs´ıˇren´ı funkˇcnost´ı aplikac´ı jako je Firefox nebo Thunderbird. Takto lze napˇr´ıklad pˇridat novou poloˇzku do menu, informaci do stavov´eho ˇr´adku, vytvoˇrit dalˇs´ı panel atd. bez toho, aniˇz by se musel jakkoli mˇenit k´od hostitelsk´e aplikace. Vˇsechny informace, jak´e nov´e prvky maj´ı b´yt pˇrid´any, jak´e jsou jejich vlastnosti a um´ıstˇen´ı, jsou souˇc´ast´ı distribuce rozˇsiˇruj´ıc´ı aplikace.

N´asleduj´ıc´ı vrstva je urˇcena pro vytv´aˇren´ı nov´ych grafick´ych komponent. Je zaloˇzena na jazyku XML Binding Language, XBL, d´ıky nˇehoˇz lze skl´adat existuj´ıc´ı prvky uˇzivatelsk´eho rozhran´ı do vˇetˇs´ıch celk˚u a definovat jim poˇzadovan´e chov´an´ı. Pˇr´ıkladem je prvek Tree, ve kter´em se zobrazuje historie navˇst´ıven´ych dokument˚u v prohl´ıˇzeˇci Firefox.

Dalˇs´ı ˇc´ast t´eto architektury, Templates, ˇr´ıd´ı propojen´ı nˇekter´ych prvk˚u uˇzivatelsk´eho rozhran´ı a zdroj˚u v RDF datab´azi. Takto lze bez jedin´eho ˇr´adku k´odu naplnit daty napˇr´ıklad strom zobrazuj´ıc´ı historii odkaz˚u. Tato vrstva tak´e umoˇzˇnuje v´ıcen´asobn´e pohledy na data ˇr´ızen´e spoleˇcnou aktualizac´ı. Jestliˇze je ve v´ıce oknech zobrazen obsah nˇejak´e strukturovan´e informace uloˇzen´e v RDF datab´azi, jej´ı zmˇenou v jednom oknˇe m˚uˇze automaticky doj´ıt k aktualizaci tˇechto dat i v ostatn´ıch oknech.

Nejv´yˇse je poloˇzen´a vrstva podporuj´ıc´ı standardy W3C a zajiˇst’uj´ıc´ı interakci s uˇzivatelem. Na t´eto ´urovni jsou napˇr´ıklad naˇc´ıt´any a za ´uˇcasti niˇzˇs´ıch vrstev zpravov´av´any (X)HTML/XUL dokumenty, kask´adov´e styly, prov´adˇeny XSL transformace a dalˇs´ı. Data, kter´a maj´ı b´yt prezentov´ana uˇzivateli, jsou vykreslov´ana renderovac´ım j´adrem Gecko, akut´aln´ı verze je 1.8.1 [32].

(16)

Kapitola 4

Tvorba uˇ

zivatelsk´

eho rozhran´ı

K programov´an´ı uˇzivatelsk´eho rozhran´ı je urˇcen jazyk XML User-Interface Language (XUL). Pomoc´ı textov´eho z´apisu lze hierarchicky skl´adat komponenty, kter´e vytvoˇr´ı poˇzadovanou podobu GUI. Platforma nab´ız´ı velk´e mnoˇzstv´ı uˇzivatelsk´ych prvk˚u:

• boxy, panely a mˇr´ıˇzky, kter´e lze pouˇz´ıt pro pozicov´an´ı dalˇs´ıch komponent,

• standardn´ı ovl´adac´ı prvky, jako jsou r˚uzn´e typy tlaˇc´ıtek, v´ybˇerov´ych nab´ıdek, prvk˚u pro vloˇzen´ı a zobrazen´ı text˚u a obrazk˚u, apod.,

• prvek zobrazuj´ıc´ı stromovou strukturu v kombinaci s dalˇs´ımi sloupci, • realizace z´aloˇzek s pˇr´ısluˇsej´ıc´ımi panely,

• hlavn´ı i kontextov´e nab´ıdky, n´astrojov´a liˇsta, stavov´y ˇr´adek, bublinov´a n´apovˇeda, • ovl´adac´ı prvky pro realizaci pr˚uvodc˚u,

• sofistikovan´e komponenty, kter´e dok´aˇz´ı zobrazit obsah webov´ych str´anek a pˇr´ıpadnˇe jejich obsah vizu´alnˇe upravovat a

• dalˇs´ı pomocn´e prvky pro pˇripojen´ı k datov´emu zdroji a podobnˇe. Obecn´a struktura zdrojov´eho k´odu okna aplikace vypad´a n´asledovnˇe: <?xml version="1.0"?>

<?xml-stylesheet href="chrome://global/skin/" type="text/css"?> <?xml-stylesheet href="chrome://docwatcher/skin/main.css"

type="text/css"?> <!DOCTYPE window [

<!ENTITY % mainDTD SYSTEM "chrome://docwatcher/locale/main.dtd"> %mainDTD;

(17)

<window

xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <script type="application/x-javascript" src="main.js"/>

<commandset>

<command id="cmd_newLink" /> </commandset>

<keyset>

<key id="key_newLink" command="cmd_newLink" keycode="VK_INSERT" /> </keyset>

<menupopup id="cmenuFolders">

<menuitem label="&cmd.newLink;" accesskey="&cmd.newLink.accesskey;" key="key_newLink" command="cmd_newLink"/> </menupopup> <description flex="1">Content</description> <script type="application/x-javascript"><![CDATA[ ]]></script> </window>

Soubor s pˇr´ıponou .xul se skl´ad´a ze dvou ˇc´ast´ı. Nejprve se uv´ad´ı deklaraˇcn´ı ˇc´ast, ve kter´e se nach´az´ı seznam importovan´ych styl˚u a DTD soubor˚u s ˇretˇezcov´ymi konstantami. N´asleduje blok definuj´ıc´ı hierarchick´e uspoˇr´ad´an´ı prvk˚u uˇzivatelsk´eho rozhran´ı.

4.1

Obsah XUL

Jak jiˇz bylo ˇreˇceno, XUL soubor je ve form´atu XML, takˇze kromˇe dan´ych pravidel syntak-tick´eho z´apisu vyˇzaduje mimojin´e i koˇrenov´y element. Podporov´ano je tˇechto pˇet:

• window – pˇredstavuje standardn´ı okno aplikace, kter´e se neliˇs´ı od ostatn´ıch oken dan´eho operaˇcn´ıho syst´emu.

• prefwindow – speci´aln´ı typ okna pouˇz´ıvan´y pro nastavov´an´ı parametr˚u aplikace. Umoˇzˇnuje pˇr´ım´e napojen´ı na datov´y zdroj.

• dialog – reprezentuje dialogov´e okno. Automaticky pˇrid´av´a tlaˇc´ıtka OK a Storno, pˇriˇcemˇz chov´an´ı chov´an´ı a vzhled okna jsou upraveny tak, aby odpov´ıdaly vlastnostem dialogov´ych oken dan´eho syst´emu.

• wizard – typ okna usnadˇnuj´ıc´ı tvorbu pr˚uvodc˚u.

• overlay – speci´aln´ı element, kter´y uvozuje obsah upravuj´ıc´ı nˇekterou ˇc´ast st´avaj´ıc´ıho uˇzivatelsk´eho rozhran´ı platformy. Dalˇs´ı informace jsou uvedeny n´ıˇze.

Nezbytnou souˇc´ast´ı koˇrenov´eho elementu je tak´e urˇcen´ı jmenn´ych prostor˚u, kter´e budou pouˇz´ıv´any. Vˇsechny XUL elementy leˇz´ı v prostoru

(18)

http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul. Vˇetˇsinou je XUL dokument tvoˇren pouze XUL elementy, a proto se identifik´ator jmenn´eho prostoru neuv´ad´ı. Pˇresto ale existuj´ı situace, kdy je potˇreba do XUL tak´e vloˇzit HTML elementy. V takov´em pˇr´ıpadˇe je potˇreba uv´est jmenn´y prostor, ve kter´em se tyto elementy nach´az´ı a urˇcit´y identifik´ator:

xmlns:html="http://www.w3.org/1999/xhtml"

HTML elementy jsou pak vkl´ad´any bˇeˇzn´ym zp˚usobem, jejich jm´eno je nav´ıc uvozeno identifik´atorem pˇr´ısluˇsn´eho jmenn´eho prostoru. Napˇr´ıklad <html:p>.

Elementy, kter´e mohou b´yt um´ıstˇeny v dan´em koˇrenov´em XUL elementu, lze rozdˇelit do dvou skupin.

4.1.1 Urˇcen´ı vzhledu

Prvn´ı skupina je tvoˇrena znaˇckami, kter´e utv´aˇrej´ı vlastn´ı uˇzivatelsk´e rozhran´ı, maj´ı nˇejakou vizu´aln´ı podobu. Tyto elementy jsou dobˇre pops´any v [37].

Pˇri programov´an´ı sloˇzitˇejˇs´ıch aplikac´ı vˇsak nezˇr´ıdka nast´avaj´ı situace, kdy je standardn´ı funkˇcnost prvk˚u nedostateˇcn´a a je potˇreba ji modifikovat. V takov´em pˇr´ıpadˇe je nezbytn´e pochopit jejich implementaci. Vˇsechny XUL prvky jsou definov´any pomoc´ı jazyka XML Bindings Language (XBL), kter´y umoˇzˇnuje skl´adat jiˇz existuj´ıc´ı elementy uˇzivatelsk´eho rozhran´ı do vˇetˇs´ıch celk˚u, definovat jejich chov´an´ı, rozhran´ı pro komunikaci s vnˇejˇs´ım svˇetem a vzhled. Protoˇze zn´ame n´azev elementu, jehoˇz implementaci potˇrebujeme prozk-oumat, vych´az´ıme z CSS souboru z´ıskan´eho z adresy chrome://global/content/xul.css, jehoˇz skuteˇcn´e um´ıstˇen´ı se nach´az´ı v firefox dir/chrome/toolkit.jar – content/global/xul.css, kde firefox dir je adres´aˇr s nainstalovanou aplikac´ı Firefox. V xul.css nalezneme poˇzadovan´y n´azev elementu a jemu pˇr´ısluˇsej´ıc´ı hodnotu vlastnosti -moz-binding, kter´a obsahuje URL s XBL definic´ı poˇzadovan´e XUL znaˇcky. Pokud potˇrebujeme jeˇstˇe podrobnˇejˇs´ı informace, kter´e lze z´ıskat pouze ze zdrojov´ych k´od˚u platformy, je v [38] k pˇr´ısluˇsn´e znaˇcce uveden n´azev odpov´ıdaj´ıc´ı tˇr´ıdy. S tˇemito znalostmi lze ve vlastn´ı aplikaci n´aslednˇe vytv´aˇret zcela nov´e prvky na z´akladˇe jiˇz existuj´ıc´ıch a nebo pouze upravovat chov´an´ı a vzhled st´avaj´ıc´ıch.

4.1.2 Podpora pro definici chov´an´ı

Do druh´e skupiny znaˇcek, kter´e lze nal´ezt v XUL dokumentu, pak patˇr´ı ty, jenˇz nedefinuj´ı vizu´aln´ı podobu, avˇsak nˇejak´ym zp˚usobem urˇcuj´ı chov´an´ı, jenˇz se pˇr´ımo t´yk´a uˇzivatelsk´eho rozhran´ı. B´yv´a totiˇz zvykem, ˇze veˇsker´y k´od definuj´ıc´ı chov´an´ı aplikace nen´ı m´ıch´an s vizu´aln´ım obsahem, m´ame snahu tyto dvˇe oblasti od sebe co nejv´ıce oddˇelit. V´yjimkou m˚uˇze b´yt kr´atk´y k´od, kter´y se napˇr´ıklad star´a o spr´avn´e pozicov´an´ı prvk˚u pˇri zmˇenˇe velikosti okna. Tento k´od je vˇetˇsinou zapisov´an do prvku <script>...</script> um´ıstˇen´eho na konci XUL.

V aplikac´ıch lze obvykle nˇekter´e funkce vyvolat z v´ıce m´ıst, napˇr´ıklad z hlavn´ı nebo kon-textov´e nab´ıdky, n´astrojov´e liˇsty nebo pomoc´ı kl´avesov´e zkratky. M´ısta, kde vˇsude lze zvolit danou funkci, by ale mˇela b´yt propojena pouze na ´urovni uˇzivatelsk´eho rozhran´ı, ide´alnˇe pˇr´ımo v XUL. Aplikaˇcn´ıho program´atora jiˇz nezaj´ım´a, jak lze aktivovat danou funkci, poˇzaduje pouze jedin´y bod, kter´y mu umoˇzn´ı pˇripojit se a reagovat na tento poˇzadavek, centr´alnˇe zak´azat funkci nebo napˇr´ıklad upravit popisek. Stejnˇe tak definice kl´avesov´ych

(19)

zkratek by mˇela b´yt um´ıstˇena pouze v XUL nebo souborech s ˇretˇezcov´ymi konstantami (viz d´ale).

Pro tyto ´uˇcely XUL nab´ız´ı nˇekolik element˚u:

• command – definuje v´ychoz´ı m´ısto spouˇstˇen´ı urˇcit´e funkce. Prvky umoˇzˇnuj´ıc´ı v´ybˇer t´eto funkce (napˇr´ıklad menuitem, button) pak mus´ı m´ıt hodnotu atributu command rovnou hodnotˇe atributu id prvku command. Jakmile se vybere libovoln´ym zp˚usobem dan´a funkce, je vyvol´ana ud´alost oncommand tohoto centr´aln´ıho m´ısta. Tato ud´alost je pravˇe m´ıstem propojen´ı uˇzivatelsk´e rozhran´ı – aplikaˇcn´ı ´uroveˇn.

• broadcaster – umoˇzˇnuje urˇcit jedin´e m´ısto pro nastavov´an´ı atribut˚u. Jestliˇze potˇrebujeme napˇr´ıklad nastavovat hodnotu nˇejak´eho atributu pro v´ıce znaˇcek najednou, nen´ı potˇreba nastavovat je oddˇelenˇe, m˚uˇzeme je propojit stejn´ym zp˚usobem jako u elementu command. M´ısto atributu command je vˇsak pouˇz´ıv´an atribut s n´azvem observes. Jakmile je urˇcit´emu elementu broadcaster pˇriˇrazena nebo zmˇenˇena hodnota libovoln´eho atributu mimo id, jsou okamˇzitˇe nastaveny patˇriˇcn´ym zp˚usobem i atributy pˇripojen´ych element˚u. Tuto vlastnost m´a i pˇredchoz´ı znaˇcka command, u kter´e se bˇeˇznˇe pouˇz´ıvaj´ı atribut pro zakazov´an´ı dan´e funkce (disabled) a jej´ı popisek (label).

• key – definuje kl´avesovou zkratku. Zp˚usob napojen´ı na danou funkci se prov´ad´ı prostˇrednictv´ım jiˇz uveden´eho atributu command. Bohuˇzel zde existuje jeden z probl´em˚u, kter´y nen´ı v ˇz´adn´ych zdroj´ıch jasnˇe uveden. Pokud je jist´y <key> propojen s <command>, nem˚uˇze b´yt registrace ud´alosti oncommand u elementu command provedena pomoc´ı metody addEventListener(), je nutn´e vyuˇz´ıt setAttribute(). V opaˇcn´em pˇr´ıpadˇe kl´avesov´a zkratka nen´ı funˇcn´ı.

Aby program mohl zachyt´avat reakce uˇzivatele, jakou m˚uˇze b´yt tˇreba poklep´an´ı na poloˇzku ve stromˇe, je potˇreba pˇriˇradit k poˇzadovan´e ud´alosti, kterou platforma generuje, k´od zpracov´avaj´ıc´ı poˇzadavek. Obecnˇe je moˇzn´e tento k´od vepsat pˇr´ımo do atributu, kter´y odpov´ıd´a n´azvu ud´alosti. Tento zp˚usob vˇsak vˇetˇsinou vede k nepˇrehledn´emu a neudrˇzovateln´emu k´odu. Zˇrejmˇe nejlepˇs´ı ˇreˇsen´ı se skl´ad´a ze dvou krok˚u:

1. Hodnotu atributu onload koˇrenov´eho elementu, s v´yjimkou overlay, nastavit na n´azev inicializaˇcn´ı funkce, kter´a se nach´az´ı v pˇr´ısluˇsn´em souboru s JavaScript k´odem. V pˇr´ıpadˇe, ˇze se v t´eto funkci alokuj´ı prostˇredky, kter´e je nutn´e pˇred ukonˇcen´ım pr´ace uvolnit, prov´ad´ı se tato ˇcinnost ve funkci, jej´ıˇz n´azev se staticky definuje pomoc´ı atributu onunload.

2. V inicializaˇcn´ı funkci pˇripojit k ud´alostem jednotliv´ych prvk˚u obluˇzn´e funkce po-moc´ı vol´an´ı metody nsIDOMEventTarget::addEventListener() (v´yjimku tvoˇr´ı v´yˇse uveden´y probl´em s elementem key).

S prvky uˇzivatelsk´eho rozhran´ı se pracuje vˇzdy aˇz v okamˇziku, kdy je vytvoˇren DOM dan´eho XUL dokumentu, nen´ı tedy nutn´e zab´yvat se um´ıstˇen´ım prvku script v XUL dokumentu. Pokud by totiˇz byl zpracov´av´an nˇejak´y k´od na zaˇc´atku dokumentu, kter´y by pracoval s prvkem uˇzivatelsk´eho rozhran´ı um´ıstˇen´eho n´ıˇze ve v´ypisu zdrojov´eho k´odu, prvek by nikdy nebyl nalezen, protoˇze v dan´em okamˇziku interpretace tohoto k´odu jeˇstˇe neexistuje.

Pouˇzit´ı metody nsIDOMEventTarget::addEventListener() je v´yhodn´e ze dvou d˚uvod˚u. Jednak lze urˇcit f´azi zachycen´ı ud´alosti a tak´e m˚uˇzeme k jedn´e ud´alosti pˇriˇradit

(20)

v´ıce obsluˇzn´ych funkc´ı. Ty lze dynamicky za bˇehu pˇrid´avat i odeb´ırat. Pˇr´ım´y z´apis k´odu do atributu s n´azvem ud´alosti toto neumoˇzˇnuje.

4.2

Kask´

adov´

e styly

Kask´adov´e styly jsou um´ıstˇeny v souborech s pˇr´ıponou .css. Urˇcuj´ı vzhled a um´ıstˇen´ı jednotliv´ych element˚u i cel´ych hierarchi´ı definovan´ych v XUL dokumentech. Protoˇze je vykreslovac´ı j´adro pro XUL a HTML stejn´e, lze pro ´upravu vzhledu pouˇz´ıvat bˇeˇzn´e CSS vlastnosti a kaˇzd´emu prvku pˇriˇradit atribut class. Pˇresto vˇsak byly pro XUL pˇrid´any nov´e vlasnosti, jejich seznam s vysvˇetlen´ım je uveden v [23].

Zde uved’me dvˇe vlasnosti, kter´e maj´ı speci´aln´ı v´yznam. Prvn´ı vlastnost je -moz-binding, tato jiˇz byla uvedena v´yˇse v souvislosti s XUL elementy. Spojuje n´azev znaˇcky uv´adˇen´e ve zdrojov´em k´odu XUL s XBL definic´ı.

Druh´a vlastnost se jiˇz t´yk´a vzhledu, jej´ı n´azev je -moz-appearance. Jestliˇze prvek tuto hodnotu nem´a nastavenou, hodnota je rovna none, nebo je platforma provozov´ana na jin´em operaˇcn´ım syst´emu neˇz je Windows XP a vyˇsˇs´ı a Mac OS X, pak se element chov´a a vypad´a pˇresnˇe takov´ym zp˚usobem, jak jej urˇcuj´ı XBL a CSS. Jestliˇze je ale tato vlastnost nastavena na nepr´azdnou platnou hodnotu, napˇr´ıklad button, chov´an´ı a vzhled prvku je ˇr´ızeno in-ternˇe dle nastaven´e hodnoty. D˚uvodem je nov´a vlastnost vykreslovac´ıho j´adra Gecko, kter´e v operaˇcn´ıch syst´emech Windows XP a Mac OS X podporuje nativn´ı vzhled a chov´an´ı grafick´ych komponent. Internˇe se vytvoˇr´ı prvek uˇzivatelsk´eho rozhran´ı operaˇcn´ıho syst´emu a ten je vloˇzen na poˇzadovan´e m´ısto v dokumentu, ˇc´ımˇz se ignoruje nastaven´ı vzhledu uveden´eho v CSS. Seznam povolen´ych hodnot se nach´az´ı v souboru nsCSSKeywordList.h. Protoˇze vˇetˇsina XUL prvk˚u m´a tyto vlastnosti implicitnˇe nastaveny, zmˇena vzhledu ˇc´ast´ı prvk˚u nen´ı moˇzn´a. Jedinou moˇznost´ı pak b´yv´a vlastnost -moz-appearance vypnout a je na v´yvoj´aˇri, aby se vizu´aln´ı podoba upravovan´eho XUL prvku co nejv´ıce bl´ıˇzila nativn´ımu vzhledu prvk˚u dan´eho operaˇcn´ıho syst´emu.

Kromˇe nov´ych vlasnost´ı pˇrid´av´a Mozilla do CSS jeˇstˇe jeden speci´aln´ı z´apis selektor˚u, kter´y se uplatˇnuje pˇri upravov´an´ı vzhledu ˇr´adk˚u, sloupc˚u a obsahu bunˇek prvku tree. Klasick´ym zp˚usobem lze mˇenit pouze vizu´aln´ı podobu okraj˚u stromu a z´ahlav´ı sloupc˚u. D˚uvodem je odliˇsn´y zp˚usob reprezentace generovan´eho obsahu stromu, jenˇz nedovoluje pouˇzit´ı atributu class. Ten nahrazuje nov´y atribut s n´azvem properties. Odpov´ıdaj´ıc´ı nastaven´ı v CSS pak vypad´a n´asledovnˇe:

selektor_stromu treechildren::n´azev_vlastnosti(hodnoty) { CSS definice

}

selektor stromu je nepovinn´y selektor vyb´ıraj´ıc´ı poˇzadovan´y strom v DOM, treechildren oznaˇcuje regul´arn´ı n´azev elementu um´ıstˇen´eho ve stromu, kter´y je vˇzdy pˇr´ıtomen a ohraniˇcuje datovou oblast, n´azev vlastnosti je povinn´y a ud´av´a, kter´a vnitˇrn´ı oblast stromu bude upravov´ana a seznam hodnot uveden´ych v z´avorce vyb´ır´a obsah, na nˇehoˇz bude vzhled aplikov´an. Tyto hodnoty se vyhled´av´aj´ı v hodnot´ach atributu properties. Kromˇe hodnot, kter´e definuje uˇzivatel, jsou pˇr´ıtomny i platformou definovan´e, jako je napˇr´ıklad sud´y/lich´y ˇr´adek, seˇrazen´y sloupec a podobnˇe. Kompletn´ı seznam je uveden v [24].

(21)

Pro pˇripojen´ı kask´adov´ych styl˚u k XUL nebo XBL je pouˇz´ıv´ana notace platn´a pro XML: <?xml-stylesheet href="chrome://docwatcher/skin/main.css"

type="text/css"?>

V´yznam URL, kter´y je zde uveden, vysvˇetluje kapitola 8. Zde je nutn´e vˇsimnout si, ˇze skuteˇcn´a fyzick´a cesta, kter´a by v tomto pˇr´ıpadˇe byla content/skin/classic/docwatcher/main.css neodpov´ıd´a v´yˇse uveden´e. D˚uvodem je fakt, ˇze platforma umoˇzˇnuje vytv´aˇret v´ıce typ˚u vzhledu aplikace a pˇrep´ınat se mezi nimi. Zde classic oznaˇcuje n´azev v´ychoz´ıho vzhledu, kter´y bude aplikov´an, pokud nen´ı nalezen adres´aˇr s n´azvem aktu´alnˇe zvolen´eho skinu pro celou platformu.

Proto, aby kaˇzd´y XUL dokument vypadal stejn´ym zp˚usobem, je potˇreba pˇripojit syst´emovou sloˇzku se styly chrome://global/skin/, z n´ıˇz platforma automaticky vyb´ır´a potˇrebn´e kask´adov´e styly. Bez tˇechto soubor˚u by vhled aplikace pˇripom´ınal obyˇcejnou neupravenou HTML str´anku. Pot´e jiˇz mohou b´yt pˇripojeny dalˇs´ı styly aplikace.

4.3

Definice extern´ıch ˇ

retˇ

ezc˚

u

Jeden ze standardn´ıch poˇzadavk˚u na modern´ı aplikace je podpora v´ıce jazykov´ych verz´ı a jejich snadn´a spr´ava. Tohoto c´ıle by bylo problematick´e dos´ahnout, pokud by ˇretˇezce byly v pˇr´ısluˇsn´ych m´ıstech pˇr´ımo veps´any, byly by tedy souˇc´ast´ı zdrojov´eho k´odu. Z tohoto d˚uvodu jsou pro ´uˇcely lokalizace urˇceny dva typy soubor˚u.

4.3.1 DTD entity

Prvn´ı typ externˇe deklaruje textov´e entity, kter´e mohou b´yt pˇripojeny k defici typu doku-mentu (DTD), soubory maj´ı pˇr´ıponu .dtd. Pˇr´ıklad jednoho ˇr´adku z tohoto souboru:

<!ENTITY cmd.newLink "Nov&#x00FD; odkaz">

Za kl´ıˇcov´ym slovem ENTITY je uveden n´azev entity, pomoc´ı nˇehoˇz se v XUL dokumentu odkazujeme na skuteˇcn´y obsah. Notace z´apisu pro vloˇzen´ı obsahu textov´e entity pˇri inter-pretaci dokumentu je &nazev entity;. Zp˚usob pˇripojen´ı souboru DTD s ˇretˇezci je uk´az´an v pˇr´ıkladu na zaˇc´atku t´eto kapitoly.

Vlastn´ı textov´y obsah, kter´y bude vloˇzen do objektov´eho modelu dokumentu (DOM), je uveden v uvozovk´ach za n´azvem entity. Jestliˇze vyuˇz´ıv´ame znaky n´arodn´ı abecedy, tzn. je-jich ASCII hodnota je vyˇsˇs´ı neˇz 127, mus´ıme si uvˇedomit, ˇze se tak´e uplatˇnuje vliv k´odov´an´ı souboru. Pokud napˇr´ıklad ve Windows uloˇz´ıme soubor, kter´y bude obsahovat p´ısmeno “ ˇR”, bude implicitnˇe uloˇzen v k´odov´an´ı CP1250 a toto p´ısmeno bude m´ıt urˇcitou hodnotu. Pokud stejn´y soubor vytvoˇr´ıme a uloˇz´ıme v Linuxu, bude pouˇzito pravdˇepodobnˇe jin´e k´odov´an´ı (ISO8859-2) a dan´y znak bude m´ıt odliˇsnou hodnotu. Pˇri naˇcten´ı renderovac´ım j´adrem Mozilly pak doch´az´ı k probl´emu – je-li pouˇzit v´ychoz´ı typ k´odov´an´ı uloˇzen´y v nastaven´ıch a pokud se neshoduje s k´odov´an´ım, ve kter´em byl soubor uloˇzen, budou znaky s diakri-tikou zobrazeny chybnˇe, nebo XML parser nebude schopen v˚ubec dan´y element naˇc´ıst a interpretace konˇc´ı chybou.

Nejspolehlivˇejˇs´ım ˇreˇsen´ım je nahrazovat vˇsechny znaky s ASCII hodnotou vˇetˇs´ı neˇz 127 jejich hodnotami dle 16bitov´eho Unicode. Tyto hodnoty se zapisuj´ı v hexadecim´aln´ım

(22)

tvaru, pˇr´ıklad je uveden v´yˇse, kde je nahrazov´an znak “´y”. Pro texty v ˇcesk´em jazyce plat´ı tabulky oznaˇcen´e Latin-1 a Latin Extended A nach´azej´ıc´ı se v [28].

4.3.2 Textov´e konstanty

Druh´y zp˚usob uchov´av´an´ı ˇretˇezcov´ych konstant mimo k´od aplikace spoˇc´ıv´a v pouˇzit´ı soubor˚u s pˇr´ıponou .properties. K extrakci poˇzadovan´eho textu z tohoto zdroje je vˇsak nutn´e pouˇz´ıt jeden z jazyk˚u popisuj´ıc´ıch chov´an´ı aplikace, viz. kapitola 5.1. ˇR´adek vypad´a napˇr´ıklad takto:

confirmDelete=Opravdu chcete vybran\u00E9 odkazy (celkem %S) smazat?

Kaˇzd´y ˇr´adek obsahuje identifik´ator ˇretˇezce a pˇr´ısluˇsej´ıc´ı text. Stejnˇe jako u extern´ıch textov´ych entit, i zde je nejlepˇs´ı cesta z´apisu znak˚u n´arodn´ı abecedy pˇres odpov´ıdaj´ıc´ı 16bitovou Unicode hodnotu. D´ale zde funguj´ı escape sekvence zn´am´e z jazyka C, coˇz je tak´e jedin´y zp˚usob, jak vloˇzit do textu znak nov´eho ˇr´adku.

A koneˇcnˇe, ˇretˇezce mohou b´yt parametrizovan´e, tj. na m´ısta, kter´a jsou oznaˇcena pomoc´ı znaku procento n´asledovan´eho ˇretˇezcem reprezentuj´ıc´ım poˇzadovan´y form´at, se vloˇz´ı vstupn´ı hodnoty. Podporovan´e form´aty zˇrejmˇe odpov´ıdaj´ı form´at˚um funkce printf jazyka C, i kdyˇz tato skuteˇcnost nen´ı v ˇz´adn´e ofici´aln´ı dokumentaci explicitnˇe uvedena. Na str´ank´ach [37] je k elementu stringbundle uveden pro vloˇzen´ı textov´eho ˇretˇezce pomoc´ı jazyka JavaScript parametr %s, coˇz je ovˇsem chyba. Metoda tˇr´ıdy nsStringBundle urˇcen´a pro anal´yzu ˇretˇezcov´ych konstant nepˇr´ımo vol´a statickou metodu nsTextFormatter::dosprintf, ve kter´e lze naj´ıt podporovan´e form´aty. Z tohoto k´odu je patrn´e, ˇze %s je pouze pro 8bitov´e ASCII ˇretˇezce, zat´ımco %S je urˇceno pro 16bitov´e Unicode ˇretˇezce. Protoˇze JavaScript pracuje pouze s 16bitov´ymi znaky, spr´avn´y identifik´ator form´atu je %S, %s zp˚usob´ı chybn´y v´ystup.

4.3.3 Volba aktivn´ıho jazyka

Jazyk, ve kter´em jsou ˇretˇezce ps´any, nen´ı explicitnˇe uveden v souborech, je vˇsak d´an jm´enem adres´aˇre, ve kter´em se tyto soubory nach´azej´ı. N´azev je ve tvaru ln nebo ln-CT, kde ln je k´od jazyka mal´ymi p´ısmeny dle ISO 639.2 a CT je k´od zemˇe velk´ymi p´ısmeny dle ISO 3166 [8]. Nadˇrazen´y adres´aˇr tˇechto jazykov´ych adres´aˇr˚u se pak jmenuje locale. Pro ˇCeskou republiku je k´od cs-CZ.

Je d˚uleˇzit´e vˇsimnout si, ˇze ve zdrojov´em k´odu uveden´em na zaˇc´atku t´eto kapitoly nen´ı v cestˇe chrome://docwatcher/locale/main.dtd konkr´etn´ı n´azev jazykov´e varianty. Obecnˇe vˇsechny soubory, kter´e se nach´azej´ı v podhierarchii adres´aˇre locale, nemaj´ı uveden´y k´od jazyka. Mozilla sama tuto cestu upravuje a doplˇnuje na z´akladˇe nejlepˇs´ı shody s aktu´aln´ım nastaven´ım operaˇcn´ıho syst´emu. Jestliˇze nalezne adres´aˇr s jazykov´ym k´odem ekvivalentn´ım k´odu, kter´y poskytuje operaˇcn´ı syst´em, jsou pouˇzity ˇretˇezce z tohoto adres´aˇre. V pˇr´ıpadˇe neshody je vyhled´an adres´aˇr en-US. Jestliˇze ani ten neexistuje, je vybr´an prvn´ı zaregi-strovan´y adres´aˇr v pr˚ubˇehu procesu instalace rozˇs´ıˇren´ı, viz. kapitola ??.

(23)

Kapitola 5

Programov´

an´ı chov´

an´ı

Pˇred vlastn´ım obsahem t´eto kapitoly je vhodn´e zm´ınit dostupn´e zdroje, odkud lze z´ısk´avat mnoho informac´ı o API, funkˇcn´ıch postupech i chyb´ach platformy. Pˇri v´yvoji mus´ıme br´at totiˇz ohled na to, ˇze se jedn´a o otevˇrenou aktivnˇe se rozv´ıjej´ıc´ı aplikaˇcn´ı platformu, na jej´ımˇz vytv´aˇren´ı se pod´ıl´ı hodnˇe program´ator˚u z cel´eho svˇeta a ne kaˇzd´y dodrˇzuje vˇsechna pravidla z´apisu zdrojov´ych k´od˚u, apod. Z tohoto d˚uvodu jsou pak nˇekter´e ˇc´asti dokumen-tace dostupn´e v [37] ne´upln´e, v nˇekter´ych m´ıstech popis zcela chyb´ı. V takov´em pˇr´ıpadˇe lze zkoumat pˇr´ımo zdrojov´e k´ody, kter´e jsou pˇr´ıstupn´e na adresehttp://lxr.mozilla.org, je zde i funkce vyhled´av´an´ı. Bohuˇzel zde vˇsak nejsou zahrnuty zdrojov´e k´ody aplikace Firefox 2.0, a proto je potˇreba st´ahnout si zdrojov´e k´ody. Bliˇzˇs´ı informace jsou uvedeny v [17]. Jen upozorˇnuji, ˇze rozbalen´y archiv zab´ır´a na disku pˇres 250MB, obsahuje v´ıce neˇz 40000 soubor˚u a nalezen´ı potˇrebn´e informace m˚uˇze b´yt ˇcasovˇe dosti n´aroˇcn´e.

Dalˇs´ım zdrojem informac´ı je samotn´a instalace zvolen´eho produktu Mozilla, hlavnˇe pak archivy v adres´aˇri chrome. Ty jsou potˇreba pˇredevˇs´ım pro nalezen´ı idenfik´ator˚u za ´

uˇcelem rozˇsiˇrov´an´ı st´avaj´ıc´ıch aplikac´ı pomoc´ı overlays. Jestliˇze vytv´aˇr´ıme aplikaci, jej´ıˇz nˇejak´a funkce je podobn´a ˇcinnosti jiˇz existuj´ıc´ıho rozˇs´ıˇren´ı nebo ˇc´asti produktu Mozilla, je obˇcas nutn´e pˇristoupit k reverzn´ımu inˇzen´yrstv´ı a zjistit, jak´ym zp˚usobem funguj´ı. Je totiˇz pravdˇepodobn´e, ˇze se v´yvoj´aˇri pot´ykali se stejn´ymi probl´emy. Dostupn´a rozˇs´ıˇren´ı lze z´ıskat napˇr´ıklad z adresy https://addons.mozilla.org. Zb´yv´a upozornit na adresu

https://bugzilla.mozilla.org, na n´ıˇz je dostupn´a Bugzilla, coˇz je datab´aze s nalezen´ymi chybami platformy Mozilla – ne vˇzdy je totiˇz chyba v k´odu v´yvoj´aˇre.

5.1

Programovac´ı jazyky

Pro programov´an´ı aplikac´ı jsou na t´eto platformˇe prim´arnˇe dostupn´e dva jazyky. Prvn´ım je C++, kter´ym lze implementovat poˇzadovan´e chov´an´ı na ´urovni komponent. Nev´yhodou je, ˇze tento k´od bude po pˇrekladu z´avisl´y na HW architektuˇre a pˇr´ıpadnˇe i na operaˇcn´ım syst´emu. Hod´ı se tam, kde potˇrebujeme zrychlit v´ypoˇcet, skr´yt nˇejak´e implementaˇcn´ı detaily nebo vyuˇz´ıt pˇr´ım´eho napojen´ı na kokr´etn´ı operaˇcn´ı syst´em.

Druh´ym jazykem je JavaScript, kter´y je nejˇcastˇeji vyuˇz´ıv´an. Jeho pouˇzit´ı je vpodstatˇe nezbytn´e i v pˇredchoz´ım pˇr´ıpadˇe, kde je potˇreba vytvoˇren´e komponentˇe pˇredat ˇr´ızen´ı. Vlast-nosti jazyka shrnuje n´asleduj´ıc´ıch nˇekolik bod˚u:

• Vych´az´ı ze standardu ECMAScript (ECMA-262 Edition 3) a pˇrid´av´a nˇekter´a rozˇs´ıˇren´ı. Aktu´aln´ı verze je 1.7 [18].

(24)

• Je to skriptovac´ı jazyk, coˇz znamen´a, ˇze zdrojov´y k´od se syntax´ı podobnou syntaxi jazyka C, je pˇri bˇehu programu ˇcten a interpretov´an. Tento fakt m´a tˇri nev´yhody: Je sn´ıˇzena rychlost prov´adˇen´ı k´odu, coˇz je znateln´e pˇri sloˇzitˇejˇs´ıch v´ypoˇctech. Ladˇen´ı je obt´ıˇznˇejˇs´ı d´ıky toho, ˇze chyby jsou vˇetˇsinou odhaleny aˇz v okamˇziku, kdy maj´ı b´yt zpracov´any. Posledn´ı nev´yhoda se t´yk´a otevˇren´e podoby k´odu – ten je snadno ˇciteln´y, pokud nen´ı z nˇejak´eho d˚uvodu moˇzn´e pouˇz´ıt n´astroj pro zatemnˇen´ı k´odu, tzv. obfuscator.

• Typy promˇenn´ych se explicitnˇe neuv´adˇej´ı, jsou zjiˇst’ov´any za bˇehu. Objekty se vytv´aˇrej´ı pomoc´ı oper´atoru new, destruktory zde neexistuj´ı. O uvolˇnov´an´ı pamˇeti se automaticky star´a Garbage collector.

• Podporov´ano je objektovˇe orientovan´e programov´an´ı, u tˇr´ıd lze rozliˇsovat priv´an´ı a veˇrejn´e atributy a metody. Lze vyuˇz´ıvat polymorfismu (vol´an´ı jedn´e konkr´etn´ı metody objekt˚u r˚uzn´ych tˇr´ıd) a jednoduch´a dˇed´ıˇcnost (odvozov´an´ı tˇr´ıdy od jin´e tˇr´ıdy a pˇreb´ır´an´ı jejich veˇrejn´ych atribut˚u a metod). Objekt a asociativn´ı pole si vpodstatˇe odpov´ıdaj´ı.

• JavaScript umoˇzˇnuje i funkcion´aln´ı programov´an´ı.

• Je moˇzn´e tak´e vyuˇz´ıvat iter´atory, getter/setter metody zn´am´e napˇr. z jazyka C#, funkce m˚uˇze vracet v´ıce hodnot najednou a dalˇs´ı vlastnosti, kter´e se st´ale rozv´ıj´ı. V posledn´ı dobˇe se tak´e vyv´ıj´ı dva nov´e projekty, kter´e se snaˇz´ı propojit j´adro platformy s jazyky Python a Java. N´azvy pˇr´ısluˇsn´ych projekt˚u jsou PyXPCOM1 a JavaXPCOM2.

5.1.1 Objektov´e programov´an´ı v jazyce JavaScript

Jak jiˇz bylo uvedeno v´yˇse, JavaScript podporuje objektovˇe orientovan´e programov´an´ı, ˇ

c´ımˇz lze dos´ahnout lepˇs´ı struktury a udrˇzovatelnosti k´odu. Pˇr´ıklad definice tˇr´ıdy vypad´a n´asledovnˇe:

function classA(parameter) {

const _self = this;

var private_attribute = parameter; var private_method = function() {

_self.public_attr1 = null; } this.public_attr1 = null; this.public_method1 = function() {} } 1 http://developer.mozilla.org/en/docs/PyXPCOM 2 http://developer.mozilla.org/en/docs/JavaXPCOM

(25)

classA.prototype.__defineGetter__("public_attr2", function() { return this.public_attribute; });

classA.prototype.__defineSetter__("public_attr2", function(val) { this.public_attribute = val; });

classA.prototype = new function() { var private_static_attr = null, this.public_attr2 = null;

this.public_method2 = function() {} }

Funkce i tˇr´ıdy sd´ılej´ı v jazyku JavaScript jedin´e kl´ıˇcov´e slovo function. V pˇr´ıkladu je definov´ana tˇr´ıda classA, tˇelo funkce pˇredstavuje jej´ı konstuktor, jehoˇz parametrem mo-hou b´yt libovoln´e promˇenn´e. Vlastnosti, kter´e jsou dostupn´e vnˇe tˇr´ıdy, maj´ı pˇred n´azvem uvedeno kl´ıˇcov´e slovo this oddˇelen´e teˇckou. V tomto pˇr´ıpadˇe se jedn´a o vˇsechny poloˇzky s prefixem public. this funguje stejn´ym zp˚usobem jako v jin´ych objektov´ych jazyc´ıch, oznaˇcuje tedy referenci na aktu´aln´ı objekt. D´ale se zde nach´az´ı atribut a metoda s prefixem private. Ty jsou pˇr´ıstupn´e pouze v r´amci tˇela konstruktoru a protoˇze jsou dostupn´e po celou dobu existence objektu, lze je povaˇzovat za priv´atn´ı. V Mozille vˇsak existuje chyba, kter´a zp˚usobuje, ˇze v tˇele priv´atn´ıch metod nen´ı pˇres kl´ıˇcov´e slovo this dostupn´a reference na aktu´aln´ı objekt. Reference je nastavena na glob´aln´ı objekt, kter´y je vˇetˇsinou window. Zp˚usob ˇreˇsen´ı tohoto probl´emu spoˇc´ıv´a v zaveden´ı konstantn´ı promˇenn´e, kter´a udrˇzuje refe-renci na aktu´aln´ı objekt a v tˇele priv´atn´ıch metod se pak lze odk´azat pomoc´ı t´eto promˇenn´e na obsah objektu.

V k´odu se nach´az´ı statick´a vlastnost tˇr´ıdy nazvan´a prototype. Jedn´a se o syst´emem vytvoˇren´y objekt dostupn´y v kaˇzd´e funkci, kter´y lze pouˇz´ıt pro pˇrid´av´an´ı/odeb´ır´an´ı/´upravu veˇrejn´ych atribut˚u a metod. Pro odeb´ır´an´ı vlastnost´ı slouˇz´ı speci´aln´ı oper´ator delete [6]. D´ıky t´eto vlastnosti m˚uˇzeme rozˇsiˇrovat funkˇcnost existuj´ıc´ıch tˇr´ıd, ale tak´e vˇsech jiˇz vytvoˇren´ych instanc´ı dan´e tˇr´ıdy. Tak lze napˇr´ıklad pˇridat metody do syst´emov´eho objektu Date.

Metody defineGetter () a defineSetter () jsou dostupn´e pouze v r´amci ob-jektu prototype a umoˇzˇnuj´ı vytv´aˇret gettery a settery. V pˇr´ıkladu je uvedena vlastnost public attr2, kter´y se syntax´ı a pouˇzit´ım tv´aˇr´ı jako atribut, avˇsak pˇri ˇcten´ı jeho hodnoty je vol´ana metoda getteru a pˇri z´apisu nov´e hodnoty je vol´ana metoda setteru. Vynech´an´ım definice setteru m˚uˇzeme z´ıskat atribut urˇcen´y pouze pro ˇcten´ı, kter´y je dostupn´y vnˇe ob-jektu.

Protoˇze m´a kaˇzd´a tˇr´ıda jedin´y statick´y objekt prototype, je vˇsemi instancemi t´eto tˇr´ıdy sd´ılen´a. Atribut, kter´y je zde definov´an a nen´ı uvozen kl´ıˇcov´ym slovem this, je pak internˇe dostupn´y vˇsem tˇemto instanc´ım. Pˇredstavuje tedy priv´atn´ı statick´y atribut. Nejvˇetˇs´ı probl´em uveden´eho z´apisu je fakt, ˇze priv´atn´ı atributy definovan´e v konstruktoru a priv´atn´ı statick´e atributy obsaˇzen´e v objektu prototype nejsou nikdy viditeln´e z jedin´e metody.

V pˇr´ıkladu je d´ale zn´azornˇen zp˚usob vytv´aˇren´ı instance anonymn´ı tˇr´ıdy. Znamen´a to, ˇ

ze zde existuje jedin´y objekt definovan´e tˇr´ıdy, kter´a vˇsak nen´ı dostupn´a a nelze vytvoˇrit jej´ı dalˇs´ı instanci. N´asleduj´ıc´ı k´ody uv´adˇej´ı dva zp˚usoby vytvoˇren´ı diskutovan´ych typ˚u instanc´ı:

(26)

var object1 = new function() {

var private_attr = null;

var private_method = function() {} this.public_attr = null; this.public_method = function() {} this.__defineGetter__("public_attr2", function() { return null; }); } var object2 = { public_attr: null, public_method: function() {},

get public_attr2() { return null; } }

Druh´y zp˚usob je jednoduˇsˇs´ı pro z´apis, syntaxe getter˚u a setter˚u je zde v´ıce zjednoduˇsena. Nev´yhodou m˚uˇze b´yt nemoˇznost definovat priv´atn´ı vlastnosti, protoˇze vˇsechny identi-fik´atory jsou automaticky viditeln´e vnˇe objektu.

V jazyce JavaScript je moˇzn´a tak´e jednoduch´a dˇediˇcnost. Jestliˇze vyuˇzijeme pˇredchoz´ıho pˇr´ıkladu, kde je uvedena tˇr´ıda classA, pak jej´ı potomek, tˇr´ıda classB, bude zaps´ana takto:

function classB() classA.apply(this);

// ... zb´yvaj´ıc´ı tˇelo konstruktoru ...

classB.prototype.__proto__ = classA.prototype; /* M´enˇe vhodn´e:

classB.prototype = new classA();

classB.prototype.constructor = classB. */

Dˇedˇen´ı prob´ıh´a ve dvou kroc´ıch. Nejprve je proveden ˇr´adek za definic´ı tˇr´ıdy classB. Jak jiˇz v´ıme, prototype je objekt sd´ılen´y vˇsemi instancemi dan´e tˇr´ıdy, avˇsak tento identi-fik´ator je dostupn´y pouze tˇr´ıd´am. Instance mohou vyuˇz´ıvat platformou definovan´y atribut proto , do nˇehoˇz se po zaveden´ı objektu do pamˇeti, ale jeˇstˇe pˇred vol´an´ım konstruktoru, automaticky pˇriˇrad´ı reference na objekt prototype [5]. Jestliˇze interpret jazyka JavaScript naraz´ı pˇri prov´adˇen´ı nˇejak´eho k´odu na m´ısto, kde se pracuje s vlastnost´ı instance objektu, tzn. vol´a se metoda instance nebo se ˇcte/zapisuje z/do atributu hodnota, je neprve zjiˇstˇeno, zda tato vlastnost existuje pˇr´ımo v dan´em objektu. Jestliˇze ne, vyhled´av´a ji v objektu proto dan´e instance. Pokud ani zde nen´ı, vyhled´av´a se v objektu proto pˇr´ısluˇsn´eho objektu proto . Doch´az´ı tedy k rekurzivn´ımu proch´azen´ı aˇz do okamˇziku, kdy je vlast-nost nalezena nebo je hodnota proto rovna null. Uveden´y z´apis v pˇr´ıkladu tedy ˇr´ık´a, ˇze vlastnost atributu proto vˇsech instanc´ı tˇr´ıdy potomka bude obsahovat referenci na ob-jekt prototype rodiˇcovsk´e tˇr´ıdy. Jestliˇze pak pracujeme s vlastnost´ı instance tˇr´ıdy potomka a ta zde nen´ı uvedena, vyhled´av´a se ve vlastnostech objektu prototype tˇr´ıdy rodiˇce.

(27)

Zde je jeˇstˇe potˇreba uv´est, jak´ym zp˚usobem se internˇe prov´ad´ı pˇriˇrazov´an´ı nov´ych hod-not vlastnostem. Tato problematika je detailnˇe i s pˇr´ıklady rozebr´ana v [27]. Jestliˇze je napˇr´ıklad definov´ana hodnota veˇrejn´eho atributu v objektu prototype rodiˇcovsk´e tˇr´ıdy, pak pˇri jej´ım ˇcten´ı v potomkovi tˇr´ıdy je vr´acena hodnota, kter´a uloˇzen´a v rodiˇci. Pˇri z´apisu nov´e hodnoty tohoto atributu ale jiˇz doch´az´ı k vytvoˇren´ı nov´eho atributu v pamˇet’ov´em prostoru potomka. V tomto okamˇziku tedy existuj´ı dvˇe hodnoty, pˇriˇcemˇz ta v rodiˇci je aktu´alnˇe neviditeln´a, protoˇze pˇri vyhled´av´an´ı je nalezena a vr´acena hodnota um´ıstˇen´a v po-tomkovi. Jestliˇze byl tento atribut definov´an v prototype, lze pro z´ısk´an´ı hodnoty atributu instance pˇr´ım´eho rodiˇce prov´est n´asleduj´ıc´ı k´od:

var valueOfParent = classAInstance.__proto__.__proto__.public_attr2;

Je-li atribut definov´an v tˇele konstruktoru rodiˇcovsk´e tˇr´ıdy, nelze tuto hodnotu jak´ymkoli zp˚usobem z´ıskat. Stejn´e tvrzen´ı pak plat´ı v pˇr´ıpadˇe vol´an´ı metod.

V koment´aˇri je uveden jeˇstˇe jeden zp˚usob tvorby vazeb dˇediˇcnosti. Ten nen´ı doporuˇcov´an, protoˇze v okamˇziku naˇc´ıt´an´ı script˚u do XUL nebo HTML dokumentu doch´az´ı k vytv´aˇren´ı instance rodiˇcovsk´e tˇr´ıdy, kter´a vˇsak m˚uˇze poˇzadovat parametry konstruktoru a ty v tomto okamˇziku jeˇstˇe nemus´ı b´yt dostupn´e. Druh´y probl´em souvis´ı se zdrˇzen´ım zav´adˇen´ı n´asledn´ych ˇc´ast´ı dokumentu zp˚usoben´eho vytv´aˇren´ım instance. Pˇri pouˇzit´ı tohoto zp˚usobu je vhodn´e nastavit zpˇet hodnotu atributu constructor, kter´y je automaticky vytv´aˇren platformou, na referenci na funkci, kter´a vˇzdy pˇredstavuje konstruktor dan´e tˇr´ıdy.

Druh´ym nezbytn´ym krokem je zavol´an´ı syst´emov´e metody apply(), jenˇz je dostupn´a v kaˇzd´e funkci. Prvn´ım parametrem je vˇzdy reference na objekt, v jehoˇz kontextu m´a b´yt spuˇstˇena, a n´asleduje pole s parametry pˇred´avan´ych rodiˇcovsk´e tˇr´ıdˇe. call() se chov´a stejnˇe, avˇsak m´ısto pole parametr˚u se uv´adˇej´ı jednotliv´e parametry zvl´aˇst’. Tyto metody spust´ı kontruktor dan´e tˇr´ıdy, avˇsak reference udan´e kl´ıˇcov´ym slovem this jsou nahrazeny referenc´ı, kter´a je pˇred´av´ana jako prvn´ı parametr. To znamen´a, ˇze vˇsechny veˇrejn´e atributy a metody, kter´e se nach´azej´ı v konstruktoru rodiˇce budou zkop´ırov´any do pamˇet’ov´eho prostoru potomka. Pokud by k vol´an´ı apply() nedoˇslo, potomci rodiˇcovsk´e tˇr´ıdy by nemˇeli poloˇzky z konstruktoru k dispozici, protoˇze tyto objekt prototype nezahrnuje. Z tohoto faktu tak´e vypl´yv´a, ˇze v´yvoj´aˇr m´a dvˇe moˇznosti navrhov´an´ı tˇr´ıd a je na nˇem, aby zvo-lil vyhovuj´ıc´ı. Pokud bude vyuˇz´ıvat lok´aln´ı promˇenn´e a funkce v tˇele konstruktoru, se kter´ymi bude pracovat jako s priv´atn´ımi poloˇzkami tˇr´ıdy, m˚uˇze sice l´epe ukr´yvat informace pˇred okoln´ım svˇetem, avˇsak interpret jazyka vytvoˇr´ı pro kaˇzdou novou instanci tˇr´ıdy znova vˇsechny metody nach´azej´ıc´ı se v tˇele konstruktoru, takˇze se zvyˇsuj´ı n´aroky na pamˇet’ a rychlost vytv´aˇren´ı objekt˚u kles´a. Druh´a moˇznost je opaˇcn´a – do tˇela konstruktoru um´ıstit pouze atributy a vˇsechny metody definovat do objektu prototype. T´ım sice pˇr´ıjdeme o moˇznost ukr´yv´an´ı poloˇzek, avˇsak odstran´ıme dˇr´ıve uveden´e nev´yhody. V tomto pˇr´ıpadˇe m˚uˇze pomoci zaveden´ı vlastn´ıch pravidel pro oznaˇcov´an´ı poloˇzek s r˚uzn´ymi ´urovnˇemi pˇr´ıstupu (private, protected, public) a ty pak dodrˇzovat.

Pro pˇr´ıstup k poloˇzk´am tˇr´ıdy se pouˇz´ıv´a standardn´ı teˇckov´a notace zn´am´a napˇr. z jazyka C. D´ıky to, ˇze jazyk JavaScript ch´ape objekty jako asociativn´ı pole, ve kter´em je kl´ıˇc tvoˇren n´azvem poloˇzky, m˚uˇzeme pro pˇr´ıstup pouˇz´ıt i oper´ator pole. Jestliˇze do tohoto pole zap´ıˇseme hodnotu na m´ısto dan´e kl´ıˇcem, jenˇz neexistuje, vytvoˇr´ı se nov´a vlastnost pˇr´ısluˇsn´e instance tˇr´ıdy. N´asleduj´ıc´ı dva ˇr´adky jsou tedy identick´e:

(28)

new classA().public_method() new classA()["public_method2"]()

Nov´a instance tˇr´ıdy vznik´a oper´atorem new. Souˇc´ast´ı interpretu jazyka JavaScript je garbage collector, kter´y se automaticky star´a o uvolˇnov´an´ı pamˇeti, pokud poˇcet referenc´ı na dan´y objekt klesne na nulu. Neexistuj´ı zde destruktory, oper´ator delete ale m˚uˇze b´yt pouˇzit pro odstranˇen´ı elementu z pole, vlastnosti z objektu nebo dokonce cel´eho objektu [6]. Dalˇs´ı oper´atory pro ´uˇcely objektovˇe orientovan´eho programov´an´ı jsou tyto: in m˚uˇze b´yt pouˇzit pro testov´an´ı existence urˇcit´e vlastnosti v instanci tˇr´ıdy, instanceof ud´av´a, zda je objekt na lev´e stranˇe oper´atoru instanc´ı tˇr´ıdy uveden´e na stranˇe prav´e a oper´ator typeof vrac´ı pro tˇr´ıdu ˇretˇezec "function" a pro instanci tˇr´ıdy "object".

5.2

XPCOM

Obecnˇe programov´an´ı chov´an´ı aplikace prob´ıh´a stejnˇe, jako u (X)HTML str´anek. Objekty window, document a dalˇs´ı bˇeˇzn´e jsou dostupn´e standardn´ı cestou, i pˇres pˇr´ısluˇsn´a rozhran´ı. S v´yjimkou prvk˚u uˇzivatelsk´eho rozhran´ı, kter´e jsou ve speci´aln´ım reˇzimu budov´any pˇr´ımo z datov´eho RDF zdroje, je moˇzn´e se vˇsemi prvky v oknˇe manipulovat prostˇrednictv´ım DOM operac´ı a na reakce uˇzivatele jsou pouˇz´ıv´any ud´alosti. Uveden´e moˇznosti jsou vˇsak pro implementaci pokroˇcil´ych aplikac´ı nedostateˇcn´e. V bˇeˇzn´em JavaScriptu nelze pracovat se soubory na disku, spouˇstˇet dalˇs´ı aplikace, pˇristupovat k okn˚um prohl´ıˇzeˇce, vytv´aˇret libovoln´a s´ıt’ov´a spojen´ı a podobnˇe.

Platforma Mozilla proto poskytuje mechanismy, kter´e umoˇzˇnuj´ı XUL aplikac´ım pˇripojit se k poˇzadovan´ym komponent´am a vol´an´ım jejich sluˇzeb prov´adˇet potˇrebn´e operace. Z´ısk´an´ı reference na poˇzadovan´y objekt je provedeno jedn´ım z n´asleduj´ıc´ıch pˇr´ıklad˚u vol´an´ı, jehoˇz v´ybˇer je z´avisl´y na typu komponenty:

Components.classes["@mozilla.org/file/directory_service;1"] .getService(Components.interfaces.nsIProperties) nebo

Components.classes["@mozilla.org/rdf/container;1"]

.createInstance(Components.interfaces.nsIRDFContainer)

Prvn´ı pˇr´ıpad pouze z´ısk´a referenci na instanci tˇr´ıdy, kter´a je singleton. V cel´em pamˇet’ov´em prostoru platformy je tedy pouze jedin´a instance t´eto sluˇzby. Druh´y pˇr´ıpad jiˇz vytv´aˇr´ı novou instanci poˇzadovan´e tˇr´ıdy. V hranat´ych z´avork´ach se uv´ad´ı ContractID poˇzadovan´e komponenty, coˇz je jedineˇcn´y ˇretˇezec, kter´ym se kaˇzd´a komponenta platformy identifikuje. Parametrem metod getService() a createInstance() je pak rozhran´ı, kter´e chceme z´ıskat. Vol´an´ı operac´ı, kter´e z´ıskan´a komponenta nab´ız´ı, se jiˇz prov´ad´ı klasick´ym zp˚usobem vol´an´ı metody. Poznamenejme, ˇze ne vˇsechny metody lze volat, nˇekter´e jsou v dokumentaci [37] oznaˇceny [noscript] a tyto lze spouˇstˇet pouze z jazyka C++ na ´urovni komponent.

Pˇred uveden´ım n´asleduj´ıc´ıch ˇc´ast´ı je potˇreba tak´e upozornit na dokument [29], s jehoˇz obsahem je vhodn´e sezn´amit se, protoˇze obsahuje informace t´ykaj´ıc´ı se spr´avn´ych postup˚u pouˇz´ıv´an´ı XPCOM komponent tak, aby byly eliminov´any ´uniky pamˇeti.

(29)

5.2.1 Moˇzn´e probl´emy

Pˇri pr´aci s komponentami se m˚uˇzeme setkat s nˇekolika probl´emy. Prvn´ı vznik´a u metod, kter´e maj´ı u nˇejak´eho parametru uveden v´yraz out a jeho typ je z´akladn´ı, neobjektov´y (viz [12], seznam Built-in Types). Znamen´a to, ˇze dan´a promˇenn´a vyˇzaduje vol´an´ı odkazem, tj. v tˇele metody bude nastavena na novou hodnotu. ˇReˇsen´ım je pˇred´an´ı objektu, jehoˇz atribut value bude po vykon´an´ı metody obsahovat n´avratovou hodnotu.

Druh´y probl´em nast´av´a u parametr˚u nˇekter´ych metod, kter´e vyˇzaduj´ı objekt s definovan´ym rozhran´ım. Jestliˇze bychom napˇr´ıklad chtˇeli pouˇz´ıt metodu Serialize() komponenty s rozhran´ım nsIRDFXMLSource, mus´ıme j´ı pˇredat objekt s rozhran´ım nsIOutputStream. V tomto pˇr´ıpadˇe je na v´yvoj´aˇri, aby objekt vytvoˇril a implementoval poˇzadovan´e rozhran´ı, nelze jej totiˇz z´ıskat pomoc´ı vol´an´ı getInstance():

var serializer = Components.classes["@mozilla.org/rdf/xml-serializer;1"] .createInstance(Components.interfaces.nsIRDFXMLSerializer); serializer.init(ds); var outputStream = { data: "", close: function() {}, flush: function() {},

write: function (buffer,count) { this.data += buffer;

return count; },

writeFrom : function (stream,count) {}, isNonBlocking: false

};

serializer.QueryInterface(Components.interfaces.nsIRDFXMLSource) .Serialize(outputStream);

Protoˇze jsou rozhran´ı uspoˇr´ad´ana hierarchicky, tj. podporuj´ı pouze jednoduchou dˇediˇcnost, maj´ı vˇsechny jedin´eho pˇredka nsISupports. Toto rozhran´ı implementuje tˇri metody, z toho dvˇe jsou dostupn´e pouze v j´adˇre pod vrstvou XPCOM a slouˇz´ı pro zv´yˇsov´an´ı/sniˇzov´an´ı poˇc´ıtadla referenc´ı na dan´y objekt. Posledn´ı metoda QueryInterface() je jiˇz viditeln´a a umoˇzˇnuje z´ıskat urˇcit´e rozhran´ı komponenty, coˇz by mohlo b´yt ˇc´asteˇcnˇe pˇrirovn´ano k pˇretypov´an´ı objektu. V pˇredchoz´ım pˇr´ıkladu je vol´an´ım createInstance() vytvoˇrena komponenta pro serializaci a vr´aceno jedno z rozhran´ı, kter´e implementuje. Jestliˇze je n´aslednˇe potˇreba zavolat metodu jin´eho rozhran´ı stejn´e komponenty, mus´ı b´yt pˇred vlastn´ım vol´an´ım toto rozhran´ı obdrˇzeno prostˇrednictv´ım metody QueryInterface().

Jestliˇze potˇrebujeme nˇejakou hodnotu nebo objekt pˇredat jin´e ˇc´asti k´odu pomoc´ı XPCOM nebo si je nˇekam uloˇzit a pozdˇeji si vyzvednout, zjist´ıme, ˇze potˇrebn´a metoda rozhran´ı m´a parametr typu nsISupports. V pˇr´ıpadˇe, ˇze se jedn´a o hodnotu, nelze ji pˇr´ımo pˇredat, ale mus´ı b´yt zabalena do objektu. Zde jsou dvˇe moˇznosti – bud’ vytvoˇr´ıme bˇeˇzn´y objekt v JavaScriptu a zvolen´y atribut nastav´ıme na poˇzadovanou hodnotu, nebo vytvoˇr´ıme instanci komponenty odpov´ıdaj´ıc´ıho typu s prefixem ContractID @mozilla.org/supports- (viz rozhran´ı nsISupportsPrimitive). Druh´a moˇznost je pomalejˇs´ı, protoˇze doch´az´ı ke komunikaci s XPCOM. V tomto okamˇziku uˇz by bylo

References

Related documents

 The relation between action and desire: because user’s actions are mainly determined by his desire and the current context values, and there is only one active user during a

In this study using difference-in-differences models, the 2006 Massachusetts health care reform was associated with a 26% increased rate of thyroidectomy for treating thyroid cancer

 Chair of Information Systems and Management (Prof. Veit) and Chair for Value Based Marketing (Prof. Paul) both focus on digital media in research and teaching..  Bachelor and

We have found that mortality from all causes, circu- latory disease and acute alcohol poisoning are strongly associated with markers of alcohol problems: registration with the

Tobacco-attributable cancers are a cause of significant differences in life expectancy between males and females and contribute to male excess mortality rates in Poland.. Ac-

Ultraviolet and optical stellar spectra of the HgMn slowly rotat- ing star HD 175640, observed with both HST-STIS and UVES instruments, were used to extend and discuss the atomic

Three measurements of the longitudinal field over a time interval of 64 days are reported by Mathys &amp; Hubrig (1996): all yielded a field close to − 2. Since we found that it