[WebKit]WebKit2 API解析

这里是对上一篇<<WebKit模块化分析>>的进一步展开。先从API层开始。

API概览

主要类图

WebKit提供了灵活的回调机制用来支持客户端与内核的交互,在API中有一些Set Client类的函数,Client一般就是用于注册针对某一功能的回调函数。

如向WKContext注册history item处理的回调函数,就会使用下面这个结构(WKContext.h):

struct WKContextHistoryClient {

    int                                                                version;

    const void *                                                       
clientInfo;

    WKContextDidNavigateWithNavigationDataCallback       didNavigateWithNavigationData;

    WKContextDidPerformClientRedirectCallback                   didPerformClientRedirect;

    WKContextDidPerformServerRedirectCallback                  didPerformServerRedirect;

    WKContextDidUpdateHistoryTitleCallback                        didUpdateHistoryTitle;

    WKContextPopulateVisitedLinksCallback                          populateVisitedLinks;

};

typedef struct WKContextHistoryClient WKContextHistoryClient;

调用WKContextSetHistoryClient就可以完成注册特定的回调函数。

角色与功能

WKView

(浏览视图,浏览功能的主要入口,也是网页显示与系统平台上的视图控件的适配,平台差异比较大。)

主要用于创建一个浏览界面,整合WKContext, WKPageGroup,WKPage的功能, 平台视图基本功能的适配(绘制、事件响应等)。

如在Mac OS下就是要实现对于NSView的适配。

WKPage

(当前浏览的页面, 负责解析执行页面内容)

 -> Frame Loader Client

 -> Page Loader Client

 -> Policy Client

 -> Form Client (表单提交操作的响应)

 -> UI Client (JS提示框、焦点变化、菜单显示状态变化、页面绘制功能等)

 -> Find Client (页面上的搜索)

 -> Context Menu Client(快捷菜单)

 -> 页面基本操作 (加载、刷新、关闭、前进、后退等)

 -> User Agent管理

 -> 页面缩放

 -> 与Injected Bundle交互

WKContext

(浏览内容管理功能)

  -> History Client

  -> Injected Bundle Client

  -> Download Client

  -> Connection Client

  -> Download Request

  -> Cached Mode

  -> Process Model (Web进程的共享模式)

  -> Memory Sampler

通过它的m_supplements成员(一个HashMap)可以提供:

  -> Get Application Cache manager

  -> Get Battery Manager

  -> Get Cookie Manager

  -> Get Database Manager

  -> Get Geolocation Manager

  -> Get Icon Database

  -> Get KeyValue Storage Manager

  -> Get Media Cache Manager

  -> Get Network Info Manager

  -> Get Notification Manager

  -> Get Plugin Site Data Manager

  -> Get Resource Cache Manager

  -> Garbage Collection of JavaScript Objects

*关于进程共享模式,参考这里. 是2010年的资料,ProcessModelSharedSecondaryThread已经不支持了。

WKFrame

(从属于一个WKPage, 表示一个Web Frame)

*完整的API定义文件在Source\WebKit2\UIProcess\API目录下。

交互流程示例

接口函数与内核对象的交互

WebKit2 API提供的C API列表中并没有直接暴露内核中的定义,而是定义了一组空的指针类型用于隐藏一些细节(信息隐藏的设计原则)。通过一个巧妙的方式与WebKit中定义的类型保持了对应关系。

它将暴露给外部应用使用的类型定义为WKXXX, 如WKPageRef, WKContextRef等,这些称为API Type。将其对应的WebKit2中的类型称为Impl Type (实现类型)。

 其定义如下(WKSharedAPICast.h):

   template<typename APIType> struct APITypeInfo
{ };

   template<typename ImplType> struct ImplTypeInfo
{ };

WebKit2中使用一个宏来建立两者之前的关联关系, 如下面这个例子(WKAPICast.h):

  WK_ADD_API_MAPPING(WKPageRef, WebPageProxy)

在实际使用时,WebKit2定义了两个函数toImpl()和toAPI()完成它们之间的转换。如

void WKPageLoadURL(WKPageRef pageRef, WKURLRef URLRef)

{

    toImpl(pageRef)->loadURL(toWTFString(URLRef));

}

- (WKPageRef)pageRef

{

    return toAPI(_data->_page.get());

}

对于外部应用能看到的就是WKXXXRef之类的定义,具体的操作由WebKit2的UI Process负责接受处理。

API映射机制的实现

WK_ADD_API_MAPPING宏和两个转换函数都是运用泛型编程来实现的。具体的定义在WKSharedAPICast.h。

首先看一下WK_ADD_API_MAPPING的定义:

#define WK_ADD_API_MAPPING(TheAPIType, TheImplType) \

    template<> struct APITypeInfo<TheAPIType> { typedef TheImplType* ImplType; }; \

    template<> struct ImplTypeInfo<TheImplType*> { typedef TheAPIType APIType; };

看起来就是声明了两个数据结构,并且各嵌套了一个类型定义。这样就可以通过它们完成类型映射了。

举个例子:

在定义过

   WK_ADD_API_MAPPING(WKPageRef, WebPageProxy)

后,下面的代码会正常执行:

    APITypeInfo<WKPageRef>
sAPIType;

    APITypeInfo<WKPageRef>::ImplType sTemp
= NULL;

    WebPageProxy * myClass = newWebPageProxy();

    sTemp = myClass;

这段代码会被正常执行。其中sAPIType的类型是PageRef(类为PageRef是由一个opaque类型定义在WKBase.h中的,运行时会显示为这个类型。), 而sTemp就是WebPageProxy *类型了。

反之,ImplTypeInfo也是类似。

下面就是两个转换函数的定义,现在就很好理解了(WKSharedAPICast.h):

