亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 838 | 回復(fù): 0
打印 上一主題 下一主題

嵌入式瀏覽器開發(fā)(四) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-12-22 08:51 |只看該作者 |倒序瀏覽

5.10 Netbit Browser的缺點分析及改進(jìn)辦法

基礎(chǔ)的GUI設(shè)計上存在缺陷

Netbit Browser目前的頁面輸出實際上還采用了簡單的畫圖機(jī)制,無法在主窗體內(nèi)放置如按鈕、編輯框、單選框等控件,也無法處理頁面元素的消息響應(yīng),(Netbit Browser 0.0.1-013版已進(jìn)行了改進(jìn)),而使用GTK作為開發(fā)平臺是完全可以實現(xiàn)這些要求的,GZILLA就是最好的實例,它通過對現(xiàn)有控件的組合,開發(fā)了自己的文檔視圖控件,實現(xiàn)了上述功能。但之所以目前沒有采用先進(jìn)的文檔視控件,是因為要實現(xiàn)這樣的有較強(qiáng)實用性的自畫文檔視圖控件,是需要很大的工作量的,僅GZILLA為實現(xiàn)其核心的DW文檔視圖控件,就動用了超過7000行

的代碼,比Netbit Browser目前的總代碼量還大。而Netscape由于考慮到支持多個GUI平臺,還需要一個抽象的中間層文檔視圖控件,這個中間層也在萬行以上。

改進(jìn)措施

固然,能容納百川,一觸即發(fā)的文檔視控件的開發(fā)是很繁重的工作,但原理卻并不復(fù)雜。下面加以闡述。

大多數(shù)的GUI平臺都提供了方便用戶進(jìn)行控件組合的機(jī)制,例如有的控件能包含其它的控件,通常稱之為container(容器),以GTK為例說明其原理。

 

GTK控件是以流行的控件組件的觀念來設(shè)計的。 不過, 依然是以C來寫的。 比起用C++來說, 這可以大大改善可移植性及穩(wěn)定性。 但同時, 這也意味著widget 作者需要小心許多實際操作上的問題。 所有同一類別的控件的一般聲明 (例如所有的按鈕控件)是放在 class structure。 只有一個這樣的結(jié)構(gòu)。 在這個結(jié)構(gòu)中儲存類別信號的聲明。 要支撐這樣的繼承, 第一欄的資料結(jié)構(gòu)必須是其父類別的資料結(jié)構(gòu)。例如GtkButton的類別的聲明看起來像這樣:

struct _GtkButtonClass{  GtkContainerClass parent_class;  void (* pressed)  (GtkButton *button);  void (* released) (GtkButton *button);  void (* clicked)  (GtkButton *button);  void (* enter)    (GtkButton *button);  void (* leave)    (GtkButton *button);};

當(dāng)一個按鈕被看成是個container(容器)時(例如, 當(dāng)它被縮放時), 其類別結(jié)構(gòu)可被傳到GtkContainerClass, 而其相關(guān)的欄位被用來處理信號。

具體而言,比如我們使用一個基礎(chǔ)的layout控件來作為我們自畫的文檔視圖控件的基礎(chǔ)控件,layout = gtk_layout_new(NULL, NULL);

 

接下來我們就可以使用gtk_layout_put函數(shù)將其它的允許被包含的控件放進(jìn)去,就是這么簡單,那難度在哪呢?其實,對于網(wǎng)頁顯示而言,能放進(jìn)去多少個按鈕、編輯框、單選框并不是最主要的,這很容易實現(xiàn),只要采用了類似layout這樣的基礎(chǔ)控件,我們原則上可以組合出來很多種效果。我們迫切關(guān)心的是那些需要用畫圖方法來實現(xiàn)的頁面元素,如文字、圖片、表格、直線是如何產(chǎn)生的。下面加以闡述。

 

實際上,無論在什么情況下,我們要作畫都需要合適的畫布,要在可以作畫的控件上才可以施展拳腳,drawing_area正是這樣的控件,如此,我們只要將畫畫在drawing_area上,然后再使用gtk_layout_put函數(shù)將drawing_area放置到layout控件上,不就萬事大吉了?不錯,但只對了一半,原來drawing_area本身并沒有實現(xiàn)自我重畫的機(jī)制,當(dāng)最小化窗口或打開對話框時,原有的界面就被破壞,只有進(jìn)行重畫才能恢復(fù)原貌,重畫又是怎樣實現(xiàn)的呢?原來,我們在將drawing_area放置于layout之前,是做了手腳的,使用以下函數(shù)

