Webkit之Frame

2024-05-03 07:19:18

1. Frame介绍

Frame应该是整个webcore里面最核心的对象之一,按地瓜的分析,Frame采用的是类似facade的模式设计,

前面在讲Page对象的文章中,也提到过,从Page的角度来看,其实一个Page就是由一个或者多个Frame构成,而这些Frame是以树状的关系组织,我们来看一段HTML代码。

<html> <body> hello, everyone! <iframe src="..."/> <iframe src ="..."/> </body></html>

在以上的html代码中,一个Page里面就会有三个Frame,首先任何一个Page都会至少对应一个Frame,也就是rootFrame,这个Frame不对应iframe节点(Frame中的m_ownerElement对象为空),也是frame树的根节点,还有两个iframe标签对应两个Frame,如果在iframe的属性src里面指定的页面中还含有iframe标签的话,那么也会对应一个frame(一个iframe标签对应一个frame),这样frame之间就形成了父子关系。

2. UML

下面是Frame的成员变量部分代码:

HashSet<FrameDestructionObserver*> m_destructionObservers; Page* m_page; mutable FrameTree m_treeNode; //树节点 mutable FrameLoader m_loader; //frameLoader mutable NavigationScheduler m_navigationScheduler; mutable RefPtr<DOMWindow> m_domWindow; HashSet<DOMWindow*> m_liveFormerWindows; HTMLFrameOwnerElement* m_ownerElement; RefPtr<FrameView> m_view; RefPtr<Document> m_doc; ScriptController m_script; mutable Editor m_editor; mutable SelectionController m_selectionController; mutable EventHandler m_eventHandler; mutable AnimationController m_animationController; Timer<Frame> m_lifeSupportTimer; float m_pageZoomFactor; float m_textZoomFactor; float m_pageScaleFactor;#if ENABLE(ORIENTATION_EVENTS) int m_orientation;#endif bool m_inViewSourceMode; bool m_isDisconnected; bool m_excludeFromTextSearch;UML图如下:

(1). Page

Page参看webkit之Page;

(2). EventHander

事件处理者,我们在网页上(确切的说是在一个frame上)点击一个按钮,或者移动鼠标,首先底层会将该事件截获然后报给WebView(Page专题中有提到),然后通过Page找到RootFrame,将该事件交给RootFrame的EventHandler,RootFrame的EventHandler如果发现其所在Frame有subFrame,会交给subFrame的EventHandler来处理,如果处理成功就返回,否则自己继续处理。

(3). FrameView

FrameViwe类用于Frame的排版.

FrameView对应着一个Frame的显示,这个数据结构也是与render引擎连接的纽带,该结构里面有一个非常重要的接口,叫layout, 接口里面的内容就是render dom树的过程。也有一个非常重要的数据成员 RenderObject* mlayoutRootObject;表示render树的根节点.

在32平台FrameView是继承自ScrollableView

(4). ScriptController

脚本相关操作的入口,我们知道,一个页面可以执行很多js函数,这个结构就是与js脚本相关的一个对象。

(5). Document

表示一个文档,一个html页面解析完成,会形成一个dom树(相关的知识请看dom规范),该结构就是表示html页面解析完成后的结构,每个标签都会在document上对应一个节点,这也是非常核心的一个数据结构,从MVC的角度来看,应该是M部分。

(6). DOMWindow

DOMWindow用来管理同DOM相关的事件、属性和消息。在bom规范中,js可以访问一个对象,window(bom规范定义了一系列的标准接口),通过该window的接口,js用户可以动态的控制页面的内容,DOMWindow就是表示那个window接口的实现.

(7). FrameLoader

页面加载器,与页面相关的加载都由其负责,里面又包含了很多其他的对象,这也是非常重要的一个对象,后面会专门讨论。

(8). HTMLFrameOwnerElement

element, 对应HTML中的元素,

(9). FrameTree

FrameTree对象用来协助管理父帧和子帧的关系,常见的比如main frame之中有iframe元素,就会调用FrameLoaderClient::createFrame来产生子帧,产生的子帧会通过appendChild添加到主帧的树状结构中。Frame通过FrameTree对象,可以方便地访问它的父帧,子帧,兄弟帧。

(10). NavigationScheduler

NavigationScheduler对象用来管理页面跳转调度(比如重定向,meta refresh等)。

(11). Editor

Editor对象用来处理页面的编辑相关的操作,比如拷贝,粘贴,输入等,Editor对象,它同Page类的EditorClient对象紧密合作。和EditorClient的关系就如同Page同Frame的关系。

(12). SelectionController

用来管理Frame中的选取操作.

(13). AnimationControlle

动画控制,控制动画的播放,暂停,继续(同HTML video标签是否有关系?)

3. 接口介绍

(1). create

static Pa***efPtr<Frame> create(Page*,HTMLFrameOwnerElement*,FrameLoaderClient*)

描述: 调用Frame构造函数,创建出Frame对象。有两个地方会创建Frame对象,一是要加载一个新的页面请求,这个时候会创建main frame,一是在加载子帧的时候,通过FrameLoaderClientQt的createFrame接口,创建子帧对应的Frame对象,在第一种情况中,HTMLFrameOwnerElement参数为NULL,第二种情况传子帧的父元素。在一个tab页内,main frame会重用。

(2). createView

