999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Linux中瀏覽器兼容ActiveX控件機(jī)制的設(shè)計(jì)與實(shí)現(xiàn)

2017-11-01 17:14:41馮博文汲如意于佳耕
關(guān)鍵詞:機(jī)制

馮博文 汲如意 于佳耕

1(中國科學(xué)院大學(xué) 北京 100190)

2(中國科學(xué)院軟件研究所互聯(lián)網(wǎng)軟件技術(shù)實(shí)驗(yàn)室 北京 100190)

Linux中瀏覽器兼容ActiveX控件機(jī)制的設(shè)計(jì)與實(shí)現(xiàn)

馮博文1,2汲如意1,2于佳耕2

1(中國科學(xué)院大學(xué) 北京 100190)

2(中國科學(xué)院軟件研究所互聯(lián)網(wǎng)軟件技術(shù)實(shí)驗(yàn)室 北京 100190)

目前,瀏覽器已經(jīng)成為計(jì)算機(jī)系統(tǒng)中不可缺少的組成部分。然而,全球市場(chǎng)份額最高的Internet Explorer瀏覽器,其廣泛應(yīng)用的ActiveX控件卻無法運(yùn)行在Linux操作系統(tǒng)的瀏覽器中。因此,研究了兩種瀏覽器插件框架,NPAPI和ActiveX,提出了一種兼容機(jī)制。該機(jī)制為中間件解決方案,一端面向NPAPI,另一端面向Wine中經(jīng)封裝的ActiveX控件,實(shí)現(xiàn)NPAPI和ActiveX控件間的消息傳輸和轉(zhuǎn)換。實(shí)驗(yàn)結(jié)果表明,兼容機(jī)制實(shí)現(xiàn)了ActiveX控件運(yùn)行在Linux操作系統(tǒng)的瀏覽器中,且加載時(shí)間、運(yùn)行效率和內(nèi)存占用均在可接受的范圍內(nèi),為ActiveX控件跨平臺(tái)技術(shù)提供了一種新的方法。

ActiveX控件 跨平臺(tái) Linux NPAPI WebKit

0 引 言

瀏覽器為在因特網(wǎng)檢索、呈現(xiàn)和瀏覽信息的一種軟件,它可以顯示網(wǎng)頁內(nèi)容并允許用戶與之交互。瀏覽器插件則為本地二進(jìn)制代碼,當(dāng)瀏覽器自身的功能無法滿足網(wǎng)頁需求時(shí),瀏覽器將加載插件,并借助插件實(shí)現(xiàn)的功能。目前,瀏覽器作為因特網(wǎng)世界的入口,已經(jīng)成為各大軟件廠商的必爭(zhēng)之地。其中,Internet Explorer瀏覽器(簡稱IE瀏覽器)在全球的市場(chǎng)份額最高[1]。IE瀏覽器為微軟開發(fā)的瀏覽器,憑借Windows操作系統(tǒng)的壟斷地位,在國內(nèi)的電子支付、在線辦公等領(lǐng)域仍然具有重要的地位[2],但至今尚不能運(yùn)行在Linux操作系統(tǒng)的瀏覽器中。

隨著發(fā)行版用戶體驗(yàn)的逐步提升,Linux 操作系統(tǒng)在桌面領(lǐng)域也存在大量用戶。如果能夠使ActiveX控件運(yùn)行在Linux操作系統(tǒng)的瀏覽器中,無論對(duì)重復(fù)利用現(xiàn)有的系統(tǒng)(如網(wǎng)上銀行、企事業(yè)單位在線辦公網(wǎng)站等),節(jié)約重復(fù)開發(fā)的成本,或者對(duì)Linux操作系統(tǒng)的推廣,都具有重要的現(xiàn)實(shí)意義。

