chrome浏览器源码刨析

chrome中content_shell工程改造成多标签浏览器

2021-04-12  本文已影响0人  chrome知识店铺

content_shell工程是基于Chromium里面的content api封装了一个简单的UI的简易浏览器。

1、将任务拆分成四个子功能

1) 添加标签栏

2) 新开网页在当前窗口展示

3) 切换标签

4) 关闭标签

2 功能实现

2.1 添加标签栏

content shell的UI是通过ShellWindowDelegateView类来绘制的,实现了工具栏和网页展示区域的绘制。

新增Tab和TabbarView两个类来实现标签和标签栏。设计到的主要类图如下:

TabbarView的成员变量web_view_list_的作用是存储创建的的WebView对象。

TabbarController和TabController是两个抽象类,TabController负责管理标签栏中的单个标签,TabbarController负责管理标签栏,主要处理标签的单击和关闭功能。

2.2新开网页在当前窗口展示

点击网页链接时,原生content shell的处理逻辑是创建新的Shell对象,通过其成员变量window_widget_创建新的窗口展示网页,相关代码如下:

AddNewContents函数是对WebContentsDelegate类函数的重写,其它对象实现WebContentsDelegate接口可以获得WebContents中的更改的通知并提供对应的功能,使用WebContents的接口函数SetDelegate(WebContentsDelegate*

delegate)来绑定接收消息的对象。

根据window_widget_是否为空来判断如实展示新开的网页,代码如下:

原生的content_shell工程的设计是一个Shell对象管理一个WebContents对象,本任务中需要改为一个Shell对象管理多个WebContents对象,在Shell类中web_contents_list_成员变量负责管理。

ShellContent继承自content::WebContentsObserver这个抽象类,重写了TitleWasSet(NavigationEntry*

entry)方法,作用是获取到网页标题之后,调用相关的函数设置标签标题和窗口标题。

2.3切换标签

Tab的鼠标点击事件逻辑通过重写View::OnMousePressed函数实现:

时序图


2.4关闭标签

点击关闭按钮或者双击标签都可以关闭当前标签。Tab的双击双击事件逻辑通过重写View::OnMousePressed函数实现,关闭按钮的点击事件逻辑通过重写ButtonListener::ButtonPressed实现:

关闭时序图

关闭当前标签后,切换到下一个标签(如果是最后一个标签,切换到上一个标签);如果关闭的标签是唯一的标签,关闭主窗口。

上一篇 下一篇

猜你喜欢

热点阅读