分别对应不同的Port 移植方式,在每一个目录下面 都包括WebCoreSupport 目录,而在不同的WebCoreSupport目录下分别包含有对类接口 WebCore::ChromeClient 、WebCore::ContextMenuClient 、WebCore::DragClient 、WebCore::EditorClient 、
WebCore::FrameLoaderClient 、WebCore::InspectorClient 等的实现,它们代表外部程序提供给WebKit 内部使用的接口实现,其中WebCore::ChromeClient、WebCore::FrameLoaderClient非常重要。
初步了解其接口定义能基本了解其对应的含义,这些接口往往需要由Port 移植部分来提供实现,往往由WebKit内部根据一定的条件来调用。
4.2.2 连接模块loader
对于WebCore中page/loader等类提供对应port实现的支持如EVentHandlerWin.cpp 、
FrameLoaderWin.cpp 、DocumentLoaderWin.cpp、DocumentLoaderWin.cpp、WidgetWin.cpp、KeyEventWin.cpp等.Loader 是在WebKit 里面一个很重要的连接器,通过loader 发起IO下载网页,再通过loader发起解析,已经最后的渲染功能。
4.2.3 显示模块WebView和WebFrame
WebView 及WebFrame 主要功能是方便外部程序嵌入WebKit不同的Port 移植对WebView 及WebFrame的定义及实现有所不同,但其与WebCore中的Page、Frame 之间的关系图描述相一致。具体关于WebView、WebFrame的定义与实现,特别是初始化时的动作可根据不同的Port 移植而有所不同,同时初始化时会将上面提到的WebCorePort 接口实现告诉WebKit内部
4.2.4 Android中对Port移植方面的实现
Android实现有点特殊,由于Andriod 将WebKit 以一个Java 类接口的方式提供给Java 环境使用(不像Chrome、Safari 等都是将WebKit 以 一个C++动态或静态库的方式供C/C++外部程序调用),这样WebKit 内部与外部即JavaVM 的交互(如上面提到的ChromeClient、FrameLoaderClient 接口实现)需要一个Bridge 类来协调处理,同时WebView、WebFrame 接口绑定给JavaVM 的jni 接口实现也需要通过这个Bridge 来支持协调处理。具体可详细参考
android源码代码中WebCore\\platform\\android目录下的源文件。
4.2.5 小结
通过进一步了解WebCore Port 接口及其实现,可以加深这样一个认识。如果从MVC的角度来看整个基于WebKit的浏览器,WebKit 的Port 部分相当于V 部分,它提供显示页面内容及其辅助信息(如提示状态)的场所(即原生窗口)以及控制该显示场所的状态变化及消息响应(如改变大小、 鼠标移动等);而M 部分往往由WebCore来实现,至于WebCore如何组织DOM则往往由htmlparser部分根据DOM 定义来组织,如何在提 供的显示场所显示Web 内容则往往由WebCore 中的layout 部分来实现,其中充分利用了Css 定义来布局显示该显示的内容。一旦涉及控制或动态处理往往由Port 部分发起而由Javascript 脚本来实现处理,其任务由JavascriptCore或V8 (JS解析Core)来完成。
一般说来新打开一个页面,Port 部分需要提供一个主显示场所(即原生窗口),如果页面中含有iframe 标签,则需要在主显示场所内创建一个子显示场所,以显示iframe 标签对应src 的内容。如果页面中含有embed/object 等插件标签同样往往也需要在主显示场所内创建一个子显示场所(除非windowless),以交由插件实现在提供的显示场所中显示内容。特别需要说明的是我们通常看到的页面表单元素input textfield、textArea、button、radiobutton等往往不像window 图形库中的按钮、菜单、输入框等会对应一个原生窗口,页面中的表单元素在一个显示场所(即原生窗口)中完全是利用Css 等通过layout 方式来达到我们所看到的类似原生按钮、输入框、列表框、滚动条等效果,其中 特别是能准确定位元素大小、设置focus、光标显示、响应事件等,这充分的说明了浏览器引擎内部布局部分的威力所在。
从另外一个角度来看,一个页面一般说来(除非遇到iframe 或插件需要另外提供一块子画布)相当于一块画布,浏览器引擎能在其精确的位置绘制不同颜色的文字、图片、图标 等,同时根据当前的鼠标及一个模拟的输入提示光标位置,接收键盘输入操作。页面中的绝大多数元素与原生的窗口元素几乎没有关联,完全通过组合、布局、准确定位来处理一切。
5 WebKit的JavascriptCore介绍
在WebKit中其Javascript实现,同样相当于一个符合ECMAScript标准的动态库,其往往依附于浏览器引擎,由浏览器引擎来提供运行环境,并控制或发起javascript实现进行编译、
解析执行脚本、垃圾回收等,同样需提供对浏览器引擎扩展的支持如Dom Binding等;
5.1 JavaScriptCore实现特点
相对于其他的Javascript实现,JavaScriptCore提出了虚拟机的概念,在编译脚本时生成高效的bytecode,bytecode统一在一个虚拟机的环境中执行。而其高效的虚拟机实现常称为SquirrelFish,通过Announcing SquirrelFish、Introducing SquirrelFish Extreme可更进一步了解关于SquirrelFish的相关内容
5.2 JavaScriptCore目录的内容
1. assembler:jit编译中间码用到的汇编程序 2. bytecode:中间码相关的类和定义
3. 生成中间码的类实现,实际上是编译Node类
4 .interpreter:用来执行js的类,实际上就是执行CodeBlock 5. jit:执行jit汇编程序的类
6. parser:解析js用到的词法分析类,语法分析bison文件和Node类结构 7. runtime:是js的执行环境中自带的类
8. wtf:是WebCor和JavaScriptCore用到的基础类
5.3 JavaScriptCore与WebCore交互
在WebCore::Frame的数据结构中包含数据成员KJSProxy* m_jscript,而在Chrome的代码中调整为JSBridge* m_jscript;,具体不同Javascript实现如何实现与WebCore的接口,需了解不同Javascript实现逻辑,如对Javascript实现逻辑及基本原理感兴趣,可具体参考其提供的api及sample等。
6 WebKit For Android
Android平台的WebKit模块由Java层和WebKit库两个部分组成,Java层负责与Android应用程序进行通信,而WebKit类库负责实际的网页排版处理。Java层和C层库之间通过JNI和Bridge相互调用,如下图所示:
6.1 WebKit模块目录结构
Java层(根目录device\\java\\android\\android\\webkit)包含41个类:
1. BrowserFrame.java: BrowserFrame对象是对WebCore库中的Frame对象的Java层封装,用于创建WebCore中定义的Frame,及为该Frame对象提供Java层回调方法。
2. ByteArrayBuilder.java: ByteArrayBuilder辅助对象,用于byte块链表的处理。 3. CachLoader.java: URL Cache载入器对象,该对象实现StreadLoader抽象基类,用于通过CacheResult对象载入内容数据。
4. CacheManager.java: Cache管理对象,负责Java层Cache对象管理。
5. CacheSyncManager.java: Cache同步管理对象,负责同步RAM和FLASH之间的浏览器Cache数据。实际的物理数据操作在WebSyncManager对象中完成。
6. CallbackProxy.java: 该对象是用于处理WebCore与UI线程消息的代理类。当有Web事件产生时WebCore线程会调用该回调代理类,代理类会通过消息的方式通知UI线程,并且调用设置的客户对象的回调函数。
7. CellList.java: CellList定义图片集合中的Cell,管理Cell图片的绘制、状态改变以及索引。
8. CookieManager.java: 根据RFC2109规范,管理cookies。
9. CookieSyncManager.java: Cookies同步管理对象,该对象负责同步RAM和Flash之间的Cookies数据。实际的物理数据操作在基类WebSyncManager中完成。
10. DataLoader.java: 数据载入器对象,用于载入网页数据。 11. DateSorter.java: 尚未使用。
12. DownloadListener.java: 下载侦听器接口。
13. DownloadManagerCore.java: 下载管理器对象,管理下载列表。该对象运行在WebKit的线程中,通过CallbackProxy对象与UI线程交互。
14. FileLoader.java: 文件载入器,将文件数据载入到Frame中。
15. FrameLoader.java: Frame载入器,用于载入网页Frame数据littlefe。 16. HttpAuthHandler.java: Http认证处理对象,该对象会作为参数传递给BrowserCallback.displayHttpAuthDialog方法,与用户交互。
17. HttpDataTime.java: 该对象是处理HTTP日期的辅助对象。 18. JsConfirmResult.java: Js确认请求对象。
19. JsPromptResult.java: Js结果提示对象,用于向用户提示Javascript运行结果。 20. JsResult.java: Js结果对象,用于用户交互。
21. JWebCoreJavaBridge.java: 用Java与WebCore库中Timer和Cookies对象交互的桥接代码。
22. LoadListener.java: 载入器侦听器,用于处理载入器侦听消息。
23. Network.java: 该对象封装网络连接逻辑,为调用者提供更为高级的网络连接接口。
24. PanZoom.java: 用于处理图片缩放、移动等操作。
25. PanZoomCellList.java: 用于保存移动、缩放图片的Cell。 26. PerfChecker.java: 用于效率测试的功能对象。 27. SslErrorHandler.java: 用于处理SSL错误消息。
28. StreamLoader.java: StreamLoader抽象类是所有内容载入器对象的基类。该类是通过消息方式控制的状态机,用于将数据载入到Frame中。
29. TextDialog.java: 用于处理html中文本区域叠加情况,可以使用标准的文本编辑而定义的特殊EditText控件。
30. URLUtil.java: URL处理功能函数,用于编码、解码URL字符串,以及提供附加的