void createView(const IntSize&, const Color&, bool, const IntSize&, bool,

ScrollbarMode = ScrollbarAuto, bool horizontalLock = false,

ScrollbarMode = ScrollbarAuto, bool verticalLock = false)

描述:创建出FrameView对象,以用于之后的排版。应用调用这个函数的时候需要传入同排版有关的一些信息,如初始视窗大小,背景色,滚动条模式等。创建出FrameView以后,即调用Frame::setView设置成当前的FrameView.

(3). setDocument

void setDocument(Pa***efPtr<Document>)

描述:设置同Frame关联的Document对象(一般是DocumentWriter创建的)。

(4). init

void Frame::init

描述:Frame对象初始化,会调用FrameLoader::init初始化FrameLoader对象。

(5). setPageAndTextZoomFactors

void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor)

描述:设置页面放大因子和文字放大因子。在网页缩放或者改变网页字体大小的时候调用。

4. 调用堆栈

品略图书馆 http://www.pinlue.com/

转载于:https://blog.51cto.com/14325182/2409935

Webkit之Frame相关推荐

  1. 用vb编写websocket客户端示例(每秒百万弹幕吞吐量)

    <websocket协议详解>教程分三篇: 什么是websocket websocket协议规范 用vb编写websocket客户端示例(每秒百万弹幕吞吐量) ​​​​​​​文章上方有详细 ...

  2. Spring Security中文文档

    Spring Security中文文档 来源:https://www.springcloud.cc/spring-security.html#overall-architecture 作者 Ben A ...

  3. WebKit Frame对象分析

    Frame应该是整个webcore里面最核心的对象之一,前面在讲Page对象的文章中,也提到过,从Page的角度来看,其实一个Page就是由一个或者多个Frame构成,而这些Frame是以树状的关系组 ...

  4. WebKit 内核源码分析 (一) Frame

    在分析内核的时候,Frame是首当其冲的一个类,本文将分析Frame类的代码. 1.    描述 Frame类是WebCore内核同应用之间联系的一个重要的类.它有点像设计模式中的Façade,将内核 ...

  5. WebKit、Gecko使用图形库

    2008年11月30日 星期日 上午 01:20 阅读了之后,觉得作为浏览器内核WebKit.Gecko,为了能高效美观的显示页面的内容,选择适当的图形库非常重要.如果图形库选择不当,往往会导致页面上 ...

  6. Frame Buster Buster ......需要buster代码

    假设您不希望其他网站在<iframe> "构建"您的网站: <iframe src="http://example.org"></ ...

  7. 爬虫采集-基于webkit核心的客户端Ghost.py [爬虫实例]

    对与要时不时要抓取页面的我们来说,是痛苦的~ 由于目前的Web开发中AJAX.Javascript.CSS的大量使用,一些网站上的重要数据是由Ajax或Javascript动态生成的,并不能直接通过解 ...

  8. WebKit和Chrome源码分析

    WebKit内核源代码分析 http://blog.sina.com.cn/s/blog_53220cef0100ta1i.html 摘要:本系列通过分析WebKit的源代码,试图分析WebKit的内 ...

  9. [Qt教程] 第40篇 网络(十)WebKit初识

    [Qt教程] 第40篇 网络(十)WebKit初识 楼主  发表于 2013-9-11 17:26:05 | 查看: 521| 回复: 10 WebKit初识 版权声明 该文章原创于作者yafeili ...

最新文章

  1. Gerrit代码Review入门实战
  2. 一份其实很短的 LaTeX 入门文档
  3. Java常用类之要点总结
  4. PHP分页的limit与offset
  5. Seize Operation Master
  6. gitlab 汉化后502
  7. OSCache操作详解+标签使用
  8. 排序 --- 6.2 Merge Two Sorted Lists || 6.3 Merge k Sorted Lists --- 图解
  9. angular环境配置
  10. Atitit 嵌入式tomcat 嵌入式服务器 attilax 你感觉艾提拉 总结 比起嵌入jetty ,文件可以自动刷新貌似还不错。。方便调试debug package com.attilax.
  11. maya mel uf8_对于学习MAYA MEL必须收藏的一篇文章
  12. 线性系列DC-DC转换器工作原理
  13. imagej得到灰度图数据_教你用免费软件Image J对WB结果进行灰度分析!
  14. 接近开关NPN和PNP区别
  15. 图扑软件 | 数字孪生智慧选煤厂
  16. mysql translate 函数_Oracle字符串函数-Translate()总结
  17. 企鹅号不更新会封_我们如何为企鹅基金会筹集60,000美元
  18. 300行python代码从零开始构建基于知识图谱的电影问答系统4-用户问题预处理
  19. ​你在淘宝剁手,钱却可能进入黑客的口袋
  20. StyleGAN 调整面部表情,让虚拟人脸更生动

热门文章

  1. 不错的网络协议栈測试工具 — Packetdrill
  2. 在Linux下查看系统版本信息命令总结
  3. Android:手把手教你打造可缩放移动的ImageView(下)
  4. LVS-DR,real-server为windows 2008的配置
  5. [转]影响Cache的几个HTTP头信息
  6. java lampo整车,lampo
  7. 海康威视:工程项目不是我们的目标,对创新业务发展充满信心...
  8. 阅读笔记《梦断代码》其二
  9. 最简单企业证书部署应用!In-House改进版!免HTTPS!
  10. 服务器端可控情形的Javascript跨域访问解决方法