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实现:
关闭时序图关闭当前标签后,切换到下一个标签(如果是最后一个标签,切换到上一个标签);如果关闭的标签是唯一的标签,关闭主窗口。
网友评论