WebKit(Blink分支)各组件的创建(FrameView)

从render_view_impl.cc开始说起。

1.     方法RenderViewImpl::Initialize中有:

  webview()->setMainFrame(WebFrame::create(main_render_frame_.get()));

2.     先看里面的参数,即WebFrame::create

此代码执行:文件WebFraemImpl.cc中方法:WebFrame::create

3.     上面方法执行同文件中方法:WebFrameImpl::create

4.     上面方法会执行同文件的重载方法:WebFrameImpl::create

5.     上面方法执行构造函数:WebFrameImpl::WebFrameImpl

注:在该构造函数中会创建WebFrameInit对象。

WebFrameInit类是在文件WebFrameImpl.h中定义。该类继承了FrameInit。

class WebFrameInit : public WebCore::FrameInit

WebFrameInit的构造函数,如下:

           WebFrameInit(WebFrameImpl*webFrameImpl, int64_t frameID)

            : WebCore::FrameInit(frameID)

            ,m_frameLoaderClientImpl(webFrameImpl)

        {

           setFrameLoaderClient(&m_frameLoaderClientImpl);

        }

在该构造函数中,创建了FrameInit对象;并且将webFrameImpl值付给FrameLoaderClient对象。

FrameInit类在文件Frame.h中定义。

class FrameInit : publicRefCounted<FrameInit>

6.     接着,我们看看

webview()->setMainFrame(WebFrame::create(main_render_frame_.get()));

看看方法setMainFrame

7.     该方法是文件WebViewImpl.cc中方法:WebViewImpl::setMainFrame

该方法的实现如下:

voidWebViewImpl::setMainFrame(WebFrame* frame)

{

toWebFrameImpl(frame)->initializeAsMainFrame(page());

}

8.     我们再看方法initializeAsMainFrame

该方法是在文件WebFrameImpl.cpp中,

WebFrameImpl::initializeAsMainFrame

该方法中,有

setWebCoreFrame(Frame::create(m_frameInit));

和m_frame->init();

这两个代码比较关键。

9.     我们先看Frame::create(m_frameInit)

该方法是在文件Frame.cpp中Frame::create

PassRefPtr<Frame>Frame::create(PassRefPtr<FrameInit> frameInit)

{

   

    RefPtr<Frame> frame = adoptRef(newFrame(frameInit));

    if (!frame->ownerElement())

       frame->page()->setMainFrame(frame);

    InspectorInstrumentation::frameAttachedToParent(frame.get());

    return frame.release();

}

会创建Frame对象,

注意:创建Frame对象的时候,也会创建FrameLoader对象。

其构造函数中有代码:

, m_loader(this,frameInit->frameLoaderClient())

并且,可执行frame->page()->setMainFrame方法。

10.            再来看看m_frame->init();

11.            上面方法是在文件Frame.h,有方法:

        inlinevoid Frame::init()

          {

        m_loader.init();

          }

12.            再看看m_loader.init();

m_loader是FrameLoader类型。该方法会执行FrameLoader.cpp文件中方法FrameLoader::init()

13.            这里有代码m_client->createDocumentLoader

执行的是文件FrameLoaderClientImpl.cpp中方法:

FrameLoaderClientImpl::createDocumentLoader

里面,有代码:

RefPtr<WebDataSourceImpl>ds = WebDataSourceImpl::create(frame, request, data);

14.            上面方法在文件WebDataSourceImpl.cpp中,WebDataSourceImpl::create。

15.            该方法会调用WebDataSourceImpl的构造函数。

在该构造函数中有,

WebDataSourceImpl::WebDataSourceImpl(Frame*frame, const ResourceRequest& request, const SubstituteData& data)

    : DocumentLoader(frame, request, data)

即创建了DocumentLoader对象。

这是第一次创建DocumentLoader对象。

16.            之后,会执行DocumentLoader::finishedLoading()方法,该方法中有代码: commitIfReady()

执行同文件的DocumentLoader::commitIfReady()方法。

17.            再执行方法FrameLoader::commitProvisionalLoad()

18.            再执行方法:

FrameLoaderClientImpl::transitionToCommittedForNewPage()

19.            再执行方法:

WebFrameImpl::createFrameView()创建第一个FrameView

20.            以上是创建第一个DocumentLoader对象和FraemView对象。

21.             接着执行方法:

FrameLoader::loadWithNavigationAction

FrameLoaderClientImpl::createDocumentLoader

WebDataSourceImpl::create

DocumentLoader::DocumentLoader