目前,針對(duì)跨平臺(tái)運(yùn)行二進(jìn)制代碼的技術(shù)已經(jīng)存在一些研究成果,主要分為兩個(gè)方向:系統(tǒng)級(jí)虛擬化和庫級(jí)虛擬化[3-4]。系統(tǒng)級(jí)虛擬化即虛擬機(jī)技術(shù),指在一臺(tái)物理計(jì)算機(jī)上,虛擬出一個(gè)或多個(gè)邏輯計(jì)算機(jī),邏輯計(jì)算機(jī)相對(duì)獨(dú)立,可以運(yùn)行不同的操作系統(tǒng)和應(yīng)用程序,其代表軟件為VirtualBox和VMWare等。用戶可以在Linux 操作系統(tǒng)中創(chuàng)建Windows操作系統(tǒng)的虛擬機(jī),但虛擬機(jī)需要較高的硬件資源,特別需要支持VT-x或AMD-V技術(shù)的處理器才能具有較好的效果。僅因?yàn)樾枰獮g覽含有ActiveX控件的網(wǎng)頁而讓用戶配置啟動(dòng)復(fù)雜的虛擬機(jī),十分不方便,并且采用虛擬機(jī)仍然沒有擺脫Windows操作系統(tǒng)。庫級(jí)虛擬化的代表為開源項(xiàng)目Wine,Wine為POSIX操作系統(tǒng)中轉(zhuǎn)換Windows API的兼容層[5]。Wine沒有模擬一個(gè)完整的計(jì)算機(jī),而是將二進(jìn)制代碼中對(duì)Windows API的調(diào)用轉(zhuǎn)換為POSIX調(diào)用,同時(shí)啟動(dòng)wineserver守護(hù)進(jìn)程模擬Windows內(nèi)核,為在Wine中的程序提供調(diào)度、Windows消息機(jī)制等內(nèi)核功能。若將IE瀏覽器整體移植至Wine中,技術(shù)難度較大。瀏覽器內(nèi)核代碼量級(jí)為百萬行級(jí),其復(fù)雜度不亞于操作系統(tǒng)內(nèi)核,且IE瀏覽器與Windows操作系統(tǒng)高度耦合。開源項(xiàng)目IEs 4 Linux嘗試將IE瀏覽器移植至Wine中,主要面向Web開發(fā)者測(cè)試網(wǎng)頁在IE瀏覽器中的布局渲染效果,僅支持IE瀏覽器的舊版本,于08年停止維護(hù)。

此外,開源項(xiàng)目FireBreath專門針對(duì)跨平臺(tái)瀏覽器插件提供了開發(fā)框架[6]。若基于FireBreath提供的開發(fā)框架,則需要獲取ActiveX控件的源代碼并做二次開發(fā)。然而,在目前的條件下無法獲取ActiveX控件的源代碼,并且針對(duì)ActiveX控件的二次開發(fā)代價(jià)較大。

采用現(xiàn)有的解決方案具有諸多的缺點(diǎn),因此,本文提出了一種在Linux操作系統(tǒng)中瀏覽器兼容ActiveX控件的機(jī)制。該機(jī)制一端面向NPAPI,一端面向Wine中經(jīng)封裝的ActiveX控件,實(shí)現(xiàn)了NPAPI和ActiveX控件間的消息傳輸和轉(zhuǎn)換,使ActiveX控件運(yùn)行在Linux操作系統(tǒng)的瀏覽器中。

1 相關(guān)工作基礎(chǔ)

1.1 NPAPI

網(wǎng)景插件應(yīng)用程序編程接口NPAPI(Netscape Plugin Application Programming Interface)為網(wǎng)景公司開發(fā)的瀏覽器插件框架,也為大部分非IE瀏覽器共同支持的插件框架[7]。NPAPI為一個(gè)簡潔的跨平臺(tái)開發(fā)框架,它定義了幾十個(gè)函數(shù),分為兩組,一組由瀏覽器提供給插件調(diào)用,名稱以NPN開頭。一組由插件提供給瀏覽器調(diào)用,名稱以NP和NPP開頭[8]。NPAPI插件在Linux操作系統(tǒng)中為so文件,在網(wǎng)頁中的形式如下:

為嵌入對(duì)象的標(biāo)簽,其type為多用途互聯(lián)網(wǎng)郵件擴(kuò)展類型MIME(Multipurpose Internet Mail Extensions),MIME標(biāo)識(shí)了需要加載的插件。瀏覽器在啟動(dòng)時(shí)會(huì)訪問幾個(gè)目錄,并獲取目錄下插件的基本信息,同時(shí)維護(hù)一張插件列表。當(dāng)網(wǎng)頁中含有標(biāo)簽時(shí),瀏覽器將匹配MIME并加載相應(yīng)的so文件,同時(shí)管理插件的生命周期。一個(gè)網(wǎng)頁可以含有多個(gè)標(biāo)簽,因此,一個(gè)插件可以存在多個(gè)實(shí)例。網(wǎng)頁利用JavaScript調(diào)用插件提供的接口,如下:

var plugin = document.getElementById(″plugin″);

plugin.foo();

變量plugin為JavaScript可編程對(duì)象,與NPAPI的NPObject對(duì)象對(duì)應(yīng),foo函數(shù)由插件代碼實(shí)現(xiàn)。NPObject含有NPClass函數(shù)指針表,JavaScript可編程對(duì)象的函數(shù)調(diào)用和數(shù)據(jù)訪問都映射至NPObject。瀏覽器調(diào)用NPHasMethod函數(shù)查詢foo函數(shù)是否存在,若存在,則緊接著調(diào)用NPInvoke函數(shù),由NPObject完成對(duì)插件代碼的調(diào)用。數(shù)據(jù)成員訪問流程與函數(shù)調(diào)用流程相似。同時(shí),NPAPI定義了變體類型NPVariant作為JavaScript數(shù)據(jù)類型與C++數(shù)據(jù)類型的映射。

1.2 ActiveX

ActiveX為微軟推出的組件技術(shù),為OLE(Object Linking and Embedding,對(duì)象鏈接與嵌入)針對(duì)互聯(lián)網(wǎng)的延伸,本質(zhì)為COM(Component Object Model,組件對(duì)象模型)組件[9]。因此,ActiveX控件可以嵌入任何支持COM組件的程序中,但主要應(yīng)用于互聯(lián)網(wǎng),在網(wǎng)頁中的形式如下:

classid=″CLSID:6B5FACBE-A8C1-4DCE-8D0F-B8E1C454234A″

codebase=″https://demo.com/control.cab″>

classid為GUID(Globally Unique Identifier,全局唯一標(biāo)識(shí)符),GUID標(biāo)識(shí)了需要加載的ActiveX控件,利用注冊(cè)表和GUID可以直接找到相應(yīng)的dll或ocx文件。codebase為ActiveX控件的下載地址。ActiveX控件與COM組件具有完全一樣的生命周期,IE瀏覽器調(diào)用Windows API獲取控件的IClassFactory指針,然后向IClassFactory指針請(qǐng)求COM對(duì)象。所有COM對(duì)象都實(shí)現(xiàn)了IUnknown接口,ActiveX控件的函數(shù)調(diào)用和數(shù)據(jù)成員訪問都經(jīng)IUnknown接口映射至COM對(duì)象。

2 兼容機(jī)制設(shè)計(jì)

若要實(shí)現(xiàn)ActiveX控件運(yùn)行在Linux操作系統(tǒng)的瀏覽器中,需要解決三個(gè)關(guān)鍵問題:

(1) 瀏覽器如何獲取和識(shí)別ActiveX控件標(biāo)簽:服務(wù)器可能會(huì)識(shí)別UA(User Agent,用戶代理)直接拒絕不兼容瀏覽器的訪問。同時(shí),NPAPI插件和ActiveX控件在網(wǎng)頁中的表現(xiàn)形式不同。

(2) ActiveX控件如何運(yùn)行在Linux操作系統(tǒng)中:ActiveX控件為Windows操作系統(tǒng)的二進(jìn)制代碼,無法直接運(yùn)行在Linux操作系統(tǒng)中。同時(shí),我們無法改動(dòng)ActiveX控件。

(3) 瀏覽器如何與ActiveX控件交互:瀏覽器具有NPAPI接口,ActiveX控件具有COM組件接口,需要在其間設(shè)計(jì)一個(gè)合理的消息機(jī)制,消除NPAPI和ActiveX控件的差異。

兼容機(jī)制采取了中間件的解決方案,即在瀏覽器與ActiveX控件間構(gòu)建一個(gè)中間件,由AxPlugin和AxLoader兩個(gè)部分組成,負(fù)責(zé)傳輸消息和轉(zhuǎn)換消息。同時(shí),需要在瀏覽器中實(shí)現(xiàn)UA偽裝和JavaScript代碼注入。兼容機(jī)制方案設(shè)計(jì)如圖1所示。

圖1 兼容機(jī)制方案設(shè)計(jì)

UA為一個(gè)特殊的字符串,在HTTP頭中的user-agent字段中,用于服務(wù)器獲取瀏覽器與操作系統(tǒng)的信息,如“Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv: 11.0) like Gecko”,Mozilla和like Gecko為習(xí)慣性字段,Windows NT 6.1為操作系統(tǒng)類型,Trident為IE瀏覽器內(nèi)核,版本號(hào)為7.0。在向服務(wù)器請(qǐng)求網(wǎng)頁時(shí),根據(jù)網(wǎng)頁地址偽裝瀏覽器的UA,可以防止服務(wù)器拒絕訪問。同時(shí),瀏覽器無法直接識(shí)別ActiveX控件標(biāo)簽,需要在解析網(wǎng)頁時(shí)注入JavaScript代碼,將ActiveX控件標(biāo)簽改變?yōu)闉g覽器可識(shí)別的NPAPI插件標(biāo)簽,使瀏覽器加載AxPlugin。UA偽裝和JavaScript代碼注入在瀏覽器中解決了如何獲取和識(shí)別ActiveX控件標(biāo)簽,小幅增加了瀏覽器的負(fù)擔(dān),但具有無需改動(dòng)現(xiàn)有在線系統(tǒng)的優(yōu)點(diǎn)。

在Linux操作系統(tǒng)中支持Windows應(yīng)用程序幾乎都離不開Wine。由于Windows操作系統(tǒng)的閉源性質(zhì),Wine開發(fā)者只能推測(cè)Windows API的內(nèi)部實(shí)現(xiàn),所以Wine沒有完全兼容Windows應(yīng)用程序,但目前PE格式加載、注冊(cè)表和COM技術(shù)已經(jīng)得到Wine的支持。ActiveX控件本質(zhì)為COM組件,因此將ActiveX控件的運(yùn)行環(huán)境由Wine負(fù)責(zé)[10]。既充分利用了Wine的支持能力,無需改動(dòng)ActiveX控件,又避免了整體移植IE瀏覽器的復(fù)雜性。

消息機(jī)制基于Linux的管道通信技術(shù),由AxPlugin和AxLoader負(fù)責(zé)。AxPlugin為NPAPI插件,負(fù)責(zé)啟動(dòng)Wine和AxLoader,并在瀏覽器與AxLoader間傳輸消息。AxLoader為exe可執(zhí)行文件,負(fù)責(zé)轉(zhuǎn)換消息并加載ActiveX控件,同時(shí)與AxPlugin傳輸消息。所以,AxLoader又需要具有Linux操作系統(tǒng)的IPC能力。Wine為在Linux操作系統(tǒng)中編譯Windows應(yīng)用程序提供了Winelib和WineGCC。Winelib含有Windows API的實(shí)現(xiàn)和Windows兼容頭文件。WineGCC為GCC的封裝,用于編譯基于Winelib的C/C++應(yīng)用程序。Winelib和WineGCC實(shí)現(xiàn)了一種Windows和Linux混合編程的技術(shù),基于Winelib和WineGCC編譯的Windows應(yīng)用程序獲得了訪問Unix API的能力[11]。因此,AxLoader可以基于Winelib和WineGCC實(shí)現(xiàn)。

基于上述方案設(shè)計(jì),瀏覽器根據(jù)網(wǎng)頁地址偽裝UA向服務(wù)器請(qǐng)求網(wǎng)頁,并在解析網(wǎng)頁時(shí)注入JavaScript代碼,改變ActiveX控件標(biāo)簽,使瀏覽器加載AxPlugin。AxPlugin將啟動(dòng)Wine和AxLoader,負(fù)責(zé)在瀏覽器和AxLoader間傳輸消息。在Wine中,AxLoader加載GUID標(biāo)識(shí)的ActiveX控件,負(fù)責(zé)在AxPlugin與ActiveX控件間轉(zhuǎn)換和傳輸消息。

3 兼容機(jī)制實(shí)現(xiàn)

3.1 UA偽裝與JavaScript代碼注入

UA偽裝和JavaScript代碼注入需要瀏覽器的支持,本文以MiniBrowser瀏覽器作為實(shí)驗(yàn)瀏覽器。MiniBrowser瀏覽器為在WebKitGTK+上實(shí)現(xiàn)的簡單瀏覽器,WebKitGTK+為WebKit內(nèi)核的GTK+移植(port)。

UA偽裝需要記錄網(wǎng)頁地址與UA的映射關(guān)系,因此采取了白名單機(jī)制。白名單格式為JSON,每條記錄含有兩個(gè)值,分別為網(wǎng)頁地址與UA。白名單中的網(wǎng)頁地址的形式如“https://*.demo.com/*”,支持通配符。白名單中的UA為不同版本IE瀏覽器的UA。在WebKit內(nèi)核中,WebView為網(wǎng)頁視圖,站在用戶的角度,WebView相當(dāng)于瀏覽器中的標(biāo)簽(tab)。在WebView向服務(wù)器請(qǐng)求網(wǎng)頁前,若用戶訪問的網(wǎng)頁地址與白名單中的網(wǎng)頁地址匹配,則獲取WebView的WebKitSettings,將其UA設(shè)置為白名單中相應(yīng)的UA,從而實(shí)現(xiàn)UA偽裝,流程如下:

WebKitSettings *settings = webkit_web_view_get_settings(web_view);

if (address matched)

//地址匹配,偽裝UA

webkit_settings_set_user_agent(settings, user_agent in whitelist);

else

//地址不匹配,還原為默認(rèn)UA

webkit_settings_set_user_agent(settings, default user_agent);

webkit_web_view_load_uri(web_view, address);

//向服務(wù)器請(qǐng)求網(wǎng)頁

WebKit內(nèi)核具有JavaScript代碼注入接口,主要為瀏覽器擴(kuò)展提供支持。注意,擴(kuò)展(extension)與插件(plugin)不同,擴(kuò)展為HTML與JavaScript代碼的集合,它可以包含插件[12]。在WebKitUserContentManager中設(shè)置WebKitUserScript,并在WebView初始化時(shí)傳入,WebKitUserScript含有的JavaScript代碼將在網(wǎng)頁解析時(shí)執(zhí)行,從而實(shí)現(xiàn)JavaScript代碼注入。注入的JavaScript代碼如下:

function listener(event) {

//事件監(jiān)聽函數(shù)

var node = event.target;

if (node.nodeName == ″OBJECT″) {

//若為標(biāo)簽

set type to ″application/x-axplugin″

set clsid to GUID

remove classid

remove codebase

}

}

window.addEventListener(″beforeload″, listener, true);

//為beforeload事件設(shè)置監(jiān)聽函數(shù)

上述代碼利用WebKit內(nèi)核支持的beforeload事件來改變ActiveX控件標(biāo)簽,使瀏覽器加載AxPlugin。網(wǎng)頁中每一個(gè)標(biāo)簽加載前將觸發(fā)beforeload事件。在beforeload事件監(jiān)聽函數(shù)中,向ActiveX控件標(biāo)簽添加type,其值為AxPlugin的MIME,設(shè)置為“application/x-axplugin”。classid在非IE瀏覽器中具有其他含義,因此將classid轉(zhuǎn)換為clsid,移除codebase。JavaScript代碼注入仍然需要白名單機(jī)制,防止JavaScript代碼注入影響其他網(wǎng)頁或者帶來不必要的性能開銷。

3.2 消息傳輸

消息傳輸分為數(shù)據(jù)傳輸和函數(shù)調(diào)用轉(zhuǎn)發(fā)兩個(gè)方面的工作。AxPlugin加載后初始化管道并創(chuàng)建子進(jìn)程,子進(jìn)程將調(diào)用execvp轉(zhuǎn)而執(zhí)行AxLoader。在消息機(jī)制中,實(shí)現(xiàn)了Read和Write兩組函數(shù)來負(fù)責(zé)AxPlugin和AxLoader間的數(shù)據(jù)傳輸,分別用于從管道中讀出或?qū)懭隒++數(shù)據(jù)類型以及NPAPI數(shù)據(jù)類型。如字符串“Hello”,編碼后向管道中寫入的字節(jié)流如圖2所示。

圖2 “Hello”字符串編碼后的字節(jié)流

第一個(gè)字節(jié)代表命令類型,由Command枚舉值定義,圖中為Command::PushString的數(shù)值。其后三個(gè)字節(jié)為傳輸數(shù)據(jù)的長度,最大值為0xFFFFFF,圖中為“Hello”(含‘

主站蜘蛛池模板: 在线欧美国产| 亚洲色大成网站www国产| 在线a视频免费观看| 国产一级裸网站| 992tv国产人成在线观看| 国产欧美亚洲精品第3页在线| 亚欧成人无码AV在线播放| 真实国产精品vr专区| 国产一区二区三区夜色| 综合天天色| 亚洲成人高清无码| 伊人久综合| 国产地址二永久伊甸园| 综合五月天网| 亚洲精品国产综合99| 国产全黄a一级毛片| 国产91视频免费观看| 国产高清毛片| 国产鲁鲁视频在线观看| 国产激情影院| 国产精品网曝门免费视频| 超清无码熟妇人妻AV在线绿巨人| 最新亚洲人成网站在线观看| 国产一区二区丝袜高跟鞋| 国产一区成人| 新SSS无码手机在线观看| 美女被狂躁www在线观看| 欧美一级一级做性视频| 经典三级久久| 欧美色99| 欧美日韩专区| jizz在线免费播放| 欧美亚洲国产精品第一页| 欧美一级大片在线观看| 美女被操91视频| 成人国产精品网站在线看| 国产噜噜噜视频在线观看 | 亚洲日韩在线满18点击进入| 久久久久久高潮白浆| 2021国产乱人伦在线播放| 波多野结衣AV无码久久一区| 国产精品女在线观看| 久久免费成人| 中文字幕在线永久在线视频2020| 99re经典视频在线| 国产精品露脸视频| 久热这里只有精品6| 天天色综网| 免费在线a视频| 国产精品福利社| 日韩AV手机在线观看蜜芽| 亚洲欧美日韩天堂| 亚洲视频在线观看免费视频| 日韩成人在线网站| 欧美精品另类| 成人小视频在线观看免费| 国产欧美日韩专区发布| 亚洲日韩图片专区第1页| 国产成人精品一区二区三在线观看| 成人蜜桃网| 国产第一页第二页| 国产啪在线91| 国产精品视频导航| 国产福利一区二区在线观看| 九九久久精品免费观看| 爱爱影院18禁免费| 亚洲三级a| 国产91麻豆视频| 日本日韩欧美| 国产成人综合日韩精品无码不卡| 亚洲福利片无码最新在线播放| 国产又大又粗又猛又爽的视频| 欧美成人精品一级在线观看| 精品国产香蕉在线播出| 中文字幕不卡免费高清视频| 久久精品人人做人人爽电影蜜月| 国产精品妖精视频| 2021天堂在线亚洲精品专区| 久久综合国产乱子免费| 最新国产精品第1页| 亚洲A∨无码精品午夜在线观看| 国产成人喷潮在线观看|