Autor: Paweł Rajewski
Gdy tworzymy serwis z zamiarem publikowania go w Sieci, wiele funkcji Internet Explorera jest ograniczonych ze względów bezpieczeństwa. W trybie offline mamy dostęp do wielu ukrytych funkcji.
Nie mamy wpływu na stałe elementy okna przeglądarki, musimy liczyć się z ustawieniami (np. wyłączeniem obsługi skryptów) dokonanymi przez klienta. Również same skrypty mają ograniczoną funkcjonalność i czasem nie można osiągnąć nimi tego co, teoretycznie, byłoby możliwe (np. zmniejszenie okna poniżej pewnej wielkości czy swobodny dostęp do plików na dysku klienta). Wiele z tych ograniczeń zniesiono w specjalnym trybie off-line (HTA) wprowadzonym w Internet Explorerze 5. W szczególności:
— można określać wygląd okna, w którym uruchamiany jest serwis np. usunąć z niego pasek tytułowy, zmienić obramowanie, dodać własną ikonę. Można wyświetlić serwis w oknie pozbawionym jakichkolwiek elementów, a nawet uruchomić go w sposób niewidoczny (bez okna i przycisku na pasku zadań).
— można blokować niektóre funkcje systemowe, takie jak menu kontekstowe, menu systemowe, zaznaczanie na stronie czy możliwość zmieniania rozmiaru okna.
— serwis automatycznie uznawany jest za „zaufany” – przestają funkcjonować ograniczenia ustawione w przeglądarce i ograniczenia skryptów (np. można zamknąć programowo przeglądarkę bez pytania użytkownika o zgodę).
— skutkiem zniesienia ograniczeń jest uruchamiane wszystkich skryptów i swobodny dostęp do obiektów ActiveX. Chyba najpraktyczniejszy z nich to FileSystemObject oferujący dostęp do dysku z możliwością tworzenia, zmieniania, kopiowania, przenoszenia i kasowania plików.
— na pasku tytułowym okna i w otwieranych przez serwis okienkach (np. alert) nie pojawia się napis „Microsoft Internet Explorer”.
Jak widać, przy pracy off-line serwis „internetowy” przypomina bardziej samodzielną aplikację niż stronę napisaną w HTML-u. Stąd serwisy o tak poszerzonej funkcjonalności nazywane są „aplikacjami HLML-owymi” (HTML Application – HTA). Na dobrą sprawę znając dobrze HTML i JScript (lub VBScript) można w prosty i tani sposób napisać zupełnie przyzwoity „program” posiadając jedynie przeglądarkę internetową. Jest to więc znakomite i niedrogie rozwiązanie dla amatorów.
Co zrobić, aby uzyskać taką funkcjonalność serwisu?
Po pierwsze, trzeba zapisać stronę z rozszerzeniem *.hta zamiast *.htm lub *.html. To pierwszy sygnał dla przeglądarki, że ma do czynienia z „aplikacją” napisaną w HTML, a nie ze zwykłą stroną. Warto zauważyć, że w związku ze zmienionym rozszerzeniem, takich stron-aplikacji nie należy umieszczać w Sieci, na zdalnym serwerze – nie zostaną one bowiem otwarte przez przeglądarkę, ale pobrane (analogicznie jak np. pliki *.exe). Dopiero po pobraniu i zapisaniu na dysk będzie można uruchomić serwis-aplikację lokalnie.
Po drugie, w ramach sekcji HEAD trzeba umieścić nowy tag:
<HTA:APPLICATION [atrybuty...] ></HTA:APPLICATION>
sterujący zachowaniem się aplikacji i wyglądem okna. Tag posiada szereg atrybutów, z których najbardziej użyteczne to:
Wygląd:
BORDER=”wartość” – określa typ obramowania okienka, w jakim uruchamiana jest aplikacja. Możliwe wartości: thick, dialog, thin, none. Wartość thick to typowe obramowanie pozwalające na zmianę wielkości okienka. Ciekawa jest wartość none wyświetlająca okno bez żadnych obramowań. Domyślnie: thick.
BORDERSTYLE=”wartość” – określa rodzaj obramowania okna aplikacji (każde okno ma dwa obramowania – całego okna, kontrolowane przez BORDER, i samej aplikacji kontrolowane przez BORDERSTYLE). Możliwe wartości: normal, complex, raised, static, sunken. Domyślnie: normal.
INNERBORDER=”wartość” – określa czy wyświetlić wewnętrzne obramowanie okna. Możliwe wartości: yes, no. Domyślnie: yes.
CAPTION=”wartość” – określa czy okno ma posiadać pasek tytułowy. Możliwe wartości: yes, no. Domyślnie: yes.
ICON=”ścieżka” – określa ścieżkę do ikony w formacie *.ico, która zostanie wyświetlona na pasku tytułowym okienka jako ikona aplikacji. Domyślnie: ikona systemowa.
MAXIMIZEBUTTON=”wartość” – określa czy na pasku tytułowym okienka wyświetlić przycisk maksymalizujący okno. Możliwe wartości: yes, no. Domyślnie: yes.
MINIMIZEBUTTON=”wartość” – określa czy na pasku tytułowym okienka wyświetlić przycisk minimalizujący okno. Możliwe wartości: yes, no. Domyślnie: yes.
Przewijanie:
SCROLL=”wartość” – określa czy w oknie wyświetlać paski przewijania. Możliwe wartości: yes, no, auto. Domyślnie: yes.
SCROLLFLAT=”wartość” – określa czy wyświetlać płaskie paski przewijania. Możliwe wartości: yes, no. Domyślnie: no.
Zachowanie:
WINDOWSTATE=”wartość” – określa początkowy rozmiar okna aplikacji. Możliwe wartości: normal, minimize, maximize. Domyślnie: normal.
SYSMENU=”wartość” – określa czy wyświetlać menu systemowe po kliknięciu ikony na pasku tytułowym. Możliwe wartości: yes, no. Domyślnie: yes.
CONTEXTMENU=”wartość” – określa czy wyświetlać menu kontekstowe wywoływane prawym klawiszem myszy. Możliwe wartości: yes, no. Domyślnie: yes.
SELECTION=”wartość” – określa czy zawartość serwisu może być zaznaczana. Możliwe wartości: yes, no. Domyślnie: yes.
Ogólne:
APPLICATIONNAME=”nazwa” – określa nazwę aplikacji, pod jaką będzie ona widziana przez system operacyjny.
SINGLEINSTANCE=”wartość” – określa czy tylko jedna aplikacja o podanej nazwie może funkcjonować równocześnie (w przeciwnym razie program może być uruchomiony kilkakrotnie w osobnych oknach). Możliwe wartości: yes, no. Domyślnie: no.
SHOWINTASKBAR=”wartość” – określa czy działająca aplikacja ma być widoczna na pasku zadań. Możliwe wartości: yes, no. Domyślnie: yes.
NAVIGABLE=”wartość” – określa czy linki zawarte na stronie-aplikacji mają być otwierane w oknie aplikacji (w przeciwnym razie będą otwierane w nowym oknie przeglądarki). Możliwe wartości: yes, no. Domyślnie: no.
Wiele atrybutów jest wzajemnie powiązanych. Np. jeśli ustawimy brak paska tytułowego, znikną oczywiście przyciski maksymalizujący, minimalizujący i ikona. Podobnie będzie jeśli wyłączymy menu systemowe (posiada ono pozycję minimalizacji i maksymalizacji, nie miałoby więc sensu blokowanie tego menu i pozostawianie odpowiednich przycisków na pasku tytułowym). Jeśli usuniemy całkowicie obramowanie okna, zniknie też pasek tytułu itd.
Oto przykładowa prosta aplikacja HTA (pamiętaj, aby zapisać plik z rozszerzeniem *.hta):
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=iso-8859-2"> <HTA:APPLICATION APPLICATIONNAME="test" SCROLL="no" BORDER="none" INNERBORDER="no"></HTA:APPLICATION> <TITLE>Próba</TITLE> </HEAD> <BODY STYLE="background: #E6E6E6;"> Program w oknie bez obramowania. Ciekawe, prawda? Zauważ, że program zostanie zakończony bez pytania o pozwolenie na zamknięcie okna.<BR> <A HREF="#" onclick="window.close();">Zakończ program</A> </BODY> </HTML>
Jak widać, poza jednym nowym tagiem, można używać wszystkich zwykłych znaczników, właściwości i funkcji HTML, CSS, JScript.
Ponieważ aplikacja HTA ma duże uprawnienia, nie można odwołać się do niej w prosty sposób ze zwykłej strony HTML nie będącej jej częścią. Przykładowo, jeśli aplikacja ma ramkę IFRAME, a w niej otworzona jest strona HTML, to odwołanie window.parent z tej strony nie zaprowadzi do nadrzędnego okna. Strona zachowywać się będzie tak, jakby była otwarta w osobnym, własnym oknie. Aby temu zaradzić „zaufane” ramki należy oznaczyć następująco:
<IFRAME SRC="strona.html" APPLICATION="yes"></IFRAME>
Z tak opisanej ramki skrypty mogą odwoływać się „w górę” tj. do głównego okna aplikacji.
Jeśli aplikacja HTA ma ustawioną wartość NAVIGABLE=”yes”, wszystkie strony HTML otwierane w jej oknie również będą „zaufane” i traktowane jakby były częścią aplikacji („zaufane” jest bowiem wszystko co jest otwierane w „zaufanym” oknie). Warto więc uważać w przypadku korzystania ze stron czy rozwiązań zewnętrznych, nie napisanych przez siebie.
Aplikacje HTA dają twórcy duże możliwości, ale niosą też zagrożenia. Mogą zawierać niebezpieczne skrypty – bądź w skutek zawartych w nich błędów, bądź wprost w wyniku złośliwej intencji programisty. Swobodny dostęp do dysku to broń obosieczna i trzeba o tym pamiętać. Jeśli aplikacja *.hta pochodzi z niepewnego źródła, warto traktować ją tak, jak każdy nieznany program – czyli ze sporą dozą ostrożności.
Paweł Rajewski
Myślę że warto by zaktualizować CSS na blogu co do wyświetlania bloków kodu by nie uciekały poza ekran lub chociażby szło je przewijać w poziomie. Czasem zajrzy się tu z małym ekranem.