專利名稱::企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)及其方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及計(jì)算機(jī)軟件領(lǐng)域,特別涉及企業(yè)Web應(yīng)用系統(tǒng)領(lǐng)域,具體是指一種企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)及其方法。
背景技術(shù):
:隨著現(xiàn)代社會(huì)科學(xué)技術(shù)的發(fā)展,大型企業(yè)的計(jì)算機(jī)軟件系統(tǒng)即企業(yè)應(yīng)用系統(tǒng)的不斷進(jìn)步,已經(jīng)由過去的C/S(客戶端/服務(wù)器)模式轉(zhuǎn)變?yōu)楝F(xiàn)在的B/S(瀏覽器/服務(wù)器)模式,傳統(tǒng)的企業(yè)應(yīng)用系統(tǒng)已經(jīng)成為企業(yè)Web應(yīng)用系統(tǒng)。Javascript語言是企業(yè)Web應(yīng)用系統(tǒng)開發(fā)過程中一種必不可少的腳本語言,它提供了控制瀏覽器和在客戶端與用戶交互的方法,彌補(bǔ)了簡單HTML頁面的不足,增強(qiáng)了網(wǎng)頁與應(yīng)用程序間的交互。Javascript可以說是Internet上最流行的腳本語言,它工作在包括IE、Firefox、Safari、0pera和GoogleChrome等主流瀏覽器中。隨著web2.0的發(fā)展,RIA(富Internet應(yīng)用,RichInternetApplication)應(yīng)用層出不窮,Javascript在其中擔(dān)任的角色越來越重要。另一方面,chrome等瀏覽器的發(fā)布,firefox和safari等瀏覽器不斷推出新版本,都給Javascript發(fā)展帶來了新的契機(jī)。程序調(diào)試目前主要存在兩種方式,一種是編譯調(diào)試目標(biāo)文件,即將調(diào)試所用的語句編譯到目標(biāo)代碼中,一種是調(diào)用該程序語言的運(yùn)行容器接口丄/0++語言的調(diào)試采用的是前一種方式,例如目前比較流行的調(diào)試工具GDB和微軟的VisualStudio自帶的Debugger,在這種方式中首先需要編譯一個(gè)"debug"模式的程序并將調(diào)試語句編譯到程序中,同時(shí)在調(diào)試過程中debugger深層介入程序的運(yùn)行,掌握和控制運(yùn)行態(tài)的一些信息并將這些信息及時(shí)返回。Java調(diào)試采用的是后一種方式,即使用Java虛擬機(jī)工具接口(JavaVirtualMachineToolInterface,JVMTI)提供的調(diào)試接口。目前的Javascript調(diào)試工具也采用后一種方式,IE和Firefox分別提供了Javascript的調(diào)試接口,調(diào)試Javascript主要在IE和Firefox下進(jìn)行。例如Firefox提供的調(diào)試接口是jsdIDebuggerService,通過向其中注入一些調(diào)試鉤子來實(shí)現(xiàn)調(diào)試。jsdIDebuggerService提供的調(diào)試接□主要有breakpointHook、debuggerHook、debugHook、errorHook、functionHook、interr卯tHook、scriptHook、throwHook、topLevelHook等。使用者只要實(shí)現(xiàn)這些接口并注冊到j(luò)sdIDebuggerService中,即可在Firefox中調(diào)試Javascript。Firebug、venkman、aptana、netbeans以及MyEclipse等者卩是使用這些接口在Firefox下實(shí)現(xiàn)Javascript調(diào)試。采用第二種調(diào)試方式的Javascript調(diào)試工具存在如下弊端首先不能跨瀏覽器,各個(gè)瀏覽器提供的調(diào)試接口都不相同,基于瀏覽器開發(fā)出來的調(diào)試工具無法通用,實(shí)現(xiàn)一個(gè)整合了多個(gè)瀏覽器引擎的調(diào)試工具本身也相當(dāng)困難。其次需要安裝插件,此類調(diào)試工具都需要在瀏覽器上安裝插件。而且瀏覽器版本的升級會(huì)導(dǎo)致調(diào)試工具無法使用。
發(fā)明內(nèi)容本發(fā)明的目的是克服了上述現(xiàn)有技術(shù)中的缺點(diǎn),提供一種不依賴于具體瀏覽器和調(diào)試插件的Javascript調(diào)試支持、系統(tǒng)架構(gòu)簡單、使用維護(hù)方便快捷、工作性能穩(wěn)定可靠、適用范圍較為廣泛的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)及其方法。為了實(shí)現(xiàn)上述的目的,本發(fā)明的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)及其方法如下該企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng),包括圖形化Javascript調(diào)試平臺(tái)和跨瀏覽器Javascript調(diào)試框架,其主要特點(diǎn)是,所述的圖形化Javascript調(diào)試平臺(tái)包括調(diào)試器引擎模塊,解析Javascript和Html,為編譯引擎模塊和調(diào)試器用戶界面模塊提供Javascript源代碼的調(diào)試信息,在斷點(diǎn)配置時(shí)及編譯引擎中被調(diào)用;Http服務(wù)器模塊,與瀏覽器、Web應(yīng)用服務(wù)器以及本地文件系統(tǒng)進(jìn)行通信;代理服務(wù)器模塊,提供訪問遠(yuǎn)程Web應(yīng)用服務(wù)器中URL的功能,統(tǒng)一URL域,支持跨域URL訪問;編譯引擎模塊,將調(diào)試源文件編譯為帶調(diào)試代碼的調(diào)試目標(biāo)文件;調(diào)試服務(wù)器模塊,接受來自瀏覽器的調(diào)試代碼API的Ajax請求,解析調(diào)試代碼發(fā)送的指令、調(diào)用堆棧、變量等信息,并將斷點(diǎn)、指令等信息返回給瀏覽器端運(yùn)行的調(diào)試代碼;調(diào)試器用戶界面模塊;提供與用戶交互的斷點(diǎn)管理、源文件定位、調(diào)試啟動(dòng)、查看變量和調(diào)試動(dòng)作功能,通過調(diào)試事件和調(diào)試服務(wù)器模塊交互;所述的跨瀏覽器的Javascript調(diào)試框架包括跨瀏覽器支持模塊,封裝有跨瀏覽器的Javascript應(yīng)用程序接口;調(diào)試代碼應(yīng)用程序接口模塊,提供調(diào)試函數(shù),在瀏覽器中運(yùn)行的Javascript代碼在每一行代碼執(zhí)行之前,都會(huì)調(diào)用該調(diào)試函數(shù)來判斷程序是否進(jìn)行中斷,如果遇到斷點(diǎn)或單步執(zhí)行等中斷時(shí),就向調(diào)試服務(wù)器發(fā)送同步Ajax請求,將當(dāng)前的資源、行號、調(diào)用堆棧和調(diào)試數(shù)據(jù)信息發(fā)送給調(diào)試服務(wù)器;調(diào)用堆棧管理模塊,提供客戶端調(diào)用堆棧管理功能,在跟進(jìn)、跟出操作過程中進(jìn)行堆棧判斷;調(diào)試命令解析模塊,用于與調(diào)試服務(wù)器模塊交互時(shí)解析調(diào)試服務(wù)器模塊傳回的調(diào)試指令。該企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)中的調(diào)試信息包括總行數(shù)和可以下斷點(diǎn)的行號。該企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)中的調(diào)試動(dòng)作包括足艮出stepover、足艮進(jìn)stepinto、返回stepreturn、繼續(xù)手丸行resume禾口終止terminate。該企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)中的Javascript應(yīng)用程序接口包括Ajax調(diào)用接口、json格式轉(zhuǎn)換和存儲(chǔ)調(diào)用堆棧接口。該企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)中的調(diào)試指令包括足艮進(jìn)stepInto、足艮出stepOver、返回stepReturn、繼續(xù)手丸行resume禾口終止terminate。該基于上述的系統(tǒng)實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其主要特點(diǎn)是,所述的方法包括圖形化Javascript調(diào)試平臺(tái)的預(yù)處理操作、斷點(diǎn)配置操作和調(diào)試中斷操作,所述的圖形化Javascript調(diào)試平臺(tái)的預(yù)處理操作,包括以下步驟(11)所述的圖形化Javascript調(diào)試平臺(tái)進(jìn)行初始化操作;(12)所述的調(diào)試器用戶界面模塊根據(jù)預(yù)先配置的調(diào)試端口啟動(dòng)一個(gè)Http服務(wù)器模塊,并記錄調(diào)試服務(wù)器模塊的地址;(13)所述的圖形化Javascript調(diào)試平臺(tái)生成客戶端URL;(14)所述的圖形化Javascript調(diào)試平臺(tái)打開瀏覽器;(15)所述的瀏覽器向Http服務(wù)器模塊發(fā)送地址為該客戶端URL的HTTP請求;(16)所述的Http服務(wù)器模塊向用戶輸入的URL發(fā)送HTTP請求,獲得該URL上的調(diào)試源文件并保存;(17)所述的圖形化Javascript調(diào)試平臺(tái)將該Http服務(wù)器模塊所獲得的調(diào)試源文件的代碼文本顯示在調(diào)試器用戶界面模塊中;(18)所述的Http服務(wù)器模塊調(diào)用編譯引擎模塊生成編譯后的調(diào)試目標(biāo)文件;(19)所述的編譯引擎模塊將編譯后的調(diào)試目標(biāo)文件輸出到瀏覽器中執(zhí)行;所述的斷點(diǎn)配置操作,包括以下步驟(21)用戶通過調(diào)試器用戶界面模塊在調(diào)試源文件中設(shè)置斷點(diǎn)標(biāo)記;(22)所述的調(diào)試器用戶界面模塊向跨瀏覽器Javascript調(diào)試框架中的斷點(diǎn)管理器添力口Javascript斷點(diǎn)標(biāo)記;(23)所述的調(diào)試命令解析模塊每隔一系統(tǒng)預(yù)設(shè)的時(shí)間間隔周期性地向調(diào)試服務(wù)器模塊發(fā)送異步Ajax請求來獲取Javascript斷點(diǎn)信息;(24)所述的調(diào)試服務(wù)器模塊讀取該斷點(diǎn)管理器中所有的斷點(diǎn)信息;(25)所述的調(diào)試服務(wù)器模塊將獲得的所有斷點(diǎn)信息返回給所述的調(diào)試命令解析模塊;(26)所述的調(diào)試命令解析模塊將斷點(diǎn)信息保存到瀏覽器端;所述的調(diào)試中斷操作包括以下步驟(31)根據(jù)用戶的操作,所述的調(diào)試器用戶界面模塊將相應(yīng)的調(diào)試指令發(fā)送到所述的調(diào)試服務(wù)器模塊;(32)所述的調(diào)試服務(wù)器模塊將該調(diào)試指令輸出到瀏覽器;(33)所述的調(diào)試命令解析模塊解析收到的該調(diào)試指令并執(zhí)行相應(yīng)的操作;(34)瀏覽器執(zhí)行某一行Javascript代碼之前的調(diào)試代碼應(yīng)用程序接口模塊中的調(diào)試函數(shù);(35)所述的調(diào)試代碼應(yīng)用程序接口模塊根據(jù)指令信息判斷瀏覽器執(zhí)行的當(dāng)前行是否需要中斷;(36)所述的調(diào)試代碼應(yīng)用程序接口模塊發(fā)送同步Ajax請求給所述的調(diào)試服務(wù)器模塊;(37)所述的調(diào)試服務(wù)器模塊構(gòu)造數(shù)據(jù)模型并向所述的調(diào)試器用戶界面模塊發(fā)送調(diào)試事件;(38)所述的調(diào)試器用戶界面模塊向所述的調(diào)試服務(wù)器模塊請求數(shù)據(jù)模型并更新調(diào)試視(39)所述的調(diào)試服務(wù)器模塊掛起當(dāng)前的同步Ajax請求,并把當(dāng)前的請求對象和當(dāng)前的堆棧關(guān)聯(lián)起來;(310)所述的調(diào)試器用戶界面模塊接收到調(diào)試事件和調(diào)試相關(guān)的資源、行號、調(diào)用堆棧、變量等數(shù)據(jù);(311)所述的調(diào)試器用戶界面模塊根據(jù)調(diào)試資源的相對路徑找到保存的調(diào)試源文件;(312)所述的調(diào)試器用戶界面模塊定位到調(diào)試源文件中的中斷行并顯示調(diào)試數(shù)據(jù)。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的圖形化Javascript調(diào)試平臺(tái)進(jìn)行初始化操作,包括以下步驟(111)根據(jù)用戶的操作,所述的圖形化Javascript調(diào)試平臺(tái)在所述的調(diào)試器用戶界面模塊中創(chuàng)建一個(gè)新的調(diào)試實(shí)例;(112)所述的圖形化Javascript調(diào)試平臺(tái)將用戶輸入的URL和瀏覽器路徑信息發(fā)送到啟動(dòng)調(diào)試界面。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的圖形化Javascript調(diào)試平臺(tái)生成客戶端URL,包括以下步驟(121)所述的圖形化Javascript調(diào)試平臺(tái)從所述的調(diào)試器用戶界面模塊中獲取調(diào)試服務(wù)器端口和用戶輸入的URL;(122)分別使用本地網(wǎng)絡(luò)地址127.0.0.1和調(diào)試服務(wù)器端口替換用戶輸入的URL中的服務(wù)器地址和端口,調(diào)試文件的文件名保持不變。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的用戶輸入的URL格式為http:〃[服務(wù)器地址]:[端口]/[文件名]。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的客戶端URL格式為http:〃127.0.0.1:[調(diào)試端口]/[文件名]。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的Http服務(wù)器模塊調(diào)用編譯引擎模塊生成編譯后的調(diào)試目標(biāo)文件,包括以下步驟(131)所述的Http服務(wù)器模塊傳入調(diào)試源文件的URL和文本內(nèi)容;(132)所述的Http服務(wù)器模塊調(diào)用編譯引擎編譯源文件資源;(133)所述的編譯引擎模塊根據(jù)對傳入資源的每一行判斷是否能下斷點(diǎn),根據(jù)判斷結(jié)果分別執(zhí)行以下步驟(a)如果該行能下斷點(diǎn),則在該行前面加上調(diào)試代碼;(b)如果該行不能下斷點(diǎn),則前進(jìn)到下一行;(134)所述的編譯引擎模塊將編譯完成后的代碼存為調(diào)試目標(biāo)文件。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的用戶通過調(diào)試器用戶界面模塊在調(diào)試源文件中設(shè)置斷點(diǎn)標(biāo)記,包括以下步驟(211)所述的調(diào)試器用戶界面模塊傳入調(diào)試源文件的URL和文本內(nèi)容;(212)用戶在資源編輯器中添加Javascript斷點(diǎn);(213)所述的調(diào)試器用戶界面模塊判斷當(dāng)前行是否能下斷點(diǎn),并根據(jù)判斷結(jié)果分別執(zhí)行以下步驟(a)如果當(dāng)前行能下斷點(diǎn),調(diào)試器UI往斷點(diǎn)管理器中添加一個(gè)斷點(diǎn)并通知調(diào)試視圖顯示斷點(diǎn);(b)如果當(dāng)前行不能下斷點(diǎn),則用戶的操作無效。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的系統(tǒng)預(yù)設(shè)的時(shí)間間隔為500ms。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的調(diào)試命令解析模塊發(fā)送的異步Ajax請求數(shù)據(jù)的格式為[COMMAND]:[調(diào)試事件]。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的調(diào)試服務(wù)器模塊返回給調(diào)試命令解析模塊的斷點(diǎn)信息數(shù)據(jù)的格式為[COMMAND]:[調(diào)試事件][斷點(diǎn)]:[[斷點(diǎn)1:[資源路徑][行號]][斷點(diǎn)2:[資源路徑][行號]]]。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的調(diào)試指令包括足艮進(jìn)stepInto、足艮出stepOver、返回stepReturn、繼續(xù)手丸行resume禾口終止terminate。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的調(diào)試服務(wù)器模塊輸出到瀏覽器的指令格式為[COMMAND]:[調(diào)試指令]。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的調(diào)試命令解析模塊解析收到的調(diào)試指令并執(zhí)行相應(yīng)的操作,包括以下步驟(321)所述的調(diào)試命令解析模塊解析收到的調(diào)試指令;(322)所述的調(diào)試命令解析模塊根據(jù)調(diào)試指令來執(zhí)行相應(yīng)的操作,具體包括以下步驟(a)如果收到的指令是終止terminate,則拋出一個(gè)終止terminate異常,終止程序執(zhí)行;(b)如果收到的指令是跟進(jìn)st印Into、返回st印Return、繼續(xù)執(zhí)行resume或者跟出st印Over,則把當(dāng)前指令狀態(tài)存放起來,下一句用戶的Javascript代碼執(zhí)行前的調(diào)試代碼應(yīng)用程序接口模塊會(huì)根據(jù)當(dāng)前指令和堆棧等信息判斷是否掛起;(c)如果不需要掛起,則繼續(xù)執(zhí)行用戶Javascript;(d)如果需要掛起,則進(jìn)行下一個(gè)調(diào)試中斷操作。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的調(diào)試代碼應(yīng)用程序接口模塊根據(jù)指令信息判斷瀏覽器執(zhí)行的當(dāng)前行是否需要中斷,包括以下步驟(331)所述的調(diào)試代碼應(yīng)用程序接口模塊獲取當(dāng)前的調(diào)試指令、斷點(diǎn)信息、以及當(dāng)前的調(diào)用堆棧數(shù)據(jù);(332)調(diào)試代碼應(yīng)用程序接口模塊判斷瀏覽器執(zhí)行的當(dāng)前行是否需要中斷,并根據(jù)判斷結(jié)果分別執(zhí)行以下步驟(a)如果當(dāng)前行不需要中斷,則繼續(xù)執(zhí)行;(b)如果當(dāng)前行需要中斷,則調(diào)試代碼應(yīng)用程序接口模塊調(diào)用調(diào)試堆棧管理獲得當(dāng)前的堆棧以及當(dāng)前的變量并傳送給調(diào)試服務(wù)器模塊。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的調(diào)試服務(wù)器模塊構(gòu)造數(shù)據(jù)模型并向所述的調(diào)試器用戶界面模塊發(fā)送調(diào)試事件,包括以下步驟(341)所述的調(diào)試服務(wù)器模塊接收中斷請求;(342)所述的調(diào)試服務(wù)器模塊根據(jù)調(diào)試代碼應(yīng)用程序接口模塊傳入的數(shù)據(jù)構(gòu)造調(diào)試數(shù)據(jù)模型;(343)所述的圖形化Javascript調(diào)試平臺(tái)向調(diào)試器用戶界面模塊發(fā)送調(diào)試事件。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的調(diào)試器用戶界面模塊定位到調(diào)試源文件中的中斷行并顯示調(diào)試數(shù)據(jù),包括以下步驟(351)所述的調(diào)試器用戶界面模塊根據(jù)調(diào)試源文件路徑打開調(diào)試源文件并根據(jù)當(dāng)前行號定位到中斷行;(352)所述的調(diào)試器用戶界面模塊根據(jù)調(diào)試數(shù)據(jù)模型顯示調(diào)試狀態(tài)及調(diào)試數(shù)據(jù)。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的調(diào)試代碼應(yīng)用程序接口模塊發(fā)送的同步Ajax請求數(shù)據(jù)格式為[COMMAND]:[調(diào)試事件][調(diào)用堆棧]:[調(diào)用堆棧和變量][資源路徑]:[資源文件URL][行號]:[當(dāng)前Javascript行號]。該實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法中的調(diào)試事件包括斷點(diǎn)breakpoint、足艮出stepOver、足艮進(jìn)stepInto、返回stepRetrun、繼續(xù)手丸行resume、終止terminate。采用了該發(fā)明的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)及其方法,由于在圖形化調(diào)試平臺(tái)中對要進(jìn)行調(diào)試的Html源文件或Javascript源文件進(jìn)行了編譯,將調(diào)試代碼API添加到了源文件中可以設(shè)置斷點(diǎn)的代碼行前,生成了調(diào)試目標(biāo)文件并在瀏覽器中執(zhí)行,當(dāng)瀏覽器運(yùn)行到Javascript代碼的斷點(diǎn)處時(shí),調(diào)試代碼API根據(jù)圖形化調(diào)試平臺(tái)發(fā)送的調(diào)試指令判斷執(zhí)行中斷,將相關(guān)調(diào)試數(shù)據(jù)以同步Ajax請求的形式發(fā)送到圖形化調(diào)試平臺(tái),最后調(diào)試平臺(tái)根據(jù)斷點(diǎn)信息進(jìn)行斷點(diǎn)的展現(xiàn)操作,從而實(shí)現(xiàn)了跨瀏覽器的Javascript圖形化集成環(huán)境調(diào)試,增強(qiáng)了調(diào)試的直觀效果,提高了調(diào)試的效率,不僅操作簡單形象,而且快捷方便,整個(gè)調(diào)試環(huán)境的運(yùn)行效率較高,系統(tǒng)性能穩(wěn)定可靠,降低了開發(fā)維護(hù)的成本;同時(shí)增強(qiáng)了系統(tǒng)可移植性和可擴(kuò)展性;不僅如此,該方法還能夠快速回應(yīng)業(yè)務(wù)需求的變化和技術(shù)變化,能夠支撐建立高度模塊化而且又高度整合的軟件系統(tǒng),不依賴于具體瀏覽器和調(diào)試插件的Javascript調(diào)試支持,系統(tǒng)架構(gòu)簡單,使用維護(hù)方便快捷,工作性能穩(wěn)定可靠,適用范圍較為廣泛,為企業(yè)Web應(yīng)用軟件技術(shù)的進(jìn)一步發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。圖1為本發(fā)明的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)的整體架構(gòu)組成示意圖。圖2為本發(fā)明的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)在Eclipse調(diào)試框架中的啟動(dòng)框架模型的類圖。圖3為本發(fā)明的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)在12Eclipse調(diào)試框架中的調(diào)試模塊模型的類圖。圖4為本發(fā)明的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)在Eclipse調(diào)試框架中的斷點(diǎn)模型的類圖。圖5為本發(fā)明的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)在Eclipse環(huán)境下JavascriptDebugToolkit(調(diào)試工具)調(diào)試界面的示意圖。圖6為本發(fā)明的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法的圖形化調(diào)試平臺(tái)的預(yù)處理操作的流程圖。圖7為本發(fā)明的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法的斷點(diǎn)配置操作的流程圖。圖8為本發(fā)明的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法的調(diào)試中斷操作的流程具體實(shí)施例方式為了能夠更清楚地理解本發(fā)明的技術(shù)內(nèi)容,特舉以下實(shí)施例詳細(xì)說明。請參閱圖1所示,該企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng),包括圖形化Javascript調(diào)試平臺(tái)和跨瀏覽器Javascript調(diào)試框架,其中,所述的圖形化Javascript調(diào)試平臺(tái)包括(1)調(diào)試器引擎模塊,解析Javascript和Html,為編譯引擎模塊和調(diào)試器用戶界面模塊提供Javascript源代碼的調(diào)試信息,在斷點(diǎn)配置時(shí)及編譯引擎中被調(diào)用;其中,該調(diào)試信息包括總行數(shù)和可以下斷點(diǎn)的行號;(2)Http服務(wù)器模塊,與瀏覽器、Web應(yīng)用服務(wù)器以及本地文件系統(tǒng)進(jìn)行通信;(3)代理服務(wù)器模塊,提供訪問遠(yuǎn)程Web應(yīng)用服務(wù)器中URL的功能,統(tǒng)一URL域,支持跨域URL訪問;(4)編譯引擎模塊,將調(diào)試源文件編譯為帶調(diào)試代碼的調(diào)試目標(biāo)文件;(5)調(diào)試服務(wù)器模塊,接受來自瀏覽器的調(diào)試代碼API的Ajax請求,解析調(diào)試代碼發(fā)送的指令、調(diào)用堆棧、變量等信息,并將斷點(diǎn)、指令等信息返回給瀏覽器端運(yùn)行的調(diào)試代碼;(6)調(diào)試器用戶界面模塊;提供與用戶交互的斷點(diǎn)管理、源文件定位、調(diào)試啟動(dòng)、查看變量和調(diào)試動(dòng)作功能,通過調(diào)試事件和調(diào)試服務(wù)器模塊交互;其中該調(diào)試動(dòng)作包括跟出st印over、足艮進(jìn)st印into、返回st印return、繼續(xù)執(zhí)行resume禾口終止terminate;所述的跨瀏覽器的Javascript調(diào)試框架包括(1)跨瀏覽器支持模塊,封裝有跨瀏覽器的Javascript應(yīng)用程序接口;該Javascript應(yīng)用程序接口包括Ajax調(diào)用接口、json格式轉(zhuǎn)換和存儲(chǔ)調(diào)用堆棧接口;(2)調(diào)試代碼應(yīng)用程序接口模塊,提供調(diào)試函數(shù),在瀏覽器中運(yùn)行的Javascript代碼在每一行代碼執(zhí)行之前,都會(huì)調(diào)用該調(diào)試函數(shù)來判斷程序是否進(jìn)行中斷,如果遇到斷點(diǎn)或單步執(zhí)行等中斷時(shí),就向調(diào)試服務(wù)器發(fā)送同步Ajax請求,將當(dāng)前的資源、行號、調(diào)用堆棧和調(diào)試數(shù)據(jù)信息發(fā)送給調(diào)試服務(wù)器;(3)調(diào)用堆棧管理模塊,提供客戶端調(diào)用堆棧管理功能,在跟進(jìn)、跟出操作過程中進(jìn)行堆棧判斷;(4)調(diào)試命令解析模塊,用于與調(diào)試服務(wù)器模塊交互時(shí)解析調(diào)試服務(wù)器模塊傳回的調(diào)試指令;該調(diào)試指令包括跟進(jìn)st印Into、跟出st印0ver、返回st印Return、繼續(xù)執(zhí)行resume禾口終止terminate。在實(shí)際使用當(dāng)中,企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)中包括圖形化Javascript調(diào)試平臺(tái)和跨瀏覽器Javascript調(diào)試框架,其中的圖形化Javascript調(diào)試平臺(tái)包括調(diào)試器引擎模塊、Http服務(wù)器模塊、代理服務(wù)器模塊、編譯引擎模塊、調(diào)試服務(wù)器模塊和調(diào)試器用戶界面(UI)模塊;跨瀏覽器的Javascript調(diào)試框架包括跨瀏覽器支持模塊、調(diào)試代碼應(yīng)用程序接口(API)模塊、調(diào)用堆棧管理模塊以及調(diào)試命令解析模塊,具體如下參調(diào)試器引擎模塊——主要功能是解析Javascript和Html,為編譯引擎和調(diào)試器UI提供Javascript源代碼的調(diào)試信息,包括總行數(shù)、可以下斷點(diǎn)的行號等內(nèi)容,在斷點(diǎn)配置時(shí)及編譯引擎中被調(diào)用。參Http服務(wù)器模塊——提供了與瀏覽器、Web應(yīng)用服務(wù)器以及本地文件系統(tǒng)通信的功能,基于Http服務(wù)器的圖形化Javascript調(diào)試平臺(tái)提供了代理服務(wù)器、編譯引擎和調(diào)試服務(wù)器三個(gè)功能模塊。參代理服務(wù)器模塊一一提供了訪問遠(yuǎn)程Web應(yīng)用服務(wù)器中URL的功能,代理服務(wù)器的主要作用是統(tǒng)一URL域,解決Javascript調(diào)試中的跨域問題。參編譯引擎模塊——提供了將調(diào)試源文件編譯為帶調(diào)試代碼的調(diào)試目標(biāo)文件的引擎。參調(diào)試服務(wù)器模塊——接受來自瀏覽器的調(diào)試代碼API的Ajax請求,解析調(diào)試代碼發(fā)送的指令、調(diào)用堆棧、變量等信息,并將斷點(diǎn)、指令等信息返回給瀏覽器端運(yùn)行的調(diào)試代碼。參調(diào)試器UI模塊——提供斷點(diǎn)管理、源文件定位、調(diào)試啟動(dòng)、查看變量、調(diào)試動(dòng)作(st印over、st印into、st印retr皿、resume、terminate)等與用戶交互的功會(huì)g,通過調(diào)試事件和調(diào)試服務(wù)器交互。參跨瀏覽器支持模塊——封裝了跨瀏覽器的JavascriptAPI,主要是Ajax調(diào)用、json格式轉(zhuǎn)換和存儲(chǔ)調(diào)用堆棧等方面的底層API,這些API是跨瀏覽器的,因此Javascript調(diào)試工具可以實(shí)現(xiàn)跨瀏覽器的Javascript調(diào)試。參調(diào)試代碼API模塊——提供了一個(gè)$jsd函數(shù),在瀏覽器中運(yùn)行的Javascript代碼在每一行代碼執(zhí)行之前,都會(huì)調(diào)用該函數(shù)來判斷程序是否進(jìn)行中斷;如果遇到斷點(diǎn)或單步執(zhí)行等中斷時(shí),就向調(diào)試服務(wù)器發(fā)送同步Ajax請求,將當(dāng)前的資源、行號、調(diào)用堆棧、調(diào)試數(shù)據(jù)等內(nèi)容發(fā)送給調(diào)試服務(wù)器。參調(diào)用堆棧管理模塊——提供了一個(gè)客戶端調(diào)用堆棧管理的功能,主要在跟進(jìn)、跟出等操作過程中起堆棧判斷作用。參調(diào)試命令解析模塊——主要用于與調(diào)試服務(wù)器交互時(shí)解析調(diào)試服務(wù)器傳回的指令,包括執(zhí)行、跟進(jìn)、跟出、下一步等。調(diào)試器UI需要實(shí)現(xiàn)Eclipse調(diào)試框架的幾個(gè)基本模塊(1)啟動(dòng)框架(LaunchFramework)再請參閱圖2所示,其中表示LaunchFramework中的模型類圖,其中Launchconfigurationtypes-可用的Launch類型Launchconfigurations-Launch方式禾口內(nèi)容的描述參Launchmanager-負(fù)責(zé)存儲(chǔ)Launch類型,配置及Launch對象Launchdelegates-執(zhí)行LaunchLaunchobjects-Launchedprocess進(jìn)禾呈/debugtargets目標(biāo)的容器參Tabgroups——編輯Launch配置信息的UI界面(2)調(diào)試模塊(DebugModel)再請參閱圖3所示,其表示DebugModel的模型類圖,其中DebugModelElements-被調(diào)試的程序元素Capabilities-對st印ping、resuming、terminating的支持參DebugEvents——在執(zhí)行目標(biāo)或進(jìn)程時(shí)發(fā)生的事件參Views-顯示調(diào)試會(huì)話信息的視圖-threads、frames、variables等參Actions-與被調(diào)試程序之間交互動(dòng)作的菜單-st印、resume等DebugModelPresentation-為debugmodelelements提供標(biāo)簽禾口圖片(3)斷點(diǎn)(Breakpoint)再請參閱圖4所示,其表示斷點(diǎn)模型的類圖,斷點(diǎn)Breakpoint是在某位置或者滿足某種條件下掛起(suspend)程序的一種方式。斷點(diǎn)模型提供Add、Remove和Change斷點(diǎn)的通知機(jī)制,并提供跨工作臺(tái)調(diào)用斷點(diǎn)的持久化機(jī)制。其中參Breakpointextension-擴(kuò)展斷點(diǎn)的擴(kuò)展點(diǎn)參Breakpoint——代表斷點(diǎn)實(shí)例的模型對象參Marker——用于持久化斷點(diǎn)屬性以及在編輯器中顯示斷點(diǎn)參BreakpointManager——斷點(diǎn)倉庫,提供斷點(diǎn)變化的事件通知參DebugTarget——安裝斷點(diǎn)的底層運(yùn)行而圖5為本發(fā)明的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)在Eclipse環(huán)境下JavascriptDebugToolkit(調(diào)試工具)調(diào)試界面的示意圖。再請參閱圖6至圖8所示,該基于上述的系統(tǒng)實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其中包括圖形化Javascript調(diào)試平臺(tái)的預(yù)處理操作、斷點(diǎn)配置操作和調(diào)試中斷操作,所述的圖形化Javascript調(diào)試平臺(tái)的預(yù)處理操作,包括以下步驟(11)所述的圖形化Javascript調(diào)試平臺(tái)進(jìn)行初始化操作,包括以下步驟(a)根據(jù)用戶的操作,所述的圖形化Javascript調(diào)試平臺(tái)在所述的調(diào)試器用戶界面模塊中創(chuàng)建一個(gè)新的調(diào)試實(shí)例;(b)所述的圖形化Javascript調(diào)試平臺(tái)將用戶輸入的URL和瀏覽器路徑信息發(fā)送到啟動(dòng)調(diào)試界面;該用戶輸入的URL格式為http:〃[服務(wù)器地址]:[端口]/[文件名];(12)所述的調(diào)試器用戶界面模塊根據(jù)預(yù)先配置的調(diào)試端口啟動(dòng)一個(gè)Http服務(wù)器模塊,并記錄調(diào)試服務(wù)器模塊的地址;(13)所述的圖形化Javascript調(diào)試平臺(tái)生成客戶端URL,包括以下步驟(a)所述的圖形化Javascript調(diào)試平臺(tái)從所述的調(diào)試器用戶界面模塊中獲取調(diào)試服務(wù)器端口和用戶輸入的URL;(b)分別使用本地網(wǎng)絡(luò)地址127.0.0.1和調(diào)試服務(wù)器端口替換用戶輸入的URL中的服務(wù)器地址和端口,調(diào)試文件的文件名保持不變;(14)所述的圖形化Javascript調(diào)試平臺(tái)打開瀏覽器;(15)所述的瀏覽器向Http服務(wù)器模塊發(fā)送地址為該客戶端URL的HTTP請求;該客戶端URL格式為http:〃127.0.0.1:[調(diào)試端口]/[文件名];(16)所述的Http服務(wù)器模塊向用戶輸入的URL發(fā)送HTTP請求,獲得該URL上的調(diào)試源文件并保存;(17)所述的圖形化Javascript調(diào)試平臺(tái)將該Http服務(wù)器模塊所獲得的調(diào)試源文件的代碼文本顯示在調(diào)試器用戶界面模塊中;(18)所述的Http服務(wù)器模塊調(diào)用編譯引擎模塊生成編譯后的調(diào)試目標(biāo)文件,包括以下步驟(a)所述的Http服務(wù)器模塊傳入調(diào)試源文件的URL和文本內(nèi)容;(b)所述的Http服務(wù)器模塊調(diào)用編譯引擎編譯源文件資源;(c)所述的編譯引擎模塊根據(jù)對傳入資源的每一行判斷是否能下斷點(diǎn),根據(jù)判斷結(jié)果分別執(zhí)行以下步驟(i)如果該行能下斷點(diǎn),則在該行前面加上調(diào)試代碼;(ii)如果該行不能下斷點(diǎn),則前進(jìn)到下一行;(d)所述的編譯引擎模塊將編譯完成后的代碼存為調(diào)試目標(biāo)文件;(19)所述的編譯引擎模塊將編譯后的調(diào)試目標(biāo)文件輸出到瀏覽器中執(zhí)行;所述的斷點(diǎn)配置操作,包括以下步驟(21)用戶通過調(diào)試器用戶界面模塊在調(diào)試源文件中設(shè)置斷點(diǎn)標(biāo)記,包括以下步驟(a)所述的調(diào)試器用戶界面模塊傳入調(diào)試源文件的URL和文本內(nèi)容;(b)用戶在資源編輯器中添加Javascript斷點(diǎn);(c)所述的調(diào)試器用戶界面模塊判斷當(dāng)前行是否能下斷點(diǎn),并根據(jù)判斷結(jié)果分別執(zhí)行以下步驟(i)如果當(dāng)前行能下斷點(diǎn),調(diào)試器UI往斷點(diǎn)管理器中添加一個(gè)斷點(diǎn)并通知調(diào)試視圖顯示斷點(diǎn);(ii)如果當(dāng)前行不能下斷點(diǎn),則用戶的操作無效;(22)所述的調(diào)試器用戶界面模塊向跨瀏覽器Javascript調(diào)試框架中的斷點(diǎn)管理器添力口Javascript斷點(diǎn)標(biāo)記;(23)所述的調(diào)試命令解析模塊每隔一系統(tǒng)預(yù)設(shè)的時(shí)間間隔周期性地向調(diào)試服務(wù)器模塊發(fā)送異步Ajax請求來獲取Javascript斷點(diǎn)信息;該系統(tǒng)預(yù)設(shè)的時(shí)間間隔為500ms;該調(diào)試命令解析模塊發(fā)送的異步Ajax請求數(shù)據(jù)的格式為[COMMAND]:[調(diào)試事件];該調(diào)試事件包括斷點(diǎn)breakpoint、跟出st印0ver、跟進(jìn)st印Into、返回st印Retr皿、繼續(xù)執(zhí)行resume、終止terminate;(24)所述的調(diào)試服務(wù)器模塊讀取該斷點(diǎn)管理器中所有的斷點(diǎn)信息;(25)所述的調(diào)試服務(wù)器模塊將獲得的所有斷點(diǎn)信息返回給所述的調(diào)試命令解析模塊;該調(diào)試服務(wù)器模塊返回給調(diào)試命令解析模塊的斷點(diǎn)信息數(shù)據(jù)的格式為[COMMAND]:[調(diào)試事件][斷點(diǎn)]:[[斷點(diǎn)1:[資源路徑][行號]][斷點(diǎn)2:[資源路徑][行號]]];(26)所述的調(diào)試命令解析模塊將斷點(diǎn)信息保存到瀏覽器端;所述的調(diào)試中斷操作包括以下步驟(31)根據(jù)用戶的操作,所述的調(diào)試器用戶界面模塊將相應(yīng)的調(diào)試指令發(fā)送到所述的調(diào)試服務(wù)器模塊;該調(diào)試指令包括跟進(jìn)st印Into、跟出st印Over、返回st印Return、繼續(xù)執(zhí)行resume禾口終止terminate;(32)所述的調(diào)試服務(wù)器模塊將該調(diào)試指令輸出到瀏覽器;該調(diào)試服務(wù)器模塊輸出到瀏覽器的指令格式為[COMMAND]:[調(diào)試指令];(33)所述的調(diào)試命令解析模塊解析收到的該調(diào)試指令并執(zhí)行相應(yīng)的操作,包括以下步驟(a)所述的調(diào)試命令解析模塊解析收到的調(diào)試指令;(b)所述的調(diào)試命令解析模塊根據(jù)調(diào)試指令來執(zhí)行相應(yīng)的操作,具體包括以下步驟(i)如果收到的指令是終止terminate,則拋出一個(gè)終止terminate異常,終止程序執(zhí)行;(ii)如果收到的指令是跟進(jìn)st印Into、返回st印Return、繼續(xù)執(zhí)行resume或者跟出st印Over,則把當(dāng)前指令狀態(tài)存放起來,下一句用戶的Javascript代碼執(zhí)行前的調(diào)試代碼應(yīng)用程序接口模塊會(huì)根據(jù)當(dāng)前指令和堆棧等信息判斷是否掛起;(iii)如果不需要掛起,則繼續(xù)執(zhí)行用戶Javascript;(iv)如果需要掛起,則進(jìn)行下一個(gè)調(diào)試中斷操作;(34)瀏覽器執(zhí)行某一行Javascript代碼之前的調(diào)試代碼應(yīng)用程序接口模塊中的調(diào)試函數(shù);(35)所述的調(diào)試代碼應(yīng)用程序接口模塊根據(jù)指令信息判斷瀏覽器執(zhí)行的當(dāng)前行是否需要中斷,包括以下步驟(a)所述的調(diào)試代碼應(yīng)用程序接口模塊獲取當(dāng)前的調(diào)試指令、斷點(diǎn)信息、以及當(dāng)前的調(diào)用堆棧數(shù)據(jù);(b)調(diào)試代碼應(yīng)用程序接口模塊判斷瀏覽器執(zhí)行的當(dāng)前行是否需要中斷,并根據(jù)判斷結(jié)果分別執(zhí)行以下步驟(i)如果當(dāng)前行不需要中斷,則繼續(xù)執(zhí)行;(ii)如果當(dāng)前行需要中斷,則調(diào)試代碼應(yīng)用程序接口模塊調(diào)用調(diào)試堆棧管理獲得當(dāng)前的堆棧以及當(dāng)前的變量并傳送給調(diào)試服務(wù)器模塊;(36)所述的調(diào)試代碼應(yīng)用程序接口模塊發(fā)送同步Ajax請求給所述的調(diào)試服務(wù)器模塊;(37)所述的調(diào)試服務(wù)器模塊構(gòu)造數(shù)據(jù)模型并向所述的調(diào)試器用戶界面模塊發(fā)送調(diào)試事件,包括以下步驟17(a)所述的調(diào)試服務(wù)器模塊接收中斷請求;(b)所述的調(diào)試服務(wù)器模塊根據(jù)調(diào)試代碼應(yīng)用程序接口模塊傳入的數(shù)據(jù)構(gòu)造調(diào)試數(shù)據(jù)模型;(c)所述的圖形化Javascript調(diào)試平臺(tái)向調(diào)試器用戶界面模塊發(fā)送調(diào)試事件;(38)所述的調(diào)試器用戶界面模塊向所述的調(diào)試服務(wù)器模塊請求數(shù)據(jù)模型并更新調(diào)試視圖;(39)所述的調(diào)試服務(wù)器模塊掛起當(dāng)前的同步Ajax請求,并把當(dāng)前的請求對象和當(dāng)前的堆棧關(guān)聯(lián)起來;該同步Ajax請求數(shù)據(jù)格式為[COMMAND]:[調(diào)試事件][調(diào)用堆棧]:[調(diào)用堆棧和變量][資源路徑]:[資源文件URL][行號]:[當(dāng)前Javascript行號];(310)所述的調(diào)試器用戶界面模塊接收到調(diào)試事件和調(diào)試相關(guān)的資源、行號、調(diào)用堆棧、變量等數(shù)據(jù);(311)所述的調(diào)試器用戶界面模塊根據(jù)調(diào)試資源的相對路徑找到保存的調(diào)試源文件;(312)所述的調(diào)試器用戶界面模塊定位到調(diào)試源文件中的中斷行并顯示調(diào)試數(shù)據(jù),包括以下步驟(a)所述的調(diào)試器用戶界面模塊根據(jù)調(diào)試源文件路徑打開調(diào)試源文件并根據(jù)當(dāng)前行號定位到中斷行;(b)所述的調(diào)試器用戶界面模塊根據(jù)調(diào)試數(shù)據(jù)模型顯示調(diào)試狀態(tài)及調(diào)試數(shù)據(jù)。在實(shí)際使用當(dāng)中,該企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的方法,包括圖形化Javascript調(diào)試平臺(tái)的預(yù)處理操作、斷點(diǎn)配置操作和調(diào)試中斷操作,所述的圖形化Javascript調(diào)試平臺(tái)的預(yù)處理操作包括以下步驟(1)圖形化Javascript調(diào)試平臺(tái)的初始化操作,包括以下步驟(a)根據(jù)用戶的操作,圖形化Javascript調(diào)試平臺(tái)在調(diào)試器UI中創(chuàng)建一個(gè)新的調(diào)試實(shí)例;(b)圖形化Javascript調(diào)試平臺(tái)將用戶輸入的URL和瀏覽器路徑信息發(fā)送到啟動(dòng)調(diào)試界面,所述的用戶輸入的URL格式為http:〃[服務(wù)器地址]:[端口]/[文件名];(2)調(diào)試器UI根據(jù)預(yù)先配置的調(diào)試端口啟動(dòng)一個(gè)Http服務(wù)器,并記錄調(diào)試服務(wù)器地址;(3)圖形化Javascript調(diào)試平臺(tái)生成客戶端URL,包括以下步驟(a)圖形化Javascript調(diào)試平臺(tái)從調(diào)試器UI中獲取調(diào)試服務(wù)器端口和用戶輸入的亂;(b)分別使用本地網(wǎng)絡(luò)地址127.0.0.1和調(diào)試服務(wù)器端口替換用戶輸入U(xiǎn)RL中的服務(wù)器地址和端口,調(diào)試文件的文件名保持不變,所述的客戶端URL格式為http:〃127.0.0.1:[調(diào)試端口]/[文件名];(4)圖形化Javascript調(diào)試平臺(tái)打開瀏覽器;(5)瀏覽器向Http服務(wù)器發(fā)送地址為客戶端URL的HTTP請求;(6)Http服務(wù)器向用戶輸入的URL發(fā)送HTTP請求并獲得該URL上的調(diào)試源文件并保存;(7)圖形化Javascript調(diào)試平臺(tái)將Http服務(wù)器獲得的調(diào)試源文件的代碼文本顯示在調(diào)試器UI中;(8)Http服務(wù)器調(diào)用編譯引擎生成編譯后的調(diào)試目標(biāo)文件,包括以下步驟(a)Http服務(wù)器傳入調(diào)試源文件的URL和文本內(nèi)容;(b)Http服務(wù)器調(diào)用編譯引擎編譯源文件資源;(c)編譯引擎根據(jù)對傳入資源的每一行判斷是否能下斷點(diǎn),分別執(zhí)行以下步驟(i)如果該行能下斷點(diǎn),則在該行前面加上調(diào)試代碼;(ii)如果該行不能下斷點(diǎn),則前進(jìn)到下一行;(d)編譯引擎將編譯完成后的代碼存為調(diào)試目標(biāo)文件。(9)編譯引擎將編譯后的調(diào)試目標(biāo)文件輸出到瀏覽器中執(zhí)行。所述的斷點(diǎn)配置操作包括以下步驟(1)用戶通過調(diào)試器UI在調(diào)試源文件中設(shè)置斷點(diǎn)標(biāo)記,包括以下步驟(a)調(diào)試器UI傳入調(diào)試源文件的URL和文本內(nèi)容;(b)用戶在資源編輯器中添加Javascript斷點(diǎn);(c)調(diào)試器UI判斷當(dāng)前行是否能下斷點(diǎn),分別執(zhí)行以下步驟(i)如果當(dāng)前行能下斷點(diǎn),調(diào)試器UI往斷點(diǎn)管理器中添加一個(gè)斷點(diǎn)并通知調(diào)試視圖顯示斷點(diǎn);(ii)如果當(dāng)前行不能下斷點(diǎn),則用戶的操作無效;(2)調(diào)試器UI向跨瀏覽器Javascript調(diào)試框架中的斷點(diǎn)管理器添加Javascript斷點(diǎn)標(biāo)記;(3)調(diào)試命令解析模塊定期向調(diào)試服務(wù)器發(fā)送異步Ajax請求來獲取Javascript斷點(diǎn)信息,所述的時(shí)間間隔為500ms;上述的調(diào)試命令解析模塊發(fā)送的異步Ajax請求數(shù)據(jù)的格式為[COMMAND]:[調(diào)試事件];(4)調(diào)試服務(wù)器讀取斷點(diǎn)管理器中所有的斷點(diǎn)信息;(5)調(diào)試服務(wù)器將獲得的所有斷點(diǎn)信息返回給調(diào)試命令解析模塊,所述的斷點(diǎn)信息數(shù)據(jù)的格式為[COMMAND]:[調(diào)試事件][斷點(diǎn)]:[[斷點(diǎn)1:[資源路徑][行號]][斷點(diǎn)2:[資源路徑][行號]]];(6)調(diào)試命令解析模塊將斷點(diǎn)信息保存到瀏覽器端。所述的調(diào)試中斷操作包括以下步驟(1)根據(jù)用戶的操作,調(diào)試器UI將相應(yīng)的調(diào)試指令發(fā)送到調(diào)試服務(wù)器,所述的調(diào)試指令包括跟進(jìn)(st印Into)、跟出(st印Over)、返回(st印Return)、繼續(xù)執(zhí)行(resume)、終止(terminate);(2)調(diào)試服務(wù)器將調(diào)試指令輸出到瀏覽器,所述的調(diào)試指令格式為[COMMAND]:[調(diào)試指令];(3)調(diào)試命令解析模塊解析收到的調(diào)試指令并執(zhí)行相應(yīng)的操作,包括以下步驟(a)調(diào)試命令解析模塊解析收到的調(diào)試指令;(b)調(diào)試命令解析模塊根據(jù)指令來執(zhí)行相應(yīng)的操作,分別包括以下步驟(i)如果收到的指令是terminate,則拋出一個(gè)terminate異常,終止程序執(zhí)行;(ii)如果收至lj的指令是st印Into、st印Return、resume、st印0ver等貝U把當(dāng)前指令狀態(tài)存放起來,下一句用戶的Javascript代碼執(zhí)行前的調(diào)試代碼API會(huì)根據(jù)當(dāng)前指令和堆棧等信息判斷是否掛起;(iii)如果不需要掛起則繼續(xù)執(zhí)行用戶Javascript;(iv)如果需要掛起則進(jìn)行下一個(gè)調(diào)試中斷操作;(4)瀏覽器執(zhí)行某一行Javascript代碼之前的調(diào)試代碼API;(5)調(diào)試代碼API根據(jù)指令信息判斷瀏覽器執(zhí)行的當(dāng)前行是否需要中斷,包括以下步驟(a)調(diào)試代碼API獲取當(dāng)前的調(diào)試指令、斷點(diǎn)信息、以及當(dāng)前的調(diào)用堆棧數(shù)據(jù);(b)調(diào)試代碼API判斷瀏覽器執(zhí)行的當(dāng)前行是否需要中斷,分別執(zhí)行以下步驟(i)如果當(dāng)前行不需要中斷,則繼續(xù)執(zhí)行;(ii)如果當(dāng)前行需要中斷,則調(diào)試代碼API調(diào)用調(diào)試堆棧管理獲得當(dāng)前的堆棧以及當(dāng)前的變量并傳送給調(diào)試服務(wù)器;(6)調(diào)試代碼API發(fā)送同步Ajax請求給調(diào)試服務(wù)器,所述的同步Ajax請求數(shù)據(jù)格式為[COMMAND]:[調(diào)試事件][調(diào)用堆棧]:[調(diào)用堆棧和變量][資源路徑]:[資源文件URL][行號]:[當(dāng)前Javascript行號];(7)調(diào)試服務(wù)器構(gòu)造數(shù)據(jù)模型并向調(diào)試器UI發(fā)送調(diào)試事件,所述的調(diào)試事件包括斷點(diǎn)(breakpoint)、足艮出(st印0ver)、足艮進(jìn)(st印Into)、返回(st印Retrim)、繼續(xù)手丸行(resume)、終止(terminate);上述的構(gòu)造數(shù)據(jù)模型并向調(diào)試器UI發(fā)送調(diào)試事件的操作包括以下步驟(a)調(diào)試服務(wù)器接收中斷請求;(b)調(diào)試服務(wù)器根據(jù)調(diào)試代碼API傳入的數(shù)據(jù)構(gòu)造調(diào)試數(shù)據(jù)模型;(c)調(diào)試平臺(tái)向調(diào)試器UI發(fā)送調(diào)試事件;(8)調(diào)試器UI向調(diào)試服務(wù)器請求數(shù)據(jù)模型并更新調(diào)試視圖;(9)調(diào)試服務(wù)器掛起當(dāng)前的同步Ajax請求,并把當(dāng)前的請求對象和當(dāng)前的堆棧關(guān)聯(lián)起來;(10)調(diào)試器UI接收到調(diào)試事件和調(diào)試相關(guān)的資源、行號、調(diào)用堆棧、變量等數(shù)據(jù);(11)調(diào)試器UI根據(jù)調(diào)試資源的相對路徑找到保存的調(diào)試源文件;(12)調(diào)試器UI定位到調(diào)試源文件中的中斷行并顯示調(diào)試數(shù)據(jù),包括以下步驟(a)調(diào)試器UI根據(jù)調(diào)試源文件路徑打開調(diào)試源文件并根據(jù)當(dāng)前行號定位到中斷行;(b)調(diào)試器UI根據(jù)調(diào)試數(shù)據(jù)模型顯示調(diào)試狀態(tài)及調(diào)試數(shù)據(jù)。在實(shí)際應(yīng)用中,本發(fā)明的跨瀏覽器Javascript調(diào)試的方法的具體過程如下1、添加斷點(diǎn)在Javascript調(diào)試平臺(tái)的實(shí)現(xiàn)中,添加斷點(diǎn)實(shí)際上就是為Javascript或Html調(diào)試源文件對應(yīng)的IFile添力卩一個(gè)marker,并且設(shè)置了marker的屬性resource.createMarker(markerType);將斷點(diǎn)注冊到斷點(diǎn)管理器DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(this)。Marker中記錄的信息有IFile的路徑、行號、斷點(diǎn)屬性等。在Javascript調(diào)試平臺(tái)添加斷點(diǎn)的過程中,需要先調(diào)用調(diào)試器引擎的API判斷該行是否能添加斷點(diǎn)。調(diào)試器引擎基于mozilla的開源框架rhino引擎,提供的核心API為IJsEngine:publicinterfaceIJsEngine{〃編譯javascriptpublicvoidcompilejs(Stringurl,Stringtext);publicvoidcompileHtml(Stringurl,Stringtext);publicbooleancanBreakLine(Stringurl,intline)5}具體過程如下(1)調(diào)試器UI判斷當(dāng)前文件是Javascript調(diào)試源文件還是Html調(diào)試源文件;(2)如果是Javascript調(diào)試源文件,就調(diào)用compilejs方法,傳入調(diào)試源文件的URL和文本內(nèi)容;(3)如果是Html調(diào)試源文件,就調(diào)用compileHtml方法,傳入調(diào)試源文件的URL和文本內(nèi)容;(4)用戶在Html或Javascript編輯器中添加Javascript斷點(diǎn);(5)調(diào)試器UI調(diào)用canBreakLine方法,傳入調(diào)試源文件的URL和當(dāng)前的行號,判斷當(dāng)前行是否能下斷點(diǎn);(6)如果當(dāng)前行能下斷點(diǎn),調(diào)試器UI調(diào)用Eclipse的斷點(diǎn)管理器BreakPointManager的addBreakPoint方法,添力口一個(gè)斷點(diǎn);(7)Eclipse的斷點(diǎn)管理器BreakPointManager通知Eclipse的各個(gè)視圖顯示斷點(diǎn);(8)如果當(dāng)前行不能下斷點(diǎn),則用戶的操作無效;2、刪除斷點(diǎn)刪除斷點(diǎn)實(shí)際上就是刪除Javascript或Html調(diào)試源文件對應(yīng)的IFile上對應(yīng)的IMarker,resource.removeMarker(markerType);在斷點(diǎn)管理器中注銷斷點(diǎn)DebugPlugin.getDefault().getBreakpointManager().removeBreakpoint(this)。3、將Html或Javascript調(diào)試源文件編譯為調(diào)試目標(biāo)文件(1)判斷源文件是Html調(diào)試源文件還是Javascript調(diào)試源文件;(2)如果是Javascript調(diào)試源文件則直接調(diào)用rhino引擎的(newDim())sourcelnfo(url)方法解析Javascript。如果是Html調(diào)試源文件則先解析html文件,只留下〈script〉標(biāo)簽中的Javascript內(nèi)容,再調(diào)用rhino引擎的(newDim()).sourcelnfo(url)方法角牟析Javascript;(3)Rhino引擎解析Javascript后把源代碼信息存在Sourcelnfo類中,Sourcelnfo類提供了breakableLines屬性用于記錄哪些行可以下斷點(diǎn);(4)編譯引擎遍歷源代碼的行,根據(jù)Sourcelnfo的breakablesLines判斷該行是否能夠下斷點(diǎn),如果能夠下斷點(diǎn)則在該行前面添加調(diào)試代碼,調(diào)試代碼包含當(dāng)前的源文件路徑、行號、當(dāng)前上下文等內(nèi)容,調(diào)試代碼的示例為$jsd(〃test.js〃,l,...);編譯引擎編譯前后的Javascript代碼調(diào)試源代碼f皿ctiontest(a,b){rare=a+b;returnc^調(diào)試目標(biāo)代碼$jsd(〃test,js〃,1,…);functiontest(a,b){$jsd(〃test,js〃,3,…);varc=a+b;$jsd(〃test,js〃,5,…);returnc;$jsdrtest.js〃,6,);}編譯引擎編譯前后的Html代碼〈html〉〈head〉調(diào)試源〈script〉testOj〈/script〉代碼〈/head〉〈body〉〈/body〉〈/html〉〈scriptsrc=,,jsdebug.js,,〉〈/script〉〈html〉〈head〉調(diào)試目〈script〉$jsd(〃test,js〃,4,…);test();標(biāo)代碼〈/script〉〈/head〉〈body〉〈/body〉〈/html〉224、在進(jìn)行Javascript調(diào)試過程中定位Javascript斷點(diǎn)由于在編譯引擎將Html和Javascript調(diào)試源文件編譯為調(diào)試目標(biāo)文件時(shí)已經(jīng)將文件路徑和行號添加到了每行可以下斷點(diǎn)的Javascript代碼前,因此不需要額外的操作來查找相關(guān)信息;當(dāng)執(zhí)行到斷點(diǎn)時(shí),調(diào)試代碼API根據(jù)當(dāng)前代碼情況調(diào)用調(diào)試堆棧管理獲得當(dāng)前的堆棧信息,并發(fā)送同步Ajax請求給調(diào)試服務(wù)器。調(diào)試代碼API發(fā)送的數(shù)據(jù)如下{〃STACK":{window:{document:{body:{tagName:,,BODY"}}},a:undefined},〃COMMAND":〃BREAKPOINT",〃RESOURCE":〃/jsdebug/jsdt_sO.5/test/test.js〃,〃LINE":2}5、調(diào)試中的中斷判斷調(diào)試目標(biāo)文件的調(diào)試代碼在Javascript代碼的每一行代碼之前,因此在執(zhí)行每一行代碼前都會(huì)先調(diào)用調(diào)試代碼,調(diào)試代碼調(diào)用了調(diào)試代碼API。調(diào)試代碼API首先判斷當(dāng)前行是否有斷點(diǎn),如果有斷點(diǎn)則執(zhí)行中斷操作,如果沒有斷點(diǎn)則根據(jù)當(dāng)前用戶的調(diào)試指令(resume、setplnto、st印0ver、st印Return、terminate)做下一步判斷(1)如果用戶的調(diào)試指令是resume,則跳出調(diào)試代碼,執(zhí)行用戶的javascript代碼;(2)如果用戶的調(diào)試指令是st印Into,則調(diào)試代碼API會(huì)調(diào)用當(dāng)前的調(diào)用堆棧管理的API判斷當(dāng)前的堆棧和上一個(gè)堆棧是否是同一個(gè),如果是同一個(gè)堆棧,則跳出調(diào)試代碼,繼續(xù)執(zhí)行用戶的Javascript代碼,如果不是同一個(gè)堆棧,則執(zhí)行中斷操作;(3)如果用戶的調(diào)試指令是setpOver則執(zhí)行中斷操作;(4)如果用戶的調(diào)試指令是setpReturn,則調(diào)試代碼API會(huì)調(diào)用當(dāng)前的調(diào)用堆棧管理的API判斷當(dāng)前的堆棧和上上一個(gè)堆棧是否是同一個(gè),如果是同一個(gè),則執(zhí)行中斷操作,否則跳出調(diào)試代碼,繼續(xù)執(zhí)行用戶的Javascript代碼;(5)如果用戶的調(diào)試指令是terminate,則拋出一個(gè)terminate的異常,結(jié)束調(diào)試;調(diào)試中斷是指中斷當(dāng)前執(zhí)行的Javascript代碼行,并在調(diào)試平臺(tái)的UI上顯示當(dāng)前調(diào)試的行,采用的是同步的Ajax請求技術(shù)來向調(diào)試服務(wù)器發(fā)送Ajax請求(1)調(diào)試代碼API通過調(diào)用堆棧管理的API獲得當(dāng)前的調(diào)用堆棧和用戶定義變量的信息。調(diào)用堆棧管理的API通過arguments,callee.caller獲得當(dāng)前的調(diào)用堆棧。調(diào)用堆棧管理通過解析arguments,callee.caller函數(shù)的源代碼獲得用戶定義的變量,通過eval函數(shù)獲得這些變量的值;(2)調(diào)試代碼API將調(diào)用堆棧、上下文變量、源文件路徑、當(dāng)前行號等信息組合為json格式的數(shù)據(jù)發(fā)送給調(diào)試服務(wù)器;(3)調(diào)試服務(wù)器接收到Ajax請求,根據(jù)調(diào)試代碼API傳入的數(shù)據(jù)構(gòu)造調(diào)試器UI所需要的數(shù)據(jù)模型,然后事件處理器向調(diào)試器UI發(fā)送調(diào)試事件。調(diào)試器UI會(huì)根據(jù)調(diào)試數(shù)據(jù)模型更新調(diào)試視圖。本發(fā)明的Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的方法有以下優(yōu)點(diǎn)1、跨瀏覽器下表是JavascriptDebugToolkit和其他主流調(diào)試工具對瀏覽器的支持情況對比<table>tableseeoriginaldocumentpage24</column></row><table>2、無插件目前其他調(diào)試工具都需要在瀏覽器中安裝插件,譬如Firebug和Venkman都是firefox上的插件,NetBeans也需要在Firefox禾PIE上安裝插件,而JavascriptDebugToolkit不需要安裝瀏覽器插件。3、不需要隨著瀏覽器的版本而升級隨著瀏覽器版本的升級,很多工具都無法支持新的版本,譬如Firefox2升能到Firefox3版本的時(shí)候,F(xiàn)irebug、Aptana等工具都不能正常使用,而使用JavascriptDebugToolkit卻不需要關(guān)心瀏覽器的版本。采用了上述的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)及其方法,由于在圖形化調(diào)試平臺(tái)中對要進(jìn)行調(diào)試的Html源文件或Javascript源文件進(jìn)行了編譯,將調(diào)試代碼API添加到了源文件中可以設(shè)置斷點(diǎn)的代碼行前,生成了調(diào)試目標(biāo)文件并在瀏覽器中執(zhí)行,當(dāng)瀏覽器運(yùn)行到Javascript代碼的斷點(diǎn)處時(shí),調(diào)試代碼API根據(jù)圖形化調(diào)試平臺(tái)發(fā)送的調(diào)試指令判斷執(zhí)行中斷,將相關(guān)調(diào)試數(shù)據(jù)以同步Ajax請求的形式發(fā)送到圖形化調(diào)試平臺(tái),最后調(diào)試平臺(tái)根據(jù)斷點(diǎn)信息進(jìn)行斷點(diǎn)的展現(xiàn)操作,從而實(shí)現(xiàn)了跨瀏覽器的Javascript圖形化集成環(huán)境調(diào)試,增強(qiáng)了調(diào)試的直觀效果,提高了調(diào)試的效率,不僅操作簡單形象,而且快捷方便,整個(gè)調(diào)試環(huán)境的運(yùn)行效率較高,系統(tǒng)性能穩(wěn)定可靠,降低了開發(fā)維護(hù)的成本;同時(shí)增強(qiáng)了系統(tǒng)可移植性和可擴(kuò)展性;不僅如此,該方法還能夠快速回應(yīng)業(yè)務(wù)需求的變化和技術(shù)變化,能夠支撐建立高度模塊化而且又高度整合的軟件系統(tǒng),不依賴于具體瀏覽器和調(diào)試插件的Javascript調(diào)試支持,系統(tǒng)架構(gòu)簡單,使用維護(hù)方便快捷,工作性能穩(wěn)定可靠,適用范圍較為廣泛,為企業(yè)Web應(yīng)用軟件技術(shù)的進(jìn)一步發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。在此說明書中,本發(fā)明已參照其特定的實(shí)施例作了描述。但是,很顯然仍可以作出各種修改和變換而不背離本發(fā)明的精神和范圍。因此,說明書和附圖應(yīng)被認(rèn)為是說明性的而非限制性的。權(quán)利要求一種企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng),包括圖形化Javascript調(diào)試平臺(tái)和跨瀏覽器Javascript調(diào)試框架,其特征在于,所述的圖形化Javascript調(diào)試平臺(tái)包括調(diào)試器引擎模塊,解析Javascript和Html,為編譯引擎模塊和調(diào)試器用戶界面模塊提供Javascript源代碼的調(diào)試信息,在斷點(diǎn)配置時(shí)及編譯引擎中被調(diào)用;Http服務(wù)器模塊,與瀏覽器、Web應(yīng)用服務(wù)器以及本地文件系統(tǒng)進(jìn)行通信;代理服務(wù)器模塊,提供訪問遠(yuǎn)程Web應(yīng)用服務(wù)器中URL的功能,統(tǒng)一URL域,支持跨域URL訪問;編譯引擎模塊,將調(diào)試源文件編譯為帶調(diào)試代碼的調(diào)試目標(biāo)文件;調(diào)試服務(wù)器模塊,接受來自瀏覽器的調(diào)試代碼API的Ajax請求,解析調(diào)試代碼發(fā)送的指令、調(diào)用堆棧、變量等信息,并將斷點(diǎn)、指令等信息返回給瀏覽器端運(yùn)行的調(diào)試代碼;調(diào)試器用戶界面模塊;提供與用戶交互的斷點(diǎn)管理、源文件定位、調(diào)試啟動(dòng)、查看變量和調(diào)試動(dòng)作功能,通過調(diào)試事件和調(diào)試服務(wù)器模塊交互;所述的跨瀏覽器的Javascript調(diào)試框架包括跨瀏覽器支持模塊,封裝有跨瀏覽器的Javascript應(yīng)用程序接口;調(diào)試代碼應(yīng)用程序接口模塊,提供調(diào)試函數(shù),在瀏覽器中運(yùn)行的Javascript代碼在每一行代碼執(zhí)行之前,都會(huì)調(diào)用該調(diào)試函數(shù)來判斷程序是否進(jìn)行中斷,如果遇到斷點(diǎn)或單步執(zhí)行等中斷時(shí),就向調(diào)試服務(wù)器發(fā)送同步Ajax請求,將當(dāng)前的資源、行號、調(diào)用堆棧和調(diào)試數(shù)據(jù)信息發(fā)送給調(diào)試服務(wù)器;調(diào)用堆棧管理模塊,提供客戶端調(diào)用堆棧管理功能,在跟進(jìn)、跟出操作過程中進(jìn)行堆棧判斷;調(diào)試命令解析模塊,用于與調(diào)試服務(wù)器模塊交互時(shí)解析調(diào)試服務(wù)器模塊傳回的調(diào)試指令。2.根據(jù)權(quán)利要求l所述的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng),其特征在于,所述的調(diào)試信息包括總行數(shù)和可以下斷點(diǎn)的行號。3.根據(jù)權(quán)利要求l所述的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng),其特征在于,所述的調(diào)試動(dòng)作包括跟出st印over、跟進(jìn)st印into、返回st印return、繼續(xù)執(zhí)行resume禾口終止terminate。4.根據(jù)權(quán)利要求1所述的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng),其特征在于,所述的Javascript應(yīng)用程序接口包括Ajax調(diào)用接口、json格式轉(zhuǎn)換和存儲(chǔ)調(diào)用堆棧接口。5.根據(jù)權(quán)利要求1所述的企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng),其特征在于,所述的調(diào)試指令包括跟進(jìn)st印Into、跟出st印0ver、返回st印Return、繼續(xù)執(zhí)行resume禾口終止terminate。6.—種基于權(quán)利要求1所述的系統(tǒng)實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的方法包括圖形化Javascript調(diào)試平臺(tái)的預(yù)處理操作、斷點(diǎn)配置操作和調(diào)試中斷操作,所述的圖形化Javascript調(diào)試平臺(tái)的預(yù)處理操作,包括以下步驟(11)所述的圖形化Javascript調(diào)試平臺(tái)進(jìn)行初始化操作;(12)所述的調(diào)試器用戶界面模塊根據(jù)預(yù)先配置的調(diào)試端口啟動(dòng)一個(gè)Http服務(wù)器模塊,并記錄調(diào)試服務(wù)器模塊的地址;(13)所述的圖形化Javascript調(diào)試平臺(tái)生成客戶端URL;(14)所述的圖形化Javascript調(diào)試平臺(tái)打開瀏覽器;(15)所述的瀏覽器向Http服務(wù)器模塊發(fā)送地址為該客戶端URL的HTTP請求;(16)所述的Http服務(wù)器模塊向用戶輸入的URL發(fā)送HTTP請求,獲得該URL上的調(diào)試源文件并保存;(17)所述的圖形化Javascript調(diào)試平臺(tái)將該Http服務(wù)器模塊所獲得的調(diào)試源文件的代碼文本顯示在調(diào)試器用戶界面模塊中;(18)所述的Http服務(wù)器模塊調(diào)用編譯引擎模塊生成編譯后的調(diào)試目標(biāo)文件;(19)所述的編譯引擎模塊將編譯后的調(diào)試目標(biāo)文件輸出到瀏覽器中執(zhí)行;所述的斷點(diǎn)配置操作,包括以下步驟(21)用戶通過調(diào)試器用戶界面模塊在調(diào)試源文件中設(shè)置斷點(diǎn)標(biāo)記;(22)所述的調(diào)試器用戶界面模塊向跨瀏覽器Javascript調(diào)試框架中的斷點(diǎn)管理器添力口Javascript斷點(diǎn)標(biāo)記;(23)所述的調(diào)試命令解析模塊每隔一系統(tǒng)預(yù)設(shè)的時(shí)間間隔周期性地向調(diào)試服務(wù)器模塊發(fā)送異步Ajax請求來獲取Javascript斷點(diǎn)信息;(24)所述的調(diào)試服務(wù)器模塊讀取該斷點(diǎn)管理器中所有的斷點(diǎn)信息;(25)所述的調(diào)試服務(wù)器模塊將獲得的所有斷點(diǎn)信息返回給所述的調(diào)試命令解析模塊;(26)所述的調(diào)試命令解析模塊將斷點(diǎn)信息保存到瀏覽器端;所述的調(diào)試中斷操作包括以下步驟(31)根據(jù)用戶的操作,所述的調(diào)試器用戶界面模塊將相應(yīng)的調(diào)試指令發(fā)送到所述的調(diào)試服務(wù)器模塊;(32)所述的調(diào)試服務(wù)器模塊將該調(diào)試指令輸出到瀏覽器;(33)所述的調(diào)試命令解析模塊解析收到的該調(diào)試指令并執(zhí)行相應(yīng)的操作;(34)瀏覽器執(zhí)行某一行Javascript代碼之前的調(diào)試代碼應(yīng)用程序接口模塊中的調(diào)試函數(shù);(35)所述的調(diào)試代碼應(yīng)用程序接口模塊根據(jù)指令信息判斷瀏覽器執(zhí)行的當(dāng)前行是否需要中斷;(36)所述的調(diào)試代碼應(yīng)用程序接口模塊發(fā)送同步Ajax請求給所述的調(diào)試服務(wù)器模塊;(37)所述的調(diào)試服務(wù)器模塊構(gòu)造數(shù)據(jù)模型并向所述的調(diào)試器用戶界面模塊發(fā)送調(diào)試事件;(38)所述的調(diào)試器用戶界面模塊向所述的調(diào)試服務(wù)器模塊請求數(shù)據(jù)模型并更新調(diào)試視圖;(39)所述的調(diào)試服務(wù)器模塊掛起當(dāng)前的同步Ajax請求,并把當(dāng)前的請求對象和當(dāng)前的堆棧關(guān)聯(lián)起來;(310)所述的調(diào)試器用戶界面模塊接收到調(diào)試事件和調(diào)試相關(guān)的資源、行號、調(diào)用堆棧、變量等數(shù)據(jù);(311)所述的調(diào)試器用戶界面模塊根據(jù)調(diào)試資源的相對路徑找到保存的調(diào)試源文件;(312)所述的調(diào)試器用戶界面模塊定位到調(diào)試源文件中的中斷行并顯示調(diào)試數(shù)據(jù)。7.根據(jù)權(quán)利要求6所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的圖形化Javascript調(diào)試平臺(tái)進(jìn)行初始化操作,包括以下步驟(111)根據(jù)用戶的操作,所述的圖形化Javascript調(diào)試平臺(tái)在所述的調(diào)試器用戶界面模塊中創(chuàng)建一個(gè)新的調(diào)試實(shí)例;(112)所述的圖形化Javascript調(diào)試平臺(tái)將用戶輸入的URL和瀏覽器路徑信息發(fā)送到啟動(dòng)調(diào)試界面。8.根據(jù)權(quán)利要求7所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的圖形化Javascript調(diào)試平臺(tái)生成客戶端URL,包括以下步驟(121)所述的圖形化Javascript調(diào)試平臺(tái)從所述的調(diào)試器用戶界面模塊中獲取調(diào)試服務(wù)器端口和用戶輸入的URL;(122)分別使用本地網(wǎng)絡(luò)地址127.0.0.1和調(diào)試服務(wù)器端口替換用戶輸入的URL中的服務(wù)器地址和端口,調(diào)試文件的文件名保持不變。9.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的用戶輸入的URL格式為http:〃[服務(wù)器地址]:[端口]/[文件名]。10.根據(jù)權(quán)利要求8所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的客戶端URL格式為http:〃127.0.0.1:[調(diào)試端口]/[文件名]。11.根據(jù)權(quán)利要求6至10中任一項(xiàng)所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的Http服務(wù)器模塊調(diào)用編譯引擎模塊生成編譯后的調(diào)試目標(biāo)文件,包括以下步驟(131)所述的Http服務(wù)器模塊傳入調(diào)試源文件的URL和文本內(nèi)容;(132)所述的Http服務(wù)器模塊調(diào)用編譯引擎編譯源文件資源;(133)所述的編譯引擎模塊根據(jù)對傳入資源的每一行判斷是否能下斷點(diǎn),根據(jù)判斷結(jié)果分別執(zhí)行以下步驟(a)如果該行能下斷點(diǎn),則在該行前面加上調(diào)試代碼;(b)如果該行不能下斷點(diǎn),則前進(jìn)到下一行;(134)所述的編譯引擎模塊將編譯完成后的代碼存為調(diào)試目標(biāo)文件。12.根據(jù)權(quán)利要求11所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的用戶通過調(diào)試器用戶界面模塊在調(diào)試源文件中設(shè)置斷點(diǎn)標(biāo)記,包括以下步驟(211)所述的調(diào)試器用戶界面模塊傳入調(diào)試源文件的URL和文本內(nèi)容;(212)用戶在資源編輯器中添加Javascript斷點(diǎn);(213)所述的調(diào)試器用戶界面模塊判斷當(dāng)前行是否能下斷點(diǎn),并根據(jù)判斷結(jié)果分別執(zhí)行以下步驟(a)如果當(dāng)前行能下斷點(diǎn),調(diào)試器UI往斷點(diǎn)管理器中添加一個(gè)斷點(diǎn)并通知調(diào)試視圖顯示斷點(diǎn);(b)如果當(dāng)前行不能下斷點(diǎn),則用戶的操作無效。13.根據(jù)權(quán)利要求6至10中任一項(xiàng)所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的系統(tǒng)預(yù)設(shè)的時(shí)間間隔為500ms。14.根據(jù)權(quán)利要求6至10中任一項(xiàng)所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的調(diào)試命令解析模塊發(fā)送的異步Ajax請求數(shù)據(jù)的格式為[COMMAND]:[調(diào)試事件]。15.根據(jù)權(quán)利要求6至10中任一項(xiàng)所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的調(diào)試服務(wù)器模塊返回給調(diào)試命令解析模塊的斷點(diǎn)信息數(shù)據(jù)的格式為[COMMAND]:[調(diào)試事件][斷點(diǎn)]:[[斷點(diǎn)1:[資源路徑][行號]][斷點(diǎn)2:[資源路徑][行號]]]。16.根據(jù)權(quán)利要求6至10中任一項(xiàng)所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的調(diào)試指令包括跟進(jìn)st印Into、跟出st印Over、返回st印Return、繼續(xù)執(zhí)行resume禾口終止terminate。17.根據(jù)權(quán)利要求6至10中任一項(xiàng)所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的調(diào)試服務(wù)器模塊輸出到瀏覽器的指令格式為[COMMAND]:[調(diào)試指令]。18.根據(jù)權(quán)利要求16所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的調(diào)試命令解析模塊解析收到的調(diào)試指令并執(zhí)行相應(yīng)的操作,包括以下步驟(321)所述的調(diào)試命令解析模塊解析收到的調(diào)試指令;(322)所述的調(diào)試命令解析模塊根據(jù)調(diào)試指令來執(zhí)行相應(yīng)的操作,具體包括以下步驟(a)如果收到的指令是終止terminate,則拋出一個(gè)終止terminate異常,終止程序執(zhí)行;(b)如果收到的指令是跟進(jìn)st印Into、返回st印Return、繼續(xù)執(zhí)行resume或者跟出st印0ver,則把當(dāng)前指令狀態(tài)存放起來,下一句用戶的Javascript代碼執(zhí)行前的調(diào)試代碼應(yīng)用程序接口模塊會(huì)根據(jù)當(dāng)前指令和堆棧等信息判斷是否掛起;(c)如果不需要掛起,則繼續(xù)執(zhí)行用戶Javascript;(d)如果需要掛起,則進(jìn)行下一個(gè)調(diào)試中斷操作。19.根據(jù)權(quán)利要求18所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的調(diào)試代碼應(yīng)用程序接口模塊根據(jù)指令信息判斷瀏覽器執(zhí)行的當(dāng)前行是否需要中斷,包括以下步驟(331)所述的調(diào)試代碼應(yīng)用程序接口模塊獲取當(dāng)前的調(diào)試指令、斷點(diǎn)信息、以及當(dāng)前的調(diào)用堆棧數(shù)據(jù);(332)調(diào)試代碼應(yīng)用程序接口模塊判斷瀏覽器執(zhí)行的當(dāng)前行是否需要中斷,并根據(jù)判斷結(jié)果分別執(zhí)行以下步驟(a)如果當(dāng)前行不需要中斷,則繼續(xù)執(zhí)行;(b)如果當(dāng)前行需要中斷,則調(diào)試代碼應(yīng)用程序接口模塊調(diào)用調(diào)試堆棧管理獲得當(dāng)前的堆棧以及當(dāng)前的變量并傳送給調(diào)試服務(wù)器模塊。20.根據(jù)權(quán)利要求19所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的調(diào)試服務(wù)器模塊構(gòu)造數(shù)據(jù)模型并向所述的調(diào)試器用戶界面模塊發(fā)送調(diào)試事件,包括以下步驟(341)所述的調(diào)試服務(wù)器模塊接收中斷請求;(342)所述的調(diào)試服務(wù)器模塊根據(jù)調(diào)試代碼應(yīng)用程序接口模塊傳入的數(shù)據(jù)構(gòu)造調(diào)試數(shù)據(jù)模型;(343)所述的圖形化Javascript調(diào)試平臺(tái)向調(diào)試器用戶界面模塊發(fā)送調(diào)試事件。21.根據(jù)權(quán)利要求20所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的調(diào)試器用戶界面模塊定位到調(diào)試源文件中的中斷行并顯示調(diào)試數(shù)據(jù),包括以下步驟(351)所述的調(diào)試器用戶界面模塊根據(jù)調(diào)試源文件路徑打開調(diào)試源文件并根據(jù)當(dāng)前行號定位到中斷行;(352)所述的調(diào)試器用戶界面模塊根據(jù)調(diào)試數(shù)據(jù)模型顯示調(diào)試狀態(tài)及調(diào)試數(shù)據(jù)。22.根據(jù)權(quán)利要求6至10中任一項(xiàng)所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的調(diào)試代碼應(yīng)用程序接口模塊發(fā)送的同步Ajax請求數(shù)據(jù)格式為[COMMAND]:[調(diào)試事件][調(diào)用堆棧]:[調(diào)用堆棧和變量][資源路徑]:[資源文件URL][行號]:[當(dāng)前Javascript行號]。23.根據(jù)權(quán)利要求6至10中任一項(xiàng)所述的實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法,其特征在于,所述的調(diào)試事件包括斷點(diǎn)breakpoint跟出st印0ver、足艮進(jìn)st印Into、返回st印Retrun、繼續(xù)手丸行resume、終止terminate。全文摘要本發(fā)明涉及一種企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng),包括圖形化Javascript調(diào)試平臺(tái)和跨瀏覽器Javascript調(diào)試框架,其中圖形化Javascript調(diào)試平臺(tái)包括調(diào)試器引擎模塊、Http服務(wù)器模塊、代理服務(wù)器模塊、編譯引擎模塊、調(diào)試服務(wù)器模塊和調(diào)試器UI模塊,跨瀏覽器的Javascript調(diào)試框架包括跨瀏覽器支持模塊、調(diào)試代碼API模塊、調(diào)用堆棧管理模塊以及調(diào)試命令解析模塊。本發(fā)明還涉及一種基于該系統(tǒng)實(shí)現(xiàn)企業(yè)Web應(yīng)用系統(tǒng)中跨瀏覽器Javascript調(diào)試的方法。采用該種企業(yè)Web應(yīng)用系統(tǒng)中實(shí)現(xiàn)跨瀏覽器Javascript調(diào)試的系統(tǒng)及其方法,調(diào)試效率高,操作簡單快捷方便,系統(tǒng)性能穩(wěn)定可靠,降低了開發(fā)維護(hù)成本,增強(qiáng)了系統(tǒng)可移植性和可擴(kuò)展性,適用范圍較為廣泛,為企業(yè)Web應(yīng)用軟件技術(shù)的進(jìn)一步發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。文檔編號G06F11/36GK101719093SQ20091020018公開日2010年6月2日申請日期2009年12月9日優(yōu)先權(quán)日2009年12月9日發(fā)明者曹宗偉,焦烈焱,馬捷申請人:上海普元信息技術(shù)有限責(zé)任公司