首页 > 编程知识 正文

ie内核和webkit内核,浏览器内核源码

时间:2023-05-04 04:45:00 阅读:178534 作者:3450

WebKit内核源代码分析(三)哈密瓜(tomorrow.cyz@gmail.com) )。

摘要:浏览器请求通常以页面请求为单位,当用户从web地址栏输入url时,浏览器会启动页面请求。 页面请求可能包含一个或多个页面子帧以及派生的子资源,如图像、CSS和插件。 Page类用于满足此类页面请求。 Page类是WebKit中非常重要的类,它类似于内核的对外聚合器。

关键字:WebKit内核源代码、WebCore、Page、Frame和WebKit体系结构

1 .概要浏览器的请求一般是页面请求单元,当用户从网站栏输入url时,浏览器会启动页面请求。 页面请求可能包含一个或多个页面子帧以及派生的子资源,如图像、CSS和插件。 Page类用于满足此类页面请求。 这些用户参与的大多数操作都与Page有关,包括前进、导航、编辑、右键单击菜单、设置和Inspector。 标记语言的分析、合成和加载经常与Frame相关。

让我们看一下Qt移植中Page类和APP应用程序之间的关系。

QWebPage通过QWebPagePrivate维护指向Page类的指针,并使用QWebPagePrivate的构造函数实例化Page对象。 QWebPage类通过随后的createMainFrame调用实例化QwebFrameData,QwebFrameData的构造函数以Page指针为参数调用Frame:create

Page类通过组合其他类实现许多功能,Page类本身没有多少代码。

2.1类关系2.1 PageGroup PageGroup不是用于管理Page的,而是旨在将具有共同属性或设置的Page分组在一起,以便于管理这些属性。 目前,这些属性包括localStorage属性、索引db、用户脚本和用户样式表。 与PageGroup相关的最常见的操作是保持对addVisitedLink等接口的访问。 如果简单地理解,在WebKit内核上放置多个APP (浏览器是一个APP )的话,一个APP很有可能独立成为一个PageGroup。 这里与多标签无关。 多标签页属于同一个页面组。 红薯在mailing group上咨询过这个问题。 一位RIM的同学给我举了个例子。 例如基于WebKit的邮件程序。 另一方面,他可能会调用基于WebKit的浏览器来显示网页。 另外,他自己也是基于WebKit的。

示一些邮件,这两个之间的setting有很大可能不一样,他们就使用不同的PageGroup。

PageGroup中有这个Group已经安装并且使用的User Script和User StyleSheet的集合,一般在网页解析完毕后,这些User Script和User StyleSheet会插入到Document中。

PageGroup中还维护了Local Storage和Index DB相关的设置,比如它们的Path,上限等,通过GroupSettings类实现。

PageGroup创建以后,每次创建一个新的Page对象,会通过addPage接口加入到这个PageGroup的m_pages中。

每次有导航行为发生的时候,会调用addVisitedLink来将url加入到已访问链接中。如果浏览器要跟踪已访问的接口,则在初始化的时候必须调用PageGroup::setShouldTrackVisitedLinks,且参数为true。此处shouldTrackVisitedLinks是一个静态的全局变量,也就是说,所有应用维护一样的行为(一个应用将其设置为false会影响到其它同样基于此核的应用)?

Page类中维护了PageGroup的指针,并提供了group接口,这是个lazy接口,如果m_group不存在,会调用InitGroup来创建一个。对于Page类来说,如果没有设置GroupName,则在初始化的时候会生成一个空GroupName的PageGroup,由m_singlePageGroup维护,并把指针赋给m_group,如果以非空的名字调用了setGroupName,则会重新创建PageGroup,此时这个PageGroup由m_group来维护。

2.2  Setting

WebCore中的设置相关的类,浏览器应用的不少配置、选项同该类相关,Qt移植中,应用在创建Page对象后,会根据Page::settings来实例化QwebSetting。

2.3  Chrome

原生窗口接口类,参考地瓜写的”WebKit中的Chrome和ChromeClient”。

2.4  其它

SelectionController :负责管理Page中的选取操作,绝大部分选取操作是基于Frame的,只在Frame的Selection为空的时候,对焦点游标的绘制工作才会使用到Page类的SelectionController。

SharedGraphicsContext3D:共享3D图形上下文,为了优化2D显示而加入。在加速的2D canvas中,引入的DrawingBuffer的概念,SharedGraphicsContext3D提供了createDrawingBuffer来创建DrawingBuffer。

DragController:拖拽控制器。Chrome的超级拖拽功能同这个有关?地瓜会在以后对此进行求证。

FocusController:焦点控制器。考虑到焦点会在各个frame之间切换,所以由Page类维护焦点控制器最合适不过。

ContextMenuController:右键下拉菜单控制器。

InspectorController:Inspector控制器,浏览器中的很多开发工具都同这个类相关。

GeolocationController:定位定位服务控制器。

DeviceMotionController:设备移动控制器

DeviceOrientationController:设备方向控制器

SpeechInputClient:语音输入Client。

ProgressTracker:进度跟踪。

BackForwardController:前进后退操作控制。

Frame:一个Page由至少一个主帧和若干个其它子帧构成。

HistoryItem:历史记录。

PluginData:插件相关,未来可能同PluginDatabase类合并。主要是初始化Plugin的信息。

PluginHalter:用来控制Plugin的停止和重新开始。

RenderTheme:这个类提供了控件的渲染和绘制接口。Qt移植中,RenderThemeQt是RenderTheme接口的具体实现。

EditorClient:同编辑功能相关,比如拷贝、剪切、删除等操作。

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。