




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
北京郵電大學(xué)畢業(yè)論文設(shè)計(jì)嵌入式瀏覽器的設(shè)計(jì)與實(shí)現(xiàn)摘要隨著計(jì)算機(jī)技術(shù)的發(fā)展,嵌入式系統(tǒng)已成為計(jì)算機(jī)領(lǐng)域的一個(gè)重要組成部分。嵌入式計(jì)算機(jī)中的應(yīng)用數(shù)量遠(yuǎn)遠(yuǎn)超過了各種通用計(jì)算機(jī),制造工業(yè),過程控制,通訊,設(shè)備,儀器儀表,汽車,船舶,航空,航空航天,軍事裝備,消費(fèi)類產(chǎn)品都是嵌入式計(jì)算機(jī)的應(yīng)用領(lǐng)域。本文主要論述了嵌入式瀏覽器開發(fā)所涉及到的技術(shù),對(duì)HTML詞法分析、C++編程等做了詳細(xì)的分析和介紹,并對(duì)C++嵌入式瀏覽器的開發(fā)進(jìn)行了介紹,分析了主要的模塊的功能和組成,并給出了主要代碼。還對(duì)典型的嵌入式瀏覽器進(jìn)行了分析,包括Gzilla,Mozilla,Thunder和zen,總結(jié)了瀏覽器設(shè)計(jì)的技術(shù)要點(diǎn)和開發(fā)策略。另外,在論文開頭,介紹了目前嵌入式瀏覽器產(chǎn)品的發(fā)展現(xiàn)狀,嵌入式瀏覽器的組成和各部份功能說明。HTML詞法分析是著重討論的技術(shù)問題,給出了詳盡的數(shù)據(jù)結(jié)構(gòu),程序流程。嵌入式瀏覽器的開發(fā),是本論文的重點(diǎn),分模塊進(jìn)行了分析,提出了需要改進(jìn)的地方,并給出了改進(jìn)措施。關(guān)鍵詞:嵌入式瀏覽器;HTML詞法分析;C++
DesignandImplementationofEmbeddedBrowserAbstractWiththedevelopmentofcomputertechnology,embeddedsystemhasbecomeanimportantpartofthecomputerfield.Embeddedcomputerfarexceedsavarietyofgeneral-purposecomputersinthenumberoftheapplications,manufacturingindustry,processcontrol,communications,equipment,instruments,automobiles,ships,aviation,aerospace,militaryequipment,andconsumerproductsarealltheapplicationfieldoftheembeddedcomputer.Thispaperdiscussesthedevelopmentofembeddedbrowserinvolvedintechnology,lexicalanalysisofHTML,C++programming,andsodoadetailedanalysisandpresentation,andC++embeddedbrowserdevelopmentwereintroducedtoanalyzethemainfunctionandcompositionofthemoduleandgivesthemaincode.Alsotypicalembeddedbrowseranalyzed,includingGzilla,Mozilla,Thunderandzen,summedupthetechnicalpointsandtodevelopstrategiesbrowserdesign.Inaddition,atthebeginningofthepaper,describesthecurrentstatusofthedevelopmentofembeddedbrowserproduct,embeddedbrowsercompositionandfunctionofeachpartofthedescription.HTMLlexicalanalysisisfocusedontechnicalissues,givesdetaileddatastructures,programflow.Embeddedbrowserdevelopment,isthefocusofthispaper,sub-moduleswereanalyzed,andareasforimprovement,andgivesimprovements.Keywords:embeddedbrowser;HTMLlexicalanalysis;C++
目錄摘要 iAbstract ii緒論 1一、嵌入式瀏覽器設(shè)計(jì)概述 2(一)目前嵌入式瀏覽器產(chǎn)品的發(fā)展現(xiàn)狀 21.國內(nèi)外發(fā)展現(xiàn)狀: 22.常見嵌入式瀏覽器 23.嵌入式瀏覽器的應(yīng)用領(lǐng)域 3(二)嵌入式瀏覽器的設(shè)計(jì)功能 3(三)C++簡(jiǎn)介 4(四)QT簡(jiǎn)介 4二、嵌入式瀏覽器分析 6(一)總體結(jié)構(gòu) 6(二)瀏覽器總體流程 7(三)圖形用戶界面GUI和排版顯示 8三、其它瀏覽器分析 9(一)Dillo(Gzilla)瀏覽器分析 91.主函數(shù)流程分析 92.文件的取得 93.選擇合適的解釋器 104.Html文件的顯示 115.Dillo分析總結(jié) 12(二)Thunder瀏覽器分析 12(三)Mozilla瀏覽器分析 131.COM 132.XML 133.Layout 134.ZEN瀏覽器分析 13四、嵌入式瀏覽器模塊功能實(shí)現(xiàn) 15(一)瀏覽器主頁界面 15(二)跳轉(zhuǎn)界面 16(三)瀏覽器編輯界面 17(四)保存界面 19五、嵌入式瀏覽器運(yùn)行測(cè)試 21(一)瀏覽器主頁界面單元運(yùn)測(cè)試 211.文件選項(xiàng)測(cè)試 212.查看選項(xiàng)測(cè)試 223.幫助選項(xiàng)測(cè)試 22(二)跳轉(zhuǎn)界面單元測(cè)試 23(三)瀏覽器編輯界面單元測(cè)試 24(四)保存界面單元測(cè)試 24(五)集成測(cè)試 25總結(jié) 26參考文獻(xiàn) 27致謝 28英文原文 29中文翻譯 37緒論隨著計(jì)算機(jī)、網(wǎng)絡(luò)技術(shù)的迅猛發(fā)展,新型的高科技含量的電子產(chǎn)品層出不窮,遍及家電、生產(chǎn)、軍事等各個(gè)領(lǐng)域。嵌入式系統(tǒng)因其體積小,速度快而受到重視。在掌上電腦、PDA、手機(jī)、導(dǎo)航設(shè)備、信息家電領(lǐng)域嵌入式系統(tǒng)被廣泛采用,這也是近期產(chǎn)品研發(fā)的熱點(diǎn)。嵌入式瀏覽器作為重要的嵌入式系統(tǒng)應(yīng)用軟件,是不可或缺的。但目前,嵌入式瀏覽器產(chǎn)品的市場(chǎng)被少數(shù)國外大公司壟斷,眾多的小型嵌入式瀏覽器也尚處于發(fā)展期,而國內(nèi)的自主技術(shù)的嵌入式瀏覽器更屈指可數(shù),剛剛進(jìn)入實(shí)用階段。迫切需要更多的人來關(guān)注嵌入式瀏覽器技術(shù),開發(fā)中國自主知識(shí)產(chǎn)權(quán)的瀏覽器產(chǎn)品。嵌入式瀏覽器cpu能力弱、功耗低,內(nèi)存等資源可用的十分有限,所需要支持的web特性不需要pc版的那么豐富,一般最基本的html即可,javascript一般都不需要全部支持。它的功能十分優(yōu)秀、前途非常廣大,本文對(duì)它的進(jìn)行了簡(jiǎn)單的開發(fā),希望對(duì)它有更深的了解,增加自己的開發(fā)經(jīng)驗(yàn)。
一、嵌入式瀏覽器設(shè)計(jì)概述(一)目前嵌入式瀏覽器產(chǎn)品的發(fā)展現(xiàn)狀1.國內(nèi)外發(fā)展現(xiàn)狀:常見的桌面瀏覽器有微軟的InternetExplorer,網(wǎng)景的Netscape,開放源碼的Mozilla,以及opera,mosaic,Hotjava,字符模式的lynx等。其中IE,Opera已有嵌入式版本,以上的大多數(shù)瀏覽器均有跨多平臺(tái)的版本。這些桌面型瀏覽器功能參差不齊,但大多能實(shí)現(xiàn)基本的瀏覽功能。其中IE與Netscape對(duì)HTML頁面的顯示效果均堪稱完美(對(duì)于XML,WML等標(biāo)準(zhǔn)的網(wǎng)頁瀏覽,本文不予討論)。對(duì)立的是,這些瀏覽器龐大的體積和對(duì)機(jī)器配置的高要求。這也是桌面瀏覽器和嵌入式瀏覽器最大的區(qū)別。另外,桌面型瀏覽器通常是基于通用的操作系統(tǒng),用于桌面電腦如PC機(jī)、MAC機(jī)等。而嵌入式瀏覽器通常基于專用系統(tǒng)。需要指出的是,我們?cè)诰W(wǎng)上??吹降囊恍┧^的優(yōu)秀瀏覽器,如Netcaptor,魔裝網(wǎng)神,騰訊,颶風(fēng),F(xiàn)antasia,金山WPSoffice的瀏覽器等等,均為使用IE內(nèi)核的瀏覽器,使用了多頁面多線程的方式,降低了系統(tǒng)資源的耗費(fèi),方便了瀏覽,但軟件本身沒有多少技術(shù)可言,可以用Delphi,VB等工具輕易開發(fā)出來(如果不要求完善的功能,只需簡(jiǎn)單到拖一個(gè)IE控件過去就行了),這也體現(xiàn)了微軟的COM+及ActiveX技術(shù)的強(qiáng)大。2.常見嵌入式瀏覽器InternetExplorerforWinCE,是IE的WindowsCE版,這也意味著用戶為了使用它,必須選用基于WinCE平臺(tái)的產(chǎn)品,隨著微軟勢(shì)力在掌上終端領(lǐng)域的蔓延,WinCE版的IE必將大行其道。AccessNetfront,Access是日本的瀏覽器大廠,占據(jù)了大部份的日本瀏覽器市場(chǎng),其產(chǎn)品廣泛應(yīng)用于手持設(shè)備、機(jī)頂盒、游戲機(jī)等產(chǎn)品。其新推出的NetfrontLinux版本可以免費(fèi)下載,網(wǎng)址是:http://www.access.co.jp/product/develop。經(jīng)試用,發(fā)現(xiàn)Netfront瀏覽效果非常好,對(duì)中文的支持和表格的顯示效果,甚至超過Netscape4.6forLinux。而且支持鍵盤操作。可以使用箭頭鍵來選擇網(wǎng)址進(jìn)行跳轉(zhuǎn)。但顯然為了簡(jiǎn)化設(shè)計(jì),Netfront使用了一定的權(quán)宜手段。比如它不支持使用<font>標(biāo)記來設(shè)置字體,也不支持樣式表,所有字體的大小是固定的,但一般情況不易發(fā)現(xiàn),不過由于Linux版本不是商業(yè)性版本,無法就此推斷其他版本的特性。NetfrontLinux版大小為1.9M,如再加以簡(jiǎn)化(比如去掉一些圖片按鈕)可以做的更小。Gzilla,現(xiàn)名Dillo,是基于Linux,使用JAVA作為GUI平臺(tái)開發(fā)的瀏覽器,其開發(fā)目的也包含嵌入式的應(yīng)用。是開放源碼項(xiàng)目。我們?cè)谠O(shè)計(jì)JAVA嵌入式Browser時(shí)主要參考了該瀏覽器的界面設(shè)計(jì)。該瀏覽器的缺點(diǎn)是不支持表格,布局過于簡(jiǎn)單,不支持中文,瀏覽效果比較差,優(yōu)點(diǎn)是網(wǎng)絡(luò)功能完善,支持cache緩沖,能夠支持多種圖片格式。網(wǎng)址是:。Viewml,使用FLTK作為GUI平臺(tái)開發(fā)的瀏覽器,主要面向嵌入式的應(yīng)用。是開放源碼項(xiàng)目。使用C++面向?qū)ο蟮脑O(shè)計(jì)。因?yàn)槭褂肍LTK,所以可以在嵌入式的MicroWindow平臺(tái)運(yùn)行,該瀏覽器支持簡(jiǎn)單的表格,界面還沒有做(只有一個(gè)主窗口),不支持中文,由于FLTK的BUG比較多,我們?cè)趯?shí)際編譯時(shí)經(jīng)常出錯(cuò),即使編譯通過,也常常是還沒運(yùn)行就coredump了,但曾經(jīng)由某人編譯成功,基本可用,網(wǎng)址是:。ZEN,一個(gè)并不知名的嵌入式瀏覽器,但卻十分優(yōu)秀,開放源碼項(xiàng)目,不僅支持表格,支持多種圖像格式,而且在設(shè)計(jì)上很有特色,將涉及到GUI平臺(tái)的部分獨(dú)立出來,用戶可以指定不同的GUI平臺(tái)運(yùn)行,內(nèi)置了對(duì)字符,SVGA和JAVA的支持,開發(fā)這只需按照相應(yīng)規(guī)范編寫該軟件的涉及GUI的部份,就可以將其移植到其它GUI平臺(tái),而無須對(duì)整個(gè)軟件進(jìn)行修改。缺點(diǎn)是網(wǎng)絡(luò)功能比較弱,不支持多線程,另外其必須等到所有圖片下載完畢才開始布局,若某文件傳輸失敗則會(huì)導(dǎo)致死鎖,需用戶中斷。網(wǎng)址是:/software/zen/。以上主要介紹了開放源碼的嵌入式瀏覽器,因?yàn)槠鋵?duì)本項(xiàng)目具有實(shí)際的參考價(jià)值。3.嵌入式瀏覽器的應(yīng)用領(lǐng)域嵌入式瀏覽器主要應(yīng)用于手持終端和信息家電,例如掌上電腦、3G手機(jī)、網(wǎng)絡(luò)機(jī)頂盒、具有網(wǎng)絡(luò)功能的其它家電,如可上網(wǎng)的電冰箱等,另外,在軍事等領(lǐng)域也有一定的應(yīng)用需求。(二)嵌入式瀏覽器的設(shè)計(jì)功能下面簡(jiǎn)介主要的組成部份,其設(shè)計(jì)原理后面將進(jìn)行專門論述。1.詞法分析主要是針對(duì)HTML進(jìn)行詞法分析,該詞法分析器實(shí)際是通用的,還可用于XML、WML的詞法分析,只需替換元素名稱即可。HTML詞法分析是瀏覽器設(shè)計(jì)的基礎(chǔ)環(huán)節(jié)之一,也是整個(gè)設(shè)計(jì)過程中重要的前端工作,其數(shù)據(jù)結(jié)構(gòu)的擬定與接下來的語法分析和布局算法密切相關(guān),詞法分析的效率與準(zhǔn)確性、容錯(cuò)性也關(guān)系到整個(gè)瀏覽器設(shè)計(jì)的質(zhì)量。2.語法分析在大型的瀏覽器中,語法分析通常是獨(dú)立的模塊,但在嵌入式瀏覽器中,語法分析通常是與布局混合在一起的,即一邊進(jìn)行語法分析,一邊布局,不設(shè)立相應(yīng)的數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)語法分析的結(jié)果。語法分析對(duì)布局的算法有直接的指導(dǎo)意義。3.布局本文中的布局應(yīng)理解為界面輸出前的預(yù)演和處理位置等信息的算法,而不是具體的畫圖和界面輸出。布局算法的好壞直接關(guān)系到界面的輸出效果,但布局算法也是要根據(jù)GUI所能實(shí)現(xiàn)的輸出效果來設(shè)計(jì)的,所以,GUI往往成為系統(tǒng)的瓶頸,如果GUI提供的支持有限,即使有再好的布局算法,也是紙上談兵,無用武之地。4.GUI及軟件界面GUI是指圖形用戶界面,瀏覽器無疑是一個(gè)圖形函數(shù)庫的大需求者,選擇好的GUI環(huán)境實(shí)屬不易,為了能夠?qū)崿F(xiàn)專有的功能,瀏覽器開發(fā)者往往還要對(duì)基礎(chǔ)的GUI庫進(jìn)行包裝、改寫,甚至寫自己的控件。所有這些,是需要有專業(yè)的GUI庫開發(fā)經(jīng)驗(yàn)的專職人員來完成。GUI的功勞第一在于軟件的操作界面,如窗口、菜單、工具條、滾動(dòng)條等。第二在于主瀏覽窗體中的圖形元素的輸出(通常以自畫控件的方式)。前者通常直接使用GUI庫中的已有控件,編程難度很小,后者主要利用基本的點(diǎn)線函數(shù),編程難度比較大。(三)C++簡(jiǎn)介C++這個(gè)詞在中國大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“Cplusplus”,“CPP”。它是一種使用非常廣泛的計(jì)算機(jī)編程語言。C++是一種靜態(tài)數(shù)據(jù)類型檢查的、支持多重編程范式的通用程序設(shè)計(jì)語言。它支持過程化程序設(shè)計(jì)、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計(jì)、泛型程序設(shè)計(jì)等多種程序設(shè)計(jì)風(fēng)格。C++由美國AT&T貝爾實(shí)驗(yàn)室的本賈尼·斯特勞斯特盧普博士在20世紀(jì)80年代初期發(fā)明并實(shí)現(xiàn)(最初這種語言被稱作“CwithClasses”帶類的C)。開始,C++是作為C語言的增強(qiáng)版出現(xiàn)的,從給C語言增加類開始,不斷的增加新特性。虛函數(shù)(virtualfunction)、運(yùn)算符重載(operatoroverloading)、多重繼承(multipleinheritance)、模板(template)、異常(exception)、RTTI、命名空間(namespace)逐漸被加入標(biāo)準(zhǔn)。優(yōu)點(diǎn):C++代碼·C++設(shè)計(jì)成靜態(tài)類型、和C同樣高效且可移植的多用途程序設(shè)計(jì)語言。C++設(shè)計(jì)成直接的和廣泛的支持多種程序設(shè)計(jì)風(fēng)格(程序化程序設(shè)計(jì)、資料抽象化、面向?qū)ο蟪绦蛟O(shè)計(jì)、泛型程序設(shè)計(jì))。C++設(shè)計(jì)成給程序設(shè)計(jì)者更多的選擇,即使可能導(dǎo)致程序設(shè)計(jì)者選擇錯(cuò)誤。C++設(shè)計(jì)成盡可能與C兼容,借此提供一個(gè)從C到C++的平滑過渡。C++避免平臺(tái)限定或沒有普遍用途的特性。C++不使用會(huì)帶來額外開銷的特性。C++設(shè)計(jì)成無需復(fù)雜的程序設(shè)計(jì)環(huán)境。出于保證語言的簡(jiǎn)潔和運(yùn)行高效等方面的考慮,C++的很多特性都是以庫(如STL)或其他的形式提供的,而沒有直接添加到語言本身里。關(guān)于此類話題,BjarneStroustrup的《C++語言的設(shè)計(jì)和演化》(1994)里做了詳盡的陳述。C++在一定程度上可以和C語言很好的結(jié)合,甚至目前大多數(shù)C語言程序是在C++的集成開發(fā)環(huán)境中完成的。C++相對(duì)眾多的面向?qū)ο蟮恼Z言,具有相當(dāng)高的性能。C++引入了面向?qū)ο蟮母拍睿沟瞄_發(fā)人機(jī)交互類型的應(yīng)用程序更為簡(jiǎn)單、快捷。很多優(yōu)秀的程序框架包括MFC、QT、wxWidgets就是使用的C++。(四)QT簡(jiǎn)介Qt(官方發(fā)音同cute發(fā)音為/kju:t/,雖然也俗稱為Q.T.發(fā)音為/kju:ti?/")是一個(gè)跨平臺(tái)的C++應(yīng)用程序開發(fā)框架。廣泛用于開發(fā)GUI程序,這種情況下又被稱為部件工具箱。也可用于開發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。Qt是一個(gè)跨平臺(tái)的C++圖形用戶界面庫,由挪威TrollTech公司于1995年底出品。Trolltech公司在1994年成立,但是在1992年,成立Trolltech公司的那批程序員就已經(jīng)開始設(shè)計(jì)Qt了,Qt的第一個(gè)商業(yè)版本于1995年推出。2008年1月31日,Nokia公司宣布通過公開競(jìng)購的方式收購TrollTech公司,旗下包括Qt在內(nèi)的技術(shù)都?xì)w入Nokia旗下。并且Nokia針對(duì)自己的移動(dòng)設(shè)備平臺(tái)規(guī)劃的需要,將Qt按不同的版本發(fā)行:Qt商業(yè)版:提供給商業(yè)軟件開發(fā)。它們提供傳統(tǒng)商業(yè)軟件發(fā)行版并且提供在協(xié)議有效期內(nèi)的免費(fèi)升級(jí)和技術(shù)支持服務(wù)。Qt開源版:僅僅為了開發(fā)自由和開放源碼軟件,提供了和商業(yè)版本同樣的功能。GNU通用公共許可證下,它是免費(fèi)的。2009年3月發(fā)布的Qt4.5起,諾基亞為Qt增添開源LGPL授權(quán)選擇。2009年5月11日起,諾基亞QtSoftware宣布Qt源代碼庫面向公眾開放,Qt開發(fā)人員可通過為Qt以及與Qt相關(guān)的項(xiàng)目貢獻(xiàn)代碼、翻譯、示例以及其他內(nèi)容,協(xié)助引導(dǎo)和塑造Qt未來的發(fā)展。為了便于這些內(nèi)容的管理,QtSoftware啟用了基于Git和Gitorious開源項(xiàng)目的Web源代碼管理系統(tǒng)。Qt專業(yè)版和企業(yè)版是Qt的商業(yè)版本。只有你購買了專業(yè)版或企業(yè)版,你才能夠編寫商業(yè)的,私人的或收費(fèi)的軟件。如果你購買了這些商業(yè)版本,你也可以獲得技術(shù)支持和升級(jí)服務(wù)。Qt為微軟公司的Windows操作系統(tǒng)只提供了專業(yè)版和企業(yè)版。
二、嵌入式瀏覽器分析(一)總體結(jié)構(gòu)Konqueror/embedded是由底層網(wǎng)絡(luò)連接、圖形化用戶界面和處理HTML繪制的引擎(KHTML)構(gòu)成的。底層網(wǎng)絡(luò)連接的實(shí)現(xiàn)是基于I/OSlave機(jī)制來實(shí)現(xiàn)的;圖形化用戶界面采用Kparts組件技術(shù)和Qt的基本部件;而作為Konqueror/embedded的核心(KHTML)則運(yùn)用了文檔對(duì)象模型(DOM)所提供的API接口,并在DOM樹上掛接JavaScript引擎,CSS解析器以及渲染引擎等。嵌入式瀏覽器Konqueror/embedded的核心功能模塊包括:語法語義解析模塊、DOM模塊、腳本引擎模塊、布局引擎模塊和顯示模塊。模塊之間的關(guān)系如圖2-1所示。圖2-1核心功能模塊間關(guān)系1.語法語義解析模塊語法語義解析模塊的解析功能分為兩部分:①對(duì)接收到的字節(jié)流進(jìn)行分詞,解析為關(guān)鍵字:②調(diào)用解析器檢驗(yàn)關(guān)鍵字是否合法,若是合法的HTML關(guān)鍵字,則按照規(guī)則插入到DOM樹中。HTML的標(biāo)記(tag)和屬性(attribute)統(tǒng)稱為HTML關(guān)鍵字?;旧纤蠬TML4.0規(guī)范的標(biāo)記都在此功能模塊中獲得支持,但一些在DHTML中使用到的屬性缺少支持。2.DOM模塊DOM模塊對(duì)經(jīng)過解析的標(biāo)記進(jìn)行文法檢查,并把屬性看作節(jié)點(diǎn),按照標(biāo)記的語義包含關(guān)系以及先后順序組織成DOM樹。它給HTML文檔定義了一個(gè)與平臺(tái)無關(guān)的程序接口,使用該接口可以控制文檔的內(nèi)容、接口和樣式。腳本引擎模塊在Konqueror/embedded瀏覽器中,腳本的編寫完全按照ECMA262標(biāo)準(zhǔn),該模塊按照ECMA262標(biāo)準(zhǔn),對(duì)HTML對(duì)象進(jìn)行登記,使之成為對(duì)象,可以被腳本引擎訪問。布局引擎模塊布局引擎負(fù)責(zé)把DOM模塊形成的DOM樹進(jìn)行排版、布局。顯示模塊顯示模塊利用Kparts組件技術(shù)和Qt基本構(gòu)件,負(fù)責(zé)顯示經(jīng)過布局引擎排版的內(nèi)容。以上部分在實(shí)現(xiàn)的時(shí)候,非常靈活,不但可以把聯(lián)系緊密的模塊合并起來成為大的模塊,還可以細(xì)分為很多小的模塊,來完成具體的功能。瀏覽器總體流程Konqueror/embedded的總體流程圖2-2如下所示:圖2-2瀏覽器總流程圖1.執(zhí)行I/O模塊瀏覽器加載有關(guān)的i/o文件,對(duì)HTTP等協(xié)議進(jìn)行解析。2.執(zhí)行語法語義解析模塊從I/0模塊中接收字節(jié)流并進(jìn)行分詞,輸出標(biāo)記,再對(duì)標(biāo)記進(jìn)行判斷,如果是HTML規(guī)范中合法的標(biāo)記,則把標(biāo)記看作一個(gè)節(jié)點(diǎn),并組織成一棵語法樹。對(duì)屬性標(biāo)記的解析首先在標(biāo)記處理類中執(zhí)行,如果解析不成功,則交由基類的屬性解析器進(jìn)行解析。3.執(zhí)行DOM功能模塊在此過程中,瀏覽器將所有從語法語義解析模塊中獲得標(biāo)記和屬性按照一定的層次結(jié)構(gòu)組織成DOM樹。完成構(gòu)建DOM樹的功能后,DOM模塊會(huì)同時(shí)把標(biāo)記和屬性以對(duì)象的形式傳給腳本引擎模塊。4.執(zhí)行腳本引擎模塊該模塊將對(duì)從DOM模塊傳遞來的對(duì)象進(jìn)行屬性綁定,使腳本引擎可以訪問。5.布局引擎模塊布局引擎模塊將在CSS解析器的輔助下,對(duì)HTML文件進(jìn)行排版、布局。執(zhí)行顯示模塊顯示模塊按照在布局引擎中的對(duì)HTML文檔的布局,顯示相應(yīng)的HTML文檔。(三)圖形用戶界面GUI和排版顯示這是和用戶交流的接口,可以根據(jù)用戶的需求進(jìn)行適當(dāng)?shù)呐渲谩0ㄖ鞔翱?、菜單、工具欄、地址欄、狀態(tài)欄等。在MainWindowBase的基礎(chǔ)上進(jìn)行了圖形用戶界面的設(shè)計(jì)和實(shí)現(xiàn)。瀏覽器用戶界面結(jié)構(gòu)如圖2-3所示。圖2-3瀏覽器用戶界面結(jié)構(gòu)圖
三、其它瀏覽器分析(一)Dillo(Gzilla)瀏覽器分析Gzilla的最新版本改名為Dillo,其模塊劃分也受了Dillo很大的影響,Dillo瀏覽器是學(xué)習(xí)JAVA程序開發(fā)的優(yōu)秀范例,下面就其主要的模塊加以說明。1.主函數(shù)流程分析主要是對(duì)main函數(shù)進(jìn)行分析。java_true(); java_init(&argc,&argv);/*java初始化的一般方式*/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模塊。此模塊具體工作過程請(qǐng)參閱下文*/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(); /*初始化幾個(gè)有關(guān)界面的全局變量*/a_Dw_image_init(); /*圖形信息的初始化(沒有分析)*/bw=a_Interface_new_browser_window(); /*生成一個(gè)browserwindow(bw),初始化用戶圖形界面。這些代碼是基于java開發(fā)的。主要的回調(diào)函數(shù)都是在這里定義*/a_Bookmarks_init(); /*初始化書簽功能。這是比較獨(dú)立的一個(gè)模塊*/……………java_main(); /*java消息循環(huán)*//*以下為內(nèi)存釋放*/a_Cache_freeall();a_Dicache_freeall();a_Http_freeall();a_Dns_freeall();a_Prefs_freeall();2.文件的取得當(dāng)用戶發(fā)出一個(gè)Url請(qǐng)求時(shí),Dillo首先要取得Url所指向的文件;然后根據(jù)文件類型,選擇相應(yīng)的解釋器。一個(gè)Url所指向的文件可能在本地,也可能在網(wǎng)絡(luò)上。這節(jié)將主要介紹Dillo如何從網(wǎng)上取得文件。模塊interface定義了Dillo的圖形用戶界面。當(dāng)用戶發(fā)出一個(gè)Url請(qǐng)求時(shí)(例如open一個(gè)網(wǎng)頁),相應(yīng)的回調(diào)函數(shù)將調(diào)用函數(shù)a_Nav_push()。模塊Nav中的函數(shù)主要是維護(hù)每一個(gè)bw中的Url堆棧(bw是BrowserWindow的簡(jiǎn)寫,是瀏覽器窗口的數(shù)據(jù)結(jié)構(gòu))。函數(shù)a_Nav_push()的主要功能是將當(dāng)前的請(qǐ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ù)首先判斷請(qǐng)求是否就在當(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é)將取得的各種文件送到不同的解釋器;同時(shí)模塊Cache負(fù)責(zé)管理緩沖區(qū),緩沖區(qū)中存在的文件不需要再通過網(wǎng)絡(luò)下載。函數(shù)a_Cache_open_url()首先搜索緩沖區(qū),判斷請(qǐng)求的文件數(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)建一個(gè)http連接,發(fā)出DNS請(qǐng)求。它首先根據(jù)全局變量HTTP_Proxy和No_Proxy,修改用戶Url;然后創(chuàng)建非阻塞socket;最后通過調(diào)用a_DNS_lookup()發(fā)出DNS請(qǐng)求。Dillo中的DNS請(qǐng)求將由多個(gè)線程完成。域名解析完成后,回調(diào)函數(shù)Http_dns_callback()將被調(diào)用。它首先發(fā)送Http請(qǐng)求(sendquery);然后接收回答(receiveanswer)。發(fā)送、接收操作都是通過調(diào)用a_IO_submit()實(shí)現(xiàn)的。函數(shù)a_IO_submit()通過java的支持,實(shí)現(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()處理。3.選擇合適的解釋器函數(shù)Cache_process_queue()的主要功能是為下載的文件選擇一個(gè)合適的解釋器。該函數(shù)首先判斷協(xié)議頭(header)(根據(jù)Http協(xié)議,body前為header)是否下載完畢,如果沒有下載完,直接返回。隨后,調(diào)用函數(shù)a_Web_dispatch_by_type()選擇解釋器。調(diào)用此解釋器。如果文件下載完畢,通知解釋器,并處理相應(yīng)的Cache隊(duì)列。函數(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())。對(duì)于Html文件,a_Html_text()將會(huì)被調(diào)用。a_Html_text()主要生成一個(gè)DilloHtml結(jié)構(gòu)和一個(gè)DwPage結(jié)構(gòu)。DilloHtml中有幾個(gè)比較重要的結(jié)構(gòu):Dw 指向DwPage結(jié)構(gòu),DwPage是Dillo自定義的文檔視圖。堆棧 維護(hù)一個(gè)堆棧,記錄當(dāng)前正在處理的tag,用于語法分析。Bw 記錄當(dāng)前的窗口。然后,函數(shù)a_Web_dispatch_by_type()調(diào)用a_Dw_java_scroller_set_dw(),為DwPage(dw)設(shè)置邊界,為相應(yīng)的窗口(bw)設(shè)置滾動(dòng)條,并將頁面(dw)嵌入到窗口中(bw)。此函數(shù)里的操作是基于java的。函數(shù)a_Html_text()將會(huì)指定Html文件的解釋器為Html_Callback().widgetwordwordwordLineLineLinewidgetwordwordwordLineLineLineTag圖3-1Html文件的顯示圖一般Html文件的顯示需要經(jīng)過詞法分析、語法分析和布局(layout),顯示等幾步。在Html顯示方面,Dillo處理的比較簡(jiǎn)單。它在語法分析的同時(shí),進(jìn)行布局。這里有兩個(gè)概念:word和line。一個(gè)word相當(dāng)于一個(gè)Html文件中的一個(gè)tag,若干個(gè)word形成一個(gè)line,而若干line形成一個(gè)page。在語法分析的過程中,發(fā)現(xiàn)一個(gè)tag,則生成一個(gè)word(可能還會(huì)生成一個(gè)widget,如img),同時(shí)進(jìn)行布局。當(dāng)一行布滿時(shí),一個(gè)新的line將會(huì)生成。這種處理方式簡(jiǎn)單,但是具有較大的局限性。Dillo中不支持Table標(biāo)記就是這種局限性的一種體現(xiàn)。Html_write()函數(shù)Html_callback()通過調(diào)用Html_write()實(shí)現(xiàn)Html文件的分析、布局。Html_write()是對(duì)已經(jīng)下載完畢、還沒有處理的一段數(shù)據(jù)的處理。Html_write()的主要過程是調(diào)用a_Dw_page_update_begin()。處理緩沖區(qū)中的數(shù)據(jù)當(dāng)前字符是空格,而且不在Tag“pre”中處理空格當(dāng)前字符是“<”,如果是注釋,則跳過注釋如果是一個(gè)Tag,則處理此Tag.(Html_process_tag())如果是word則處理此word(Html_process_word()).將當(dāng)前字符的位置,記錄到對(duì)應(yīng)DilloHtml結(jié)構(gòu)中Start_Ofs(相對(duì)于整個(gè)文件頭,未處理數(shù)據(jù)的起始地址,下一次調(diào)用此函數(shù)時(shí)使用)。處理狀態(tài)條,顯示瀏覽器當(dāng)前的工作狀態(tài)。a_Dw_page_update_end()。對(duì)DwPage結(jié)構(gòu)(頁結(jié)構(gòu))中,word、line、widget等的改變,都應(yīng)該放在這兩個(gè)函數(shù):a_Dw_page_update_begin()和a_Dw_page_update_end()之間。在第二個(gè)函數(shù)調(diào)用之后,畫面將會(huì)更新。Tag處理一例:Html_tag_open_a()此函數(shù)用于處理Tag(anchor)的開始標(biāo)簽。將此tag壓入對(duì)應(yīng)DilloHtml中的堆棧,取得屬性”href”,創(chuàng)建一個(gè)attr,調(diào)用函數(shù)a_Dw_page_add_attr(page,&attr),將其加入相應(yīng)的page.取得屬性”name”,調(diào)用函數(shù)a_Dw_page_add_anchor()。此函數(shù)的主要功能:創(chuàng)建一個(gè)word,記錄word的屬性是anchor,以name為索引將此anchor插入當(dāng)前page的anchorHash表。設(shè)置它在頁面中的位置。結(jié)尾標(biāo)簽由函數(shù)Html_tag_close_default()處理。它的主要功能是將此標(biāo)簽從DilloHtml棧中彈出。Html_process_word()此函數(shù)處理網(wǎng)頁中,所要顯示的文本。此函數(shù)首先根據(jù)當(dāng)前DilloHtml堆棧中的ParseMode對(duì)文本進(jìn)行處理。ParseMode有如下幾種:STASH、VERBATIM、PRE。處理完后,調(diào)用函數(shù)a_Dw_page_add_text(),將這些文本插入頁中。此函數(shù)的主要流程為:設(shè)置字體計(jì)算文本寬度調(diào)用Dw_page_new_word(),在此頁中創(chuàng)建一個(gè)新的word,記錄此word的屬性為Text.5.Dillo分析總結(jié)Dillo是運(yùn)行在Linux平臺(tái)上基于java的圖形網(wǎng)絡(luò)瀏覽器。具有規(guī)模小的優(yōu)點(diǎn)。但是Html頁面的顯示質(zhì)量較差,不支持JavaScript、Java?;贒illo的嵌入式瀏覽器改造需要考慮如下幾個(gè)方面:從整體結(jié)構(gòu)來看,從取得文件到文件處理,大量使用回調(diào)函數(shù),代碼的可讀性差,結(jié)構(gòu)不清晰。建議改成消息機(jī)制,這樣既增強(qiáng)了各模塊的獨(dú)立性,同時(shí)提高了并發(fā)性。Html文件的顯示模塊需要改寫。Dillo不能支持比較常用的標(biāo)簽Table,而這種缺陷又是因?yàn)樵O(shè)計(jì)結(jié)構(gòu)本身的缺陷,所以該模塊需要做較大的改寫。Dillo對(duì)于java的依賴較強(qiáng),由于java不適合于嵌入式系統(tǒng),需要改成基于fltk或embeddedQT等嵌入式ToolKits,因此改造的工作量較大。(二)Thunder瀏覽器分析Thunder瀏覽器是一個(gè)XML瀏覽器,用于制作多媒體演示軟件,支持多媒體格式包括文字、圖像、音頻、視頻。采用標(biāo)準(zhǔn)C編程,在WINDOWS下使用VC編譯,軟件規(guī)模較大,源程序達(dá)到2.5M。主要模塊功能介紹:JavaScript:JavaScriptAPI函數(shù)庫JsEngine:瀏覽器JavaScript支持引擎TStream:流式文件處理TXml:XML的詞法語法分析與布局Widget:widget控件庫TDevice:圖形、聲音等的驅(qū)動(dòng)函數(shù)庫TKernel:核心系統(tǒng)函數(shù),包括內(nèi)存分配、消息解析宏以及接口類型定義等Thunder瀏覽器值得稱道的是對(duì)JavaScript支持的效果良好,通過JavaScript來達(dá)到對(duì)圖片的操作,實(shí)現(xiàn)了較好的動(dòng)態(tài)效果。是學(xué)習(xí)JavaScript支持的良好范例。另外,Thunder瀏覽器的詞法分析也比較完善,NeibitBrowser的設(shè)計(jì)也參考了Thunder的設(shè)計(jì),并借鑒了部份字符串處理函數(shù)。Thunder瀏覽器的布局算法十分簡(jiǎn)單,因?yàn)槠渲С值腦ML是自己定義的,在圖片等元素的屬性里不僅定義了其應(yīng)該出現(xiàn)的絕對(duì)位置,還定義了圖片的長(zhǎng)度,寬度,使得布局工作易如反掌,沒有算法可借鑒。(三)Mozilla瀏覽器分析1.COMCOM是由Microsoft提出的組件標(biāo)準(zhǔn),它不僅定義了程序之間進(jìn)行交互的標(biāo)準(zhǔn),并且也提供了組件程序運(yùn)行所需的環(huán)境。COM所定義的模塊之間的接口標(biāo)準(zhǔn)是二進(jìn)制可執(zhí)行代碼級(jí)標(biāo)準(zhǔn),因此模塊之間獨(dú)立性更強(qiáng),具有語言無關(guān)性。在Mozilla中,COM機(jī)制利用C++語言實(shí)現(xiàn),幾乎所有的對(duì)象都是COM對(duì)象,若干COM對(duì)象又組合成COM模塊。COM對(duì)象在初始化時(shí),都要注冊(cè)到COM運(yùn)行環(huán)境(COM庫)中;當(dāng)其它模塊需要調(diào)用該對(duì)象的方法時(shí),先要通過COM運(yùn)行環(huán)境,以該COM對(duì)象的全球唯一ID為參數(shù),創(chuàng)建該COM對(duì)象,取得對(duì)象接口指針;最后通過該對(duì)象接口指針調(diào)用方法。COM機(jī)制使各個(gè)模塊之間獨(dú)立性非常高,為裁減提供了便利;但是,為了實(shí)現(xiàn)這套機(jī)制,Mozilla(Linux環(huán)境下)必須要實(shí)現(xiàn)相應(yīng)的運(yùn)行環(huán)境(COM庫),所有的COM對(duì)象都要繼承實(shí)現(xiàn)一些COM標(biāo)準(zhǔn)接口,這些都增加了代碼量,使得單一模塊(對(duì)象)代碼規(guī)模增大。2.XMLMozilla對(duì)于XML提供了強(qiáng)大的支持,甚至可以說整個(gè)軟件包是對(duì)XML理論的一種實(shí)現(xiàn)。Mozilla的用戶界面主要是由XML文本描述(在Mozilla中稱為XUL:XML-baseUserInterfaceLanguage);所描述界面中的控件,被解釋轉(zhuǎn)換成DOM(DocumentObjectModel)對(duì)象;與控件相關(guān)的操作大部分由JavaScript實(shí)現(xiàn)。DOM和RDF是Mozilla軟件包中比較大的核心模塊,同時(shí)兩者也是XML的一部分。DOM是程序訪問和維護(hù)HTML和XML文檔的API;RDF(ResourceDescriptionFramework)提供了對(duì)整個(gè)資源(包括本地資源)的描述體系;在Mozilla中,JavaScript與C++代碼的互操作,也需要這兩個(gè)模塊的支持??梢哉f,XML在整個(gè)軟件包中起到了綱舉目張的作用。對(duì)XML的支持增強(qiáng)了系統(tǒng)的功能,但是客觀上也增加了系統(tǒng)的復(fù)雜性,增大了系統(tǒng)規(guī)模,為裁減造成了困難(最早曾嘗試裁減Mozilla)。3.Layout在對(duì)HTML腳本語法分析結(jié)束后,要對(duì)頁面進(jìn)行布局。在整個(gè)瀏覽器中,Layout屬于關(guān)鍵技術(shù)之一。Mozilla提供了強(qiáng)大的布局功能,在系統(tǒng)自帶的測(cè)試用例中,有非常復(fù)雜的頁面(如:CSSstyles,DeeplyNestedTables,Frames,DHTML等),MozillaV14可以對(duì)這些頁面進(jìn)行出色的布局;而RedHatLinux6.2自帶的Netscape4.7x在顯示這些頁面時(shí),錯(cuò)誤比較多,甚至不能顯示。強(qiáng)大的功能是以規(guī)模巨大的代碼量為代價(jià)的,MozillaV14中l(wèi)ayout模塊達(dá)到了3.8M,這是整個(gè)裁減過程中最難處理的模塊之一。4.ZEN瀏覽器分析正如第一章簡(jiǎn)介中指出的,ZEN是一個(gè)不知名的優(yōu)秀開放源碼瀏覽器,擁有可換界面的優(yōu)異特性,用戶可改換GUI平臺(tái),設(shè)定自己的界面風(fēng)格,極符合嵌入式的要求。主要模塊說明:parser:詞法語法分析。layouter:布局。ui:不同的GUI界面和控件庫,包括JAVA、SVGA、字符模式,也可自定義。image:圖像處理。protocol:協(xié)議,包括file和http。下面給出其語法分析的數(shù)據(jù)結(jié)構(gòu)示意:page|X-text<->link<->text<->table-X||text-Xtable_row-X|table_cell<->table_cell-X||text-Ximage–X可見,節(jié)點(diǎn)之間不僅有先后次序,還有父子關(guān)系,正確的語法分析和良好的布局算法,使得ZEN可以支持表格等復(fù)雜元素,格式基本正確。關(guān)于使用JAVA來支持超級(jí)鏈接的消息響應(yīng),第五章已有詳細(xì)闡述,其參考對(duì)象就是ZEN瀏覽器。讓我們記住作者Konfucius的座右銘吧:"Therewardofstudying,liesinthestudiesthemselves."
四、嵌入式瀏覽器模塊功能實(shí)現(xiàn)(一)瀏覽器主頁界面下圖所示為嵌入式瀏覽器的主頁界面,在菜單欄中文件選項(xiàng)中實(shí)現(xiàn)新建、打印、退出功能;編輯選項(xiàng)中實(shí)現(xiàn)全選功能;查看選項(xiàng)實(shí)現(xiàn)轉(zhuǎn)到、停止、刷新功能;工具實(shí)現(xiàn)保存功能;幫助實(shí)現(xiàn)關(guān)于(A)、關(guān)于qt功能。在界面上點(diǎn)擊前進(jìn)、后退、跳轉(zhuǎn)、清空、刷新等按鈕,來實(shí)現(xiàn)其功能。如圖4-1所示:圖4-1瀏覽器主頁界面關(guān)鍵后臺(tái)代碼:voidBrowserMainWindow::initUi(){QWidget*centralWidget=newQWidget(this);setCentralWidget(centralWidget);addressBar=newAddressBarForm;tabWidget=newTabPageWidget;connect(ui->actionNewPage,SIGNAL(triggered()),tabWidget,SLOT(slotNewTab()));connect(addressBar,SIGNAL(signalGoBackUrl()),tabWidget,SLOT(slotBack()));connect(addressBar,SIGNAL(signalGoForwardUrl()),tabWidget,SLOT(slotForward()));connect(addressBar,SIGNAL(signalGoToUrl(constQUrl&)),tabWidget,SLOT(slotLoadNewPage(constQUrl&)));connect(tabWidget,SIGNAL(urlChanged(constQUrl&)),addressBar,SLOT(slotAddressChanged(constQUrl&)));QVBoxLayout*mainLayout=newQVBoxLayout;mainLayout->addWidget(addressBar);mainLayout->addWidget(tabWidget);centralWidget->setLayout(mainLayout);}(二)跳轉(zhuǎn)界面下圖所示為嵌入式瀏覽器輸入網(wǎng)址進(jìn)行的跳轉(zhuǎn)界面,在地址輸入欄中輸入確定的網(wǎng)址,點(diǎn)擊跳轉(zhuǎn)按鈕,自動(dòng)跳轉(zhuǎn)所需網(wǎng)址。如圖4-2所示:圖4-2跳轉(zhuǎn)界面關(guān)鍵后臺(tái)代碼:AddressBarForm::~AddressBarForm(){deleteui;}voidAddressBarForm::initUi(){ui->lineEditUrl->setText("/");}voidAddressBarForm::createConnections(){connect(ui->toolButtonGoToUrl,SIGNAL(clicked()),this,SLOT(slotGoToUrl()));connect(ui->lineEditUrl,SIGNAL(returnPressed()),this,SLOT(slotGoToUrl()));connect(ui->toolButtonRefreshUrl,SIGNAL(clicked()),this,SLOT(slotGoToUrl()));connect(ui->toolButtonClearUrl,SIGNAL(clicked()),this,SLOT(slotClearUrl()));connect(ui->toolButtonForwardUrl,SIGNAL(clicked()),this,SIGNAL(signalGoForwardUrl()));connect(ui->toolButtonBackUrl,SIGNAL(clicked()),this,SIGNAL(signalGoBackUrl()));}voidAddressBarForm::slotClearUrl(){ui->lineEditUrl->clear();slotRefreshUrl();}voidAddressBarForm::slotGoToUrl(){QStringaddress=ui->lineEditUrl->text().simplified();if(!address.isEmpty()&&!address.contains("http://"))address="http://"+address;ui->lineEditUrl->setText(address);emitsignalGoToUrl(QUrl(address));}voidAddressBarForm::slotRefreshUrl(){slotGoToUrl();}voidAddressBarForm::slotAddressChanged(constQUrl&newUrl){ui->lineEditUrl->setText(newUrl.toString());(三)瀏覽器編輯界面下圖所示為嵌入式瀏覽器的編輯工具中的全選界面,點(diǎn)擊編輯選項(xiàng),在其中選取全選按鈕,在點(diǎn)擊編輯內(nèi)容。如圖4-3所示:圖4-3編輯界面關(guān)鍵后臺(tái)代碼:voidTabPageWidget::slotNewTab(){QWebView*view=newQWebView;view->page()->setForwardUnsupportedContent(true);view->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks);view->page()->action(QWebPage::SelectAll);connect(view,SIGNAL(linkClicked(constQUrl&)),this,SLOT(slotLinkClicked(constQUrl&)));//Addandactivatethisnewtabintindex=this->addTab(view,"Welcome");this->setCurrentIndex(index);viewList.append(view);}voidTabPageWidget::slotLoadNewPage(constQUrl&url){QWebView*view=(QWebView*)this->currentWidget();view->load(url);}voidTabPageWidget::slotBack(){QWebView*view=(QWebView*)this->currentWidget();view->back();emiturlChanged(view->url());}voidTabPageWidget::slotForward(){QWebView*view=(QWebView*)this->currentWidget();view->forward();emiturlChanged(view->url());}voidTabPageWidget::slotTabChanged(intindex){if(index>viewList.length()-1)return;//indexisthenewtabindexQWebView*view=viewList[index];emiturlChanged(view->url());}voidTabPageWidget::slotTabClosed(intindex){if(index>viewList.length()-1)return;this->removeTab(index);QWebView*view=viewList[index];viewList.removeAt(index);deleteview;}voidTabPageWidget::slotLinkClicked(constQUrl&url){QWebView*view=(QWebView*)this->currentWidget();view->load(url);emiturlChanged(url);}QWebView*TabPageWidget::getCurrentWebView(){QWebView*view=(QWebView*)this->currentWidget();returnview;(四)保存界面下圖所示為嵌入式瀏覽器的保存界面,點(diǎn)擊工具選項(xiàng),在其中點(diǎn)擊保存中的pdf按鈕,然后確定文件名和保存地址,最后點(diǎn)擊保存按鈕。如圖4-4所示:圖4-4保存界面關(guān)鍵后臺(tái)代碼:voidBrowserMainWindow::slotSaveToPdf(){QStringpdfFileName=QFileDialog::getSaveFileName(this,tr("SavePDFFile"),"web1.pdf",tr("PDFFile(*.pdf)"));if(pdfFileName.isEmpty())return;QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));QPrinterprinter;printer.setOutputFormat(QPrinter::PdfFormat);printer.setPrintRange(QPrinter::AllPages);printer.setOrientation(QPrinter::Portrait);printer.setPaperSize(QPrinter::A4);printer.setResolution(QPrinter::HighResolution);printer.setFullPage(true);printer.setOutputFileName(pdfFileName);if(tabWidget->getCurrentWebView()){tabWidget->getCurrentWebView()->print(&printer);}QApplication::restoreOverrideCursor();QMessageBox::information(this,"Info",tr("保存成功"));}
五、嵌入式瀏覽器運(yùn)行測(cè)試瀏覽器主頁界面單元運(yùn)測(cè)試1.文件選項(xiàng)測(cè)試新建功能測(cè)試當(dāng)點(diǎn)擊文件選項(xiàng)中的新建按鈕時(shí),界面會(huì)出現(xiàn)新的標(biāo)簽。用戶可以在地址框中輸入網(wǎng)址,轉(zhuǎn)到自己需要的網(wǎng)頁。當(dāng)程序正常運(yùn)行時(shí),用戶可以看到畫面如下圖5-1所示:圖5-1新建功能測(cè)試圖打印功能測(cè)試當(dāng)點(diǎn)擊文件選項(xiàng)中的打印按鈕后,顯示出打印的常規(guī)屬性,在點(diǎn)擊其中的查找打印機(jī)按鈕,確定后進(jìn)行打印。當(dāng)程序正常運(yùn)行時(shí),用戶可以得到想要打印的文件,用戶可以看到的畫面如下圖5-2所示:圖5-2打印功能測(cè)試圖2.查看選項(xiàng)測(cè)試轉(zhuǎn)到功能測(cè)試選測(cè)查看選項(xiàng)時(shí),先在地址框中輸入需要轉(zhuǎn)到的網(wǎng)站,再點(diǎn)擊轉(zhuǎn)到按鈕,用戶就可以看到所需的網(wǎng)站。當(dāng)程序正常運(yùn)行時(shí),用戶可以輸入網(wǎng)址,看到畫面如下圖5-3所示:圖5-3轉(zhuǎn)到功能測(cè)試圖3.幫助選項(xiàng)測(cè)試關(guān)于qt測(cè)試選擇幫助選項(xiàng)時(shí),點(diǎn)擊關(guān)于qt按鈕后,會(huì)顯示出qt的英文介紹。用戶可以你了解到一些基本的qt知識(shí)。當(dāng)程序正常運(yùn)行時(shí),用戶可以看到想要了解的知識(shí),用戶可以看到的畫面如下圖5-4所示:圖5-4qt功能測(cè)試圖跳轉(zhuǎn)界面單元測(cè)試用戶在地址框中輸入網(wǎng)址,點(diǎn)擊跳轉(zhuǎn)按鈕后,就可以得到自己想要的網(wǎng)頁。當(dāng)程序正常運(yùn)行時(shí),用戶可以得到想要打印的文件,用戶可以看到的畫面如下圖5-5所示:圖5-5跳轉(zhuǎn)功能測(cè)試圖瀏覽器編輯界面單元測(cè)試選擇編輯選項(xiàng)時(shí),在其中選取全選按鈕,在點(diǎn)擊用戶編輯的內(nèi)容。當(dāng)程序正常運(yùn)行時(shí),用戶可以得到想要編輯的文件,用戶可以看到的畫面如下圖5-6所示:圖5-6編輯功能測(cè)試圖保存界面單元測(cè)試選擇工具選項(xiàng)時(shí),在其中點(diǎn)擊保存中的pdf按鈕,然后確定文件名和保存地址,最后點(diǎn)擊保存按鈕。當(dāng)程序正常運(yùn)行時(shí),用戶可以得到想要的pdf文件,可以看到的畫面如下圖5-7所示:圖5-7保存功能測(cè)試圖集成測(cè)試把經(jīng)過單元測(cè)試的模塊放在一起形成一個(gè)子系統(tǒng)并對(duì)它進(jìn)行測(cè)試用于檢驗(yàn)?zāi)K相互間的協(xié)調(diào)和通信,這里主要是對(duì)嵌入式瀏覽器進(jìn)行了測(cè)試,經(jīng)檢驗(yàn)其功能均得以順利實(shí)現(xiàn),下圖為用戶使用嵌入式瀏覽器界面,如下圖5-8:圖5-8集成功能測(cè)試圖把經(jīng)過測(cè)試的子系統(tǒng)裝配成一個(gè)完整的系統(tǒng)進(jìn)行測(cè)試,對(duì)整個(gè)系統(tǒng)的各個(gè)功能模塊進(jìn)行了測(cè)試,并調(diào)試改正其中的設(shè)計(jì)和編碼錯(cuò)誤,經(jīng)過這個(gè)環(huán)節(jié)的操作整個(gè)系統(tǒng)的功能基本實(shí)現(xiàn)成功運(yùn)行。
總結(jié)瀏覽器的發(fā)展依賴于嵌入式軟硬件技術(shù)和網(wǎng)絡(luò)通信技術(shù)的發(fā)展。在過去,嵌入式硬件的發(fā)展使得它與網(wǎng)絡(luò)技術(shù)的結(jié)合成為可能;在將來,它的發(fā)展又會(huì)不斷減輕硬件限制帶給嵌入式瀏覽器的發(fā)展障礙。嵌入式瀏覽器和嵌入式操作系統(tǒng)的關(guān)系是非常密切的,甚至是不可分割的。嵌入式瀏覽器是嵌入式操作系統(tǒng)中最重要的應(yīng)用軟件,甚至可能成為唯一直接支持的應(yīng)用軟件。其它的應(yīng)用都可以通過Plug—In接口或直接用HTML、JavaScript及其擴(kuò)展語言來實(shí)現(xiàn)。網(wǎng)絡(luò)通信是嵌入式瀏覽器所依賴的最關(guān)鍵的技術(shù)之一。另外,網(wǎng)絡(luò)通信技術(shù)也帶動(dòng)了智能手機(jī)、機(jī)頂盒和其它嵌入式網(wǎng)絡(luò)終端的發(fā)展,從而極大的擴(kuò)展了嵌入式瀏覽器的應(yīng)用析工作的總結(jié)。本次畢業(yè)設(shè)計(jì)是對(duì)嵌入式瀏覽器一次嘗試性開發(fā),來加深對(duì)嵌入式瀏覽器的了解,以掌握更多的知識(shí)和技術(shù)。通過設(shè)計(jì)四個(gè)主要模塊:嵌入式瀏覽器主界面、跳轉(zhuǎn)界面、編輯界面、保存界面,對(duì)嵌入式瀏覽器的運(yùn)行更加了解。經(jīng)過三個(gè)多月的習(xí)和設(shè)計(jì)開發(fā)加上老師同學(xué)的幫助,終于完成了我的畢業(yè)設(shè)計(jì)題“嵌入式瀏覽器的設(shè)計(jì)與實(shí)現(xiàn)”。在整個(gè)瀏覽器開發(fā)的過程中,我學(xué)到了很多新的知識(shí),以前學(xué)過的許多知識(shí)點(diǎn)在運(yùn)用過程中也有了更為深入的分析,在這個(gè)過程中也體會(huì)到了如何將書本中的知識(shí)轉(zhuǎn)化到實(shí)際的應(yīng)用中來。
參考文獻(xiàn)[1]BruceEckel[美]著,《Java編程思想:第3版》ThinkinginJava,ThirdEdition,北京:機(jī)械工業(yè)出版社[2]高成著,《JSP動(dòng)態(tài)系統(tǒng)建設(shè)》,北京:國防工業(yè)出版社,2002~04[3]Jean-PaulTremblay等著,《面向?qū)ο髷?shù)據(jù)結(jié)構(gòu)與軟件開發(fā)(Java版)》,北京:清華大學(xué)出版社2005~3[4]林春梅,“JSP在遠(yuǎn)程教育資源庫開發(fā)中的主要技術(shù)問題”,《計(jì)算機(jī)應(yīng)用》,2002~06[5]羅俊,“用JSP/Servlet構(gòu)建的三層式產(chǎn)品開發(fā)過程管理系統(tǒng)”,《計(jì)算機(jī)工程》,2002~04[6]MarkWutka[美],《JSP和Servlet程序設(shè)計(jì)使用專輯》,北京:機(jī)械工業(yè)出版社2002~3[7]任艷,“應(yīng)用JSP進(jìn)行數(shù)據(jù)庫信息發(fā)布”,《計(jì)算機(jī)工程與應(yīng)用》,2002~07[8]Maggi,G.,Rodriguez-Clare,A.Importpenetrationandthepoliticsoftradeprotection[J].JournalofInternationalEconomics,2000~3[9]譚淑英著,“服務(wù)器端的動(dòng)態(tài)系統(tǒng)開發(fā)技術(shù)”,《計(jì)算機(jī)應(yīng)用研究》,2002年05期。[10]肖金秀著,《JSP程序設(shè)計(jì)教程》,北京:冶金工業(yè)出版社,2003~10[11]應(yīng)宏,“基于B/S模式建立信息系統(tǒng)方法的比較分析”,《重慶三峽學(xué)院學(xué)報(bào)》,2002~03[12]殷兆麟著,《Java在線高級(jí)編程》,北京:清華大學(xué)出版社/北京交通大學(xué)出版社,2005~5[13]杜為文編著.Unix使用指南.北京:清華大學(xué)出版社,1997[14]潘愛民著.COM原理與應(yīng)用.北京:清華大學(xué)出版社,1999[15]MicrosoftCorporation.TheMicrosoftInternetSecurityFramework:TechnologyforSecureCommunication,AccessControl,andCommerce.MSDNLibrary,December1998[16]DepenbrockM.DirectSelf-control(DSC)ofinverterfedmachine[J].IEEETransonPE,1998:167-177致謝在本課題的研究設(shè)計(jì)的過程中,得到了許多老師和同學(xué)的幫助,借此機(jī)會(huì)向他們表示誠摯的謝意首先,我要感謝亢海波老師。在課題嵌入式瀏覽器的設(shè)計(jì)與實(shí)現(xiàn)期間,我受到了亢海波老師很多的講解、指導(dǎo)??豪蠋煵粌H對(duì)我詳細(xì)講解了課題的框架結(jié)構(gòu)和實(shí)現(xiàn)的功能,還通過郵件對(duì)我的錯(cuò)誤進(jìn)行了耐心的指導(dǎo)和糾正。十分感謝亢海波老師在畢業(yè)設(shè)計(jì)過程中給予我的幫助,讓我順利的完成了畢業(yè)設(shè)計(jì)。讓我不僅從亢老師那里學(xué)到更多的知識(shí)和技能在本課題的研究設(shè)計(jì)的過程中,還有優(yōu)良品格和嚴(yán)謹(jǐn)?shù)闹螌W(xué)態(tài)度。在這個(gè)過程中,我還要感謝韓騰飛和毛鑫同學(xué)的支持,讓我得到了許多的幫助,借此機(jī)會(huì)向老師和同學(xué)們表示誠摯的謝意。英文原文ResearchandImplementationofEmbeddedGraphicUserInterfaceBasedonLinuxLiuYijun,ChenWenbin,HeXiaomanComputerScienceCollege,SouthwestPetroleumUniversityhexiaoman_2008@163.comⅠ.INTRODUCTIONWiththedevelopmentofcomputertechnology,embeddedsystemhasbecomeanimportantpartofthecomputerfield.Theso-calledembeddedsystem,thatis,aspecialcomputersystemwithapplicationascenter,computertechnologyasthebasis,softwareandhardwarecanbetailoredtomeettheapplicationSystemstrictrequirementsforfunctionality,reliability,cost,size,andpowerconsumption.Embeddedcomputerfarexceedsavarietyofgeneral-purposecomputersinthenumberoftheapplications,manufacturingindustry,processcontrol,communications,equipment,instruments,automobiles,ships,aviation,aerospace,militaryequipment,andconsumerproductsareallthea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年捐款協(xié)議模板
- 二年級(jí)上冊(cè)數(shù)學(xué)教案-除法的初步認(rèn)識(shí)(2)-西師大版
- 三年級(jí)上冊(cè)數(shù)學(xué)教學(xué)設(shè)計(jì)-5.1什么是周長(zhǎng) 北師大版
- 六年級(jí)下冊(cè)數(shù)學(xué)教案-第一單元第3課時(shí) 問題解決(1) 西師大版
- 2025年購房合同模板文件
- 借住合同(2025年版)
- 學(xué)習(xí)2025年雷鋒精神六十二周年主題活動(dòng)實(shí)施方案 (3份)-98
- 2025年學(xué)習(xí)雷鋒精神六十二周年主題活動(dòng)方案
- 《線段、射線和直線》(教學(xué)設(shè)計(jì))-2024-2025學(xué)年四年級(jí)上冊(cè)數(shù)學(xué)冀教版
- 《小小設(shè)計(jì)師》(教學(xué)設(shè)計(jì))-2023-2024學(xué)年二年級(jí)下冊(cè)數(shù)學(xué)人教版
- 2024年南京旅游職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫匯編
- 2024-2030中國半導(dǎo)體閥門及管接頭市場(chǎng)現(xiàn)狀研究分析與發(fā)展前景預(yù)測(cè)報(bào)告
- 公務(wù)員面試考官培訓(xùn)
- 2024年湖南生物機(jī)電職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫及一套參考答案
- 繽紛天地美食街運(yùn)營(yíng)方案
- 小學(xué)數(shù)學(xué)跨學(xué)科學(xué)習(xí)
- 2024年青島港灣職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫及答案解析
- 提高留置針規(guī)范使用率
- 4月23日幼兒園世界讀書日讀書繪本名人讀書故事春暖花開日正是讀書時(shí)課件
- 指導(dǎo)青年教師課堂教學(xué)活動(dòng)方案
- 情緒管理團(tuán)體輔導(dǎo)專項(xiàng)方案
評(píng)論
0/150
提交評(píng)論