① 能不能用golang做webkit開發
沒在windows下用過node-webkit,如果是我,我會選擇PyQt。如果不考慮跨平台,C#就不錯。Golang這方面沒有成熟的東西,如果是學習體驗的角度,可以用Golang。
② Chrome如何顯示網頁
確認您已經月度了多進程架構?的設計文檔。
您將特別想了解主要的組成方塊圖。
您同時也可能有興趣了解多進程資源載入?,以了解網頁如何從網路下載。
概念上的應用層 每個方框表示一個概念層。
通過選取或者取代各層之上的層可以構建不同的瀏覽器應該是可能的。
因此,任何層都不應該依賴任何比它層次更高的層或者需要更高層次的相關信息。
WebKit?:Safari、Chromium和任何其他基於Webkit的瀏覽器的渲染引擎。
Port是WebKit的一部分,它與依賴於系統服務的平台集成,如資源載入和圖形。
Glue:轉換Webkit類型成Chromium類型。
這是我們的Webkit嵌入層。
它是Chromium和test_shell(允許我們測試Webkit)這輛個瀏覽器基本的部分。
Render/Render host:這是Chromium的多進程嵌入層。
它穿透進程邊界代理各種通知和命令。
您應該可以想像其他多進程瀏覽器正在使用這層,它應該依賴瀏覽器的其他服務。
Tab contents:瀏覽器特定的層表示標簽的內容。
它與歷史系統、口令管理登應用服務綁定。
它不應該,而且決不假設它嵌入在一個Chromium瀏覽器窗口裡(它也可被其他瀏覽器組件像HTML對話框使用)。
Broeser:表示瀏覽器窗口,它嵌入了多個標簽內容(TabContentses?)。
WebKit?我們使用WebKit開源工程布局網頁。
這些代碼來自蘋果而且存在/third_party/WebKit目錄。
WebKit主要由表示內核布局功能的 WebCore、執行JavaScript的JavaScriptCore組成。
我們僅運行JavaScriptCore進行測試,通常我們以我們更高性能的V8引擎取代它。
我們並沒有實際使用蘋果稱為WebKit的那一層,這一層是嵌入WebCore和OSX應用Safari之間的API。
為了方便,我們把參考蘋果這一層的代碼稱為WebKit。
WebKit?Port 在最底層我們有我們的WebKit Port。
這是平台無關的WebCore的代碼的介面在特定平台的我們的實現。
這些文件位於/webkit/port,且與WebCore的目錄層次相似。
我們的port大部分都是與實際OS無關:您可以認為是Chromium port的WebCore。
少數部分像字體渲染的處理在每個平台不同。
通過多進程資源載入?系統處理網路資源和響應。
而不是直接從render進程交由OS處理。
圖形上使用為Android開發的Skia圖形庫。
這是一個跨平台的圖形庫而且可以處理許多圖象和除文本外的基本圖形元素。
skia位於 /third_party/skia。
主要的圖形操作的入口是/webkit/port/platform/graphics /GraphicsContextSkia.cpp。
它也被許多在同一目錄的其他文件如/base/gfx使用。
Webkit膠粘層 Chromium應用使用不同的類型、代碼風格和代碼布局而不是第三方的WebKit代碼。
WebKit膠粘層提供許多方便的嵌入的API為 WebKit使用Goole代碼方便和類型轉換(如,我們使用std::string取代WebCore::String,GURL取代KURL)。
膠粘層位於/webkit/glue。
膠粘對象都與Webkit對象相似,只是以"Web"作為前綴。
例如,WebCore::Frame編程 WebFrame。
WebKit?膠粘層隔離了基於Chromium的代碼庫與WebCore數據類型,以便基於Chromium代碼修改最小化對於WebCore的影響。
基於次,WebCore的數據類型決不直接在Chromium使用。
API都被加到WebKit膠粘層,以方便Chromium(when it needs to poke at some WebCore?object)。
test_shell應用是缺少網頁瀏覽器骨架的應用,用於測試我們的WebKit port和膠粘層代碼。
它像Chromium一樣使用相同的膠粘(glue)介面與webkit通訊。
它沒有許多復雜的瀏覽器特性、線程和進程,但是提供了一個簡單的方法給開發者測試新代碼。
這個應用也用於自動運行WebKit測試。
Chromium的渲染進程使用glue介面嵌入了我們的webkit port。
它沒有包含非常多的代碼:它的主要任務是成為渲染器連接瀏覽器的IPC通道。
渲染器中最重要的類是RenderView,位於/chrome/renderer/render_view.cc。
這個對象表示一個網頁。
它處理所有來自或者到瀏覽器進程的瀏覽相關的命令。
它由RenderWidget驅動,RenderWidget提供繪制和事件處理。
RenderView與瀏覽器進程通訊通過全局的(每個渲染進程一個)RenderProcess對象。
FAQ:RenderWidget與RenderView的區別是什麼?RenderWidget通過實現在glue層稱為 WebWidgetDelegate的抽象介面映射成WebCore::Widget對象。
基本上它可以認為是屏幕上接收輸入事件和我們需要繪制的窗口。
RenderView繼承了RenderWidget而且是標簽或者彈出窗口的內容。
它處理瀏覽命令另外處理繪制和widget的輸入事件。
每個渲染器有2個線程(見chrome多進程架構?中的圖或者chroimum的線程?)。
渲染器線程執行RenderView等主要對象和所有WebKit代碼。
當它與瀏覽器通訊時,消息首先發送給主線程,主線程分發消息給瀏覽器進程。
另外就是這種方式允許發送從渲染器到瀏覽器的同步消息。
這種方式提供了瀏覽器等待渲染器的一組操作完成後繼續。
一個簡單的例子是當JavaScript讀取cookie時。
渲染器線程將阻塞而且主線程將投遞所有接收到的消息直到收到正確的響應。
正常的處理都是一旦主線程收到消息就順序地發送給渲染器。
瀏覽器進程 底層瀏覽器進程對象 所有與渲染器進程的通訊都有瀏覽器的IO線程完成。
這個線程同時處理所有網路通訊?這也保持了與用戶介面進行交互。
當主線程(用戶介面在此執行)初始化RenderProcessHost。
RenderProcessHost創建新的渲染器進程和ChannelProxy對象(與渲染器通過有名管道通訊)。
RenderProcessHost在瀏覽器的IO線程中執行,同時偵聽來自渲染器的有名管道數據,而且自動前向通知所有消息給UI線程中的RenderProcess。
ResourceMessageFilter安裝在這個通道里,這可以查到某種需要直接在IO線程處理的消息(如網路請求)。
ResourceMessageFilter::OnMessageReceived執行消息過濾。
UI線程的RenderProcessHost負責分發視圖相關的消息給合適的RenderViewHost(它處理有限的自身的非視圖相關的消息)。
RenderProcessHost::OnMessageReceived進行這些消息的分發。
高層瀏覽器進程對象 當視圖相關的消息進入RenderViewHOst::OnMessageReceived,大多數這些消息在次處理,剩下的消息交給集成 RenderWidgetHost的類處理。
渲染器中對應與這兩對象的分別是RenderView和RenderWidget(關於這些對象見渲染器進程)。
在微軟的Windows上,我們將每個RenderWidgetHost與RenderWidgetHostHWND關聯。
RenderWidgetHost管理事件和繪制到本地的HWND。
其他的系統我們採用相似的類管理本地輸入和繪制。
在RenderView/Widget之上的是WebContents對象,大多數的消息實際上都以在這個對象上的函數調用方式結束。
每個WebContents表示顯示網路數據的標簽的內容。
它受一般的TabContents類(有許多其他TabContents的規范,如歷史和下載。
)驅動。
WebContents是大多數瀏覽和頂層瀏覽器UI更新的切換點。
FAQ:為什麼將WebContents和RenderViewHost分離?這兩個對象提供了不同的功能層次。
您可以認為 RenderViewHost是Chromium的多進程嵌入層。
RenderViewHost對象能用於(實際上不是)渲染內容的其他部分。
例如,您可想像成一個帶有web視圖的對話框。
它能使用RenderViewHost去管理繪制且與渲染進程通訊,但是它不能有標簽或者常見的瀏覽命令。
RenderViewHost通過抽象介面RenderViewHostDelegate前向傳遞許多消息給WebContents。
WebContents處理瀏覽狀態和任何與web瀏覽器UI相關的操作。
我們假設的對話框不必需要任何這些功能,僅需要實現它關心的 RenderViewHostDelegate的部分介面。
演示示例 其他關於瀏覽和啟動的例子在獲取Chrome源碼?. 「設置游標」消息的處理過程 設置游標是由渲染器發送給瀏覽器的一個典型的消息。
在渲染器按下面過程處理: 設置游標消息由WebKit內部生成。
典型地一般是響應輸入事件。
設置游標消息由RenderWidget::SetCursor(chrome/render/render_widget.cc)發出。
它將調用RenderWidget::Send去分發消息。
這個方法也被RenderView使用去發送消息給瀏覽器。
然後調用RenderThread::Send。
接著調用IPC::SyncChannel,這個方法實現內部代理消息給渲染器的主線程同時投遞消息給發送消息給瀏覽器的命名管道。
接著瀏覽器接管該消息: RenderProcessHost?的IPC::ChannelProxy接收所有瀏覽器IO線程的消息。
它首先發送它們給 RenderMessageFilter,RenderMessageFilter將直接在IO線程分發網路請求和相關的消息。
既然我們的消息沒有被過濾掉,它將繼續交由瀏覽器的UI線程(IPC::ChannelProxy內部如此實現)。
RenderProcessHost?::OnMessageReceived(chrome/browser/render_process_host.cc)獲取所有響應渲染器進程的視圖的消息。
它直接處理幾種類型的消息,且對於剩下的前向通知相應的RenderViewHost去響應來自RenderView的消息。
消息到達RenderViewHost::OnMessageReceived(chrome/browser /render_view_host.cc)。
許多消息在這里處理,但是設置游標的消息不在此處,因為它是一個來自RenderWidget的消息應該交給RenderWidgetHost處理。
所有RenderViewHost未處理的消息都自動地前向通知給RenderWidgetHost,包括設置游標消息。
在chrome/browser/render_widget_host.cc中的消息映射最終接收RenderWidgetHost::OnMsgSetCusor然後調用合適的UI函數去設置滑鼠的游標。
滑鼠單擊消息處理過程 發送滑鼠消息是一個從瀏覽器發送給渲染器的典型消息。
瀏覽器的UI線程通過RenderWidetHostHWND::OnMouseEvent接收到窗口消息,然後調用ForwardMouseEventToRenderer。
這個前向通知函數將輸入事件包裝成跨平台的WebMouseEvent且發送給與之相關的RenderWidgetHost後結束。
RenderWidgetHost::ForwardInputEvent創建一個IPC消息ViewMsg_HandleInputEvent,序列化成WebInputEv。
然後調用RenderWigetHost::Send 發送。
這將事件前向傳遞給RenderProcessHost::Send函數,這個函數按順序將消息傳遞給IPC::ChannelProxy。
內部里,IPC::ChannnelProxy將代理此消息給瀏覽器的IO線程。
然後寫入與之相應的渲染器的命名管道。
注意:許多由WebContents創建的其他類型的消息,特別是瀏覽功能的消息,這些也按照相似的過程從WebContents傳遞到RenderViewHost。
然後渲染器接管該消息。
渲染器的主線程的IPC::Channel讀取由瀏覽器發送的消息,且IPC::ChannelProxy代理給渲染線程。
RenderView?::OnMessageReceived獲取這個消息。
許多種類型的消息都在此直接處理。
但是單擊消息卻不是,它將繼續(和其他所有未處理消息一起)通過此傳遞給RenderWidget::OnMessageReceived(它按照順序前向通知 RenderWidget::OnHandleInputEvent)。
輸入事件最終交給WebWidgetImpl::HandleInputEvent。
③ MAC OSX用Xcode編譯webkit,有詳細的步驟嗎
1.使用Xcode軟體。Xcode是一個蘋果系統上的集成開發環境(IDE),就是說用Xcode就能編寫C語言程序,並編譯運行。也能開發ios程序等,是一種軟體。在windows上類似這種能編c語言的還有微軟出的visual studio,和其他免費的一些如codeblocks,c-free等。
在Xcode中編譯運行C/C++的操作步驟:
1)打開Xcode,在歡迎界面點擊Create a new Xcode project。
2)彈出一個對話框,在左側欄選擇Mac OS X分類的Application,右側選擇Command Line Tool,點擊Next。
3)在Proct Name填寫項目名稱,如HelloMac,其餘默認即可(type里也可以選擇C或C++),點擊Next後選擇路徑並點擊Create完成項目創建。
4)在Xcode主界面左側點擊main.m,把代碼替換成C/C++的代碼,點擊左上角的Run按鈕即可編譯運行,界面下方會彈出控制台顯示運行結果。
④ webkit的開發語言是c還是c++
C語言是一門編程語言,而資料庫則是數據的集合。 1、C語言是一門通用計算機編程語言,應用廣泛,用它可以開發資料庫管理軟體,也可以通過C語言藉助於SQL語句來操作資料庫。 2、資料庫指的是以一定方式儲存在一起、能為多個用戶共享、具有盡可能
⑤ 如何用Python開發一個簡單的Webkit瀏覽器
你好,
1,基於IE內核的瀏覽器直接用VB編寫即可。引用WEBbrowser就可以了。復雜的操作可能要實現某些介面,比如攔截下載事件等。這部分用VB比較復雜,用Delphi比較合適。
2,webkit有現成封裝的ActiveX,可以直接被VB調用。
但自己編寫webkit內核的瀏覽器比較困難。
⑥ 網頁編程軟體有哪些
問題一:HTML5開發工具有哪些 一、Adobe Edge
目前還處於預覽階段的Adobe Edge是用HTML5、CSS、JavaScript開發動態互動內容的設計工具。內容可以同時兼容移動設備和桌面電腦。Edge的一個重要功能是Web工具包界面,方便確保頁面在不同瀏覽器中的架構一致性,此外Edge還將整合TypeKit這樣的字體服務。
動畫和圖形可以添加到HTML元素中,程序也能通過Edge自身的代碼片段庫或者JavaScript代碼進行擴展。動畫可以在獨立的時間線上進行嵌套,還能實現互動功能。符合可以服用並通過API和代碼片段控制。通過Edge設計的內容可以兼容iOS和Android設備,也可以運行在火狐、Chrome、Safari和IE9等主流瀏覽器。
二、Adobe Dreamweaver CS6
Adobe Dreamweaver CS6作為一個Web設計軟體,提供了對HTML網站和移動程序的可視化編輯界面。其Fluid Grid排版系統整合CSS樣式表功能,提供自適應版面的跨平台兼容性。開發者可以完全實現Web設計的可視化操作,無需為代碼所困。
用戶不但還能在Live View中預覽,還提供多屏幕預覽功能。開發者可以通過MultiScreen預覽面板查看HTML5內容的渲染效果。Live View通過WebKit渲染引擎支持HTML5。
三、Adobe ColdFusion 10
ColdFusion是用來開發企業Web程序的伺服器端技術,通過Websockets、互動表單、視頻和地理標簽等HTML5技術創建富媒體用戶體驗。
四、Sencha Architect 2
在開發移動和桌面應用的工具中,Sencha的定位是HTML5可視化應用開發。開發團隊可以在一個單一集成的環境中完成應用的設計、開發和部署。開發者還可以開發Sencha Touch2和Ext js4 JavaScript應用,並實時預覽。
五、Sencha Touch 2
Sencha Touch2是移動應用框架,也被看作是Sencha的HTML5平台。開發者可以用它開發面向iOS、Android和Blackberry、Kindle Fire等多種平台的移動應用。
六、Dojo Foundation Maqetta
來自於IBM的一個項目,Dojo Foundation Maqetta是為桌面和移動設備開發HTML5應用的開源工具,支持在瀏覽器中查看HTML5界面。用戶體驗設計師可以通過拖放組裝UI樣板
七、微軟Visual Studio 2010 ServicePack 1
雖然一開始並不支持HTML5,但微軟在2011年三月發布的Visual Studio 2010 SP1中提供了IntelliSense,追加了針對HTML5的一些元素。
八、JetBrains WebStorm 4.0
作為擁有HTML編輯器的JavaScript集成開發環境,WebStorm4.0提供了開發web應用的HTML5樣板。開發者可以在創建HTML文檔時可獲得對HTML5文件的支持。例如砍伐者鍵入。開發者還可以在chrome瀏覽器中實時預覽HTML文檔。
九、Google Web Toolkit
該開發工具用於開發瀏覽器應用,但庫中支持很多HTML5功能。包括對客戶端或web存儲的支持。其他HTML5功能還包括支持Canvas可視化,以及音頻和視頻widget。
...>>
問題二:網頁開發軟體有哪些 一、 Microsoft公司的FrontPage
應用開發工具可大大提高編制網路課件的效率. 目前,國際上比較流行的Web頁製作軟體大致可以分為兩類:代碼型和所見即所得型.代碼型的製作軟體要編程,對於初學者來說想要立即上手比較困難. Microsoft公司的FrontPage就不同了,它作為一種所見即所得型的代表軟體,可以使使用者的工作效率得以很大提高. FrontPage 2000 是Office 2000 家族的一員,沿襲著Office 的風格.所以會用 Word 的人很容易學會FrontPage.
二、Macromedia 公司的Dreamweaver
Dreamweaver是美國MACROMEDIA公司開發的集網頁製作和管理網站於一身的所見即所得網頁編輯器,它是第一套針對專業網頁設計師特別發展的視覺化網頁開發工具,利用它可以輕而易舉地製作出跨越平台限制和跨越瀏覽器限制的充滿動感的網頁.
三、網頁製作工具的綜合運用
Microsoft公司的FrontPage 和Macromedia公司的Dreamweaver是使用最多的HTML網頁製作工具。它們都支持多種媒體類型,可以通過ActiveX定義介面,與腳本編程語言JavaScript和VBScript配合,創建動態交互的Web教學系統。特別值得指出的是,Macromedia的Dreamweaver以及Flash和Fireworks一起被人們稱作網頁製作三劍客,三者的有機結合,可以說是目前使用方便、功能強大的網站管理及HTML頁面製作工具。
四、Java開發工具
應選擇可移植性好的開發工具。如JDK。
雖然Java程序的可移植性好,但其也依賴於使用的開發工具,如果使用了一些編程工具自己提供的擴展功能,則可能會降低可移植性。
五、資料庫的選擇
最好選擇能跨平台使用的資料庫,如Oracle等。
問題三:製作網頁軟體需要哪些編程技術? 15分 您需要掌握的技術:
html+css;
html5+css3;
js/jquery等腳本語言或者腳本框架;
bootstrap等前端框架;
PS,AI,FW等切圖軟體的操作;
有一定的審美能力。
希望你能進步,加油!
問題四:免費的中文編程軟體有哪些 中文編程軟體有不少,習語言、習佳娃、習姐 是免費的。
問題五:網頁編程用什麼軟體方便? Dreamweaver 開發簡單的HTML格式的軟體 方面快捷 或者 EditPlus 這個都行 都挺好用的
問題六:網頁製作,不懂編程,有什麼好用易學的軟體 Adobe Dreamweaver這個簡單有提示,而且容易查看
問題七:html編程用什麼軟體比較好 dreamwaver很專業,想要的功能基本上都涵蓋,但是站內存也多(我目前就用這個做html,css,js,PHP)。
相對來講Notepad++就是一款功能還算強大,速度非常快的編程軟體。
不管用什麼軟體開發,前提是一定要把軟體里你需要的功能調用出來,例如代碼錯誤提示功能,更改背景顏色用來保護眼睛啊。
問題八:初學web前端開發用什麼軟體 10分 初學web前端開發可以使用DW。
web前端開發是個非常新的職業,對一些規范和最佳實踐的研究都處於探索階段。總有新的靈感和技術不時閃現出來,新的技術也給網頁增加了許多新的活力;瀏覽器大戰也越來越白熱化,跨瀏覽器兼容方案依然是五花八門。為了滿足「高可維護性」的需要,我們需要更深入,更系統地去掌握前端知識.
那麼我們應該怎麼學習前端開發這門技術呢?
現在很多小夥伴喜歡在互聯網上找視頻資料學習網頁製作,但是光看視頻你是不可能學會網頁製作的,沒有人指導你,而且很多視頻已經過時了 ,並沒有什麼用! 如果你真的想學習網頁製作這門技術,你可以來這個裙,最前面的是 4 9 四+中間是 靈 六 思+最後是 久 三 思! 在這里有最新的HTML課程 免費學習 也有很多人指導你進步,不需要你付出什麼,只要你是真心想學習的,隨便看看的就不要加了,加了也是浪費大家的時間 。
Web前端開發在產品開發環節中的作用變得越來越重要,而且需要專業的前端工程師才能做好。Web前端開發是一項很特殊的工作,涵蓋的知識面非常廣,既有具體的技術,又有抽象的理念。簡單地說,它的主要職能就是把網站的界面更好地呈現給用戶。聽起來比較復雜,但前端開發的門檻其實非常的低,與伺服器端語言先慢後快的學習曲線相比,前端開發的學習曲線是先快後慢。
所以,對於從事IT工作的人來說,前端開發是個不錯的初入點。也正因為如此,前端開發的領域有很多自學成「才」的同行,但大多數人都停留在會用的階段,因為後面的學習曲線越來越陡峭,每前進一步都很難。更系統的學習,做專業的人才更利於職業發展。當然學習的目的是為了就業,我們來看一下,web前端開發工程師前景如何?
行業發展好
從我們身邊的方方面面考慮,互聯網行業無疑是現在發展前景最好的行業之一。潭州教育致力於改變中國IT實踐教學模式,引領中國IT教學技術標准與人才培養標准。讓想學習的人隨時隨地都可以進行學習!
人才需求大
互聯網對人們的影響越來越大,各類職業也需求更多,前端的人才需求比以前也有了質的飛躍。我們希望從業者:「我們不是為了學技術而去學技術,我們學技術是為了能更好去做產品」。最後引用喬布斯的話,Web就是未來,我們作為前端開發工作者也是未來。相信Web前端開發的明天會更好。
問題九:可以用來編程的軟體有哪些? 常用自動編程軟體有
MASTERCAM
UG
POWERMILL
PRO / E軟體
、CATIA、
CIMATRON、
DELCAM等軟體。
PRO / E軟體主要是模具行業用來三維建模的
問題十:有哪些適合初學者編程的軟體 這個應該要看你學習什麼東西了,學習C語言的話可以使用VC++6.0、TC,學習Java的話可用jcreator、eclipse、NetBeans,學習C#的話就只能用VS(VisualStudio),學習網頁(HTML)的話可以用記事本、notepad++、Dreamweaver都可以
⑦ 如何用Python開發一個簡單的Webkit瀏覽器
在這篇教程中,我們會用 Python 的 PyQt 框架編寫一個簡單的 web 瀏覽器。關於 PyQt ,你可能已經有所耳聞了,它是 Qt 框架下的一系列 Python 組件,而 Qt(發音類似「cute」)是用來開發GUI的 C++ 框架。嚴格來講, Qt 也可用於開發不帶圖形界面的程序,但是開發用戶界面應該是 Qt 框架最為廣泛的應用了。Qt 的主要優勢是可以開發跨平台的圖形界面程序,基於 Qt 的應用能夠藉助於各平台的原生性在不同類的設備上運行,而無須修改任何代碼庫。
Qt 附帶了webkit的介面,你可以直接使用 PyQt 來開發一個基於 webkit 的瀏覽器。
我們本次教程所開發的瀏覽器可以完成如下功能:
載入用戶輸入的url
顯示在渲染頁面過程中發起的所有請求
允許用戶在頁面中執行自定義的 JavaScript 腳本
牛刀小試
讓我們從最簡單的 PyQt 的 Webkit 用例開始吧:輸入 url,打開窗口並在窗口中載入頁面。
這個例子十分短小,連import語句和空行在內也只有 13 行代碼。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import sys
from PyQt4.QtWebKit import QWebView
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
app = QApplication(sys.argv)
browser = QWebView()
browser.load(QUrl(sys.argv[1]))
browser.show()
app.exec_()
當你通過命令行將 url 傳給腳本時,程序會載入 url 並且在窗口中顯示載入完成的頁面。
現在,看似你已經有一個「命令行瀏覽器」啦!至少比 python 的 requests 模塊強多了,甚至比Lynx還略高一籌,因為我們的瀏覽器還可以載入 JavaScript 腳本呢。但是目前為止還沒有跟 Lynx 拉開差距,因為在啟用瀏覽器的時候只能通過命令行傳入 url。那麼,必然需要通過某種方式把需要載入的 url 傳入瀏覽器。沒錯,就是地址欄!
添加地址欄
其實地址欄的實現非常簡單,我們只需要在窗口頂端加一個輸入框就夠了。用戶在文本框中輸入 url 之後,瀏覽器就會載入這個地址。下面,我們將用到 QLineEdit 控制項來實現輸入框。鑒於我們的瀏覽器現在有地址欄和瀏覽器顯示框兩部分,因此還要給我們的應用增加一個網格布局。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import sys
from PyQt4.QtGui import QApplication
from PyQt4.QtCore import QUrl
from PyQt4.QtWebKit import QWebView
from PyQt4.QtGui import QGridLayout, QLineEdit, QWidget
class UrlInput(QLineEdit):
def __init__(self, browser):
super(UrlInput, self).__init__()
self.browser = browser
# add event listener on "enter" pressed
self.returnPressed.connect(self._return_pressed)
def _return_pressed(self):
url = QUrl(self.text())
# load url into browser frame
browser.load(url)
if __name__ == "__main__":
app = QApplication(sys.argv)
# create grid layout
grid = QGridLayout()
browser = QWebView()
url_input = UrlInput(browser)
# url_input at row 1 column 0 of our grid
grid.addWidget(url_input, 1, 0)
# browser frame at row 2 column 0 of our grid
grid.addWidget(browser, 2, 0)
# main app window
main_frame = QWidget()
main_frame.setLayout(grid)
main_frame.show()
# close app when user closes window
sys.exit(app.exec_())
到這里,我們已經有一個瀏覽器的雛形啦!看上去和當年的 Google Chrome 還有幾分相像呢,畢竟兩者採用了相同的渲染引擎。現在,你可以在輸入框中輸入 url ,程序便會將地址傳入瀏覽器,接著渲染出所有的 HTML 頁面和 JavaScript 腳本並展示出來。
添加開發工具
一個瀏覽器最有趣也最重要的部分是什麼?當然是各種各樣的開發工具了!一個沒有開發者控制台的瀏覽器怎麼能算是瀏覽器呢?所以,我們的 Python 瀏覽器當然也要有一些開發者工具才行。
現在,我們就來添加一些類似於 Chrome 的開發者工具中 「Network」 標簽的功能吧!這個功能就是簡單地追蹤瀏覽器引擎在載入頁面的時候所執行的所有請求。在瀏覽器主頁面的下方,我們將通過一個表來顯示這些請求。簡單起見,我們只會記錄登錄的 url、返回的狀態碼和響應的內容類型。
首先我們要通過 QTableWidget 組件創建一個表格,表頭包括需要存儲的欄位名稱,表格可以根據每次新插入的記錄來自動調整大小。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class RequestsTable(QTableWidget):
header = ["url", "status", "content-type"]
def __init__(self):
super(RequestsTable, self).__init__()
self.setColumnCount(3)
self.setHorizontalHeaderLabels(self.header)
header = self.horizontalHeader()
header.setStretchLastSection(True)
header.setResizeMode(QHeaderView.ResizeToContents)
def update(self, data):
last_row = self.rowCount()
next_row = last_row + 1
self.setRowCount(next_row)
for col, dat in enumerate(data, 0):
if not dat:
continue
self.setItem(last_row, col, QTableWidgetItem(dat))
想要追蹤所有請求的話,我們還需要對 PyQt 的內部構件有更深入的了解。了解到,Qt 提供了一個 NetworkAccessManager類作為 API 介面,通過調用它可以監控應用載入頁面時所執行的請求。我們需要自己編寫一個繼承自 NetworkAccessManager 的子類,添加必要的事件監聽器,然後使用我們自己編寫的 manager 來通知 webkit 視圖執行相應的請求。
首先我們需要以 NetworkAccessManager 為基類創建我們自己的網路訪問管理器。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Manager(QNetworkAccessManager):
def __init__(self, table):
QNetworkAccessManager.__init__(self)
# add event listener on "load finished" event
self.finished.connect(self._finished)
self.table = table
def _finished(self, reply):
"""Update table with headers, status code and url.
"""
headers = reply.rawHeaderPairs()
headers = {str(k):str(v) for k,v in headers}
content_type = headers.get("Content-Type")
url = reply.url().toString()
# getting status is bit of a pain
status = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
status, ok = status.toInt()
self.table.update([url, str(status), content_type])
在這里需要提醒大家的是, Qt 的某些實現並不像想像中那麼簡單明了,比如說從響應中獲取狀態碼就十分繁瑣。首先,你得把請求對象的類屬性作為參數傳入 response 的方法.attribute()中,.attribute()方法的返回值是 QVariant 類型而非 int 類型。接著,需要調用內置函數.toInt()將其轉換成一個包含兩個元素的元組,最終得到響應的狀態碼。
現在,我們終於有了一個記錄請求的表和一個監控網路的 manager,接下來只要把他們聚攏起來就可以了。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if __name__ == "__main__":
app = QApplication(sys.argv)
grid = QGridLayout()
browser = QWebView()
url_input = UrlInput(browser)
requests_table = RequestsTable()
manager = Manager(requests_table)
# to tell browser to use network access manager
# you need to create instance of QWebPage
page = QWebPage()
page.setNetworkAccessManager(manager)
browser.setPage(page)
grid.addWidget(url_input, 1, 0)
grid.addWidget(browser, 2, 0)
grid.addWidget(requests_table, 3, 0)
main_frame = QWidget()
main_frame.setLayout(grid)
main_frame.show()
sys.exit(app.exec_())
現在,運行瀏覽器程序,在地址欄鍵入 url,就可以看到在主頁面下方的記錄表中記錄下的所有請求。
如果你有興趣的話,還可以為瀏覽器添加很多新的功能:
通過content-type添加篩選功能
添加記錄表的排序功能
添加計時器
高亮顯示出錯的請求(比如說把錯誤信息置為紅色)
顯示出更為具體的請求內容,比如說完整的頭信息、響應內容、請求方法等。
增加一個重復發送請求並載入出來的選項。比如說用戶可以點擊在記錄表中的請求來重試請求。
其實還有太多的功能可以繼續完善和改進,你可以一一嘗試一下,這會是一個非常有趣而且收獲良多的學習過程。但是如果想把這些功能都說完,估計都能寫一本書了。所以限於篇幅,本文就不一一介紹了,感興趣的朋友可以參考其他書籍和網上教程。
增加解析自定義 JavaScript 腳本的功能
我們終於迎來最後一個功能了!就是解析在頁面中包含的 JavaScript 腳本。
基於我們之前已經打下的基礎,要完成這個功能非常簡單。我們只需要在添加一個 QLineEdit 組件,把它和頁面聯系起來,然後調用evaulateJavaScript方法就可以了。
Python
1
2
3
4
5
6
7
8
9
class JavaScriptEvaluator(QLineEdit):
def __init__(self, page):
super(JavaScriptEvaluator, self).__init__()
self.page = page
self.returnPressed.connect(self._return_pressed)
def _return_pressed(self):
frame = self.page.currentFrame()
result = frame.evaluateJavaScript(self.text())
下面是這個功能的示例。看,我們的開發者工具已經整裝待發了!
Python
1
2
3
4
5
6
7
8
9
10
11
if __name__ == "__main__":
# ...
# ...
page = QWebPage()
# ...
js_eval = JavaScriptEvaluator(page)
grid.addWidget(url_input, 1, 0)
grid.addWidget(browser, 2, 0)
grid.addWidget(requests_table, 3, 0)
grid.addWidget(js_eval, 4, 0)
現在唯一缺少的就是在頁面中不能執行 Python 腳本。你可以開發自己的瀏覽器,提供對 JavaScript 和 Python 的支持,這樣其他開發者就可以針對你的瀏覽器開發應用了。
後退、前進和其他頁面操作
我們在前面已經使用了 QWebPage 對象來開發瀏覽器,當然作為一個合格的瀏覽器,我們也需要為終端用戶提供一些重要功能。Qt 的網頁對象支持很多不同操作,我們可以把它們全都添加到瀏覽器中。
現在我們可以先嘗試著添加「後退」、「前進」和「刷新」這幾個操作。你可以在界面上添加這些操作按鈕,簡單起見,這里只加一個文本框來執行這些動作。
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class ActionInputBox(QLineEdit):
def __init__(self, page):
super(ActionInputBox, self).__init__()
self.page = page
self.returnPressed.connect(self._return_pressed)
def _return_pressed(self):
frame = self.page.currentFrame()
action_string = str(self.text()).lower()
if action_string == "b":
self.page.triggerAction(QWebPage.Back)
elif action_string == "f":
self.page.triggerAction(QWebPage.Forward)
elif action_string == "s":
self.page.triggerAction(QWebPage.Stop)
和之前一樣,我們要創建一個 ActionInputBox 的實例,把參數傳入頁面對象並把輸入框對象添加到頁面中。
For reference here』s code for final result 示例代碼看這里
[1]: Graphical User Interface,圖形用戶界面,又稱圖形用戶介面,是指採用圖形方式顯示的計算機操作用戶界面。
[2]: WebKit是一個開源的瀏覽器引擎,與之相對應的引擎有 Gecko(Mozilla Firefox 等使用)和 Trident(也稱 MSHTML ,IE 使用)。