gtk_object_set_data(GTK_OBJECT(drawing_area), "layout", partp);

來將畫在drawing_area上的信息對應(yīng)的數(shù)據(jù)封裝給了drawing_area控件。同時使用函數(shù)

gtk_signal_connect(GTK_OBJECT(drawing_area), "expose_event",            (GtkSignalFunc)render_line_event, NULL);

來將expose_event這個重畫消息,捆綁給了drawing_area控件。render_line_event即是用于重畫的函數(shù),到了需要重畫的時候,該函數(shù)取出封裝給drawing_area的數(shù)據(jù)進(jìn)行重畫。

 

如此這般費神,終于可以讓線條、文字、表格、圖片得見天日,完美的展現(xiàn)在眾人面前(當(dāng)然,所有的畫與重畫的函數(shù)都要自己寫好了才行)。不要高興太早,超級鏈接都不可點擊,GIF動畫也不會動,界面還是死的,原來忘了畫龍點睛,怎么辦?加消息。

 

加消息的步驟通常如下,以文字的超級鏈接為例。

首先新建一個消息盒子,event_box = gtk_event_box_new();

如果著急的話先把盒子放到layout上,當(dāng)然用gtk_layout_put函數(shù)。若是最后再放上去,效果是同樣的。

將drawing_area裝到盒子里。

gtk_container_add(GTK_CONTAINER(event_box),drawing_area);

 

下面指定消息:

