2009-10-15 03:34:08
ActiveX'owe boje

Pisanie własnej przeglądarki (czy chociaż renderera HTML) to samobójstwo - HTML to temat-rzeka i jeśli żaden z producentów którejkolwiek przeglądarki nie dał sobie z tym rady (ciągłę luki bezpieczeństwa, rozbieżności w obsłudze standardów, własne narowy, wydajność, etc), to jak np. ja miałbym sobie dać radę? W dodatku sam? Zatem odpada, zdecydowanie. No ale ludzie domagają się HTMLa, nie przeżyją bez tego (zresztą ostatnio korci mnie, by dodać obsługę RSSów - czytnik w Operze zaczyna mnie dobijać, nowego softu nie chcę, Google Reader zdecydowanie odpada), a sporo softu obsługuje HTML i tak. Jakim cudem? Używają kontrolki Internet Explorera - TWebBrowser.

No to fajnie, zaimportowałem sobie kontrolkę IE via odpowiednia funkcja Delphi i początek zapowiada się nieźle. Co prawda trzeba dodać blokowanie zewnętrznych linków i skryptów, ale odpowiedni kod już jest, więc bułka z masłem. Działa, obrazki wyświetlają się, za statusbar IE robi statusbar HCMa (łiii, nie trzeba pozbywać się przeglądarkowych przyzwyczajeń jeśli chodzi o linki!), na razie pięknie. Czyżby? I wtedy mnie coś przypadkowo uderzyło. Ale to tak mocno, że do dzisiaj mi dzwoni w głowie.

Wyciek pamięci.

I to spory, bo około 10MB. Wycieki są tym większe, im większe są wczytywane dokumenty. I co, wydawałoby się że banał - wywołać metodę "Free" kontrolki i wszystko samo się sprzątnie? O nie, nie nie nie... ;-)) RAM is cheap, motherfucker, so put it to good use! Problem udało mi się trochę załagodzić, rzutując TWebBrowser.Document na IPersistStreamInit i używając metody InitNew tego interfejsu, ale dalej jest po pierwsze ~10MB jednorazowego wycieku, a potem kolejnych kilkadziesiąt-kilkaset kB wycieku (zależnie od tego, ile ważyły obrazki). Myślałem że może coś robię nie tak, więc kombinowałem z różnymi metodami i ostatecznie stanęło na tym, że KontrolkaIE.Free tak naprawdę mało co zwalnia, a co bym nie robił, to zawsze będzie jakiś memory leak. W gruncie rzeczy, to nawet nie wiem za co się złapać, OLE i ActiveX to kolejny temat-rzeka, do tego najeżony WTFami, domysłami i ogólną czarną magią - a mnie się skończyły koty więc nawet nie mam co poświęcać (to tzw. mhrhrhrhotchny humor Brancha).

Właściwie jedyne co mi teraz przychodzi na myśl, to trik z sandboxowaniem (wsadzanie kontrolki do osobnego procesu) - tworzy się nowy proces, jako jego okno nadrzędne ustawia się okno kontrolki-kontenera gdzie miał być przechowywany IE albo Acrobat, i resztę deleguje do delikwenta. Nie jest to zbyt efektywne rozwiązanie ale będzie działać, to raz, zapewni kontrolę nad użyciem pamięci to dwa, a trzy, jeśli się wysypie (bo np. ktoś odpalił HCMa pod stareńkim Win98 i próbował wyświetlić plik html o treści "<input type>"), to tylko proces przeglądarki a nie HCM. W sumie to można już przyglądać się jak to zrobili w Chrome. ;-) Chyba, że komuś udało się to obejść/rozwiązać bardziej po bożemu - bardzo chętnie poczytam i douczę się. Z góry gwiazdor zapłać, bo ja nie mam. Dościślę tylko, że mój TWebBrowser jest tworzony dynamicznie.

A w ogóle to fajną mamy zimę tej jesieni.


Może Cię zainteresować...

Komentowanie wyłączone dla tego wpisu.
Powered by:
Hellcore Mailer - polski program pocztowyOpera Web BrowserFreeBSD - The Power to Serve!Slackware
RSSy:
Sidekick:
Projekty:
O autorze:
Zobacz:
Kategorie:
Archiwum:
Szukaj: