日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

WebKit中的Chrome和ChromeClient

發布時間:2024/4/15 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WebKit中的Chrome和ChromeClient 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

瀏覽器的GUI接口分成兩種,一種是控件的繪制,另一種則是同應用息息相關的窗口交互操作。本文主要介紹后一種,在WebKit里面,稱之為宿主窗口。Chrome類為WebKit內核定義了一系列的宿主窗口相關的操作接口,并最終在不同的實現中由ChromeClient類的派生類來實現,比如,在Qt里面的ChromeClientQt類。本文將介紹Chrome類在WebKit中的作用,以及在移植WebKit的時候,如何來實現ChromeClient類。

關鍵字:WebKitWebCore,Chrome,ChromeClient,宿主窗口,WebKit移植,ChromeClientQt

1.????Chrome類在WebKit中的作用

先說個題外話,春節回家,親戚朋友都會關心我在做什么。當我告訴它們,我在從事跟瀏覽器相關的工作的時候,他們迷惑的眼神分明在表示對我進一步解釋的期待。這個時候,我會根據不同的人給出兩種解釋,對那些已經有網絡使用背景的人,我告訴他們,我在做跟IE一樣的事情。對不知道網絡為何物的人,我會這么跟他們說,網站就像世界各地有很多的電視臺,我們在做一個技術,這個技術讓你的電視可以跟別的電視不一樣,你可以找到很多的電視臺,這些電視臺提供各種各樣的節目,內容,這個技術可以幫你把這個電視臺的節目抓下來,并展現給你看,如果沒有這個技術,即使你找到這個電臺,把東西拿下來你也看不了,同時你可以通過我們這個技術,同這個電視臺進行雙向交流,就像打進電視熱線一樣。他們似懂非懂,也許會豎起大拇指,說“你這個科學很先進!我覺得很有前途,你要好好干!以后我們家的電視也要用你們那樣的技術!“。

后來我為了這個瀏覽器的定義,特意查了百度百科,我綜合一下,比較好的解釋可能是這樣,”瀏覽器是Web/Wap服務的客戶端瀏覽程序,可向Web/Wap服務器發送各種請求,并對服務器發回的超文本信息和各種多媒體數據格式進行解釋、顯示和播放,并讓用戶與此些文件互動“。

從上面這個定義里面,我簡單提煉出了瀏覽器需要的幾個功能件:發送請求(http),解釋超文本信息和各種多媒體數據(解析),顯示和播放這些信息(排版,渲染,以及可能存在的插件),互動(交互)。這幾個模塊里面,同平臺GUI相關的是排版、渲染和互動。而Chrome類就是WebCore內核渲染網頁以及互動所需的并定義出來會由移植實現的同平臺相關的接口,這個接口不包括控件的渲染。ChromeClient的具體實現(比如ChromeClientQt),則是移植對這些接口的實現。如果以MVC的角度來看,Chrome就是V,當然WebKit并非MVC的架構。

2.????類關系

Chrome是對應于Page的,每個Page都會在構造函數中創建出一個Chrome對象,并將對象指針賦給Pagem_chrome成員。

?

?

?

Chrome類繼承自HostWindow類,HostWindow類定義了宿主窗口必須實現的一系列接口,包括刷窗口(及內容),滾動,窗口相對坐標和屏幕坐標之間的相互轉換等接口。HostWindow是個抽象接口類,沒有構造函數,無法實例化,Chrome通過繼承對這個類進行了實現。

?

?

?

在類Chrome的實現中,通過了組合的方式,將具體實現委托給ChromeClient。如

void Chrome::invalidateContentsAndWindow(const IntRect& updateRect, bool immediate)

{

????m_client->invalidateContentsAndWindow(updateRect, immediate);

}

ChromeClient也是抽象接口類,沒有構造函數,必須在porting的時候,進行繼承,由不同的移植依托自己的平臺進行實現。以Qt移植為例,由ChromeClientQt類來最終實現(googleChrome分支主要由ChromeClientImpl類實現)。

?

?

?

而在ChromeClientQt的具體實現中,很多又是通過Page類的內部QwebPageClient類數據成員(client)提供的接口來實現的。同樣的,QwebPageClient是抽象接口類,無法實例化,通過繼承類PageClientQWidget來實現。而PageClientQWidget的實現又最終通過qwebview來實現,這個過程有點繞彎彎。

?

????

PageClientQWidget的實例化在QwebPage::setView接口中完成。