if(partp->parent && partp->parent->type == LAYOUT_PART_LINK) {

    gtk_signal_connect(GTK_OBJECT(event_box), "enter_notify_event",

              (GtkSignalFunc)activate_text_link, drawing_area);

    gtk_signal_connect(GTK_OBJECT(event_box), "leave_notify_event",

              (GtkSignalFunc)activate_text_link, drawing_area);

    gtk_signal_connect(GTK_OBJECT(event_box), "button_press_event",

              (GtkSignalFunc)select_text_link, drawing_area);

    gtk_signal_connect(GTK_OBJECT(event_box), "button_release_event",

              (GtkSignalFunc)select_text_link, drawing_area);

    gtk_widget_add_events(event_box,

             GDK_ENTER_NOTIFY_MASK |

             GDK_LEAVE_NOTIFY_MASK |

             GDK_BUTTON_PRESS_MASK |

             GDK_BUTTON_RELEASE_MASK);

gtk_widget_realize(event_box);

 

如此這般,超級鏈接終于可點了(同樣,消息引發(fā)的函數(shù)都得老老實實寫好了)。可以實現(xiàn)移到上面就自動變色,點擊就跳轉(zhuǎn)到其它網(wǎng)頁。

 

別忘了,指定一個漂亮的小手,這樣點超級鏈接的時候更有情調(diào)。

gdk_window_set_cursor(event_box->window, gdk_cursor_new(GDK_HAND2));

    綜上所述,如果每一個消息對應(yīng)的函數(shù)都能按部就班的完成,超級自畫文檔視圖控件的完成也就指日可待了。

 

若只支持簡單的字、線、圖,程序大致可以控制在千行以內(nèi),當(dāng)然這不包括文字布局算法、圖像解碼算法的部份。除此之外,我們還要擬定比較完善的數(shù)據(jù)結(jié)構(gòu)來存儲我們畫在drawing_area上的信息,通常這些信息是語法分析的結(jié)果,也可以是詞法分析的結(jié)果,在自畫過程中融入語法分析的過程。

 

5.11 Netbit Browser未來的展望

    Netbit Browser作為一個畢業(yè)設(shè)計課題,還是接近圓滿的。通過Netbit Browser的開發(fā),對常見的瀏覽器開發(fā)技術(shù)有了深入了解和實踐機(jī)會,但若作為實際的軟件開發(fā)項目來講,還差的很遠(yuǎn),為了使其能繼續(xù)得以生存,決定將其變?yōu)殚_放源碼項目,遵循GPL協(xié)議開發(fā),現(xiàn)已成為中國Linux論壇(http://www.linuxforum.net)的MyLinux計劃的一個子項目。

   

    下面主要討論一下Netbit Browser在技術(shù)上亟待解決的問題。

(1)超級鏈接的支持,實際上在對技術(shù)的了解的基礎(chǔ)上。如前面的詳細(xì)分析可見,該部份的實現(xiàn)已沒有障礙,應(yīng)該盡快實現(xiàn),根本上是個編程序的毅力問題。

 

(2)圖片的顯示, 圖片顯示因為有很多開放的開發(fā)包或源程序,只是顯示的話難度不大,但要考慮到多個圖片的同時傳輸、JPG的逐步顯示、GIF的動態(tài)顯示就愈顯復(fù)雜,仍需要對圖像算法、網(wǎng)絡(luò)傳輸、線程、消息等技術(shù)多加研究。

 

(3)TABLE等復(fù)雜的元素的布局,這實際是一個眾多瀏覽器共同的問題,目前除了IE以外,其它瀏覽器都還存在較大的問題,如果能實現(xiàn)類似Netfront的效果,就比較實用了。開放源碼的ZEN瀏覽器的table布局算法也很值得借鑒。

 

市場展望:Netbit Browser使用標(biāo)準(zhǔn)C編程,可以移植到Windows平臺。也可以利用相關(guān)技術(shù)實現(xiàn)有市場價值的應(yīng)用,如“HTML智能分析”這個軟件,就是利用了Netbit Browser的詞法分析技術(shù)進(jìn)行了有益的嘗試。


第六章  其它瀏覽器分析

6.1  Dillo(Gzilla)瀏覽器分析

Gzilla的最新版本改名為Dillo,Netbit Browser的界面設(shè)計主要借鑒了Dillo,其模塊劃分也受了Dillo很大的影響,Dillo瀏覽器是學(xué)習(xí)GTK程序開發(fā)的優(yōu)秀范例,下面就其主要的模塊加以說明。

 

6.1.1主函數(shù)流程分析

主要是對main函數(shù)進(jìn)行分析。

gtk_true();            

gtk_init(&argc, &argv); /* gtk初始化的一般方式 */

a_Prefs_init();         /*   初始化 preference ,preference包括: http_proxy, no_proxy, home, link_color, bg_color, text_color, allow_white_bg, force_my_colors!『瘮(shù)a_Prefs_init()調(diào)用Pref_load()分析文件dillorc,并初始化全局變量。*/

a_Dns_init();       /* 初始化DNS模塊!〈四K具體工作過程請參閱下文*/

a_Url_init();       /* 該函數(shù)首先初始化全局變量http_proxy, 和 no_proxy; */

a_Mime_init();      /*從網(wǎng)絡(luò)(a_Http_get)或本地(a_File_get)取得文件后,不同的文件需要不同的方法打開。該函數(shù)定義了如下幾種打開文件的方法:    */

a_Dicache_init();   /* Dicache用于圖形文件的處理。*/

a_Interface_init(); /* 初始化幾個有關(guān)界面的全局變量 */

a_Dw_image_init();  /* 圖形信息的初始化。]有分析)*/

bw = a_Interface_new_browser_window();  /* 生成一個browser window(bw),初始化用戶圖形界面。這些代碼是基于gtk開發(fā)的。主要的回調(diào)函數(shù)都是在這里定義*/

a_Bookmarks_init();     /* 初始化書簽功能。這是比較獨立的一個模塊 */

……………

gtk_main();             /* gtk消息循環(huán) */

/* 以下為內(nèi)存釋放 */

a_Cache_freeall();

a_Dicache_freeall();

a_Http_freeall();

a_Dns_freeall();

a_Prefs_freeall();

 

6.1.2文件的取得

 

當(dāng)用戶發(fā)出一個Url 請求時,Dillo 首先要取得Url所指向的文件;然后根據(jù)文件類型,選擇相應(yīng)的解釋器。一個Url所指向的文件可能在本地,也可能在網(wǎng)絡(luò)上。這節(jié)將主要介紹Dillo如何從網(wǎng)上取得文件。

 

模塊interface定義了Dillo的圖形用戶界面。當(dāng)用戶發(fā)出一個Url請求時(例如open 一個網(wǎng)頁),相應(yīng)的回調(diào)函數(shù)將調(diào)用函數(shù)a_Nav_push()。模塊Nav中的函數(shù)主要是維護(hù)每一個bw中的Url 堆棧(bw 是Browser Window的簡寫,是瀏覽器窗口的數(shù)據(jù)結(jié)構(gòu))。函數(shù)a_Nav_push()的主要功能是將當(dāng)前的請求記錄到bw 中的expecting域:

bw->nav_expect.url = g_strdup(url);

bw->nav_expect.title = NULL;

bw->nav_expecting = TRUE;

 

隨后,調(diào)用函數(shù)Nav_open_url() 。該函數(shù)首先判斷請求是否就在當(dāng)前頁中(如anchor 就在當(dāng)前頁中),如果是,則直接跳到當(dāng)前頁中指定位置;如果否,調(diào)用函數(shù)a_Cache_open_url() 并修改用戶界面(狀態(tài)條和一些buttons)。

模塊Cache 是Dillo中的關(guān)鍵模塊。模塊HTTP 和模塊File負(fù)責(zé)取得文件,模塊Cache負(fù)責(zé)將取得的各種文件送到不同的解釋器;同時模塊Cache負(fù)責(zé)管理緩沖區(qū),緩沖區(qū)中存在的文件不需要再通過網(wǎng)絡(luò)下載。函數(shù)a_Cache_open_url() 首先搜索緩沖區(qū),判斷請求的文件數(shù)據(jù)是否已經(jīng)存在;如果存在,調(diào)用Cache_process_queue()處理Cache中的數(shù)據(jù);否則,調(diào)用 a_Url_open ()從網(wǎng)上取文件。

 

函數(shù)a_Url_open()的主要功能是調(diào)用合適的opener,該函數(shù)一般調(diào)用Url_open()。Url_open()將調(diào)用合適的method:a_File_get()或者a_Http_get()。這里只討論a_Http_get()。

 

函數(shù)a_Http_get()主要是創(chuàng)建一個http連接,發(fā)出DNS請求。它首先根據(jù)全局變量HTTP_Proxy和 No_Proxy,修改用戶Url;然后創(chuàng)建非阻塞socket;最后通過調(diào)用a_DNS_lookup()發(fā)出DNS請求。

 

Dillo中的DNS請求將由多個線程完成。域名解析完成后,回調(diào)函數(shù)Http_dns_callback()將被調(diào)用。它首先發(fā)送Http請求 (send query);然后接收回答(receive answer)。發(fā)送、接收操作都是通過調(diào)用a_IO_submit()實現(xiàn)的。函數(shù)a_IO_submit()通過gtk的支持,實現(xiàn)了阻塞IO操作。當(dāng)數(shù)據(jù)被接收到,回調(diào)函數(shù)a_Cache_callback()將被調(diào)用。

 

函數(shù)a_Cache_callback()主要功能是處理接收到的數(shù)據(jù),判斷文件是否下載完畢。接收到的數(shù)據(jù)將由函數(shù)Cache_process_queue()處理。

6.1.3  選擇合適的解釋器

函數(shù)Cache_process_queue()的主要功能是為下載的文件選擇一個合適的解釋器。

 

(1)該函數(shù)首先判斷協(xié)議頭(header)(根據(jù)Http協(xié)議,body前為header)是否下載完畢,如果沒有下載完,直接返回。

(2)隨后,調(diào)用函數(shù)a_Web_dispatch_by_type()選擇解釋器。

(3)調(diào)用此解釋器。

(4)如果文件下載完畢,通知解釋器,并處理相應(yīng)的Cache隊列。

 

函數(shù)a_Web_dispatch_by_type()首先調(diào)用a_Mime_set_viewer(),該函數(shù)根據(jù)文件類型選擇相應(yīng)的 viewer(即:主函數(shù)中a_Mime_init()初始化的幾種打開方式: a_Gif_image() a_Jpeg_image() 和a_Html_text())。對于Html文件,a_Html_text()將會被調(diào)用。a_Html_text()主要生成一個DilloHtml 結(jié)構(gòu)和一個DwPage結(jié)構(gòu)。

 

DilloHtml中有幾個比較重要的結(jié)構(gòu):

Dw     指向DwPage結(jié)構(gòu),DwPage是Dillo自定義的文檔視圖。

堆棧   維護(hù)一個堆棧,記錄當(dāng)前正在處理的tag,用于語法分析。

Bw     記錄當(dāng)前的窗口。

 

然后,函數(shù)a_Web_dispatch_by_type()調(diào)用a_Dw_gtk_scroller_set_dw(), 為DwPage(dw)設(shè)置邊界,為相應(yīng)的窗口(bw)設(shè)置滾動條,并將頁面(dw )嵌入到窗口中(bw)。此函數(shù)里的操作是基于gtk的。

 

函數(shù)a_Html_text()將會指定Html文件的解釋器為Html_Callback().

 

6.1.4  Html 文件的顯示


一般Html文件的顯示需要經(jīng)過詞法分析、語法分析和布局(layout),顯示等幾步。在Html顯示方面,Dillo處理的比較簡單。它在語法分析的同時,進(jìn)行布局。

 

這里有兩個概念:word 和line。一個word相當(dāng)于一個Html文件中的一個tag ,若干個word形成一個line,而若干line形成一個page。在語法分析的過程中,發(fā)現(xiàn)一個tag,則生成一個word( 可能還會生成一個widget,如img),同時進(jìn)行布局。當(dāng)一行布滿時,一個新的line將會生成。這種處理方式簡單,但是具有較大的局限性。 Dillo 中不支持Table 標(biāo)記就是這種局限性的一種體現(xiàn)。

 

Html_write( )

函數(shù)Html_callback()通過調(diào)用Html_write()實現(xiàn)Html文件的分析、布局。Html_write()是對已經(jīng)下載完畢、還沒有處理的一段數(shù)據(jù)的處理。

 

Html_write()的主要過程是

(1)調(diào)用a_Dw_page_update_begin()。

(2)處理緩沖區(qū)中的數(shù)據(jù)

當(dāng)前字符是空格,而且不在Tag “ pre”中處理空格

當(dāng)前字符是“<”,

    如果是注釋,則跳過注釋

    如果是一個Tag,則處理此Tag. (Html_process_tag())

    如果是word 則處理此word (Html_process_word()).

(3)將當(dāng)前字符的位置,記錄到對應(yīng)DilloHtml結(jié)構(gòu)中Start_Ofs (相對于整個文件頭,未處理數(shù)據(jù)的起始地址,下一次調(diào)用此函數(shù)時使用)。

(4)處理狀態(tài)條,顯示瀏覽器當(dāng)前的工作狀態(tài)。

(5)a_Dw_page_update_end( )。對DwPage結(jié)構(gòu)(頁結(jié)構(gòu))中,word、line、widget等的改變,都應(yīng)該放在這兩個函數(shù):a_Dw_page_update_begin() 和a_Dw_page_update_end()之間。在第二個函數(shù)調(diào)用之后,畫面將會更新。

 

Tag處理一例: Html_tag_open_a()

 

此函數(shù)用于處理Tag( anchor)的開始標(biāo)簽。

(1)將此tag壓入對應(yīng)DilloHtml中的堆棧,

(2)取得屬性 ”href”,創(chuàng)建一個attr,調(diào)用函數(shù)a_Dw_page_add_attr(page, &attr),將其加入相應(yīng)的page.

(3)取得屬性”name”,調(diào)用函數(shù)a_Dw_page_add_anchor()。此函數(shù)的主要功能:

創(chuàng)建一個word,記錄word的屬性是anchor,

以name為索引將此anchor插入當(dāng)前page的anchor Hash表。

設(shè)置它在頁面中的位置。

 

結(jié)尾標(biāo)簽由函數(shù)Html_tag_close_default()處理。它的主要功能是將此標(biāo)簽從DilloHtml棧中彈出。

 

Html_process_word()

此函數(shù)處理網(wǎng)頁中,所要顯示的文本。此函數(shù)首先根據(jù)當(dāng)前DilloHtml堆棧中的ParseMode對文本進(jìn)行處理。ParseMode有如下幾種:STASH、VERBATIM、 PRE。

 

處理完后,調(diào)用函數(shù)a_Dw_page_add_text(),將這些文本插入頁中。

此函數(shù)的主要流程為:

(1)設(shè)置字體

(2)計算文本寬度

(3)調(diào)用Dw_page_new_word(),在此頁中創(chuàng)建一個新的word,記錄此word的屬性為Text.

 

6.1.5 Dillo分析總結(jié)

 

Dillo是運行在Linux平臺上基于gtk的圖形網(wǎng)絡(luò)瀏覽器。具有規(guī)模小的優(yōu)點。但是Html 頁面的顯示質(zhì)量較差,不支持JavaScript、Java;贒illo的嵌入式瀏覽器改造需要考慮如下幾個方面:

 

(1)從整體結(jié)構(gòu)來看,從取得文件到文件處理,大量使用回調(diào)函數(shù),代碼的可讀性差,結(jié)構(gòu)不清晰。建議改成消息機(jī)制,這樣既增強(qiáng)了各模塊的獨立性,同時提高了并發(fā)性。

(2)Html文件的顯示模塊需要改寫。Dillo不能支持比較常用的標(biāo)簽Table,而這種缺陷又是因為設(shè)計結(jié)構(gòu)本身的缺陷,所以該模塊需要做較大的改寫。

 

(3)Dillo對于gtk的依賴較強(qiáng),由于gtk不適合于嵌入式系統(tǒng),需要改成基于fltk或embedded QT等嵌入式ToolKits,因此改造的工作量較大。

 

6.2 Thunder瀏覽器分析

Thunder瀏覽器是一個XML瀏覽器,用于制作多媒體演示軟件,支持多媒體格式包括文字、圖像、音頻、視頻。采用標(biāo)準(zhǔn)C編程,在WINDOWS下使用VC編譯,軟件規(guī)模較大,源程序達(dá)到2.5M。

主要模塊功能介紹:

JavaScript: JavaScript API函數(shù)庫

JsEngine: 瀏覽器JavaScript支持引擎

TStream:流式文件處理

TXml:XML的詞法語法分析與布局

Widget:widget控件庫

TDevice:圖形、聲音等的驅(qū)動函數(shù)庫

TKernel:核心系統(tǒng)函數(shù),包括內(nèi)存分配、消息解析宏以及接口類型定義等

 

Thunder瀏覽器值得稱道的是對JavaScript支持的效果良好,通過JavaScript來達(dá)到對圖片的操作,實現(xiàn)了較好的動態(tài)效果。是學(xué)習(xí)JavaScript支持的良好范例。

 

另外,Thunder瀏覽器的詞法分析也比較完善,Neibit Browser的設(shè)計也參考了Thunder的設(shè)計,并借鑒了部份字符串處理函數(shù)。

 

Thunder瀏覽器的布局算法十分簡單,因為其支持的XML是自己定義的,在圖片等元素的屬性里不僅定義了其應(yīng)該出現(xiàn)的絕對位置,還定義了圖片的長度,寬度,使得布局工作易如反掌,沒有算法可借鑒。

 

6.3        Mozilla瀏覽器分析

6.3.1  COM

COM是由Microsoft提出的組件標(biāo)準(zhǔn),它不僅定義了程序之間進(jìn)行交互的標(biāo)準(zhǔn),并且也提供了組件程序運行所需的環(huán)境。COM所定義的模塊之間的接口標(biāo)準(zhǔn)是二進(jìn)制可執(zhí)行代碼級標(biāo)準(zhǔn),因此模塊之間獨立性更強(qiáng),具有語言無關(guān)性!≡贛ozilla中,COM機(jī)制利用C++語言實現(xiàn),幾乎所有的對象都是COM對象,若干COM對象又組合成COM模塊。COM對象在初始化時,都要注冊到COM運行環(huán)境(COM庫)中;當(dāng)其它模塊需要調(diào)用該對象的方法時,先要通過COM運行環(huán)境,以該COM對象的全球唯一ID為參數(shù),創(chuàng)建該COM對象,取得對象接口指針;最后通過該對象接口指針調(diào)用方法。

 

COM機(jī)制使各個模塊之間獨立性非常高,為裁減提供了便利;但是,為了實現(xiàn)這套機(jī)制,Mozilla(Linux環(huán)境下)必須要實現(xiàn)相應(yīng)的運行環(huán)境(COM庫),所有的COM對象都要繼承實現(xiàn)一些COM標(biāo)準(zhǔn)接口,這些都增加了代碼量,使得單一模塊(對象)代碼規(guī)模增大。

 

6.3.2  XML

 

Mozilla對于XML提供了強(qiáng)大的支持,甚至可以說整個軟件包是對XML理論的一種實現(xiàn)。Mozilla 的用戶界面主要是由XML文本描述(在Mozilla中稱為XUL: XML-base User Interface Language);所描述界面中的控件,被解釋轉(zhuǎn)換成DOM(Document Object Model)對象;與控件相關(guān)的操作大部分由JavaScript實現(xiàn)。DOM 和RDF是Mozilla軟件包中比較大的核心模塊,同時兩者也是XML的一部分。DOM 是程序訪問和維護(hù)HTML 和XML文檔的API;RDF ( Resource Description Framework) 提供了對整個資源(包括本地資源)的描述體系;在Mozilla中,JavaScript與C++代碼的互操作,也需要這兩個模塊的支持?梢哉f,XML 在整個軟件包中起到了綱舉目張的作用。

 

對XML的支持增強(qiáng)了系統(tǒng)的功能,但是客觀上也增加了系統(tǒng)的復(fù)雜性,增大了系統(tǒng)規(guī)模,為裁減造成了困難(最早曾嘗試裁減Mozilla)。

 

6.3.3  Layout

在對HTML腳本語法分析結(jié)束后,要對頁面進(jìn)行布局。在整個瀏覽器中,Layout屬于關(guān)鍵技術(shù)之一。Mozilla提供了強(qiáng)大的布局功能,在系統(tǒng)自帶的測試用例中,有非常復(fù)雜的頁面(如:CSS styles, Deeply Nested Tables, Frames, DHTML等),MozillaV14可以對這些頁面進(jìn)行出色的布局;而RedHat Linux6.2自帶的Netscape4.7x在顯示這些頁面時,錯誤比較多,甚至不能顯示。

 

強(qiáng)大的功能是以規(guī)模巨大的代碼量為代價的,MozillaV14中l(wèi)ayout模塊達(dá)到了3.8M,這是整個裁減過程中最難處理的模塊之一。

 

6.4        ZEN瀏覽器分析

正如第一章簡介中指出的,ZEN是一個不知名的優(yōu)秀開放源碼瀏覽器,擁有可換界面的優(yōu)異特性,用戶可改換GUI平臺,設(shè)定自己的界面風(fēng)格,極符合嵌入式的要求。

 

主要模塊說明:

parser:詞法語法分析。

layouter:布局。

ui:不同的GUI界面和控件庫,包括GTK、SVGA、字符模式,也可自定義。

image:圖像處理。

protocol:協(xié)議,包括file和http。

 

下面給出其語法分析的數(shù)據(jù)結(jié)構(gòu)示意:

 

page

 |

X- text <-> link <-> text <-> table -X

              |                  |

            text -X           table_row -X

                                 |

                              table_cell <-> table_cell -X

                                 |              |

text -X        image –X

 

可見,節(jié)點之間不僅有先后次序,還有父子關(guān)系,正確的語法分析和良好的布局算法,使得ZEN可以支持表格等復(fù)雜元素,格式基本正確。

 

關(guān)于使用GTK來支持超級鏈接的消息響應(yīng),第五章已有詳細(xì)闡述,其參考對象就是ZEN瀏覽器。

 

讓我們記住作者Konfucius的座右銘吧:

"The reward of studying, lies in the studies themselves."

 

6.5 瀏覽器分析工作的總結(jié)

瀏覽器分析工作是一項十分耗費精力的工作,由于瀏覽器的源代碼大多比較龐大,模塊的獨立性也較差,往往環(huán)環(huán)相扣,上下相關(guān),涉及的技術(shù)也十分繁雜,分析起來十分費力,進(jìn)展也比較緩慢,大約占了整個開發(fā)工作的1/3時間。但這項工作一定要踏識的完成,要多借鑒成熟的技術(shù),這樣在自己的開發(fā)工作中才可以事半功倍,做到心中有數(shù)也就能夠按部就班。

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP