專利名稱:對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器及網(wǎng)頁插件的隔離方法
技術(shù)領(lǐng)域:
本發(fā)明涉及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,具體涉及一種對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器及網(wǎng)頁插件的隔離方法。
背景技術(shù):
瀏覽器是指可以顯示網(wǎng)頁服務(wù)器或者文件系統(tǒng)的HTML文件內(nèi)容,并讓用戶與這些文件交互的一種軟件。網(wǎng)頁瀏覽器主要通過HTTP協(xié)議與網(wǎng)頁服務(wù)器交互并獲取網(wǎng)頁,這些網(wǎng)頁由URL指定,文件格式通常為HTML格式,并由多媒體文件格式MME在HTTP協(xié)議中指明。一個網(wǎng)頁中可以包括多個文檔,每個文檔都是分別從服務(wù)器獲取的。大部分的瀏覽器本身都支持除了 HTML之外的其它廣泛的格式,例如JPEG、PNG、GIF等圖像格式,并且能夠擴(kuò)展支持眾多的插件(plug-1ns)。另外,許多瀏覽器還支持其他的URL類型及其相應(yīng)的協(xié)議,如FTP、Gopher、HTTPS (HTTP協(xié)議的加密版本)。HTTP內(nèi)容類型和URL協(xié)議規(guī)范允許網(wǎng)頁設(shè)計者在網(wǎng)頁中嵌入圖像、動畫、視頻、聲音、流媒體等。個人電腦上常見的網(wǎng)頁瀏覽器包括微軟的 Internet Explorer、Mozilla 的 Firefox、Apple 的 Safari, Opera、GoogleChrome> GreenBrowser瀏覽器、360安全瀏覽器、搜狗高速瀏覽器、天天瀏覽器、騰訊TT、傲游瀏覽器、百度瀏覽器、騰訊QQ瀏覽器等,瀏覽器是最經(jīng)常使用到的客戶端程序。ActiveX在廣義上是指微軟公司的整個COM架構(gòu),但是現(xiàn)在通常用來稱呼基于標(biāo)準(zhǔn)COM接口來實現(xiàn)對象連接與嵌入的ActiveX控件(在瀏覽器中通常作為插件被加載)。后者是指從VBX發(fā)展而來的,面向微軟的Internet Explorer技術(shù)而設(shè)計的以O(shè)CX為擴(kuò)展名的OLE控件。通過定義容器和組件之間的接口規(guī)范,如果編寫了一個遵循規(guī)范的控件,那么可以很方便地在多種容器中使用而不用修改控件的代碼。同樣,通過實現(xiàn)標(biāo)準(zhǔn)接口調(diào)用,一個遵循規(guī)范的容器可以很容易地嵌入任何遵循規(guī)范的控件。由于OLE在ActiveX控件中的應(yīng)用的普及,現(xiàn)在OLE技術(shù)中只有少數(shù)獨立于ActiveX技術(shù),例如復(fù)合文檔。一些瀏覽器,例如Internet Explorer,網(wǎng)景瀏覽器等等都不同程度上支援ActiveX控件。這允許網(wǎng)頁通過腳本和控件交互產(chǎn)生更加豐富的效果,但同時也帶來一些安全性的問題,如控件的崩潰通常會導(dǎo)致瀏覽器程序崩潰。為了應(yīng)對瀏覽器經(jīng)常出現(xiàn)崩潰的現(xiàn)象,現(xiàn)在很多瀏覽器廠商都采用了多進(jìn)程標(biāo)簽瀏覽的概念,其中包括IE8、Chrome、FirefOX等瀏覽器,而眾多基于WebKit的瀏覽器在蘋果發(fā)布WebKit2內(nèi)核以后已經(jīng)采用多進(jìn)程標(biāo)簽瀏覽這個功能。因為在瀏覽器中添加多進(jìn)程瀏覽功能之后,即使是瀏覽器其中的一個進(jìn)程出現(xiàn)了崩潰現(xiàn)象,也不會牽連到其他瀏覽器窗口,從而有效的避免了整個瀏覽器的假死。在最新一代瀏覽器IE8中,微軟添加了被稱為“Loosely-Coupled IE(LCIE)”的架構(gòu)(http: //www.1efans. net/liulana1-duoincheng-duib1-1ance)。通過Loosely-CoupledIE (LCIE)架構(gòu),IE8將主要的瀏覽進(jìn)程與渲染進(jìn)程相隔離。主要的進(jìn)程處理瀏覽器、用戶界面和框架(窗口),用于存儲選項卡(即標(biāo)簽頁)。IE8中的某些選項卡是運(yùn)行在相同的進(jìn)程中的,不過不同安全級別的選項卡是相互分開的,即運(yùn)行在不同的進(jìn)程中。ActiveX控件是通過選項卡進(jìn)程進(jìn)行處理的。在上述的IE瀏覽器的多進(jìn)程架構(gòu)中,雖然選項卡是被分類在不同的進(jìn)程中從而形成了多進(jìn)程的架構(gòu)的,而且在各個進(jìn)程中ActiveX控件是通過選項卡進(jìn)程進(jìn)行處理的。但是在同一個進(jìn)程中的選項卡中的不同類型的ActiveX插件的都是運(yùn)行在一個進(jìn)程中,由于各種不同的ActiveX插件出現(xiàn)崩潰的概率是各自不同的,而且各個插件的情況各不相同,仍舊會導(dǎo)致其所在進(jìn)程的崩潰,即相應(yīng)的選項卡會崩潰。
發(fā)明內(nèi)容
鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器及網(wǎng)頁插件的隔離方法。依據(jù)本發(fā)明的一個方面,提供了一種對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,包括插件類型獲取器,適于獲取頁面加載過程中待加載的頁面中插件的類型;插件進(jìn)程創(chuàng)建器,適于為相同類型的頁面中插件創(chuàng)建一獨立于瀏覽器進(jìn)程的插件進(jìn)程;插件線程創(chuàng)建器,適于在該獨立的插件進(jìn)程中為各個相同類型的頁面中插件創(chuàng)建一線程以運(yùn)行所述頁面中插件??蛇x地,所述插件類型獲取器包括類型I D解析器,適于解析待加載頁面中對應(yīng)的網(wǎng)頁元素,從中解析出標(biāo)識所述待加載的頁面中插件的唯一 ID,從而獲取待加載的頁面中插件的類型??蛇x地,所述插件類型獲取器進(jìn)一步包括類型ID攔截器,適于攔截CoGetClassObject函數(shù),獲取被調(diào)用的所述待加載的頁面中插件的唯一 ID。可選地,所述插件進(jìn)程創(chuàng)建器進(jìn)一步包括進(jìn)程查詢器,適于查詢所述頁面中插件的類型的插件進(jìn)程是否已創(chuàng)建;進(jìn)程創(chuàng)建器,適于未創(chuàng)建插件進(jìn)程,或已創(chuàng)建的插件進(jìn)程中線程數(shù)達(dá)到線程閾值或當(dāng)前內(nèi)存占用達(dá)到預(yù)定配額時為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程,并更新所述頁面中插件的類型的進(jìn)程信息列表。可選地,所述進(jìn)程創(chuàng)建器進(jìn)一步適于根據(jù)待加載頁面的類型設(shè)置該頁面中不同類型插件的進(jìn)程優(yōu)先級,按所述進(jìn)程優(yōu)先級依次創(chuàng)建相應(yīng)頁面中插件的插件進(jìn)程??蛇x地,所述進(jìn)程創(chuàng)建器進(jìn)一步包括新進(jìn)程生成器,適于生成一個具有唯一進(jìn)程ID的新插件進(jìn)程,并為其分配所述預(yù)定配額的內(nèi)存空間;新進(jìn)程配置器,適于設(shè)置所述新插件進(jìn)程所屬的頁面中插件的類型、線程閾值、線程信息列表??蛇x地,所述瀏覽器還包括進(jìn)程判斷器,適于判斷與所述瀏覽器進(jìn)程獨立的頁面中插件的類型的進(jìn)程數(shù)是否到達(dá)進(jìn)程閾值,若未達(dá)到,則為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程??蛇x地,所述瀏覽器還包括進(jìn)程通信器,適于所述頁面中插件的類型的插件進(jìn)程與瀏覽器進(jìn)程之間通過互斥鎖實現(xiàn)進(jìn)程通信的互斥??蛇x地,所述瀏覽器還包括線程釋放器,適于當(dāng)所述頁面中插件所在的瀏覽器標(biāo)簽頁關(guān)閉時,則關(guān)閉所述頁面中插件的線程,并釋放所述線程占用的內(nèi)存空間。根據(jù)本發(fā)明的另一方面,提供了一種網(wǎng)頁插件的隔離方法,包括步驟獲取頁面加載過程中待加載的頁面中插件的類型;為相同類型的頁面中插件創(chuàng)建一獨立于瀏覽器進(jìn)程的插件進(jìn)程;在該獨立的插件進(jìn)程中為各個相同類型的頁面中插件創(chuàng)建一線程以運(yùn)行所述頁面中插件??蛇x地,所述獲取頁面加載過程中待加載的頁面中插件的類型的步驟包括解析待加載頁面中對應(yīng)的網(wǎng)頁元素,從中解析出標(biāo)識所述待加載的頁面中插件的唯一 ID,從而獲取待加載的頁面中插件的類型??蛇x地,進(jìn)一步包括攔截CoGetClassObject函數(shù),獲取被調(diào)用的所述待加載的頁面中插件的唯一 ID??蛇x地,所述為相同類型的頁面中插件創(chuàng)建一獨立于瀏覽器進(jìn)程的插件進(jìn)程包括查詢所述頁面中插件的類型的插件進(jìn)程是否已創(chuàng)建;若未創(chuàng)建,或已創(chuàng)建的插件進(jìn)程中線程數(shù)達(dá)到線程閾值或當(dāng)前內(nèi)存占用達(dá)到預(yù)定配額,則為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程,并更新所述頁面中插件的類型的進(jìn)程信息列表??蛇x地,所述為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程的步驟包括根據(jù)待加載頁面的類型設(shè)置該頁面中不同類型插件的進(jìn)程優(yōu)先級;按所述進(jìn)程優(yōu)先級依次創(chuàng)建相應(yīng)頁面中插件的插件進(jìn)程??蛇x地,所述為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程的步驟進(jìn)一步包括生成一個具有唯一進(jìn)程ID的新插件進(jìn)程,并為其分配所述預(yù)定配額的內(nèi)存空間;設(shè)置所述新插件進(jìn)程所屬的頁面中插件的類型、線程閾值、線程信息列表??蛇x地,所述為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程的步驟之前還包括判斷與所述瀏覽器進(jìn)程相獨立的頁面中插件的類型的進(jìn)程的數(shù)目是否到達(dá)進(jìn)程閾值,若未達(dá)到,則為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程??蛇x地,所述頁面中插件的類型的插件進(jìn)程與瀏覽器進(jìn)程之間通過互斥鎖實現(xiàn)進(jìn)程通信的互斥??蛇x地,進(jìn)一步包括當(dāng)所述頁面中插件所在的瀏覽器標(biāo)簽頁關(guān)閉時,則關(guān)閉所述頁面中插件的線程,并釋放所述線程占用的內(nèi)存空間。根據(jù)本發(fā)明的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器及網(wǎng)頁插件的隔離方法可以使不同類型的網(wǎng)頁插件分別運(yùn)行在與瀏覽器進(jìn)程獨立的不同的進(jìn)程中,由此解決了由于插件崩潰導(dǎo)致的選項卡(或標(biāo)簽頁)崩潰或甚至整個瀏覽器崩潰的問題,取得了使瀏覽器運(yùn)行更穩(wěn)定的有益效果。上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式
。
通過閱讀下文優(yōu)選實施方式的詳細(xì)描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認(rèn)為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中圖1示出了根據(jù)本發(fā)明一個實施例的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器結(jié)構(gòu)示意圖;圖2示出了圖1中進(jìn)程創(chuàng)建器的具體結(jié)構(gòu)示意圖;圖3示出了應(yīng)用實例中用于管理進(jìn)程和線程的類的數(shù)據(jù)結(jié)構(gòu)示意圖;圖4示出了在瀏覽器中打開三個標(biāo)簽頁并加載Flash、BD Player和Qvod插件的實例圖;圖5示出了根據(jù)本發(fā)明一個實施例的網(wǎng)頁插件的隔離方法流程圖。
具體實施例方式下面將參照附圖更詳細(xì)地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應(yīng)當(dāng)理解,可以以各種形式實現(xiàn)本公開而不應(yīng)被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。為了避免由于插件崩潰導(dǎo)致的選項卡(或標(biāo)簽頁)崩潰或甚至整個瀏覽器崩潰的問題,本實施例提供的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器結(jié)構(gòu)如圖1所示,包括插件類型獲取器110、插件進(jìn)程創(chuàng)建器120及插件線程創(chuàng)建器130。插件類型獲取器110適于獲取頁面加載過程中待加載的頁面中插件的類型。若待加載的網(wǎng)頁中存在插件(即網(wǎng)頁中插件),則網(wǎng)頁源代碼對應(yīng)的網(wǎng)頁元素中會以不同的類型ID,即CLSID來區(qū)分不同類型的網(wǎng)頁中插件,因此,該插件類型獲取器110包括一類型ID解析器111,通過解析網(wǎng)頁元素中插件的唯一 ID,從而獲取待加載的頁面中插件的類型。例如需要加載flash object對象,如下的網(wǎng)頁源代碼例子〈object classid="clsid:D27CDB6E-AE6D-llcf-96B8-444553540000"codebase=〃http://download, macromedia. com/pub/shockwave/cabs/flash/swflash. cab#version=
6,0,29,0"width="360"height="210">。類型ID解析器111通過識別關(guān)鍵字clsid很容易解析出插件對象的類型,從而使瀏覽器很容易判斷出采用哪種類別的插件來加載該插件對象。獲取到clsid后,瀏覽器會加載網(wǎng)頁中插件的插件進(jìn)程(如上述flash進(jìn)程),進(jìn)一步地,插件類型獲取器110還包括類型I D攔截器112,適于攔截CoGetClassObject函數(shù),從而hook住被調(diào)用的待加載的網(wǎng)頁中插件,獲取被調(diào)用的待加載的頁面中插件的clsid。通過hook到clsid后,便可加載網(wǎng)頁中插件的插件進(jìn)程。插件進(jìn)程創(chuàng)建器120適于為相同類型的頁面中插件創(chuàng)建一獨立于瀏覽器進(jìn)程的插件進(jìn)程。即為了避免由于插件崩潰導(dǎo)致的選項卡(或標(biāo)簽頁)崩潰或甚至整個瀏覽器崩潰的問題,該插件進(jìn)程創(chuàng)建器120為不同類型的插件創(chuàng)建不同的進(jìn)程,且都獨立于瀏覽器進(jìn)程,如根據(jù)Flash、baidu player、Qvod插件的CLSID而創(chuàng)建不同的進(jìn)程。該插件進(jìn)程創(chuàng)建器120具體包括進(jìn)程查詢器121和進(jìn)程創(chuàng)建器122。由于一個瀏覽器可以有多個標(biāo)簽頁,每個標(biāo)簽頁中可能都有加載的插件對象,且類型可能相同,因此,后打開的標(biāo)簽頁中待加載的插件對象對應(yīng)的插件進(jìn)程可能已被創(chuàng)建。進(jìn)程查詢器121通過查詢進(jìn)程管理器的進(jìn)程列表判斷當(dāng)前待加載頁面中插件對應(yīng)類型的進(jìn)程是否已創(chuàng)建。若未創(chuàng)建該插件進(jìn)程,或已創(chuàng)建的插件進(jìn)程中線程數(shù)達(dá)到線程閾值或當(dāng)前內(nèi)存占用達(dá)到預(yù)定配額時,進(jìn)程創(chuàng)建器122為該類型的頁面中插件創(chuàng)建新插件進(jìn)程,并更新頁面中插件的類型的進(jìn)程信息列表。進(jìn)程信息列表包括新插件進(jìn)程所屬的頁面中插件的類型、線程閾值(即進(jìn)程中包含的最大線程數(shù)量)、線程信息列表等信息。其中,線程信息列表包括進(jìn)程中當(dāng)前已有的線程數(shù)及線程所對應(yīng)的標(biāo)簽頁等信息。進(jìn)一步地,進(jìn)程創(chuàng)建器122在創(chuàng)建插件進(jìn)程時,根據(jù)待加載頁面的類型設(shè)置該頁面中不同類型插件的進(jìn)程優(yōu)先級,并按所述進(jìn)程優(yōu)先級依次創(chuàng)建相應(yīng)頁面中插件的插件進(jìn)程。例如對于視頻網(wǎng)頁中的視頻的顯示,就需要將該為flash插件建立的進(jìn)程的優(yōu)先級設(shè)的高一點。該進(jìn)程優(yōu)先級還會根據(jù)當(dāng)前頁面的類型和URL進(jìn)行調(diào)整,從而高效地支持頁面中的插件顯示,優(yōu)先生成對應(yīng)的進(jìn)程和線程。這里進(jìn)程優(yōu)先級同時也表示創(chuàng)建某類型插件的創(chuàng)建順序的優(yōu)先級,其中,對于某類型的頁面,對其中不同類型插件創(chuàng)建進(jìn)程的優(yōu)先順序的關(guān)系可通過配置文件的形式存儲在瀏覽器的相應(yīng)文件中,進(jìn)程創(chuàng)建器122讀取該配置文件,按該配置文件中的制定的順序為不同類型的插件創(chuàng)建插件進(jìn)程。其中,進(jìn)程創(chuàng)建器122具體結(jié)構(gòu)如圖2所示,包括新進(jìn)程生成器210和新進(jìn)程配置器220。新進(jìn)程生成器210適于生成一個具有唯一進(jìn)程ID的新插件進(jìn)程,并為其分配預(yù)定配額的內(nèi)存空間。新進(jìn)程配置器220適于設(shè)置新插件進(jìn)程所屬的頁面中插件的類型、線程閾值、線程信息列表。該內(nèi)存空間為虛擬內(nèi)存空間,大小通常為1GB,線程閾值為10,即一個插件進(jìn)程包含10個該類型插件的線程,內(nèi)存空間大小和線程閾值可根據(jù)實際情況設(shè)定。插件線程創(chuàng)建器130適于在該獨立的插件進(jìn)程中為各個相同類型的頁面中插件創(chuàng)建一線程以運(yùn)行頁面中插件。創(chuàng)建線程時在上述線程信息列表中的線程所對應(yīng)的標(biāo)簽頁的表項設(shè)置該線程對應(yīng)的插件對象所屬的標(biāo)簽頁ID,以便關(guān)閉標(biāo)簽頁時便于查找該標(biāo)簽頁中所有的插件對象對應(yīng)的線程,并將該這些線程關(guān)閉,釋放線程所占用的進(jìn)程的系統(tǒng)資源。本實施例中,對于進(jìn)程的創(chuàng)建,默認(rèn)是可以最大地創(chuàng)建256個進(jìn)程的,并發(fā)地同時在瀏覽器中開啟256個進(jìn)程很少出現(xiàn),所以256這個上限滿足瀏覽器的使用也滿足目前系統(tǒng)硬件上的實際情況。因此,瀏覽器還包括進(jìn)程判斷器140,在創(chuàng)建進(jìn)程之前,該進(jìn)程判斷器140判斷與瀏覽器進(jìn)程獨立的頁面中插件的類型的進(jìn)程數(shù)是否到達(dá)進(jìn)程閾值(即256),若達(dá)到,則為該類型的頁面中插件創(chuàng)建新插件進(jìn)程。由于不同類型插件的插件進(jìn)行相互獨立,且都與瀏覽器進(jìn)程獨立,在瀏覽器運(yùn)行過程中,可能存在進(jìn)程間對系統(tǒng)資源的占用的競爭。因此,本實施例中,還包括進(jìn)程通信器150,頁面中插件的類型的插件進(jìn)程與瀏覽器進(jìn)程之間通過互斥鎖(不限于該進(jìn)程通信方式)實現(xiàn)進(jìn)程通信的互斥。為了有效管理進(jìn)程所占用的系統(tǒng)資源,本實施例的瀏覽器還包括線程釋放器160,適于當(dāng)頁面中插件所在的瀏覽器標(biāo)簽頁關(guān)閉時,則關(guān)閉所述頁面中插件的線程,并釋放所述線程占用的內(nèi)存空間,以重新分配系統(tǒng)資源。在實際應(yīng)用中,構(gòu)建一個Session MGR類來管理上述進(jìn)程、線程的查詢、創(chuàng)建及釋放的過程,該類的數(shù)據(jù)結(jié)構(gòu)如圖3所示,Session MGR類會生產(chǎn)并管理一片大的虛擬內(nèi)存(share memory database)其中的維系有每個插件類別的進(jìn)程信息,如圖3中,為該類的每個插件類別的對象數(shù)據(jù)結(jié)構(gòu)示意圖,其中有CLSID (插件類別ID)、pr0C_C0Unt (進(jìn)程數(shù)量)、currentprocID (當(dāng)前進(jìn)程ID)、Proc [](進(jìn)程信息數(shù)組)。該P(yáng)roc □數(shù)組包括有如下信息procID (進(jìn)程ID)、Prio (進(jìn)程優(yōu)先級,未創(chuàng)建時為創(chuàng)建該進(jìn)程的優(yōu)先級)、Quota (進(jìn)程的配額數(shù)量)、clsid (該進(jìn)程對應(yīng)的插件類別ID)、threadcount (進(jìn)程中的線程數(shù)量)、Tids [](上述進(jìn)程中的線程(也可以是標(biāo)簽頁的id號,因為一個線程對應(yīng)一個標(biāo)簽頁)的信息的數(shù)組,其中保存有線程的信息)。其中,進(jìn)程閾值、線程閾值可通過全局變量設(shè)定,如線程閾值設(shè)定為10。圖4為瀏覽器中打開三個標(biāo)簽頁并加載Flash、BD Player和Qvod插件的實例圖。在打開每個標(biāo)簽頁時,通過攔截CoGetClassObject函數(shù),從而hook住標(biāo)簽頁中插件,獲取該頁面中插件的clsid。獲取插件的clsid后便由上述Session MGR根據(jù)不同的clsid創(chuàng)建不同的插件進(jìn)程及其中的線程。如圖4中,瀏覽器共加載了 3個類型的插件,分別是Flash、BD Player和Qvod插件。當(dāng)打開Tl標(biāo)簽頁時,加載Flash、BD Player插件,SessionMGR根據(jù)其不同的clsid分別創(chuàng)建Flash進(jìn)程I和BD Player進(jìn)程1,并分別在其中創(chuàng)建相應(yīng)的線程,之后按圖3中的數(shù)據(jù)結(jié)構(gòu)設(shè)置相應(yīng)的信息,如設(shè)置進(jìn)程中的線程數(shù)量為I。為了便于關(guān)閉標(biāo)簽頁時便于查找該標(biāo)簽頁中所有的插件對象對應(yīng)的線程,創(chuàng)建線程時在Tids []中設(shè)置該線程所對應(yīng)的標(biāo)簽頁ID (即對應(yīng)插件所屬標(biāo)簽頁ID)的信息設(shè)置該線程所屬的標(biāo)簽頁ID,從圖中可看出Fla sh線程Tl和BD Player線程Tl都屬于標(biāo)簽頁Tl。在打開標(biāo)簽頁T2時,加載Flash、Qvod插件,Session MGR查詢當(dāng)前已創(chuàng)建Flash進(jìn)程1,而且其中的線程數(shù)為1,未超過線程閾值10,則直接在已創(chuàng)建的Flash進(jìn)程I中創(chuàng)建標(biāo)簽頁T2對應(yīng)Flash插件對象的線程,并設(shè)置該線程所對應(yīng)的標(biāo)簽頁為T2。如圖4中Flash進(jìn)程I中的兩個Flash線程分別對應(yīng)標(biāo)簽頁Tl和T2。在加載Qvod插件時,SessionMGR查詢當(dāng)前未創(chuàng)建該類插件的進(jìn)程,因此創(chuàng)建Qvod進(jìn)程I,并在其中創(chuàng)建Qvod線程,并設(shè)置該Qvod線程所對應(yīng)的標(biāo)簽頁為T2。打開標(biāo)簽頁T3的過程和上述過程類似,此處不再贅述。其中,當(dāng)進(jìn)程中的線程數(shù)量超過10個且該進(jìn)程的配額超過例如IG時,會自動生成一個新的進(jìn)程來運(yùn)行該類型插件的線程,如Flash進(jìn)程I中線程超過10個,再加載Flash插件時,則創(chuàng)建Flash進(jìn)程2,并在其中創(chuàng)建相應(yīng)的Flash線程。本實施例的瀏覽器通過獲取待加載插件的clsid,并為不同類型的插件創(chuàng)建獨立于瀏覽器進(jìn)程的插件進(jìn)程,使不同類型的網(wǎng)頁插件分別運(yùn)行在不同的進(jìn)程中,由此解決了由于插件崩潰導(dǎo)致的選項卡(或標(biāo)簽頁)崩潰或甚至整個瀏覽器崩潰的問題,取得了使瀏覽器運(yùn)行更穩(wěn)定的有益效果。本發(fā)明還提供了一種網(wǎng)頁插件的隔離方法,其流程如圖3所示,包括
步驟S510,獲取頁面加載過程中待加載的頁面中插件的類型。若待加載的網(wǎng)頁中存在插件(即網(wǎng)頁中插件),則網(wǎng)頁源代碼對應(yīng)的網(wǎng)頁元素中會以不同的類型ID,即CLSID來區(qū)分不同類型的網(wǎng)頁中插件,因此,通過解析網(wǎng)頁元素中插件的唯一 ID,從而獲取待加載的頁面中插件的類型。例如需要加載flash object對象,如下的網(wǎng)頁源代碼例子〈object classid="clsid:D27CDB6E-AE6D-llcf-96B8-444553540000"codebase=〃http://download, macromedia. com/pub/shockwave/cabs/flash/swflash. cab#version=
6,0,29,0"width="360"height="210">。解析時通過識別關(guān)鍵字Cl s id很容易解析出插件對象的類型,從而使瀏覽器很容易判斷出采用哪種類別的插件來加載該插件對象。獲取到clsid后,瀏覽器會加載網(wǎng)頁中插件的插件進(jìn)程(如上述flash進(jìn)程),進(jìn)一步地,通過攔截CoGetClassObject函數(shù),從而hook住被調(diào)用的待加載的網(wǎng)頁中插件,獲取被調(diào)用的待加載的頁面中插件的clsid。通過hook到clsid后,便可加載網(wǎng)頁中插件的插件進(jìn)程。步驟S520,為相同類型的頁面中插件創(chuàng)建一獨立于瀏覽器進(jìn)程的插件進(jìn)程。即為了避免由于插件崩潰導(dǎo)致的選項卡(或標(biāo)簽頁)崩潰或甚至整個瀏覽器崩潰的問題,為不同類型的插件創(chuàng)建不同的進(jìn)程,且都獨立于瀏覽器進(jìn)程,如根據(jù)Flash、baidu player, Qvod插件的CLSID而創(chuàng)建不同的進(jìn)程。 該步驟S520具體包括查詢進(jìn)程管理器的進(jìn)程列表判斷當(dāng)前待加載頁面中插件對應(yīng)類型的進(jìn)程是否已創(chuàng)建。由于一個瀏覽器可以有多個標(biāo)簽頁,每個標(biāo)簽頁中可能都有加載的插件對象,且類型可能相同,因此,后打開的標(biāo)簽頁中待加載的插件對象對應(yīng)的插件進(jìn)程可能已被創(chuàng)建。若未創(chuàng)建,或已創(chuàng)建的插件進(jìn)程中線程數(shù)達(dá)到線程閾值或當(dāng)前內(nèi)存占用達(dá)到預(yù)定配額,則為該類型的頁面中插件創(chuàng)建新插件進(jìn)程,并更新頁面中插件的類型的進(jìn)程信息列表。其中,進(jìn)程信息列表包括新插件進(jìn)程所屬的頁面中插件的類型、線程閾值(即進(jìn)程中包含的最大線程數(shù)量)、線程信息列表等信息。其中,線程信息列表包括進(jìn)程中當(dāng)前已有的線程數(shù)及線程所對應(yīng)的標(biāo)簽頁等信息。進(jìn)一步地,在創(chuàng)建插件進(jìn)程時,根據(jù)待加載頁面的類型設(shè)置該頁面中不同類型插件的進(jìn)程優(yōu)先級,并按所述進(jìn)程優(yōu)先級依次創(chuàng)建相應(yīng)頁面中插件的插件進(jìn)程。例如對于視頻網(wǎng)頁中的視頻的顯示,就需要將該為flash插件建立的進(jìn)程的優(yōu)先級設(shè)的高一點。該進(jìn)程優(yōu)先級還會根據(jù)當(dāng)前頁面的類型和URL進(jìn)行調(diào)整,從而高效地支持頁面中的插件顯示,優(yōu)先生成對應(yīng)的進(jìn)程和線程。這里進(jìn)程優(yōu)先級同時也表示創(chuàng)建某類型插件的創(chuàng)建順序的優(yōu)先級,其中,對于某類型的頁面,對其中不同類型插件創(chuàng)建進(jìn)程的優(yōu)先順序的關(guān)系可通過配置文件的形式存儲在瀏覽器的相應(yīng)文件中,創(chuàng)建進(jìn)程時先讀取該配置文件,按該配置文件中的制定的順序為不同類型的插件創(chuàng)建插件進(jìn)程。創(chuàng)建插件進(jìn)程的具體步驟如下生成一個具有唯一進(jìn)程ID的新插件進(jìn)程,并為其分配預(yù)定配額的內(nèi)存空間。設(shè)置新插件進(jìn)程所屬的頁面中插件的類型、線程閾值、線程信息列表。該內(nèi)存空間為虛擬內(nèi)存空間,大小通常為1GB,線程閾值為10,即一個插件進(jìn)程包含10個該類型插件的線程,內(nèi)存空間大小和線程閾值可根據(jù)實際情況設(shè)定。步驟S530,在該獨立的插件進(jìn)程中為各個相同類型的頁面中插件創(chuàng)建一線程以運(yùn)行頁面中插件。創(chuàng)建線程時在上述線程信息列表中的線程所對應(yīng)的標(biāo)簽頁的表項設(shè)置該線程對應(yīng)的插件對象所屬的標(biāo)簽頁ID,以便關(guān)閉標(biāo)簽頁時便于查找該標(biāo)簽頁中所有的插件對象對應(yīng)的線程,并將該這些線程關(guān)閉,釋放線程所占用的進(jìn)程的系統(tǒng)資源。本實施例中,對于進(jìn)程的創(chuàng)建,默認(rèn)是可以最大地創(chuàng)建256個進(jìn)程的,并發(fā)地同時在瀏覽器中開啟256個進(jìn)程很少出現(xiàn),所以256這個上限滿足瀏覽器的使用也滿足目前系統(tǒng)硬件上的實際情況。因此,在創(chuàng)建進(jìn)程之前,判斷與瀏覽器進(jìn)程獨立的頁面中插件的類型的進(jìn)程數(shù)是否到達(dá)進(jìn)程閾值(即256),若達(dá)到,則為該類型的頁面中插件創(chuàng)建新插件進(jìn)程。由于不同類型插件的插件進(jìn)行相互獨立,且都與瀏覽器進(jìn)程獨立,在瀏覽器運(yùn)行過程中,可能存在進(jìn)程間對系統(tǒng)資源的占用的競爭。因此,本實施例中,頁面中插件的類型的插件進(jìn)程與瀏覽器進(jìn)程之間通過互斥鎖實現(xiàn)進(jìn)程通信的互斥。為了有效管理進(jìn)程所占用的系統(tǒng)資源,當(dāng)頁面中插件所在的瀏覽器標(biāo)簽頁關(guān)閉時,則關(guān)閉頁面中插件的線程,并釋放所述線程占用的內(nèi)存空間,以重新分配系統(tǒng)資源。在此提供的算法和顯示不與任何特定計算機(jī)、虛擬系統(tǒng)或者其它設(shè)備固有相關(guān)。各種通用系統(tǒng)也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類系統(tǒng)所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對任何特定編程語言。應(yīng)當(dāng)明白,可以利用各種編程語言實現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對特定語言所做的描述是為了披露本發(fā)明的最佳實施方式。在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實施例可以在沒有這些具體細(xì)節(jié)的情況下實踐。在一些實例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對本說明書的理解。類似地,應(yīng)當(dāng)理解,為了精簡本公開并幫助理解各個發(fā)明方面中的一個或多個,在上面對本發(fā)明的示例性實施例的描述中,本發(fā)明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖即所要求保護(hù)的本發(fā)明要求比在每個權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個實施例的所有特征。因此,遵循具體實施方式
的權(quán)利要求書由此明確地并入該具體實施方式
,其中每個權(quán)利要求本身都作為本發(fā)明的單獨實施例。本領(lǐng)域那些技術(shù)人員可以理解,可以對實施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們設(shè)置在與該實施例不同的一個或多個設(shè)備中??梢园褜嵤├械哪K或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實施例的任意之一都可以以任意的組合方式來使用。本發(fā)明的各個部件實施例可以以硬件實現(xiàn),或者以在一個或者多個處理器上運(yùn)行的軟件模塊實現(xiàn),或者以它們的組合實現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實踐中使用微處理器或者數(shù)字信號處理器(DSP)來實現(xiàn)根據(jù)本發(fā)明實施例的瀏覽器中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計算機(jī)程序和計算機(jī)程序產(chǎn)品)。這樣的實現(xiàn)本發(fā)明的程序可以存儲在計算機(jī)可讀介質(zhì)上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。應(yīng)該注意的是上述實施例對本發(fā)明進(jìn)行說明而不是對本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計出替換實施例。在權(quán)利要求中,不應(yīng)將位于括號之間的任何參考符號構(gòu)造成對權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計算機(jī)來實現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序??蓪⑦@些單詞解釋為名稱。
權(quán)利要求
1.一種對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,包括 插件類型獲取器,適于獲取頁面加載過程中待加載的頁面中插件的類型; 插件進(jìn)程創(chuàng)建器,適于為相同類型的頁面中插件創(chuàng)建一獨立于瀏覽器進(jìn)程的插件進(jìn)程; 插件線程創(chuàng)建器,適于在該獨立的插件進(jìn)程中為各個相同類型的頁面中插件創(chuàng)建一線程以運(yùn)行所述頁面中插件。
2.如權(quán)利要求1所述的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,其特征在于,所述插件類型獲取器包括 類型ID解析器,適于解析待加載頁面中對應(yīng)的網(wǎng)頁元素,從中解析出標(biāo)識所述待加載的頁面中插件的唯一 ID,從而獲取待加載的頁面中插件的類型。
3.如權(quán)利要求2所述的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,其特征在于,所述插件類型獲取器進(jìn)一步包括 類型ID攔截器,適于攔截CoGetClassOb ject函數(shù),獲取被調(diào)用的所述待加載的頁面中插件的唯一 ID。
4.如權(quán)利要求1所述的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,其特征在于,所述插件進(jìn)程創(chuàng)建器進(jìn)一步包括 進(jìn)程查詢器,適于查詢所述頁面中插件的類型的插件進(jìn)程是否已創(chuàng)建; 進(jìn)程創(chuàng)建器,適于未創(chuàng)建插件進(jìn)程,或已創(chuàng)建的插件進(jìn)程中線程數(shù)達(dá)到線程閾值或當(dāng)前內(nèi)存占用達(dá)到預(yù)定配額時為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程,并更新所述頁面中插件的類型的進(jìn)程信息列表。
5.如權(quán)利要求4所述的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,其特征在于,所述進(jìn)程創(chuàng)建器進(jìn)一步適于根據(jù)待加載頁面的類型設(shè)置該頁面中不同類型插件的進(jìn)程優(yōu)先級,按所述進(jìn)程優(yōu)先級依次創(chuàng)建相應(yīng)頁面中插件的插件進(jìn)程。
6.如權(quán)利要求4所述的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,其特征在于,所述進(jìn)程創(chuàng)建器進(jìn)一步包括 新進(jìn)程生成器,適于生成一個具有唯一進(jìn)程ID的新插件進(jìn)程,并為其分配所述預(yù)定配額的內(nèi)存空間; 新進(jìn)程配置器,適于設(shè)置所述新插件進(jìn)程所屬的頁面中插件的類型、線程閾值、線程信息列表。
7.如權(quán)利要求4所述的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,其特征在于,所述瀏覽器還包括 進(jìn)程判斷器,適于判斷與所述瀏覽器進(jìn)程獨立的頁面中插件的類型的進(jìn)程數(shù)是否到達(dá)進(jìn)程閾值,若未達(dá)到,則為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程。
8.如權(quán)利要求廣7中任一項所述的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,其特征在于,所述瀏覽器還包括 進(jìn)程通信器,適于所述頁面中插件的類型的插件進(jìn)程與瀏覽器進(jìn)程之間通過互斥鎖實現(xiàn)進(jìn)程通信的互斥。
9.如權(quán)利要求Γ7中任一項所述的對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,其特征在于,所述瀏覽器還包括線程釋放器,適于當(dāng)所述頁面中插件所在的瀏覽器標(biāo)簽頁關(guān)閉時,則關(guān)閉所述頁面中插件的線程,并釋放所述線程占用的內(nèi)存空間。
10.一種網(wǎng)頁插件的隔離方法,包括步驟 獲取頁面加載過程中待加載的頁面中插件的類型; 為相同類型的頁面中插件創(chuàng)建一獨立于瀏覽器進(jìn)程的插件進(jìn)程; 在該獨立的插件進(jìn)程中為各個相同類型的頁面中插件創(chuàng)建一線程以運(yùn)行所述頁面中插件。
11.如權(quán)利要求10所述的網(wǎng)頁插件的隔離方法,其特征在于,所述獲取頁面加載過程中待加載的頁面中插件的類型的步驟包括 解析待加載頁面中對應(yīng)的網(wǎng)頁元素,從中解析出標(biāo)識所述待加載的頁面中插件的唯一I D,從而獲取待加載的頁面中插件的類型。
12.如權(quán)利要求11所述的網(wǎng)頁插件的隔離方法,其特征在于,進(jìn)一步包括 攔截CoGetClassObject函數(shù),獲取被調(diào)用的所述待加載的頁面中插件的唯一 ID。
13.如權(quán)利要求10所述的網(wǎng)頁插件的隔離方法,其特征在于,所述為相同類型的頁面中插件創(chuàng)建一獨立于瀏覽器進(jìn)程的插件進(jìn)程包括 查詢所述頁面中插件的類型的插件進(jìn)程是否已創(chuàng)建; 若未創(chuàng)建,或已創(chuàng)建的插件進(jìn)程中線程數(shù)達(dá)到線程閾值或當(dāng)前內(nèi)存占用達(dá)到預(yù)定配額,則為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程,并更新所述頁面中插件的類型的進(jìn)程信息列表。
14.如權(quán)利要求13所述的網(wǎng)頁插件的隔離方法,其特征在于,所述為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程的步驟包括 根據(jù)待加載頁面的類型設(shè)置該頁面中不同類型插件的進(jìn)程優(yōu)先級; 按所述進(jìn)程優(yōu)先級依次創(chuàng)建相應(yīng)頁面中插件的插件進(jìn)程。
15.如權(quán)利要求13所述的網(wǎng)頁插件的隔離方法,其特征在于,所述為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程的步驟進(jìn)一步包括 生成一個具有唯一進(jìn)程ID的新插件進(jìn)程,并為其分配所述預(yù)定配額的內(nèi)存空間; 設(shè)置所述新插件進(jìn)程所屬的頁面中插件的類型、線程閾值、線程信息列表。
16.如權(quán)利要求13所述的網(wǎng)頁插件的隔離方法,其特征在于,所述為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程的步驟之前還包括 判斷與所述瀏覽器進(jìn)程相獨立的頁面中插件的類型的進(jìn)程的數(shù)目是否到達(dá)進(jìn)程閾值,若未達(dá)到,則為該類型的所述頁面中插件創(chuàng)建新插件進(jìn)程。
17.如權(quán)利要求1(Γ16中任一項所述的網(wǎng)頁插件的隔離方法,其特征在于,所述頁面中插件的類型的插件進(jìn)程與瀏覽器進(jìn)程之間通過互斥鎖實現(xiàn)進(jìn)程通信的互斥。
18.如權(quán)利要求1(Γ16中任一項所述的網(wǎng)頁插件的隔離方法,其特征在于,進(jìn)一步包括 當(dāng)所述頁面中插件所在的瀏覽器標(biāo)簽頁關(guān)閉時,則關(guān)閉所述頁面中插件的線程,并釋放所述線程占用的內(nèi)存空間。
全文摘要
本發(fā)明涉及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,公開了一種對網(wǎng)頁中插件進(jìn)行隔離的瀏覽器,包括插件類型獲取器,適于獲取頁面加載過程中待加載的頁面中插件的類型;插件進(jìn)程創(chuàng)建器,適于為相同類型的頁面中插件創(chuàng)建一獨立于瀏覽器進(jìn)程的插件進(jìn)程;插件線程創(chuàng)建器,適于在該獨立的插件進(jìn)程中為各個相同類型的頁面中插件創(chuàng)建一線程以運(yùn)行所述頁面中插件。還公開了一種網(wǎng)頁插件的隔離方法。本發(fā)明通過使不同類型的網(wǎng)頁插件分別運(yùn)行在與瀏覽器進(jìn)程獨立的不同的進(jìn)程中,由此解決了由于插件崩潰導(dǎo)致的選項卡(或標(biāo)簽頁)崩潰或甚至整個瀏覽器崩潰的問題,取得了使瀏覽器運(yùn)行更穩(wěn)定的有益效果。
文檔編號G06F9/44GK103034495SQ20121053760
公開日2013年4月10日 申請日期2012年12月12日 優(yōu)先權(quán)日2012年12月12日
發(fā)明者楊曉兵, 任寰 申請人:北京奇虎科技有限公司, 奇智軟件(北京)有限公司