template<typename T>

inline typename APITypeInfo<T>::ImplType
toImpl(T t)

{

    // An example of the conversions that take place:

    // const struct OpaqueWKArray* -> const struct OpaqueWKArray -> struct OpaqueWKArray -> struct OpaqueWKArray*
-> ImmutableArray*

    

    typedef typename WTF::RemovePointer<T>::Type
PotentiallyConstValueType;

    typedef typename WTF::RemoveConst<PotentiallyConstValueType>::Type
NonConstValueType;

    

    return reinterpret_cast<typenameAPITypeInfo<T>::ImplType>(const_cast<NonConstValueType*>(t));

}

template<typename T>

inline typename ImplTypeInfo<T>::APIType
toAPI(T t)

{

    return reinterpret_cast<typenameImplTypeInfo<T>::APIType>(t);

}

Reference:

  1. 如果对typename的使用有疑问,看这里:

     http://dev.yesky.com/13/2221013.shtml 

  2. 关于信息隐藏的设计原则

   a. Hiding Data within OOP  

   b. 设计的核心任务之二:信息隐藏  

 

转载请注明出处: http://blog.csdn.net/horkychen

时间: 2024-07-30 00:54:46

[WebKit]WebKit2 API解析的相关文章

[WebKit]WebKit2多进程机制的解析

在<<WebKit模块化分析>>中说到WebKit2中的多进程模型.多进程模型已经是浏览器的基本架构要素,下面展开分析一下WebKit2中的多进程模型. 协作决定接口,确立责任分工后,对于模块或系统间最重要的事莫过于接口定义,而且是有着简洁明确的定义.对于WebKit2中三个进程中的交互也是相当频繁和多样,如果使用传统的查表法对应解析执行,就会面临巨大的维护成本.WebKit2使用了Encoder和Decoder的概念的很好地将消息解析的工作放到各个功能上.于是提供的公共接口主要关

利用JavaMail API 解析MIME 详解

所以可以封装成一个mailadaptor.jar. 1# MailAdaptor 简介 MailAdaptor 是一个负责邮件存取,邮件解析,邮件生成MIME的适配器. 2# MailAdaptor 核心函数 MailAdaptor主要包括:  代码如下 复制代码 MailInfo loadMailInfo(MailSetting mailSetting, Long companyId, String emlFilePath); Boolean saveMailInfo(Long company

Java 6中新型模态对话框API解析

一.引言 对话框,是指一个最顶层的拥有标题和边框的弹出窗口,典型地应用于用户进行某种形式的输入操作.在JDK 5.0和早期版本中,构建一个对话框时,它必须拥有一个作为它的所有者窗口的框架窗口或另一个对话框,即使窗口是不可见的.当用户最小化一个可见对话框的所有者窗口时会自动隐藏该对话框;而当用户随后恢复所有者窗口时,该对话框再次出现. 一个对话框可以是无模式的也可以是模式的.除了该对话框的所有者的窗口之外,模式对话框将阻止在应用程序中其它顶层窗口的输入.模式对话框捕获窗口焦点直到其被关闭为止(经常

VMware 虚拟化编程(3) —VMware vSphere Web Service API 解析

目录 目录 前文列表 VMware vSphere Web Services API VMware vSphere Web Services SDK vSphere WS API 中的托管对象 Managed Object 托管对象引用 Managed Object References 托管对象属性收集器 PropertyCollector 连接 vCenter 并获取 MO 最后 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/VADP 概念简析 VM

基于QT的webkit与ExtJs开发CB/S结构的企业应用管理系统

  一:源起       1.何为CB/S的应用程序       C/S结构的应用程序,是客户端/服务端形式的应用程序,这种应用程序要在客户电脑上安装一个程序,客户使用这个程序与服务端通信,完成一定的操作.     B/S结构的应用程序,是浏览器/服务端形式的应用程序,这种应用程序不用在客户端部署任何东西,客户只需要通过浏览器与服务端通信,来完成一定的操作.     两种类型的程序优缺点对比: 对比内容 C/S结构的应用程序 B/S结构的应用程序 部署 较困难 方便 升级 较困难 方便 对客户端

时间和日期新API(JSR310)

对日期和时间的新的API,主要包括 Instant.Clock.LocalDateTime.DateTimeFormatter.ZonedDateTime 以及替换 Calendar 的 Chronology 等类.建议大家体验使用. 具体看下面的代码和注释吧: import org.junit.Test; import java.time.*; import java.time.chrono.ChronoLocalDateTime; import java.time.chrono.Chrono

java微信开发API第二步 获取和回复消息_java

微信开发API如何获取和回复消息,下面就为大家进行介绍 一.说明 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet使用注解方式,平台要求:j2ee6.0+.jdk6.0+.t

使用Acorn来解析JavaScript

Talk 因为最近工作上有需要使用解析 JavaScript 的代码,大部分情况使用正则表达式匹配就可以处理,但是一旦依赖于代码上下文的内容时,正则或者简单的字符解析就很力不从心了,这个时候需要一个语言解析器来获取整一个 AST(abstract syntax tree). 然后我找到了多个使用 JavaScript 编写的 JavaScript 解析器: Esprima Acorn UglifyJS 2 Shift 从提交记录来看,维护情况都蛮好的,ES 各种发展的特性都跟得上,我分别都简单了

java微信开发API第一步 服务器接入_java

微信开发API如何接入服务器,下面就为大家进行介绍 一.说明 * 本示例根据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/2016 5:34:36 PM )进行开发演示. * 编辑平台:myeclipse10.7+win32+jdk1.7+tomcat7.0  * 服务器:阿里云 windows server 2008 64bits * 平台要求:servlet使用注解方式,平台要求:j2ee6.0+.jdk6.0+.tom