www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]一、概述?????? 之前有介紹過(guò)chromium的界面層的相關(guān)知識(shí),這篇文章則是重點(diǎn)介紹chromium中書簽這一個(gè)模塊,不僅有界面層的知識(shí),還會(huì)較多的介紹邏輯層的一些內(nèi)容。接下來(lái)會(huì)詳細(xì)介紹chro

一、概述
?????? 之前有介紹過(guò)chromium的界面層的相關(guān)知識(shí),這篇文章則是重點(diǎn)介紹chromium中書簽這一個(gè)模塊,不僅有界面層的知識(shí),還會(huì)較多的介紹邏輯層的一些內(nèi)容。接下來(lái)會(huì)詳細(xì)介紹chromium中書簽功能的詳細(xì)實(shí)現(xiàn)。主要問(wèn)題有:
??????????????1、書簽數(shù)據(jù)在硬盤和內(nèi)存中存儲(chǔ)結(jié)構(gòu);
??????????????2、初始化過(guò)程;
??????????????3、相關(guān)操作的實(shí)現(xiàn)步驟;
??????????????4、線程模型;
??????????????5、書簽同步。

二、書簽結(jié)構(gòu)綜述
??????? Bookmark界面層在..srcchromebrowseruiviewsbookmarks中實(shí)現(xiàn)。Bookmark邏輯層在..srcchromebrowserbookmarks 中實(shí)現(xiàn),包括讀寫書簽文件,書簽導(dǎo)入導(dǎo)出等。
???????書簽在整個(gè)工程中是chrome特色功能,它包括三種類型,書簽欄、其他、和“mobile”。書簽欄管理用戶創(chuàng)建的所有書簽
???????作為chromium拓展中心的一個(gè)功能,整體流程圖如圖:
?
??? 圖1 書簽整體流程圖

???????在書簽?zāi)K中,其中主要的兩個(gè)模塊是底層數(shù)據(jù)處理和界面顯示,具體實(shí)現(xiàn)分別在BookmarkModel和BookmarkBarView中,它們之間采用的是observer設(shè)計(jì)模式,BookmarkModel(具體目標(biāo)),BookmarkBarView(具體觀察者)。

三、書簽存儲(chǔ)結(jié)構(gòu)
???????書簽的存儲(chǔ)結(jié)構(gòu)需要從配置文件中結(jié)構(gòu)及內(nèi)存中存儲(chǔ)結(jié)構(gòu)兩方面分析。
???????書簽配置文件中存儲(chǔ)在本地Bookmarks中,以JSON的格式存儲(chǔ)。并在書簽?zāi)K啟動(dòng)的時(shí)候load文件中的書簽數(shù)據(jù)。本地JSON書簽數(shù)據(jù)如下:
???????? "children": [ {
??????????? "date_added": "12994954482846617",
??????????? "id": "7",
??????????? "name": "Google",
??????????? "type": "url",
??????????? "url": "http://www.google.com.hk/"
???????? },
???????在內(nèi)存中每個(gè)節(jié)點(diǎn)對(duì)應(yīng)一個(gè)BookmarkNode。其中包含了favicon, id and type等節(jié)點(diǎn)信息。
???????在BookmarkModel中定義了如下幾個(gè)節(jié)點(diǎn):
???????? BookmarkNode root_;
???????? BookmarkPermanentNode* bookmark_bar_node_;
???????? BookmarkPermanentNode* other_node_;
???????? BookmarkPermanentNode* mobile_node_;
???????root_作為根節(jié)點(diǎn),是書簽欄中節(jié)點(diǎn)和“其他”文件夾中節(jié)點(diǎn)的父節(jié)點(diǎn)。BookmarkPermanentNode只是BookmarkNode一個(gè)簡(jiǎn)單的封裝,用來(lái)管理書簽欄及“其他”等這種固定的文件夾。

四、書簽初始化及釋放
???????書簽功能的初始化:可以分為兩個(gè)部分,數(shù)據(jù)邏輯層和界面層。從上面的主流程圖中我們可以看出,數(shù)據(jù)邏輯層先于界面層初始化,具體初始化流程如下:
???????數(shù)據(jù)邏輯層:
???????初始化流程,拓展中心統(tǒng)一初始化,在ExtensionService::InitEventRouters()中調(diào)用
???????bookmark_event_router_.reset(new BookmarkExtensionEventRouter(
???????????? BookmarkModelFactory::GetForProfile(profile_)));
???????? ??? bookmark_event_router_->Init();
???????最終在BookmarkModelFactory完成BookmarkModel的創(chuàng)建。另外,BookmarkExtensionEventRouter繼承自BookmarkModelObserver,是BookmarkModel的一個(gè)具體觀察者。會(huì)將bookmark中的修改通知裝換成event傳給extension system
???????邏輯層初始化執(zhí)行順序如下圖:

?
圖2 書簽數(shù)據(jù)邏輯層執(zhí)行
???????為防止阻塞UI線程,書簽文件的加載是在一個(gè)后臺(tái)進(jìn)程中完成的,chromium啟動(dòng)的時(shí)候,主線程Post出一個(gè)文件加載的Task,同時(shí)傳入了一個(gè)回調(diào)函數(shù)的指針參數(shù),當(dāng)消息中心處理這個(gè)Task時(shí)會(huì)調(diào)用之前傳入的回調(diào),并完成書簽文件的加載接JSON數(shù)據(jù)的解析。注意這個(gè)步驟是在File加載線程中完成的。加載解析完成后,F(xiàn)ile加載線程會(huì)POST出一個(gè)Task,并將操作權(quán)交還給主線程,去完成后需初始化工作。
??????? 書簽文件的解析是在JSONFileValueSerializer中完成的,在這個(gè)里面會(huì)將JSON文件反序列化。并將其內(nèi)容存入BookmarkLoadDetails中,供接下來(lái)的調(diào)用。

???????界面層:
???????BookmarkBarView類是BookmarkModel的具體觀察者,負(fù)責(zé)書簽數(shù)據(jù)的渲染布局等,與書簽界面層相關(guān)的操作主要在這里面實(shí)現(xiàn)。
???????BookmarkBarView由BrowserView統(tǒng)一管理,BrowserView不會(huì)主動(dòng)創(chuàng)建BookmarkBarView,而是在之后執(zhí)行需要書簽的操作中,如UpdateUIForContents,若書簽界面層尚未創(chuàng)建,則執(zhí)行創(chuàng)建操作,否則跳過(guò)。

???????書簽?zāi)K的釋放:同樣重點(diǎn)完成數(shù)據(jù)邏輯層和界面層的釋放。釋放的過(guò)程和創(chuàng)建相反。先delete 管理界面模塊的BookmarkBarView,這部分功能由BrowserView統(tǒng)一管理釋放。之后再進(jìn)一步delete管理邏輯層的模塊BookmarkModel,這部分釋放工作在配置文件管理中心統(tǒng)一釋放。

五、書簽操作執(zhí)行流程
???????書簽界面層與邏輯層的類關(guān)系圖如下。

?
?? 圖3 界面層、邏輯層類關(guān)系圖
?? ?
???????BookmarkModel繼承自PofileDeyedService,因而可以實(shí)現(xiàn)在配置文件管理中心統(tǒng)一釋放
???????BookmarkBarView繼承自DetachableToolbarView,是一個(gè)與Chrome frame分離的view控件。
???????BookmarkModel與BookmarkBarView均繼承自消息中心NotificationObserver,并會(huì)通過(guò)registrar_注冊(cè)自己需要接受的通知。

