[WebKit]WebKit2 API解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 这里是对上一篇的进一步展开。先从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


目录
相关文章
|
23天前
|
API 数据处理 开发者
获取淘宝分类详情:深入解析taobao.cat_get API接口
淘宝开放平台推出的`taobao.cat_get` API接口,帮助开发者和商家获取淘宝、天猫的商品分类详情。该接口支持获取类目列表、属性及父类目信息,通过指定分类ID(cid)实现精准查询,并提供灵活的参数设置和高效的数据处理。使用流程包括注册账号、创建应用、获取App Key/Secret、构造请求、发送并解析响应。示例代码展示了如何用Python调用此API。开发者可借此为电商项目提供数据支持。
|
13天前
|
JSON 前端开发 搜索推荐
关于商品详情 API 接口 JSON 格式返回数据解析的示例
本文介绍商品详情API接口返回的JSON数据解析。最外层为`product`对象,包含商品基本信息(如id、name、price)、分类信息(category)、图片(images)、属性(attributes)、用户评价(reviews)、库存(stock)和卖家信息(seller)。每个字段详细描述了商品的不同方面,帮助开发者准确提取和展示数据。具体结构和字段含义需结合实际业务需求和API文档理解。
|
6天前
|
JSON 缓存 API
解析电商商品详情API接口系列,json数据示例参考
电商商品详情API接口是电商平台的重要组成部分,提供了商品的详细信息,支持用户进行商品浏览和购买决策。通过合理的API设计和优化,可以提升系统性能和用户体验。希望本文的解析和示例能够为开发者提供参考,帮助构建高效、可靠的电商系统。
24 12
|
5天前
|
数据挖掘 API 数据安全/隐私保护
深度解析:获取亚马逊畅销榜API接口及实战应用
Lazada 淘宝详情 API 是连接 Lazada 和淘宝商品数据的桥梁,帮助电商从业者获取淘宝商品的详细信息(如标题、描述、价格等),并应用于 Lazada 平台。它在市场调研、产品选品、价格策略和数据分析等方面为商家提供支持,助力优化运营策略。通过 Python 示例代码展示了 API 的实际应用,并强调了数据准确性、API 使用限制及数据安全的重要性。
32 10
|
14天前
|
供应链 搜索推荐 API
深度解析1688 API对电商的影响与实战应用
在全球电子商务迅猛发展的背景下,1688作为知名的B2B电商平台,为中小企业提供商品批发、分销、供应链管理等一站式服务,并通过开放的API接口,为开发者和电商企业提供数据资源和功能支持。本文将深入解析1688 API的功能(如商品搜索、详情、订单管理等)、应用场景(如商品展示、搜索优化、交易管理和用户行为分析)、收益分析(如流量增长、销售提升、库存优化和成本降低)及实际案例,帮助电商从业者提升运营效率和商业收益。
108 20
|
18天前
|
数据采集 供应链 API
Python爬虫与1688图片搜索API接口:深度解析与显著收益
在电子商务领域,数据是驱动业务决策的核心。阿里巴巴旗下的1688平台作为全球领先的B2B市场,提供了丰富的API接口,特别是图片搜索API(`item_search_img`),允许开发者通过上传图片搜索相似商品。本文介绍如何结合Python爬虫技术高效利用该接口,提升搜索效率和用户体验,助力企业实现自动化商品搜索、库存管理优化、竞品监控与定价策略调整等,显著提高运营效率和市场竞争力。
61 3
|
22天前
|
JSON 供应链 搜索推荐
淘宝APP分类API接口:开发、运用与收益全解析
淘宝APP作为国内领先的购物平台,拥有丰富的商品资源和庞大的用户群体。分类API接口是实现商品分类管理、查询及个性化推荐的关键工具。通过开发和使用该接口,商家可以构建分类树、进行商品查询与搜索、提供个性化推荐,从而提高销售额、增加商品曝光、提升用户体验并降低运营成本。此外,它还能帮助拓展业务范围,满足用户的多样化需求,推动电商业务的发展和创新。
48 5
|
1月前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
30天前
|
安全 API 数据安全/隐私保护
速卖通AliExpress商品详情API接口深度解析与实战应用
速卖通(AliExpress)作为全球化电商的重要平台,提供了丰富的商品资源和便捷的购物体验。为了提升用户体验和优化商品管理,速卖通开放了API接口,其中商品详情API尤为关键。本文介绍如何获取API密钥、调用商品详情API接口,并处理API响应数据,帮助开发者和商家高效利用这些工具。通过合理规划API调用策略和确保合法合规使用,开发者可以更好地获取商品信息,优化管理和营销策略。
|
1月前
|
JSON 自然语言处理 Java
OpenAI API深度解析:参数、Token、计费与多种调用方式
随着人工智能技术的飞速发展,OpenAI API已成为许多开发者和企业的得力助手。本文将深入探讨OpenAI API的参数、Token、计费方式,以及如何通过Rest API(以Postman为例)、Java API调用、工具调用等方式实现与OpenAI的交互,并特别关注调用具有视觉功能的GPT-4o使用本地图片的功能。此外,本文还将介绍JSON模式、可重现输出的seed机制、使用代码统计Token数量、开发控制台循环聊天,以及基于最大Token数量的消息列表限制和会话长度管理的控制台循环聊天。
353 7

推荐镜像

更多