content_shell工程是基于Chromium里面的content api封裝了一個簡單的UI的簡易瀏覽器醉鳖。
1、將任務拆分成四個子功能
1) 添加標簽欄
2) 新開網(wǎng)頁在當前窗口展示
3) 切換標簽
4) 關(guān)閉標簽
2 功能實現(xiàn)
2.1 添加標簽欄
content shell的UI是通過ShellWindowDelegateView類來繪制的遗契,實現(xiàn)了工具欄和網(wǎng)頁展示區(qū)域的繪制辐棒。
新增Tab和TabbarView兩個類來實現(xiàn)標簽和標簽欄。設計到的主要類圖如下:
TabbarView的成員變量web_view_list_的作用是存儲創(chuàng)建的的WebView對象牍蜂。
TabbarController和TabController是兩個抽象類漾根,TabController負責管理標簽欄中的單個標簽,TabbarController負責管理標簽欄鲫竞,主要處理標簽的單擊和關(guān)閉功能辐怕。
2.2新開網(wǎng)頁在當前窗口展示
點擊網(wǎng)頁鏈接時,原生content shell的處理邏輯是創(chuàng)建新的Shell對象从绘,通過其成員變量window_widget_創(chuàng)建新的窗口展示網(wǎng)頁寄疏,相關(guān)代碼如下:
AddNewContents函數(shù)是對WebContentsDelegate類函數(shù)的重寫,其它對象實現(xiàn)WebContentsDelegate接口可以獲得WebContents中的更改的通知并提供對應的功能僵井,使用WebContents的接口函數(shù)SetDelegate(WebContentsDelegate*
delegate)來綁定接收消息的對象陕截。
根據(jù)window_widget_是否為空來判斷如實展示新開的網(wǎng)頁,代碼如下:
原生的content_shell工程的設計是一個Shell對象管理一個WebContents對象批什,本任務中需要改為一個Shell對象管理多個WebContents對象农曲,在Shell類中web_contents_list_成員變量負責管理。
ShellContent繼承自content::WebContentsObserver這個抽象類,重寫了TitleWasSet(NavigationEntry*
entry)方法乳规,作用是獲取到網(wǎng)頁標題之后形葬,調(diào)用相關(guān)的函數(shù)設置標簽標題和窗口標題。
2.3切換標簽
Tab的鼠標點擊事件邏輯通過重寫View::OnMousePressed函數(shù)實現(xiàn):
2.4關(guān)閉標簽
點擊關(guān)閉按鈕或者雙擊標簽都可以關(guān)閉當前標簽暮的。Tab的雙擊雙擊事件邏輯通過重寫View::OnMousePressed函數(shù)實現(xiàn)笙以,關(guān)閉按鈕的點擊事件邏輯通過重寫B(tài)uttonListener::ButtonPressed實現(xiàn):
關(guān)閉當前標簽后,切換到下一個標簽(如果是最后一個標簽冻辩,切換到上一個標簽)猖腕;如果關(guān)閉的標簽是唯一的標簽,關(guān)閉主窗口恨闪。