???????BookmarkModel類中的實(shí)現(xiàn)。它是是observer模式中的具體目標(biāo)及數(shù)據(jù)邏輯層的核心實(shí)現(xiàn)。BookmarkModel對(duì)象需要通過(guò) BookmarkModelFactory才能創(chuàng)建,而不能直接創(chuàng)建。
???????BookmarkModel類管理者內(nèi)存中的書簽數(shù)據(jù),也向外提供了很多的操作接口,如AddNode、RemoveAndDeleteNode、RemoveNode等。用戶操作書簽時(shí),都會(huì)通過(guò)調(diào)用這些接口來(lái)修改書簽內(nèi)容。
???????在BookmarkModel中通過(guò)定義一個(gè)BookmarkStorage的對(duì)象來(lái)操作書簽的磁盤讀寫,上面提到的文件加載就是通過(guò)這個(gè)對(duì)象來(lái)執(zhí)行的。另外,當(dāng)書簽數(shù)據(jù)與磁盤同步也在?? 這個(gè)里面完成,當(dāng)用戶修改了書簽內(nèi)容時(shí),會(huì)調(diào)用其中的ScheduleSave()函數(shù)寫回磁盤。
???????書簽磁盤讀寫的類圖如下:
?

? 圖4 書簽磁盤讀寫類圖
???????其中BookmarkLoadDetails是用來(lái)臨時(shí)存儲(chǔ)書簽數(shù)據(jù)的對(duì)象。

?????? BookmarkBarView類派生自BookmarkModelObserver,是observer模式中一個(gè)具體的觀察者。中完成書簽界面展示以及部分用戶操作。

?????? 另外,書簽欄內(nèi)部的子文件夾顯示也存在菜單欄的彈出,包括點(diǎn)擊文件夾及拖動(dòng)書簽節(jié)點(diǎn)至文件夾都會(huì)彈出。BookmarkBarView中定義了兩個(gè)菜單對(duì)書簽欄的子菜單進(jìn)行管理:
???????? BookmarkMenuController* bookmark_menu_;
???????? BookmarkMenuController* bookmark_drop_menu_;
???????其中bookmark_menu_用于管理用戶點(diǎn)擊BookmarkBarView中的文件夾時(shí)彈出的菜單(BookmarkBarView是MenuButtonListener的子類,可以收聽到這個(gè)事件)。bookmark_drop_menu_是用戶拖拽一個(gè)node到文件夾上時(shí)彈出的菜單。


?
圖5 書簽右鍵菜單實(shí)現(xiàn)類圖

???????Chromium中書簽最基本的操作有添加、刪除、修改等。同時(shí),用戶操作書簽的方式也有很多,如快捷鍵,主菜單,書簽右鍵菜單等。書簽操作的執(zhí)行順序基本如下。

?

圖6 書簽操作執(zhí)行順序


???????書簽的顯示實(shí)現(xiàn)
?????? 在chromium的代碼中,每次調(diào)用網(wǎng)頁(yè)時(shí)都會(huì)調(diào)用void Browser::UpdateBookmarkBarState(BookmarkBarStateChangeReason reason),用以判斷是否需要顯示書簽,書簽有三種狀態(tài),SHOW(顯示與地址欄不分離)、DETACHED(顯示與地址欄分離)、HIDDEN(不顯示)。
[cpp]?view plaincopy void?Browser::UpdateBookmarkBarState(BookmarkBarStateChangeReason?reason)?{?? ??BookmarkBar::State?state;?? ??//?The?bookmark?bar?is?hidden?in?fullscreen?mode,?unless?on?the?new?tab?page.?? ??if?(browser_defaults::bookmarks_enabled?&&?? ??????profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar)?&&?? ??????(!window_?||?!window_->IsFullscreen()))?{?? ????state?=?BookmarkBar::SHOW;?? ??}?else?{?? ????WebContents*?web_contents?=?chrome::GetActiveWebContents(this);?? ????BookmarkTabHelper*?bookmark_tab_helper?=?? ????????web_contents???BookmarkTabHelper::FromWebContents(web_contents)?:?NULL;?? ????if?(bookmark_tab_helper?&&?bookmark_tab_helper->ShouldShowBookmarkBar())?? ??????state?=?BookmarkBar::DETACHED;?? ????else?? ??????state?=?BookmarkBar::HIDDEN;?? ??}?? ?? ??//?Only?allow?the?bookmark?bar?to?be?shown?in?default?mode.?? ??if?(!search_model_->mode().is_default())?? ????state?=?BookmarkBar::HIDDEN;?? ?? ??if?(state?==?bookmark_bar_state_)?? ????return;?? ?? ??bookmark_bar_state_?=?state;?? ?? ??if?(!window_)?? ????return;??//?This?is?called?from?the?constructor?when?window_?is?NULL.?? ?? ??if?(reason?==?BOOKMARK_BAR_STATE_CHANGE_TAB_SWITCH)?{?? ????//?Don't?notify?BrowserWindow?on?a?tab?switch?as?at?the?time?this?is?invoked?? ????//?BrowserWindow?hasn't?yet?switched?tabs.?The?BrowserWindow?implementations?? ????//?end?up?querying?state?once?they?process?the?tab?switch.?? ????return;?? ??}?? ?? ??BookmarkBar::AnimateChangeType?animate_type?=?? ??????(reason?==?BOOKMARK_BAR_STATE_CHANGE_PREF_CHANGE)???? ??????BookmarkBar::ANIMATE_STATE_CHANGE?:?? ??????BookmarkBar::DONT_ANIMATE_STATE_CHANGE;?? ??window_->BookmarkBarStateChanged(animate_type);?? }??
?????? 在這個(gè)函數(shù)中最終會(huì)調(diào)用window_->BookmarkBarStateChanged(animate_type),其中會(huì)調(diào)用到BrowserView的實(shí)現(xiàn)中,再由其中的bookmark_bar_view_來(lái)統(tǒng)一接手管理界面的工作。

???????書簽欄中點(diǎn)擊打開網(wǎng)頁(yè)
???????當(dāng)從書簽欄中點(diǎn)擊打開網(wǎng)頁(yè)時(shí),先會(huì)調(diào)用void BookmarkBarView::ButtonPressed函數(shù),并在此函數(shù)中會(huì)調(diào)用page_navigator_->OpenURL(params);進(jìn)一步調(diào)用WebContentsImple相應(yīng)的方法來(lái)實(shí)現(xiàn)。

???????當(dāng)前頁(yè)直接添加書簽
???????將當(dāng)前頁(yè)添加到書簽則會(huì)調(diào)用void BookmarkCurrentPage(Browser* browser)(browser_commands.cc中的全局函數(shù)),再調(diào)用void BrowserView::ShowBookmarkBubble(const GURL& url, bool already_bookmarked)最終是在BookmarkBubbleView中完成。

六、書簽線程模型
???????在整個(gè)書簽?zāi)K中,除了文件讀取是在后臺(tái)File線程中完成外,其余操作均在主線程中執(zhí)行,線程執(zhí)行方法與整個(gè)chromium的線程模型保持一致。
???????為了保證書簽文件在加載是不出現(xiàn)線程安全問(wèn)題,chromium中設(shè)計(jì)了一個(gè)BookmarkStorage的中間層來(lái)讀寫書簽文件,并在BookmarkStorage中定義了一個(gè)BookmarkLoadDetails,通過(guò)操作它來(lái)加載書簽文件中的詳細(xì)信息。加載完成后回調(diào)到主線程,并把所有權(quán)交還給BookmarkModel。但BookmarkModel中沒(méi)有對(duì)BookmarkLoadDetails的引用,不能直接操作其中的內(nèi)容,這樣就確保解決了線程可能帶來(lái)的問(wèn)題。

七、登陸后書簽同步
???????用戶登陸成功后,數(shù)據(jù)同步中心會(huì)對(duì)相關(guān)數(shù)據(jù)進(jìn)行同步,書簽也包括在內(nèi)。在Chromium中會(huì)由browser_sync同步中心統(tǒng)一管理用戶同步相關(guān)操作。BookmarkModelAssociator負(fù)責(zé)實(shí)現(xiàn)bookmark model 和sync model之間的聯(lián)系算法、為sync node 及bookmark node之間的相互獲取提供方法。同步完成后最終會(huì)調(diào)用BookmarkModel的相關(guān)方法來(lái)實(shí)現(xiàn)書簽的更新。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