WebKit 代码阅读笔记 (二) 理解Chrome

WebKit 代码阅读笔记(一) 理解WebKit Port


Image

http://www.webkit.org/blog/101/back-to-basics/

WebKit begins where the chrome ends.


Chrome在WebCore中代表了外围的窗口环境,它是WebCore跟窗口环境进行整合的一个重要桥梁,Port需要实现的一个最重要的回调接口就是ChromeClient,而Chrome会把相应的调用转发给ChromeClient由Port来处理,一般而言Chrome处理如下事件或者提供如下服务:

  1. 用于接收页面刷新事件的回调,页面刷新可能是JS触发的,也可能是输入事件触发的,
  2. 用于接收页面滚动事件的回调,滚动通常是由于页面处理输入事件引发的
  3. 窗口到屏幕之间的坐标换算
  4. 当前光标形状的设置
  5. 提供窗口的大小,页面显示的ViewPort的大小
  6. 提供页面缩放系数
  7. 响应页面焦点元素的变化事件
  8. 响应页面要求打开新窗口的请求(在新窗口中打开新的页面)
  9. 响应要求窗口以模态方式运行
  10. 响应要求窗口关闭
  11. 响应对工具栏,状态栏,菜单栏的显示和隐藏
  12. 响应弹出消息提示对话框的请求(比如JS的alert)
  13. 响应鼠标悬停在某页面元素的事件
  14. 响应显示提示信息(ToolTip)的请求
  15. 响应页面打印的请求
  16. 响应页面要求获得当前地理信息的请求(未来会移到GeolocationClient处理)
  17. 响应打开文件对话框选择文件的请求
  18. 响应要求全屏播放视频的请求
  19. 响应页面要求显示通知窗口的请求(Notification)
  20. 响应页面为多选框(ComboBox)创建下拉选项窗口的请求
  21. 响应页面要求显示上下文菜单的请求

下面以在QtWebKit中如何处理滚动为例,来说明Chrome的作用:

  1. 首先滚轮事件(WheelEvent)或者鼠标在滚动条上面的点击事件(MouseEvent)会被QWebView(Qt Port对Page提供的一个Widget的封装)获得;
  2. 事件会转发给页面的事件处理器(EventHandler,每个Frame自带一个)
  3. 事件处理器经过处理后确认滚轮事件(或者在滚动条上的点击事件)会引发一个滚动事件
  4. 然后滚动事件通过层层转发后经由Chrome转发给ChromeClientQt处理
  5. ChromeClientQt实际上最后调用QWebView的scroll方法来真正滚动UI组件
  6. QWebView的scroll会引发页面重绘,然后我们最后就看到页面内容的滚动

整个过程让人觉得有点兜圈子的感觉,为什么QWebView不直接自己处理滚动,然后重绘页面呢,我想是WebKit本身希望在自己内部可以处理尽可能多的事情,这样对外部窗口环境的依赖性就可以降到最低,外部的窗口环境只需要依照WebKit本身的指示在适当时候将内部的状态反映(同步)出来即可。


更多:

QtWebKit Visual Studio 2008 编译和调试环境建立指南

https://rogeryi.wordpress.com/2011/06/08/qtwebkit-visual-studio-2008-compile-debug-env-setup-guide/

Chrome的编译:https://rogeryi.wordpress.com/2011/03/29/chrome-webkit-build-on-windows/

WebKit资源收集 https://rogeryi.wordpress.com/2011/03/28/webkit-resources/

Advertisements