创建第二个DocumentLoader对象。

22.            接着执行:

DocumentLoader::dataReceived()

DocumentLoader::commitIfReady()

FrameLoader::commitProvisionalLoad()

FrameLoaderClientImpl::transitionToCommittedForNewPage()

WebFrameImpl::createFrameView()

创建第二个FrameView.

FrameView是个比较关键的组件,它是否透明,可以让整个chromium实现透明展示网页

WebKit(Blink分支)各组件的创建(FrameView),布布扣,bubuko.com

时间: 2024-10-11 20:15:16

WebKit(Blink分支)各组件的创建(FrameView)的相关文章

vue组件的创建

vue的核心基础就是组件的使用,玩好了组件才能将前面学的基础更好的运用起来.组件的使用更使我们的项目解耦合.更加符合vue的设计思想MVVM. 那接下来就跟我看一下如何在一个Vue实例中使用组件吧! 这里有一个Vue组件的示例: Vue.component('Vheader',{ data:function(){ return { } }, template:`<div class="header"> <div class="w"> <

Vue——组件的创建

vue的核心基础就是组件的使用,玩好了组件才能将前面学的基础更好的运用起来.组件的使用更使我们的项目解耦合.更加符合vue的设计思想MVVM. 那接下来就跟我看一下如何在一个Vue实例中使用组件吧! 这里有一个Vue组件的示例: Vue.component('Vheader',{ data:function(){ return { } }, template:`<div class="header"> <div class="w"> <

react组件的创建

最近项目接触react和rn,之前会一些vue和小程序,起初写react是很难受的,尤其是jsx的写法,不过2周过后感觉写起来有点舒服了... 目前react的组件一共有3种方式:React.createClass,React.Component,函数式 React.createClass(API已经移除) 这是早期react组件的创建方式,如果你看的文章是几年之前写的,很多都是这种方式(比如阮老师这篇React 入门实例教程) React.createClass现在这一API已经移除,如果非要

WebKit(Blink分支)各组件的创建与逻辑关系

从render_view_impl.cc開始说起. 1.     方法RenderViewImpl::Initialize中有: WebLocalFrame* web_frame = WebLocalFrame::create(main_render_frame_.get());  这里会创建WebLocalFrame对象. 之后有webwidget_ = WebView::create(this); 这里会创建WebViewImpl对象.且后面将两者关联起来. 2. 我们来先来看看WebLoc

C# 使用Vici WinService组件来创建Windows服务

Vici WinService 是 是Windows平台下使用C#开发的轻量级用于创建,删除服务的类库,您只需简单的几行代码即可实现多线程异步服务的创建,删除,运行 废话不多说,直接上代码 /****************************************************************** * 创建人:HTL * 创建时间:2015-5-12 14:09:39 * 说明:使用Vici WinService组件创建的Windows服务 * Email:[email

Angular之组件的创建

一 : Dos命令 ① , Angular创建组件使用的是Dos命令 . 在项目的README.md文件中有详细的描述. 二 : 具体操作 ①, 先cd到项目工程的src/app目录下 , 如下图所示② , 执行ng generate component命令 原文地址:https://blog.51cto.com/aonaufly/2392943

vue组件的创建和使用(小功能)

titleBlock.vue组件页面 <template> <!-- 通用标题头 --> <div style="margin: 20px 0;"> <h3 style="margin-left: 20px">{{title}}</h3> <Divider /> </div> </template> <script> export default { prop

二、React初体验之React组件创建

(中间因为应付各种考试,处理其他事情,隔了好时间没更新,现在终于有时间了,续上!) 本文为React初始体验,因此先不考虑文件如何组织,尽量以最简单的方式让大家了解React其中的原理. 在创建组件(component)之前,大家首先需要了解一些基础知识.有ES6.JSX语法等基础知识的同学请跳过下面一段. ES6是JavaScript的最新标准,里面新增了许多语法方式,甚至出现了“类”的继承方式,我个人暂且把他们理解为新增了许多“语法糖”,这些“语法糖”可能带给老手的是方便,而对于我们这些菜鸟

Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突

Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突 这篇是接着上篇分布式版本库--Windows下Git的环境部署以及在GitHub上开源自己的项目讲的,上篇主要是说用GUI来图形化界面操作,但是一般我们程序员也不会这么干,用命令又轻松又愉悦,所以,这里我就再开了一篇来专门说一下纯命令是怎么去操作的,但是要注意哦,其实廖雪峰老师的网站就是非常赞的学习资源哦! 廖雪峰老师:http://www.li