在代碼結構上,ChromeClientQt.cppPageClientQt.cpp都位于WebKit/qt/WebCoreSupport目錄下,表面他們為了實現WebCore需要實現的移植層代碼。

3.????主要接口

3.1.???????ChromeClientQt

ChromeClientQt(QWebPage* webPage);

描述:構造函數,以QWebPage為依賴對象創建。一般在創建Page對象前調用這個構造函數實例化ChromeClientQt,并以之為參數創建Page對象。

3.2.???????windowRect

FloatRect windowRect();

描述:獲得瀏覽器窗口區域的大小,這個區域不止包括顯示區域,還包括狀態條,菜單欄,工具欄等等。

3.3.???????pageRect

FloatRect pageRect();

描述:獲取顯示區域的大小,在排版的時候會經常調用到。

3.4.???????createWindow

Page* createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures&, const NavigationAction&);

描述:創建一個窗口。一般是在新建一個新窗口或者tab頁的時候調用。一個新窗口的創建意味著會有一個qwebview的創建和qwebpage的創建。窗口創建成功以后,還要在qwebframe主幀中發起網頁請求。這個接口在移植中非常重要。

3.5.???????setToolbarsVisible

setToolbarsVisible(bool visible);

bool toolbarsVisible();

void setStatusbarVisible(bool);

statusbarVisible();

setScrollbarsVisible(bool);

scrollbarsVisible();

setMenubarVisible(bool);

menubarVisible();

描述:不用多說,這些接口是用來控制這些區域的顯示與否。

3.6.???????addMessageToConsole

void addMessageToConsole(MessageSource, MessageType,

????????????????????????????MessageLevel, const String& message,

????????????unsigned int lineNumber,

const String& sourceID);

描述:很多瀏覽器都在提供了javascript控制臺工具,方便開發人員進行調試,這個接口就是要把信息在控制臺中打印出來。

3.7.???????runJavaScriptAlert

void runJavaScriptAlert(Frame*, const String&);

bool runJavaScriptConfirm(Frame*, const String&);

bool runJavaScriptPrompt(Frame*, const String& message,

?const String& defaultValue, String& result);

描述:用來實現javascript中的alert框,確認框,提示框,完成同用戶的交互。

3.8.???????setStatusbarText

void setStatusbarText(const String&);

描述:設置狀態條顯示信息。

3.9.???????invalidateContentsAndWindow

void invalidateContentsAndWindow?(const IntRect& windowRect, bool immediate);

描述:非常重要的一個移植接口,用來刷屏(包含內容和窗體)。一般情況下,平臺趨向于一個異步的調用(并不馬上調用),也就是說,可能多次的invalidateContentsAndWindow調用的結果才導致一次屏幕的刷新。Immediate參數則用來表示是否要立即進行屏幕刷新,不過很多移植都不對這個參數進行支持。

3.10.??scroll

void scroll(const IntSize& delta, const IntRect& scrollViewRect,

const IntRect&);

描述:滾動支持。移植一般調用native widget缺省的scroll功能來實現這個接口。

3.11.??windowToScreen

IntRect??windowToScreen(const IntRect& rect) const

IntPoint??screenToWindow(const IntPoint& point) const;

描述:非常重要的移植接口,用來實現基于控件或者小窗口的相對坐標和屏幕坐標之間的轉換。在排版的時候,會經常用到這兩個轉換。

3.12.??requestGeolocationPermissionForFrame

void requestGeolocationPermissionForFrame(

Frame* frame, Geolocation* geolocation)

void cancelGeolocationPermissionRequestForFrame(

Frame* frame, Geolocation* geolocation);

描述:在Geolocation(基于瀏覽器的地理定位技術)的時候,瀏覽器在調用Geolocation API獲取您的地理位置之前,會有一個用戶確認,這兩個接口就是用來實現這個確認以及確認的取消。

3.13.??createPopupMenu

QWebSelectMethod* createSelectPopup() const;

PassRefPtr<PopupMenu> createPopupMenu(

PopupMenuClient* client) const;

描述:在WebKit中,網頁中的下拉框(select+option)并不是作為一個控件來實現,而是結合畫input,畫下來三角和彈出選項來實現。這兩個接口就是用來彈出選項的。畫框和input則在RenderThemeQt中實現。

3.14.??show

void show();

描述:用來顯示窗體和內容,立即執行刷屏。

總結

以上是生活随笔為你收集整理的WebKit中的Chrome和ChromeClient的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。