转载,请注明出处!
WebCore模块需要下载某资源时,会使用ResourceRequest对象来记录资源的地址,然后将资源地址传递给目标平台网络模块,最后利用目标平台网络模块下载资源。为了方便移植,WebCore模块严格定义了网络模块需要提供的功能。主要功能如下:
- 具有一个接受下载请求的接口。现在这个接口由ResourceHandle类提供,是一个静态方法。方法名称是ResourceHandle::create。
- 自主维护下载请求队列。WebCore模块不关心下载队列的具体形式,只要网络模块处理所有的下载请求就可以了。
- 每当下载到数据时,调用“指定接口”将数据传递给“指定对象”。WebCore模块在传递请求的同时,会传递一个接受下载数据的ResourceHandleClient对象。每当网络模块下载到数据时,就要调用ResourceHandleClient::didReceiveData接口传递数据。
- 当下载完所有数据时,调用“指定接口”将“完成时间”传递给“指定对象”。WebCore模块在传递请求的同时,会传递一个接受下载数据的ResourceHandleClient对象。每当网络模块下载到数据时,就要调用ResourceHandleClient::didFinishLoading接口传递完成时间。
目标平台网络模块的工作模型
WebKit内核可用的网络接口完全由ResourceHandle对象类确定。目前ResourceHandle类提供的功能为:
- 发送异步下载请求。方法是执行静态方法ResourceHandle::create。
- 发送同步下载请求。方法是执行静态方法ResourceHandle::loadResourceSynchronously。
- 确定请求的目标资源是否在缓存池中。目前只有固定的几个平台支持这个功能,具体有Android平台、qt平台。方法是执行静态方法ResourceHandle::willLoadFromCache。
- 把指定资源与一串特殊信息存储到缓存池中。目前只有chrome浏览器支持这个功能。方法是执行静态方法ResourceHandle::cacheMetaData。
- 网页侦测相关接口,具体接口有shouldContentSniff, shouldContentSniffURL, forceConentSniffing。这些接口的作用和意义我不太明白。
- 检测是否正在处理同步下载请求,接口为loadsBlocked。此接口的意义是我的猜测。
- 认证功能,具体接口有hasAuthenticationChallenge, clearAuthentication。
- 取消对异步下载请求的处理。方法是执行实例方法cancel。
- 设置以及获取网络数据的客户。如果网络模块下载到了数据,会将数据传给这个客户。方法是执行实例方法client, setClient。
- 延迟处理异步下载请求。android平台以及windows平台不支持。方法是执行实例方法 setDeferLoading。
- 查询异步请求的信息。方法有firstRequest, loastHTTPMethod,这些方法都是实例方法。
- 错误处理。错误处理是通过timer事件触发的。因此,错误处理肯定是由主线程完成的。方法是fireFailure。
- 允许客户端扩展协议的处理方法。方法是用静态方法ResourceHandle::registerBuiltinConstructor注册指定协议的处理函数。