一.首先看Render进程中的核心类RenderWidget,RenderView(Impl)与WebKit模块之间关系的建立
RendeWidget与WebKit::WebWidget,RenderView(Impl)与WebKit::WebView(Impl)之间的关系
RenderWidget类是WebKit::WebWidget和RenderWidgetHost之间的通信桥梁。
RenderWidgetHost运行在Browser进程中。
RenderView用来管理WebView,并为内嵌的应用提供通信接口。
RenderWidget包含一个WebKit::WebWidget*类型的成员变量webwidget_。
通过RenderWidget的静态函数Create直接创建RenderWidget的实例时,才会导致WebKit::WebWidget实例的成员变量webwidget_的创建.
RenderViewImpl是RenderWidget的子类同时也是RenderView的实现子类,创建RenderViewImpl实例导致RenderWidget实例被创建时,RenderWidget中不会创建WebKit::WebWidget。
RenderViewImpl::Create()函数中创建了RenderViewImpl,并调用了RenderViewImpl::Initialize().
RenderViewImpl::Initialize()函数中调用webwidget_ = WebView::create(this)创建了WebViewImpl的实例,并保存在RenderWidget中定义的变量webwidget_中。
以上分析,我们可以得到以下结论:
RenderWidget对应于WebKit::WebWidget;
RenderViewImpl对应于WebKit::WebViewImpl(WebKit::WebView的实现子类);
只有创建RenderWidget实例时,才会导致WebKit::WebWidget的具体子类实例的创建;
创建RenderViewImpl实例时,会导致WebKit::WebViewImpl(WebKit::WebView的实现子类)实例的创建;
RenderWidget继承自WebKit::WebWidgetClient,在创建WebKit::WebWidget的具体子类实例时,RenderWidget将自身作为参数传给WebKit::WebWidget的具体子类。
RenderViewImpl继承自WebKit::WebViewClient,在创建WebKit::WebViewImpl时,RenderViewImpl将自身作为参数传给WebKit::WebViewImpl.
WebKit::WebWidget的三个子类WebKit::WebPopupMenu, WebKit::WebPagePopup, WebKit::WebPopupTypeHelperPlugin都包含一个成员变量WebWidgetClient* m_widgetClient,实际指向RenderWidget.
WebKit::WebViewImpl中包含一个成员变量WebViewClient* m_client,这个成员变量指向RenderViewImpl.
这样, RenderWidget包含WebKit::WebWidget的指针变量,WebKit::WebWidget也包含RenderWidget的指针变量,两者可以双向通信了。
同理,RenderViewImpl包含WebKit::WebViewImpl的指针变量,WebKit::WebViewImpl也包含RenderViewImpl的指针变量,两者也可以双向通信了。
RendeWidget与WebKit::WebWidget,RenderView(Impl)与WebKit::WebView(Impl)之间的关系
RenderWidget类是WebKit::WebWidget和RenderWidgetHost之间的通信桥梁。
RenderWidgetHost运行在Browser进程中。
RenderView用来管理WebView,并为内嵌的应用提供通信接口。
RenderWidget包含一个WebKit::WebWidget*类型的成员变量webwidget_。
通过RenderWidget的静态函数Create直接创建RenderWidget的实例时,才会导致WebKit::WebWidget实例的成员变量webwidget_的创建.
RenderViewImpl是RenderWidget的子类同时也是RenderView的实现子类,创建RenderViewImpl实例导致RenderWidget实例被创建时,RenderWidget中不会创建WebKit::WebWidget。
RenderViewImpl::Create()函数中创建了RenderViewImpl,并调用了RenderViewImpl::Initialize().
RenderViewImpl::Initialize()函数中调用webwidget_ = WebView::create(this)创建了WebViewImpl的实例,并保存在RenderWidget中定义的变量webwidget_中。
以上分析,我们可以得到以下结论:
RenderWidget对应于WebKit::WebWidget;
RenderViewImpl对应于WebKit::WebViewImpl(WebKit::WebView的实现子类);
只有创建RenderWidget实例时,才会导致WebKit::WebWidget的具体子类实例的创建;
创建RenderViewImpl实例时,会导致WebKit::WebViewImpl(WebKit::WebView的实现子类)实例的创建;
RenderWidget继承自WebKit::WebWidgetClient,在创建WebKit::WebWidget的具体子类实例时,RenderWidget将自身作为参数传给WebKit::WebWidget的具体子类。
RenderViewImpl继承自WebKit::WebViewClient,在创建WebKit::WebViewImpl时,RenderViewImpl将自身作为参数传给WebKit::WebViewImpl.
WebKit::WebWidget的三个子类WebKit::WebPopupMenu, WebKit::WebPagePopup, WebKit::WebPopupTypeHelperPlugin都包含一个成员变量WebWidgetClient* m_widgetClient,实际指向RenderWidget.
WebKit::WebViewImpl中包含一个成员变量WebViewClient* m_client,这个成员变量指向RenderViewImpl.
这样, RenderWidget包含WebKit::WebWidget的指针变量,WebKit::WebWidget也包含RenderWidget的指针变量,两者可以双向通信了。
同理,RenderViewImpl包含WebKit::WebViewImpl的指针变量,WebKit::WebViewImpl也包含RenderViewImpl的指针变量,两者也可以双向通信了。
类关系图:
WebKit::WebWidgetClient中提供的接口都与事件处理,窗口渲染相关。
WebKit::WebViewClient中提供的接口都是与界面行为相关的,如Session,zoom,Accessibility,Geolocation,Speech等。
二.接着看WebKit中与网页渲染相关的类结构
WebKit中负

本文深入分析了Chromium for Android的渲染进程结构,特别是GraphicsLayer在网页内容渲染中的作用。从WebKit的WebWidgetClient、WebViewClient接口开始,探讨了RenderView、RenderLayerCompositor、RenderLayer、RenderLayerBacking和GraphicsLayer之间的关系。GraphicsLayer的创建涉及到一系列中间类,如WebContentLayerImpl和PictureLayer。在Render进程中,LayerTreeHost、ThreadProxy、LayerTreeHostImpl协同工作,控制网页各层的合成。RenderWidgetCompositor与WebKit模块的交互确保了渲染的顺利进行,而root_layer_与m_rootContentLayer的关联则完成了WebKit与底层渲染层的连接。
最低0.47元/天 解锁文章
3311

被折叠的 条评论
为什么被折叠?



