[WebKit]WebKit2 API解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 这里是对上一篇的进一步展开。先从API层开始。 API概览 主要类图 WebKit提供了灵活的回调机制用来支持客户端与内核的交互,在API中有一些Set Client类的函数,Client一般就是用于注册针对某一功能的回调函数。
这里是对上一篇<<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的使用有疑问,看这里:
  2. 关于信息隐藏的设计原则
 
转载请注明出处: http://blog.csdn.net/horkychen


目录
相关文章
|
6天前
|
存储 JSON API
深入解析RESTful API设计原则与实践
【9月更文挑战第21天】在数字化时代,后端开发不仅仅是编写代码那么简单。它关乎于如何高效地连接不同的系统和服务。RESTful API作为一套广泛采用的设计准则,提供了一种优雅的解决方案来简化网络服务的开发。本文将带你深入了解RESTful API的核心设计原则,并通过实际代码示例展示如何将这些原则应用于日常的后端开发工作中。
|
6天前
|
缓存 API 网络架构
Nuxt Kit API :路径解析工具
【9月更文挑战第20天】在 Nuxt Kit API 中,路径解析工具如 `resolvePath()`、`joinPaths()` 和 `relativePath()` 帮助开发者高效处理应用路径,确保资源准确加载,并支持动态路由与组件导入。这些工具提升了应用的灵活性和可扩展性,同时需注意路径准确性、跨平台兼容性和性能优化,以提升用户体验。
26 12
|
26天前
|
XML JSON API
淘宝京东商品详情数据解析,API接口系列
淘宝商品详情数据包括多个方面,如商品标题、价格、图片、描述、属性、SKU(库存量单位)库存、视频等。这些数据对于买家了解商品详情以及卖家管理商品都至关重要。
|
28天前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
65 0
|
28天前
|
监控 测试技术 API
|
28天前
|
Java 缓存 数据库连接
揭秘!Struts 2性能翻倍的秘诀:不可思议的优化技巧大公开
【8月更文挑战第31天】《Struts 2性能优化技巧》介绍了提升Struts 2 Web应用响应速度的关键策略,包括减少配置开销、优化Action处理、合理使用拦截器、精简标签库使用、改进数据访问方式、利用缓存机制以及浏览器与网络层面的优化。通过实施这些技巧,如懒加载配置、异步请求处理、高效数据库连接管理和启用GZIP压缩等,可显著提高应用性能,为用户提供更快的体验。性能优化需根据实际场景持续调整。
47 0
|
28天前
|
开发者
告别繁琐代码,JSF标签库带你走进高效开发的新时代!
【8月更文挑战第31天】JSF(JavaServer Faces)标准标签库为页面开发提供了大量组件标签,如`&lt;h:inputText&gt;`、`&lt;h:dataTable&gt;`等,简化代码、提升效率并确保稳定性。本文通过示例展示如何使用这些标签实现常见功能,如创建登录表单和展示数据列表,帮助开发者更高效地进行Web应用开发。
29 0
|
28天前
|
Apache 开发者 Java
Apache Wicket揭秘:如何巧妙利用模型与表单机制,实现Web应用高效开发?
【8月更文挑战第31天】本文深入探讨了Apache Wicket的模型与表单处理机制。Wicket作为一个组件化的Java Web框架,提供了多种模型实现,如CompoundPropertyModel等,充当组件与数据间的桥梁。文章通过示例介绍了模型创建及使用方法,并详细讲解了表单组件、提交处理及验证机制,帮助开发者更好地理解如何利用Wicket构建高效、易维护的Web应用程序。
25 0
|
28天前
|
UED 存储 自然语言处理
【语言无界·体验无疆】解锁Vaadin应用全球化秘籍:从代码到文化,让你的应用畅游世界每一个角落!
【8月更文挑战第31天】《国际化与本地化实战:构建多语言支持的Vaadin应用》详细介绍了如何使用Vaadin框架实现应用的国际化和本地化,提升用户体验和市场竞争力。文章涵盖资源文件的创建与管理、消息绑定与动态加载、日期和数字格式化及文化敏感性处理等方面,通过具体示例代码和最佳实践,帮助开发者构建适应不同语言和地区设置的Vaadin应用。通过这些步骤,您的应用将更加灵活,满足全球用户需求。
32 0
|
28天前
|
API 数据库 UED
全面解析构建高性能API的秘诀:运用Entity Framework Core与异步编程提升Web应用响应速度及并发处理能力的详细指南与实践案例
【8月更文挑战第31天】本文详细介绍了如何利用 Entity Framework Core (EF Core)的异步编程特性构建高性能 API。通过创建基于 EF Core 的 .NET Core Web API 项目,配置数据库上下文,并定义领域模型,文章展示了如何使用异步方法进行数据查询、加载相关实体及事务处理。具体代码示例涵盖了 GET、POST、PUT 和 DELETE 操作,全面展示了 EF Core 异步编程的优势,有助于提升 API 的响应速度和处理能力。
31 0

热门文章

最新文章

推荐镜像

更多