chrome在win7及之后系统添加jumplist功能。jumplist即系统任务栏相关的功能,包括任务栏图标、鼠标放置后视图、进度条、右键菜单等等。
路径:..\chromium\src\chrome\browser\win\jumplist.h
..\chromium\src\chrome\browser\win\jumplist.cpp
主要函数:
explicit JumpList(Profile* profile); // 显示构造函数
~JumpList() override; // 重写(父类的)析构函数
// TopSites 常去网站???
void TopSitesLoaded(history::TopSites* top_sites) override; // 重写topsites ???
void TopSitesChanged(history::TopSites* top_sites, ChangeReason change_reason) override; // 修改topsites
// tabrestore 用于最近常去网站的恢复???
void TabRestoreServiceChanged(sessions::TabRestoreService* service) override; // ???
void TabRestoreServiceDestoryed(session::TabRestoreService* service) override;
void InitializeTimerForUpdate(); // 一个一次性的初始化jumplist的函数。如果队列已有则清除后发送一个新的请求。
void ProcessNotifications(); // 进程更新通知。
void ProcessTopSitesNotification(); // topsites服务通知
void ProcessTabRestoreServiceNotification(); // tabrestore服务通知
void OnMostVisitedURLsAvailable(const history::MostVisitedURLList& data); // 回调,最常去网站的URL
// ShellLinkItem ???
bool AddTab(const sessions::TabRestoreService::Tab& tab, size_t max_items);
// 添加一个新的ShellLinkItem,用于标签的跳转列表数据
// 所以不会超过maxitems。
void AddWindow(const sessions::TabRestoreService::Window& window, size_t max_items);
// 在窗口的每个选项卡中添加一个新的ShellLinkItem到JumpList数据
// 如果这样做不会超过maxitems。
void StartLoadingFavicon(); // 加载网站图标
void OnFaviconDataAvailable(const favicon_base::FaviconImageResult& image_result); // 回调,当加载一个网站图标时用于历史服务
void PostRunUpdate(); // 发送更新和删除jumplist的相关文件夹的命令
void OnRunUpdateCompletion(std::unique_ptr<UpdateTransaction> update_transaction); // 回调,合并更新操作结果,并返回实例
void CancelPendingUpdate(); // 结束一个未执行的更新
void Terminate(); // 终止函数
static void RunUpdateJumpList(...); // 更新jumplist 1.创建新的jumplist没有图标,2.通知操作系统,3.删除过时图标
static void CreateNewJumpListAndNotifyOS(...); // 创建jumplist
static int CreateIconFiles(...); // 创建图标文件
static void DeleteIconFiles(...); // 删除图标文件
jumplist开发的主要cc文件集中在 jumplist.cc及jumplist_updater.cc文件。涉及jumplist类,JumpListUpdater类,及IShellList类。
大概逻辑及用到的主要函数:
1. 执行jumplist.cc中 jumplist()构造。构造中包括注册jumplist等等系列操作
2. 执行jumplist.cc中 create...()函数。用于create icon,url,command等等。
3. 执行jumplist.cc中,UpdateTaskCategory()函数。该函数用于更新tasks栏的相关数据(tasks开发时主要修改该函数)。
4. 执行jumplist_updater.cc中,AddShellLink()函数。该函数主要调用COM IShellList接口,实现jumplist,核心。
5. 执行jumplist.cc中,ShutDown()函数。该函数调用Terminate()执行退出操作。
其中,tasks列的缓存可能由系统保存
通过代码刷新缓存的方式:
屏蔽 jumplist.cc文件中删除判断:
1. begin_update_timer.Elapsed() >= kTimeOutForBeginUpdate
2. add_custom_category_timer.Elapsed() >= kTimeOutForAddCustomCategory
3. !jumplist_updater.AddCustomCategory(
l10n_util::GetStringUTF16(IDS_RECENTLY_CLOSED), recently_closed_pages, kRecentlyClosedItems))
防止该三处直接return,导致jumplist更新tasks栏不生效
之后,反复对jumplist右键点击 新建窗口、浏览器等按钮,然后关闭重复按钮,可以激活对jumplist的刷新。