Page对象是webkit的核心对象之一,顾名思义,Page数据结构就是描述览器上我们打开的一个页面,这样一个页面包括很多部分,比如菜单控制,拖拽控制,页面显示,以及一些参数设置等。所以webkit中的Page对象里面也对应很多这样相关的对象,下面是一张表示这些对象关系的类图。

从上图中可以看出,Page里面主要是一些对象的组合,Page自身的代码并不是很多,里面的对象根据名字大概能够猜出个一二,下面主要讲一下两个比较重要的对象.

1. Frame

Frame应该是webcore里面最重要的一个核心对象,从page的角度上来看,页面就是有众多的Frame构成,当然,一定会有一个主Frame,Page中持有的这个Frame就是主Frame,也就是RootFrame,这个对象比较复杂,后面我会单独拿出来分析。

2. chrome

chrome是与显示相关的一个对象,比如刷新页面窗口,滚动窗口等,就会用到chrome中的接口,chrome也是连接webcore与webkit(指webkit的port部分)的核心对象。下面是一个关于chrome的类图

大家看到,chrome是继承自HostWindow,就是表示一个宿主窗口,这里贴出HostWindow的代码

[cpp] view plaincopy
  1. class HostWindow : public Noncopyable {
  2. public:
  3. virtual ~HostWindow() { }
  4. // Requests the host invalidate the window, not the contents.  If immediate is true do so synchronously, otherwise async.
  5. virtual void invalidateWindow(const IntRect& updateRect, bool immediate) = 0;
  6. // Requests the host invalidate the contents and the window.  If immediate is true do so synchronously, otherwise async.
  7. virtual void invalidateContentsAndWindow(const IntRect& updateRect, bool immediate) = 0;
  8. // Requests the host scroll backingstore by the specified delta, rect to scroll, and clip rect.
  9. virtual void scroll(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) = 0;
  10. // Requests the host invalidate the contents, not the window.  This is the slow path for scrolling.
  11. virtual void invalidateContentsForSlowScroll(const IntRect& updateRect, bool immediate) = 0;
  12. #if ENABLE(TILED_BACKING_STORE)
  13. // Requests the host to do the actual scrolling. This is only used in combination with a tiled backing store.
  14. virtual void delegatedScrollRequested(const IntSize& scrollDelta) = 0;
  15. #endif
  16. // Methods for doing coordinate conversions to and from screen coordinates.
  17. virtual IntPoint screenToWindow(const IntPoint&) const = 0;
  18. virtual IntRect windowToScreen(const IntRect&) const = 0;
  19. // Method for retrieving the native client of the page.
  20. virtual PlatformPageClient platformPageClient() const = 0;
  21. // To notify WebKit of scrollbar mode changes.
  22. virtual void scrollbarsModeDidChange() const = 0;
  23. // Request that the cursor change.
  24. virtual void setCursor(const Cursor&) = 0;
  25. };

chrome中有一个ChromeClient,这个chromeClient都是由客户实现,这样webcore就能够和外面交互

附chrome代码

[cpp:collapse] + expand sourceview plaincopy

其实chrome的大部分功能都是委托给chromeclient实现。

chrome中有一个接口名如下:

Page* Chrome::createWindow(Frame* frame, const FrameLoadRequest& request, const WindowFeatures& features, const NavigationAction& action) ;

其实就是创建一个新的窗口,那么在什么时候会用到此接口,比如打开一个新的标签页,这时候就需要创建一个新的窗口,所以,从这个角度来说,chromeclient就是为webcore里需要显示的内容提供一个场所,对需要涉及到的显示操作,提供一种实现。

WebChromeClient提供一种ChromeClient的实现,而实际的窗口相关的操作,都会定义在webview里面,所以不同的平台应该有不同WebView的实现。

WebKit Page对象的分析相关推荐

  1. WebKit Frame对象分析

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

  2. WebKit 内核源码分析 (三) Page

    浏览器的请求一般是以页面请求为单位,当用户通过网址栏输入一个url,浏览器就开始一个页面请求.而一个页面请求可能包含有一到多个页面子帧,以及图片.CSS和插件等派生子资源.Page类就是用来对应这样的 ...

  3. WebKit 内核源码分析 (二) FrameLoader

    FrameLoader类负责一个Frame的加载,在Frame的流程中起到非常重要的重要,同很多组件都有交互,本文将分析FrameLoader类的代码. 1. 概述 顾名思义,FrameLoader是 ...

  4. 6.Page对象详解

    序 就好像用户看到的都是由dom表现出来的,所有的业务处理都是在Page对象中处理的.如果业务越简单,创建的Page对象数量就会越少:如果业务越复杂,那么相对而言Page对象数量就越多(或Page实例 ...

  5. Puppeteer调用page对象evaluate方法产生的Execution context was destroyed错误处理

    Execution context was destroyed产生的场景 在NodeJs中使用Puppeteer中Page对象的evaluate方法执行脚本,深入使用后一定遇到过Error: Exec ...

  6. asp.net中page对象生命周期和各事件执行顺序

    asp.net页面事件执行顺序: 一.初始化部分: 1.构造函数:创建page类的一个实例,初始化page类的属性. 2.AddParsedSubObject函数: protected virture ...

  7. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  8. python类属性和实例属性_Python 类属性与实例属性,类对象与实例对象用法分析...

    本文实例讲述了Python 类属性与实例属性,类对象与实例对象用法.分享给大家供大家参考,具体如下: demo.py(类属性,所有实例对象共用类属性): # 定义工具类 继承object是为了兼容py ...

  9. [翻译]-马丁·福勒-page对象

    译者注:这篇文章翻译自马丁·福勒(Martin Flower,对,没错,就是软件教父)官网的一篇文章,原文出处在文底.如果你正在做WEB自动化测试,那么我强烈推荐你看这篇文章.另外透露Martin F ...

最新文章

  1. C++编译器Qt Creator下载地址
  2. 蓝桥杯 k倍区间 前缀和
  3. Stomp-Spring服务器端的Web套接字Java客户端
  4. TensorFlow 常见API
  5. python实战——发邮件
  6. Android实现按钮点击效果(第一次点击变色,第二次恢复)
  7. 解决phpcms模版设置中不能显示栏目首页模板,栏目列表页模板,内容页模板等下拉菜单选项的问题!...
  8. fread 单独测试没有问题 在正式项目里面丢数据 可能是系统资源不足 预读出了问题
  9. db_index,unique和primary区别
  10. 深度学习:Seq2seq模型
  11. 数学建模美赛E题数据获取
  12. UWB与蓝牙AOA定位技术简要对比
  13. Hcse 交换知识点-1
  14. Ubuntu下载ROMS源码
  15. 分享国内外好用的H5页面制作网站
  16. K8S异常之Unable to update cni config err=no vaild network found in /etc/cni/net.d
  17. Windows Mobile与symbian智能手机系统的比较
  18. c++ 一个学习小组有5个人,每个人有三门课(高数、英语和C语言)的考试成绩,求每人的平均成绩。按行输出每个学生的各科成绩及平均成绩。
  19. 推荐一个支付系统技术大全的博主--凤凰牌老熊
  20. STM32CubeIDE下载安装

热门文章

  1. 68)deque数组
  2. FFmpeg编译找不到库文件
  3. 关于数据库的备份和某个表的数据备份的相关步骤介绍
  4. Android判断一个Service是否运行
  5. LVS入门篇(二)之LVS基础
  6. Python操作Excel表格
  7. eclipse error pages打红X的解决方法
  8. PHP学习记录之会话处理(二)
  9. android 布局之scrollview
  10. ie8下showmodaldialog页面回传会打开新页面的问题