精华内容
下载资源
问答
  • webkit内核源码下载
    2012-04-16 12:56:56

    WebKit内核源码分析(一)---dlmu2001

    http://blog.csdn.net/dlmu2001/article/details/6164873 

    摘要:本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析的时候以Qt的移植为参考,涉及移植的东西不多,主要还是以内核为主。在分析内核的时候,Frame是首当其冲的一个类,本文将分析Frame类的代码。

    1.    描述

    Frame类是WebCore内核同应用之间联系的一个重要的类。它有点像设计模式中的Façade,将内核的各个不同的零配件组装在了一起,但又不是Façade,因为用户很多时候还是要直接去操作里面的组件。除了设计上的考虑,Frame还有语法上的意义,它对应于Page里面的帧。

    2.    类结构

     

     

    1)              FrameTree对象用来协助管理父帧和子帧的关系,常见的比如main frame之中有iframe元素,就会调用FrameLoaderClientQt::createFrame来产生子帧,产生的子帧会通过appendChild添加到主帧的树状结构中。Frame通过FrameTree对象,可以方便地访问它的父帧,子帧,兄弟帧。

    2)              维护FrameLoader对象用来完成frame的加载,FrameLoader是一个非常重要的类,后续进行进一步的分析。

    3)              维护NavigationScheduler对象用来管理页面跳转调度(比如重定向,meta refresh等)。

    4)              DOMWindow用来管理同DOM相关的事件、属性和消息。

    5)              FrameViwe类用于Frame的排版。

    6)              Frame文档解析后,对每一个tag或者attr,会有对应的dom节点关联,Document类用来管理这些dom节点。不同的文档类型继承出不同的子类,比如HTML文档对应子类HTMLDocument,XML文档对应于XMLDocument。

    7)              SciptController对象,脚本控制器,用来管理脚本的执行和操作。

    8)              Editor对象用来处理页面的编辑相关的操作,比如拷贝,粘贴,输入等,Editor对象,它同Page类的EditorClient对象紧密合作。和EditorClient的关系就如同Page同Frame的关系。

    9)              SelectionController用来管理Frame中的选取操作。

    10)         AnimationControlle,动画控制,控制动画的播放,暂停,继续(同HTML video标签是否有关系?)

    11)         EventHandler,事件处理对象,这里的对象主要是同上层应用也就是用户参与的事件,比如鼠标事件,按键事件(快捷键等),滚动事件,resize事件等。这是一个浏览器外壳经常需要打交道的类。

    3.    主要接口

    3.1   Create

    static PassRefPtr<Frame> create(Page*,HTMLFrameOwnerElement*,FrameLoaderClient*)
    描述: 调用Frame构造函数,创建出Frame对象。有两个地方会创建Frame对象,一是要加载一个新的页面请求,这个时候会创建main frame,一是在加载子帧的时候,通过FrameLoaderClientQt的createFrame接口,创建子帧对应的Frame对象,在第一种情况中,HTMLFrameOwnerElement参数为NULL,第二种情况传子帧的父元素。在一个tab页内,main frame会重用。

    调用系列:

    àQwebPage::setView

    àQwebPage::setViewportSize

    àQwebPage::mainFrame

    àQwebPagePrivate::createMainFrame

    àQwebFrameData::QwebFrameData

    àFrame::create


    àFrameLoader::finishedLoading
    à……

    àHTMLDocumentParser::append

    à……

    àHTMLTreeBuilder::processToken

    à……

    àHTMLElementBase::openURL

    àSubFrameLoader::requestFrame

    à……

    àFrameLoaderClientQt::creatFrame

    àQwebFrameData::QwebFrameData

    àFrame::create

    3.2  createView

    void createView(const IntSize&, const Color&, bool, const IntSize&, bool,

                ScrollbarMode = ScrollbarAuto, bool horizontalLock = false,

                ScrollbarMode = ScrollbarAuto, bool verticalLock = false)

    描述:创建出FrameView对象,以用于之后的排版。应用调用这个函数的时候需要传入同排版有关的一些信息,如初始视窗大小,背景色,滚动条模式等。创建出FrameView以后,即调用Frame::setView设置成当前的FrameView。
    函数调用系列:
    àFrameLoader::commitProvisionalLoad

    àFrameLoader::transitionToCommitted

    àFrameLoaderClientQt::transitionToCommittedForNewPage

    àFrame::createView

    3.3  setDocument

    void setDocument(PassRefPtr<Document>)

    描述:设置同Frame关联的Document对象(一般是DocumentWriter创建的)。

    函数调用系列:

    àQWebFrame::QwebFrame

    àQwebFramePrivate::init

    àFrame::init

    àFrameLoader::init

    àDocumentWriter::begin

    àFrame::setDocument


    àDocumentLoader::receivedData
    àDocumentLoader::commitLoad

    àFrameLoaderClientQt::committedLoad

    àDocumentLoader::commitData

    àDocumentWriter::setEncoding

    àDocumentWriter::willSetEncoding

    àFrameLoader::receivedFirstData

    àDocumentWriter::begin

    àFrameLoader::clear

    àFrame::setDocument

    3.4  init

    void Frame::init

    描述:Frame对象初始化,会调用FrameLoader::init初始化FrameLoader对象。

    调用系列:
    àQWebFrame::QWebFrame

    àQwebFramePrivate::init

    àFrame::init

    3.5  setPageAndTextZoomFactors

    void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor)

    描述:设置页面放大因子和文字放大因子。在网页缩放或者改变网页字体大小的时候调用。

    更多相关内容
  • WebKit 内核源代码分析二 dlmu2001 tomorrow.cyz@ 摘要本系列通过分析 WebKit的源代码试图分析WebKit内核设计架构模 块之间的关系分析的时候以 Qt的移植为参考涉及移植的东西不多主要还 是以内核为主FrameLoader类...
  • webkitChrome内核浏览器易语言源码
  • C# webkit内核的浏览器打开网页源码.rar
  • android webkit 内核

    2019-08-03 01:14:07
    Android_WebView、Webkit内核深入讲解.rar,Android_WebView、Webkit内核深入讲解.doc
  • WEBKIT内核源码分析系列

    千次阅读 2014-07-16 10:23:16
    WebKit内核源码分析(一) 摘要:在分析内核的时候,Frame是首当其冲的一个类,本文将分析Frame类的代码。 2. WebKit内核源码分析(二) 摘要:FrameLoader类负责一个Frame的加载,在Frame的流程中起...

    原帖地址:http://www.cnblogs.com/qq499194341/articles/2891954.html     作者空间有很多webkit基础的文章,有时间看看

    目录:

    1.WebKit内核源码分析(一)

    摘要:在分析内核的时候,Frame是首当其冲的一个类,本文将分析Frame类的代码。

    2.WebKit内核源码分析(二)

    摘要:FrameLoader类负责一个Frame的加载,在Frame的流程中起到非常重要的重要,同很多组件都有交互,本文将分析FrameLoader类的代码。

    3.WebKit内核源码分析(三)

    摘要:Page类就是用来对应这样的页面请求。Page类是WebKit中非常重要的一个类,它就像内核对外的一个聚合器。

    4.WebKit内核源码分析(四)

    摘要:本文介绍 WebCore 中 Loader 模块是如何加载资源的,分主资源和派生资源分析 loader 模块的类关系。

    5.WebKit内核源码分析(五)

    摘要:本文分析WebKithtml的解析过程,DOM节点树的建立。


     

    WebKit内核源码分析(一)

    摘要:本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析的时候以Qt的移植为参考,涉及移植的东西不多,主要还是以内核为主。在分析内核的时候,Frame是首当其冲的一个类,本文将分析Frame类的代码。

    1. 描述

    Frame类是WebCore内核同应用之间联系的一个重要的类。它有点像设计模式中的Façade,将内核的各个不同的零配件组装在了一起,但又不是Façade,因为用户很多时候还是要直接去操作里面的组件。除了设计上的考虑,Frame还有语法上的意义,它对应于Page里面的帧。

    2. 类结构

     

    1) FrameTree对象用来协助管理父帧和子帧的关系,常见的比如main frame之中有iframe元素,就会调用FrameLoaderClientQt::createFrame来产生子帧,产生的子帧会通过appendChild添加到主帧的树状结构中。Frame通过FrameTree对象,可以方便地访问它的父帧,子帧,兄弟帧。

    2) 维护FrameLoader对象用来完成frame的加载,FrameLoader是一个非常重要的类,后续进行进一步的分析。

    3) 维护NavigationScheduler对象用来管理页面跳转调度(比如重定向,meta refresh等)。

    4) DOMWindow用来管理同DOM相关的事件、属性和消息。

    5) FrameViwe类用于Frame的排版。

    6) Frame文档解析后,对每一个tag或者attr,会有对应的dom节点关联,Document类用来管理这些dom节点。不同的文档类型继承出不同的子类,比如HTML文档对应子类HTMLDocument,XML文档对应于XMLDocument。

    7) SciptController对象,脚本控制器,用来管理脚本的执行和操作。

    8) Editor对象用来处理页面的编辑相关的操作,比如拷贝,粘贴,输入等,Editor对象,它同Page类的EditorClient对象紧密合作。和EditorClient的关系就如同Page同Frame的关系。

    9) SelectionController用来管理Frame中的选取操作。

    10) AnimationControlle,动画控制,控制动画的播放,暂停,继续(同HTML video标签是否有关系?)

    11) EventHandler,事件处理对象,这里的对象主要是同上层应用也就是用户参与的事件,比如鼠标事件,按键事件(快捷键等),滚动事件,resize事件等。这是一个浏览器外壳经常需要打交道的类。

    3. 主要接口

    3.1 Create

    static PassRefPtr<Frame> create(Page*,HTMLFrameOwnerElement*,FrameLoaderClient*)

     

    描述: 调用Frame构造函数,创建出Frame对象。有两个地方会创建Frame对象,一是要加载一个新的页面请求,这个时候会创建main frame,一是在加载子帧的时候,通过FrameLoaderClientQt的createFrame接口,创建子帧对应的Frame对象,在第一种情况中,HTMLFrameOwnerElement参数为NULL,第二种情况传子帧的父元素。在一个tab页内,main frame会重用。

    调用系列:

    ->QwebPage::setView
    ->QwebPage::setViewportSize
    ->QwebPage::mainFrame
    ->QwebPagePrivate::createMainFrame
    ->QwebFrameData::QwebFrameData
    ->Frame::create

    ->FrameLoader::finishedLoading
    ->……
    ->HTMLDocumentParser::append
    ->……
    ->HTMLTreeBuilder::processToken
    ->……
    ->HTMLElementBase::openURL
    ->SubFrameLoader::requestFrame
    ->……
    ->FrameLoaderClientQt::creatFrame
    ->QwebFrameData::QwebFrameData
    ->Frame::create

    3.2 createView

    void createView(const IntSize&, const Color&, bool, const IntSize&, bool,ScrollbarMode = ScrollbarAuto, bool horizontalLock = false,ScrollbarMode = ScrollbarAuto, bool verticalLock = false)

     

    描述:创建出FrameView对象,以用于之后的排版。应用调用这个函数的时候需要传入同排版有关的一些信息,如初始视窗大小,背景色,滚动条模式等。创建出FrameView以后,即调用Frame::setView设置成当前的FrameView。

    函数调用系列:

    ->FrameLoader::commitProvisionalLoad
    ->FrameLoader::transitionToCommitted
    ->FrameLoaderClientQt::transitionToCommittedForNewPage
    ->Frame::createView

    3.3 setDocument

    void setDocument(PassRefPtr<Document>)

     

    描述:设置同Frame关联的Document对象(一般是DocumentWriter创建的)。

    函数调用系列:

    ->QWebFrame::QwebFrame
    ->QwebFramePrivate::init
    ->Frame::init
    ->FrameLoader::init
    ->DocumentWriter::begin
    ->Frame::setDocument

    ->DocumentLoader::receivedData
    ->DocumentLoader::commitLoad
    ->FrameLoaderClientQt::committedLoad
    ->DocumentLoader::commitData
    ->DocumentWriter::setEncoding
    ->DocumentWriter::willSetEncoding
    ->FrameLoader::receivedFirstData
    ->DocumentWriter::begin
    ->FrameLoader::clear
    ->Frame::setDocument

    3.4 init

    void Frame::init()

     

    描述:Frame对象初始化,会调用FrameLoader::init初始化FrameLoader对象。
    调用系列:
    ->QWebFrame::QWebFrame
    ->QwebFramePrivate::init
    ->Frame::init

    3.5 setPageAndTextZoomFactors

    void setPageAndTextZoomFactors(float pageZoomFactor, float textZoomFactor)

     

    描述:设置页面放大因子和文字放大因子。在网页缩放或者改变网页字体大小的时候调用。


     

    WebKit内核源代码分析(二)

    摘要:本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析的时候以Qt的移植为参考,涉及移植的东西不多,主要还是以内核为主。FrameLoader类负责一个Frame的加载,在Frame的流程中起到非常重要的重要,同很多组件都有交互,本文将分析FrameLoader类的代码。

    1. 概述

    顾名思义,FrameLoader是一个Frame的loader,它的作用就是为客户提供一个下载一个Frame的一系列接口。这里的客户指的是类的客户,比如Frame类,间接客户是上层应用,比如qwebframe。
    从它的定义看,最容易想到的是一个load接口,用来将一个frame load下来。任何一个页面至少都需要一个mainframe,因此一个页面的下载一般就是从load一个mainframe开始。
    在load frame的过程中,通过FrameLoaderClient接口将load过程的不同阶段告知客户。
    FrameLoader通过setDocumentLoader相当于把load的工作委托给了DocumentLoader类。
    FrameLoader同DocumentLoader是has-a的关系。一般在load的时候创建DocumentLoader。Frame调用DocumentLoader的startLoadingMainResource开始load frame。

    2. 类关系

     

    1)Frame和FrameLoader是contain-a的关系,在Frame的构造函数中调用FrameLoader的构造函数,调用时传入参数Frame指针和FrameLoaderClient指针。
    2)Frame有可能有子Frame,所以维护SubFrameLoader对象m_subframeLoader来管理子Frame的load。Frame可以对应xml document,也可对应html document,等等。跟Document相关的子resource的load不在FrameLoader的职责范围内。
    3)包含一个DocumentWriter类对象m_writer,当Frame的数据load finish的时候,将数据传给DocumentWriter类,进行下一步的处理(比如解码)
    4)FrameLoader维护了三个DocumentLoader对象,分别对应于不同的阶段,m_policyDocumentLoader对应于收到用户load调用,进行policy check阶段,m_provisionalDocumentLoader对应于policy check通过以后,Frame数据还没有到来之前,它会负责startLoadingMainResource的调用。m_documentLoader则是Frame第一个数据到来以后使用的DocumentLoader,这个时候,前一个主Frame的DocumentLoader已经不能再用(user agent开始白屏,刷掉前一个页面的显示)。
    5)包含一个HistoryController对象,用于操作历史记录相关的接口,保存或者恢复Document和View相关的状态,维护前进后退队列,以实现前进后退功能,前进后退本质上是同Page对象关联的,FrameLoader通过HistoryController操作m_backFowardController对象
    6)包含一个ResourceLoadNotifier对象,主要用于同ResourceLoader及FrameLoaderClient打交道,可以理解为ResourceLoader有事件变化或者发生的时候,通知FrameLoader的一个手段
    7)包含一个SubframeLoader对象,当FrameLoader下载的Document有子帧需要请求的时候(比如HTMLDocument中解析到iframe 元素),用来处理子帧请求
    8)将FrameLoader的状态封装到FrameLoaderStateMachine中,这个状态同FrameState不同,FrameState倾向于判断Frame涉及的Document的下载状态,是出于发起状态(Provisional),还是出于已经收到响应但不全(CommittedPage),还是响应收全的状态,倾向于同http相关。而FramLoaderStateMachine倾向于同DocumentLoader相关,用来描述FrameLoader处理DocumentLoader的节点,是处于已经创建,还是显示的状态。
    9)PolicyChecker主要用来对FrameLoader进行一些校验。包括三种校验:NewWindow,Navigation和Content。NewWindow对应于浏览器需要新开一个tab页或窗口的时候,Navigation对应于一个页面请求发起的时候,Content校验对应于收到数据以后(判断Mime type等),PolicyChecker通过提供对应的接口,由FrameLoaderClient来对这些请求进行校验,以确定是否允许继续,或者需要其它的动作。

    3. 主要接口

    Frame::init()

     

    功能:FrameLoader的初始化
    函数调用系列
    ->QWebFrame::QWebFrame(QwebPage* parent,QWebFrameData *frameData)
    ->QWebFramePrivate::init(QWebFrame* qwebframe,QWebFrameData* frameData)
    ->Frame::init()
    ->FrameLoader::init()
    说明:主要做一些自身的初始化工作,比如初始化状态机,Sandbox Flags,创建DocumentLoader被设置为Policy DocumentLoader和Provisional DocumentLoader,调用DocumentLoader和documentWriter等的接口进行初始化操作

    FrameLoader::commitProvisionalLoad()

     

    功能:提交Provisional阶段下载的数据
    函数调用系列:
    ->DocumentLoader::finishLoading
    ->DocumentLoader::commitIfReady
    ->FrameLoader::commitProvisionalLoad

    或者
    ->ResourceLoader::didReceiveData
    ->MainResourceLoader::addData
    ->DocumentLoader::receiveData
    ->DocumentLoader::commitLoad
    ->DocumentLoader::commitIfReady
    ->DocumentLoader::commitProvisionalLoad
    说明:这个接口主要的操作是将Provisional DocumentLoader设置成DocumentLoader,因为已经收到数据,所以FrameState也会跃迁到FrameStateCommittedPage。还有历史记录,PageCache相关的操作。另外,这个接口会间接调用FrameLoaderClientQt::transitionToCommittedForNewPage,通过Frame::createView创建出FrameView来。

    Frame::finishedLoading()

     

    功能:frame请求网络加载完成的时候调用此接口
    函数调用系列
    ->ResourceLoader::didFinishLoading
    ->MainResourceLoader::didFinishLoading
    ->FrameLoader::finishedLoading
    ->FrameLoader::init()
    说明:检查是否有网络错误,告诉DocumentLoader和DocumentWriter下载完成,以便进行后续操作(提交数据,解析)。

    FrameLoader::finishedParsing()

     

    功能:解析完成调用此接口
    函数调用系列
    ->DocumentWritter::end
    ->….
    ->Document::finishParsing
    ->….
    ->Document::finishedParsing
    ->FrameLoader::finishedParsing
    FrameLoader::load(const ResourceRequest& request,bool lockHistory)
    功能:加载一个frame请求,Frame请求相关的数据,封装成ResourceRequest传入。
    函数调用系列:一般由应用触发调用
    说明:这个接口调用FrameLoaderClientQt::createDocumentLoader创建出DocumentLoader,并以此DocumentLoader为Policy Document Loader,进入Policy check流程。


     

    WebKit内核源代码分析(三)

    摘要:浏览器的请求一般是以页面请求为单位,当用户通过网址栏输入一个url,浏览器就开始一个页面请求。而一个页面请求可能包含有一到多个页面子帧,以及图片、CSS和插件等派生子资源。Page类就是用来对应这样的页面请求。Page类是WebKit中非常重要的一个类,它就像内核对外的一个聚合器。
    关键词:WebKit内核源代码,WebCore,Page,Frame,WebKit架构

    1. 概述

    浏览器的请求一般是以页面请求为单位,当用户通过网址栏输入一个url,浏览器就开始一个页面请求。而一个页面请求可能包含有一到多个页面子帧,以及图片、CSS和插件等派生子资源。Page类就是用来对应这样的页面请求。前进后退,导航,编辑,右键菜单,设置,Inspector等这些用户参与的动作,大部分是同Page相关的。而标记语言解析、排版、加载则更多地同Frame相关。
    我们通过几个图来看下Qt移植中Page类同应用之间的关系。

    QWebPage通过QWebPagePrivate维护Page类的指针,并在QWebPagePrivate的构造函数中实例化Page对象。QWebPage类通过之后的createMainFrame调用实例化QwebFrame,而在QwebFrameData的构造函数中,以Page指针为参数调用了Frame::create 创建出Frame对象。

    Page类通过组合其它类的方式,实现了很多功能,Page类本身并没有多少代码。

    2. 类关系

    2.1 PageGroup

    PageGroup并不是用来对Page进行管理的,而是设计用来将一些具有共同的属性或者设置的Page编成组的,以方便对这些属性进行管理。目前这样的属性包括localStorage的属性,IndexDB,User Script,User StyleSheet等。最常见的同PageGroup相关的操作是维护已访问链接(如addVisitedLink等接口)。根据地瓜的理解,假设WebKit内核之上架设多个应用(浏览器是一个应用),比较可能的是,一个应用独立一个PageGroup。这里同多tab页没有关系,多tab页属于同一个PageGroup。地瓜曾在mailing group上就这个问题咨询过,一位RIM的同学给我举了一个例子,比如一个基于WebKit的邮件程序,一方面他可能调用基于webkit的browser来显示网页,另外他本身也基于webkit来显示一些邮件,这两个之间的setting有很大可能不一样,他们就使用不同的PageGroup。

    PageGroup中有这个Group已经安装并且使用的User Script和User StyleSheet的集合,一般在网页解析完毕后,这些User Script和User StyleSheet会插入到Document中。
    PageGroup中还维护了Local Storage和Index DB相关的设置,比如它们的Path,上限等,通过GroupSettings类实现。
    PageGroup创建以后,每次创建一个新的Page对象,会通过addPage接口加入到这个PageGroup的m_pages中。

    每次有导航行为发生的时候,会调用addVisitedLink来将url加入到已访问链接中。如果浏览器要跟踪已访问的接口,则在初始化的时候必须调用PageGroup::setShouldTrackVisitedLinks,且参数为true。此处shouldTrackVisitedLinks是一个静态的全局变量,也就是说,所有应用维护一样的行为(一个应用将其设置为false会影响到其它同样基于此核的应用)?
    Page类中维护了PageGroup的指针,并提供了group接口,这是个lazy接口,如果m_group不存在,会调用InitGroup来创建一个。对于Page类来说,如果没有设置GroupName,则在初始化的时候会生成一个空GroupName的PageGroup,由m_singlePageGroup维护,并把指针赋给m_group,如果以非空的名字调用了setGroupName,则会重新创建PageGroup,此时这个PageGroup由m_group来维护。

    2.2 Setting

    WebCore中的设置相关的类,浏览器应用的不少配置、选项同该类相关,Qt移植中,应用在创建Page对象后,会根据Page::settings来实例化QwebSetting。

    2.3 Chrome

    原生窗口接口类,参考地瓜写的”WebKit中的Chrome和ChromeClient”。

    2.4 其它

    SelectionController:负责管理Page中的选取操作,绝大部分选取操作是基于Frame的,只在Frame的Selection为空的时候,对焦点游标的绘制工作才会使用到Page类的SelectionController。
    SharedGraphicsContext3D:共享3D图形上下文,为了优化2D显示而加入。在加速的2D canvas中,引入的DrawingBuffer的概念,SharedGraphicsContext3D提供了createDrawingBuffer来创建DrawingBuffer。
    DragController:拖拽控制器。Chrome的超级拖拽功能同这个有关?地瓜会在以后对此进行求证。
    FocusController:焦点控制器。考虑到焦点会在各个frame之间切换,所以由Page类维护焦点控制器最合适不过。
    ContextMenuController:右键下拉菜单控制器。
    InspectorController:Inspector控制器,浏览器中的很多开发工具都同这个类相关。
    GeolocationController:定位定位服务控制器。
    DeviceMotionController:设备移动控制器
    DeviceOrientationController:设备方向控制器
    SpeechInputClient:语音输入Client。
    ProgressTracker:进度跟踪。
    BackForwardController:前进后退操作控制。
    Frame:一个Page由至少一个主帧和若干个其它子帧构成。
    HistoryItem:历史记录。
    PluginData:插件相关,未来可能同PluginDatabase类合并。主要是初始化Plugin的信息。
    PluginHalter:用来控制Plugin的停止和重新开始。
    RenderTheme:这个类提供了控件的渲染和绘制接口。Qt移植中,RenderThemeQt是RenderTheme接口的具体实现。
    EditorClient:同编辑功能相关,比如拷贝、剪切、删除等操作。


     

    WebKit 内核源代码分析 ( 四 )

    摘要:本文介绍 WebCore 中 Loader 模块是如何加载资源的,分主资源和派生资源分析 loader 模块的类关系。
    关键词: WebKit,Loader,Network,ResouceLoader,SubresourceLoader

    一、类结构及接口

    Loader 模块是 Network 模块的客户。 Network 模块提供指定资源的获取和上传功能,获取的资源可能来自网络、本地文件或者缓存。对不同 HTTP 实现的适配会在 Network 层完成,所以 Loader 接触到的基本上是同 OS 和 HTTP 实现无关的 Network 层接口。

    如上是 Loader 和 NetWork 之间的类关系图, ResourceHandleClient 是 ResourceHandle 的客户,它定义一系列虚函数,这些虚函数是 ResouceHandle 的回调,继承类实现这些接口。
    ResouceHandleClient 的接口同网络传输过程息息相关,一般为某一个网络事件对应的回调。下面是其中的一些接口。

    复制代码
    // 一般情况下,在发起网络请求前调用,可以设置特定的 Http头部,比如 user agent 等,在重定向请求的时候,也会自动调用
    
    void willSendRequest(ResourceHandle*, ResourceRequest&, const ResourceResponse&)
    
    // 上传数据的时候,在 TCP wrtie 事件的时候,向对方发送数据的时候调用, loader 可以根据这个回调显示上传进度。
    
    void didSendData(ResourceHandle*, unsigned long long /*bytesSent*/, unsigned long long /*totalBytesToBeSent*/)
    
    // 收到第一个响应包,此时至少 http 的部分头部已经解析(如status code ), loader 根据响应的头部信息判断请求是否成功等。
    
    void didReceiveResponse(ResourceHandle*,const ResourceResponse&)
    
    // 收到 HTTP 响应数据,类似 tcp 的 read 事件,来 http 响应数据了, Network 的设计机制是来一段数据上传一段数据。
    
    void didReceiveData(ResourceHandle*, const char*, int,int /*lengthReceived*/)
    
    // 加载完成,数据来齐。
    
    void didFinishLoading(ResourceHandle*, double /*finishTime*/)
    
    // 加载失败
    
    void didFail(ResourceHandle*, const ResourceError&)
    
    // 要求用户鉴权
    
    void didReceiveAuthenticationChallenge(ResourceHandle*,const AuthenticationChallenge&)
    复制代码

     

    WebCore 把要加载的资源分成两类,一类是主资源,比如 HTML 页面,或者下载项,一类是派生资源,比如 HTML 页面中内嵌的图片或者脚本链接。这两类资源对于回调的处理有很大的不同,比如,同样是下载失败,主资源可能需要向用户报错,派生资源比如页面中的一张图下载失败,可能就是图不显示或者显示代替说明文字而已,不向用户报错。因此有了 MainResourceLoader 和 SubresourceLoader 之分。它们的公共基类 ResourceLoader 则完成一些两种资源下载都需要完成的操作,比如通过回调将加载进程告知上层应用。

    ResourceLoader 通过 ResourceNotifier 类将回调传导到 FrameLoaderClient 类。

    主资源的加载是立刻发起的,而派生资源则可能会为了优化网络,在队列中等待 ( 这里的立刻发起是 loader 层面的,不是 Network 层面的 ) 。 ResourceScheduler 这个类就是用来管理资源加载的调度。主要调度对象就是派生资源,会根据 host 来影响资源加载的先后顺序。

    主资源和派生资源的加载还有一个区别,主资源目前是没有缓存的,而派生资源是有缓存机制的。这里的缓存指的是 Resouce Cache ,用于保存原始数据(比如 CSS , JS 等),以及解码过的图片数据,通过 Resource Cache 可以节省网络请求和图片解码的时候。不同于 Page Cache , Page Cache 存的是 DOM 树和 Render 树的数据结构,用来在前进后退的时候快速显示页面。

    二、加载流程

    下图是加载 html 页面时,一个正常的加载流程。

    三、主资源加载过程

    1. DocumentLoader 调用 MainResourceLoader::load 向 loader 发起请求
    2. 调用 MainResourceLoader::loadNow
    3. 调用 MainResourceLoader::willSendRequest
    4. 调用 ResourceLoader::willSendRequest, 将 callback 通过 ResourceNotifier 传导给 FrameLoaderClient 。 Client 可以在回调中操作 ResourceRequest ,比如设置请求头部。
    5. 调用 PolicyChecker::checkNavigationPolicy 过滤掉重复请求等
    6. loader 调用 ResourceHandle::create 向 Network 发起加载请求
    7. 收到第一个 HTTP 响应数据包 ,Network 回调 MainResourceLoader::didReceiveResponse ,主要处理 HTTP 头部。
    8. 调用 PolicyChecker:: checkContentPolicy, 并最终通过 FrameLoaderClient 的 dispatchDecidePolicyForMIMEType 判断是否为下载请求(存在 "Content-Disposition"http 头部)
    9. 调用 MainResourceLoader::continueAfterContentPolicy ,根据 ResourceResponse 检测是否发生错误。
    10. 调用 ResourceLoader::didReceiveResponse ,将 callback 通过 ResourceNotifier 传导给 FrameLoaderClient 。
    11. 收到 HTTP 体部数据,调用 MainResourceLoader::didReceiveData
    12. 调用 ResourceLoader::didReceiveData ,将 callback 通过 ResourceNotifier 传导给 FrameLoaderClient
    13. 调用 MainResourceLoader::addData
    14. 调用 DocumentLoader::receivedData
    15. 调用 DocumentLoader::commitLoad
    16. 调用 FrameLoader::commitProvisionalLoad , FrameLoader 从 provisional 状态跃迁到 Committed 状态
    17. 调用 FrameLoaderClientQt::committedLoad
    18. 调用 DocumentLoader::commitData ,启动 Writer 对象来处理数据( DocumentWriter::setEncoding , DocumentWriter::addData )
    19. 调用 DocumentWriter::addData
    20. 调用 DocumentParser::appendByte
    21. 调用 DecodedDataDocumentParser::appendBytes 对文本编码进行解码
    22. 调用 HTMLDocumentParser::append ,进行 HTML 解析
    23. 数据来齐,调用 MainResourceLoader::didFinishLoading
    24. 调用 FrameLoader::finishedLoading
    25. 调用 DocumentLoader::finishedLoading
    26. 调用 FrameLoader::finishedLoadingDocument ,启动 writer 对象接收剩余数据,重复 19-22 进行解析
    27. 调用 DocumentWriter::end 结束接收数据(调用 Document::finishParsing )
    28. 调用 HTMLDocumentParser::finish

    四、派生资源加载流程

    在派生资源的加载中, SubresourceLoader 更多起到的是一个转发的作用,通过它的 client(SubresourceLoaderClient 类)来完成操作。



    各个加载阶段的处理在 SubresourceLoaderClient 的派生类 CachedResourceRequest,Loader,IconLoader 中完成。 Client 会创建 SubresourceLoader 。请求发起阶段, ResourceLoadScheduler 负责对 SubresourceLoader 进行调度。

    Document 类会创建 CachedResourceLoader 类的对象 m_cachedResourceLoader, 这个类 ( 对象 ) 提供了对 Document 的派生资源的访问接口 requestImage , requestCSSStyleSheet , requestUserCSSStyleSheet,requestScript,requestFont,requestXSLStyleSheet,requestLinkPrefetch。为了实现这些接口,CachedResourceLoader 需要创建 CachedResourceRequest 对象来发起请求。

    一般情况下,一个 Document 拥有一个 CachedResourceLoader 类实例。MemoryCache 类则对提供缓存条目的管理,可以方便地进行 add , remove ,缓存淘汰等。具体的缓存条目则是通过 CachedResource 类存储, MemoryCache 类维护了一个 HashMap 存储所有缓存条目。

    HashMap <String,CachedResource> m_resources;

     

    CachedResourceRequest 依赖于 CachedResource, 在 CacheResourceRequest 的构造函数中,会传入 CachedResource 对象作为参数。 CachedResource 既存储响应体部,也存储同 cache 相关的头部。在发起请求前,会检查是否有 cache 的 validator ,在收到响应的时候,则需要更新对应的头部。 CachedResource 类实现了 RFC2616 中的缓存一节。实际上 CachedResource 类真正完成了同网络的通信。 CachedResource 类根据申请的资源类型派生出不同的子类。

    CachedResource 类的使用者必须是 CachedResourceClient, 在这个类中维护了 CachedResourceClient 类的集合 m_clients 。每一个 Client 通过 addClient 和 removeClient 将自己加入到该类的 Client 集合中。CachedResourceClientWalker则提供了CachedResouceClient的一个遍历接口。当数据来齐的时候,CachedResource 类会通过 CachedResouceClient::notifyFinished 接口通知使用者。

    下图是 Image 元素对应的几个类关系。

    下面以 image 为例分析其加载过程

    1. 解析 html 页面的时候,解析到 img 标签,调用 HTMLImageElement::create 创建 HTMLImageElement 对象,该对象包含 HTMLImageLoader 对象 m_imageLoader
    2. 解析到 img 的 href 属性,调用 ImageLoader::updateFromElementIgnoringPreviousError
    3. 调用 ImageLoader::updateFromElement
    4. 调用 CachedResourceLoader::requestImage
    5. 调用 CachedResourceLoader::requestResource( 根据缓存的情况确定是否可以从缓存获取,或者需要 revalidate ,或者需要直接从网络获取 )
    6. 调用 CachedResourceLoader::loadResource
    7. 根据 Resource 的类型调用 createResource 创建对应的 CachedResource
    8. 调用 MemoryCache::add 在 cache 中查找是否有对应的 cache 条目,如果没有创建之
    9. 调用 CachedImage::load
    10. 调用 CachedResource::load
    11. 调用 CachedResourceLoader::load
    12. 调用 CachedResourceRequest::load
    13. 创建 CachedResourceRequest 对象,它将作为 SubresourceLoader 的 client
    14. 调用 ResourceLoaderScheduler::scheduleSubresourceLoad
    15. 调用 SubresourceLoader::create
    16. ResourceLoadScheduler::requestTimerFired
    17. 调用 ResourceLoader::start
    18. 调用 ResourceHandle::create 发起请求
    19. 收到 HTTP 响应头部,调用 ResourceLoader::didReceiveResponse
    20. 调用 SubresourceLoader::didiReceiveResponse
    21. 调用 CachedResourceRequest::didReceiveResponse 处理响应头部,特别是同缓存相关的头部,比如 304 的 status code
    22. 调用 ResourceLoader::didReceiveResponse
    23. 收到体部数据,调用 ResourceLoader::didReceiveData
    24. 调用 SubresourceLoader::didReceiveData
    25. 调用 ResourceLoader::didReceiveData
    26. 调用 ResourceLoader::addData 将数据存储到 SharedBuffer 里面
    27. 调用 CachedResourceRequest::didReceiveData
    28. 数据来齐 , 调用 ResourceLoader::didFinishLoading
    29. 调用 SubresourceLoader::didFinishLoading
    30. 调用 CachedResourceRequest::didFinishLoading
    31. 调用 CachedResource::finish
    32. 调用 CachedResourceLoader::loadDone
    33. 调用 CachedImage::data ,创建对应的 Image 对象,解码


     

    WebKit内核源代码分析(五)

    摘要:本文分析WebKit中html的解析过程,DOM节点树的建立。
    关键词:WebKit,html解析,html tree construction,WebCore,DOM节点树

    1. HTML解析模型

    图1 HTML解析模型图

    上图是HTML解析模型图,HTML解析分成Tokeniser和Tree Construction两个步骤,在”WebKit中的html词法分析”一文中,我们已经对Tokeniser这一步进行了分析,本文的目标是Tree Construction这一步。

    Tree Construction输入是token流,输出是DOM节点树。

    2. DOM树

    HTML DOM定义了一套标准来将html文档结构化,它定义了表示和修改文档所需的对象、这些对象的行为和属性以及对象之间的关系,可以把它理解为页面上数据和结构的一个树形表示。
    Node是DOM模型中的基础类,它可以分成13类(见NodeType),在HTML解析中,最常见的是Document,Element,Text三类。

    • Document是文档树的根节点,在HTML文档中,他派生为HTMLDocument。
    • 在文档中,所有的标签转化为Element类,一般它有标签名,并根据标签名继承为特定的子类。
    • Element之间的原始文本转化成Text类。

    以一个简单的html页面为例:

    复制代码
    <html>
    <head>
    <title>test</title>
    </head>
    <body>
    <h1>hl1</h1>
    <h2>hl2</h2>
    <h3>hl3</h3>
    </body>
    </html>
    复制代码

     经过解析后的节点树如下(忽略换行符):

    图2 HTML DOM节点树示例

    如果没有忽略换行符,则每个换行符就是一个Value为”\n”的Text节点。

    3. Tree Construction原理

    将图二中的节点树以WebKit中的类具体化(同样忽略换行符)。

    图3 Webkit HTML DOM节点树示例

    看到这里,你是不是觉得仿佛看到了一个呼之欲出的Tree Construction轮廓?是的,最简化的情况就是这样,根据输入的token,创建出相应的Element派生类,然后添加到DOM树中合适的位置,这就是Tree Construction干的事情。当然,添加到合适的位置,这个需要一系列复杂的规则,另外,WebKit将Render树的创建也放到了Tree Construction阶段中来,再加上CSS,Javascript,所以,这就是你看到的复杂的代码。

    放出两个函数原型,热热身,培养培养感情。

    PassRefPtr<Element> HTMLConstructionSite::createHTMLElement(AtomicHTMLToken& token);
    
    void HTMLConstructionSite::insertHTMLElement(AtomicHTMLToken& token);

    Tree Construction流程由一个状态“Insertion Mode”进行控制,它影响token的处理以及是否支持CDATA部分,HTML5中给出了详细的规则。它也控制了在特定状态下能够处理的token,比如在head里面,再出现head标签,显然是不应该处理的。

    4. 开放元素堆栈

    为了维护即将解析的标签同已解析的标签之间的关系(此时即将解析的标签还没有加入到DOM树中),引入了开放元素堆栈m_openElements,初始状态下,这个堆栈是空的,它是向下增长的,所以最上面的节点是最早加入到堆栈中的,在html文档中,最上面的节点就是html元素,最底部的节点就是最新加入到堆栈中的。Tree Builder的时候,每碰到一个StartTag的token,就会往m_opnElements中压栈,碰到EndTag的token,则出栈。像Character这样的token,则不需要进行压栈出栈的动作,只有可以包含子节点的tag,才做压栈出栈的动作。Html5的文档中对开放元素堆栈也有说明

    对于正在解析的token,除了根节点html,它必然是堆栈底部元素(m_openElements.top())的子节点,所以在形成DOM树的时候,就可以通过ContainerNode::parserAddChild这样的接口加入到DOM节点树中。除了正常的堆栈和压栈,对于html,head,body元素,栈结构(HTMLElementStack)中有专门的成员m_htmlElement,m_headElement,m_bodyElement记录,主要是用于检错纠错处理。

    在本文的html范例中,当解析到<h2>hl2</h2>的hl2这个character的token的时候,它的开放元素堆栈如下,HTMLHeadingElement是堆栈的top,所以它是hl2这个Text节点的parent。

    图4 开放元素堆栈示例

    此时的DOM节点树如下:

    图5 Webkit DOM节点数示例

    5. 元素的创建

    HTMLElementFactory类提供了元素的创建方法createHTMLElement。传入为对应的标签名,所属的document,所属的form(如果属于form),在parser的时候,最后一个参数为true。

    PassRefPtr<HTMLElement> HTMLElementFactory::createHTMLElement(const QualifiedName& qName, Document* document, HTMLFormElement* formElement, bool createdByParser);

     

    在HTMLElementFactory中,通过一个Hash Map将tag name和对应的元素构造函数对应起来(gFunctionMap)。tag一般对应一个派生于HTMLElement的类。如下是HTMLHeadingElement的类层次结构图。

    图6 HTMLHeadingElement类层次图

    6. 其它

    HTMLConstructionSite::attach中的attach一词,主要是attach到DOM节点数上,当然,它同时调用了Element::attach,Element类的attach主要是attach到Render树上,它会创建对应该Element的RendrObject。

    除了m_openElements,HTMLConstructionSite同时维护了Format元素列表m_activeFormattingElements,Formating元素就是那些格式化标签,包括a,b,big,code,em,font,I,fot,I,nobr,s,small,strike,strong,tt,u。为了处理这些Formatting元素的嵌套关系(此时它们可能不是父子关系,而是平级,不加入到m_openElements),HTML5引入了这个列表

    使用gdb调试的童子,可以运行Tools/gdb/webkit.py脚本,在print结构体的时候得到易于理解的表示,还可以打印出节点树,具体参考http://trac.webkit.org/wiki/GDB

    展开全文
  • WebKit内核源码分析_ALL

    2013-12-01 13:39:15
    WebKit内核源码分析_ALL
  • C# webkit内核的浏览器打开网页源码--值得下载 C# webkit内核的浏览器打开网页源码--值得下载
  • 这是一款由c#开发的 webkit 内核浏览器,经过再次开发后完全可以满足B/S架构的自定义任务。 已测试完全可以使用
  • C# webkit内核的浏览器打开网页源码(值得下载
  • C# webkit内核的浏览器打开网页源码2019
  • C#WinFrom窗体集成Webkit内核 webkit.net包+教程+源码 全包
  • 如需转载,请注明出处!... 这是一篇自己写于一年前的工作文档,分享出来。...WebKit是一个开源的浏览器网页排版引擎,包含WebCore排版引擎和JSCore引擎。 WebCore和JSCore引擎来自于KDE项目的KHTML和KJS开...

    如需转载,请注明出处! WebSite: http://www.jjos.org/ 作者: 姜江 linuxemacs@gmail.com QQ: 457283

    这是一篇自己写于一年前的工作文档,分享出来。

    一、WebKit简介

    WebKit是一个开源的浏览器网页排版引擎,包含WebCore排版引擎和JSCore引擎。
    WebCore和JSCore引擎来自于KDE项目的KHTML和KJS开源项目。Android平台的Web
    引擎框架采用了WebKit项目中的WebCore和JSCore部分,上层由Java语言封装,并且作
    为API提供给Android应用开发者,而底层使用WebKit核心库(WebCore和JSCore)进行
    网页排版。

    二、WebKit目录结构

     

    Android平台的WebKit模块分成JavaWebKit库两个部分,其目录结构如下表所示:

    WebKit模块目录结构

    Java层(根目录device\java\android\android\webkit

    BrowserFrame.java

    BrowserFrame对象是对WebCore库中的Frame对象的Java层封装,用于创建WebCore中定义的Frame,以及为该Frame对象提供Java层回调方法。

    ByteArrayBuilder.java

    ByteArrayBuilder辅助对象,用于byte块链表的处理。

    CachLoader.java

    URL Cache载入器对象,该对象实现StreadLoader抽象基类,用于通过CacheResult对象载入内容数据。

    CacheManager.java

    Cache管理对象,负责JavaCache对象管理

    CacheSyncManager.java

    Cache同步管理对象,负责同步RAMFLASH之间的浏览器Cache数据。实际的物理数据操作在WebSyncManager对象中完成。

    CallbackProxy.java

    该对象是用于处理WebCoreUI线程消息的代理类。当有Web事件产生时WebCore线程会调用该回调代理类,代理类会通过消息的方式通知UI线程,并且调用设置的客户对象的回调函数。

    CellList.java

    CellList定义图片集合中的Cell,管理Cell图片的绘制、状态改变以及索引。

    CookieManager.java

    根据RFC2109规范,管理cookies

    CookieSyncManager.java

    Cookies同步管理对象,该对象负责同步RAMFlash之间的Cookies数据。实际的物理数据操作在基类WebSyncManager中完成。

    DataLoader.java

    数据载入器对象,用于载入网页数据。

    DateSorter.java

    尚未使用

    DownloadListener.java

    下载侦听器接口

    DownloadManagerCore.java

    下载管理器对象,管理下载列表。该对象运行在WebKit的线程中,通过CallbackProxy对象与UI线程交互。

    FileLoader.java

    文件载入器,将文件数据载入到Frame中。

    FrameLoader.java

    Frame载入器,用于载入网页Frame数据

    HttpAuthHandler.java

    Http认证处理对象,该对象会作为参数传递给BrowserCallback.displayHttpAuthDialog方法,与用户交互。

    HttpDataTime.java

    该对象是处理HTTP日期的辅助对象。

    JsConfirmResult.java

    Js确认请求对象

    JsPromptResult.java

    Js结果提示对象,用于向用户提示Javascript运行结果。

    JsResult.java

    Js结果对象,用于用户交互

    JWebCoreJavaBridge.java

    JavaWebCore库中TimerCookies对象交互的桥接代码。

    LoadListener.java

    载入器侦听器,用于处理载入器侦听消息。

    Network.java

    该对象封装网络连接逻辑,为调用者提供更为高级的网络连接接口。

    PanZoom.java

    用于处理图片缩放、移动等操作

    PanZoomCellList.java

    用于保存移动、缩放图片的Cell

    PerfChecker.java

    用于效率测试的功能对象???

    SslErrorHandler.java

    用于处理SSL错误消息。

    StreamLoader.java

    StreamLoader抽象类是所有内容载入器对象的基类。该类是通过消息方式控制的状态机,用于将数据载入到Frame中。

    TextDialog.java

    用于处理html中文本区域叠加情况,可以使用标准的文本编辑而定义的特殊EditText控件。

    URLUtil.java

    URL处理功能函数,用于编码、解码URL字符串,以及提供附加的URL类型分析功能。

    WebBackForwardList.java

    该对象包含WebView对象中显示的历史数据。

    WebBackForwardListClient.java

    浏览历史处理的客户接口类,所有需要接收浏览历史改变的类都需要实现该接口。

    WebChromeClient.java

    Chrome客户基类,Chrome客户对象在浏览器文档标题、进度条、图标改变时候会得到通知。

    WebHistoryItem.java

    该对象用于保存一条网页历史数据

    WebIconDataBase.java

    图表数据库管理对象,所有的WebView均请求相同的图标数据库对象。

    WebSettings.java

    WebView的管理设置数据,该对象数据是通过JNI接口从底层获取。

    WebSyncManager.java

    数据同步对象,用于RAM数据和FLASH数据的同步操作。

    WebView.java

    Web视图对象,用于基本的网页数据载入、显示等UI操作。

    WebViewClient.java

    Web视图客户对象,在Web视图中有事件产生时,该对象可以获得通知。

    WebViewCore.java

    该对象对WebCore库进行了封装,将UI线程中的数据请求发送给WebCore处理,并且通过CallbackProxy的方式,通过消息通知UI线程数据处理的结果。

    WebViewDatabase.java

    该对象使用SQLiteDatabaseWebCore模块提供数据存取操作。

     

    三、WebKit模块框架

    Android平台的WebKit模块由Java层和WebKit库两个部分组成,Java层负责与Android应用程序进行通信,而WebKit类库负责实际的网页排版处理。Java层和C层库之间通过JNIBridge相互调用,如下图所示:

     

     

     

     

     

    3.1 Java层框架

    3.1.1 主要类关系

    WebKit模块的Java层一共由41个文件组成,其中主要的类关系如下图所示:

     

     

    1. WebView

    WebView类是WebKit模块Java层的视图类,所有需要使用Web浏览功能的Android应用程序都要创建该视图对象显示和处理请求的网络资源。目前,WebKit模块支持HTTPHTTPSFTP以及javascript请求。WebView作为应用程序的UI接口,为用户提供了一系列的网页浏览、用户交互接口,客户程序通过这些接口访问WebKit核心代码。

    1. WebViewDatabase

    WebViewDatabaseWebKit模块中针对SQLiteDatabase对象的封装,用于存储和获取运行时浏览器保存的缓冲数据、历史访问数据、浏览器配置数据等。该对象是一个单实例对象,通过getInstance方法获取WebViewDatabase的实例。WebViewDatabaseWebKit模块中的内部对象,仅供WebKit框架内部使用。

    1. WebViewCore

    WebViewCore类是Java层与CWebKit核心库的交互类,客户程序调用WebView的网页浏览相关操作会转发给BrowserFrame对象。当WebKit核心库完成实际的数据分析和处理后会回调WebViweCore中定义的一系列JNI接口,这些接口会通过CallbackProxy将相关事件通知相应的UI对象。

    1. CallbackProxy

    CallbackProxy是一个代理类,用于UI线程和WebCore线程交互。该类定义了一系列与用户相关的通知方法,当WebCore完成相应的数据处理,则会调用CallbackProxy类中对应的方法,这些方法通过消息方式间接调用相应处理对象的处理方法。详细的处理流程在下文中会具体分析。

    1. BrowserFrame

    BrowserFrame类负责URL资源的载入、访问历史的维护、数据缓存等操作,该类会通过JNI接口直接与WebKit C层库交互。

    1. JWebCoreJavaBridge

    该类为JavaWebKit代码提供与CWebKit核心部分的TimerCookies操作相关的方法。

    1. DownloadManagerCore

    下载管理核心类,该类负责管理网络资源下载,所有的Web下载操作均有该类同一管理。该类实例运行在WebKit线程当中,与UI线程的交互是通过调用CallbackProxy对象中相应的方法完成。

    1. WebSettings

    该对象描述了WEB浏览器访问相关的用户配置信息。

    1. DownloadListener

    下载侦听接口,如果客户代码实现该接口,则在下载开始、失败、挂起、完成等情况下,DownloadManagerCore对象会调用客户代码中实现的DwonloadListener方法。

    1. WebBackForwardList

    WebBackForwarList对象维护着用户访问历史记录,该类为客户程序提供操作访问浏览器历史数据的相关方法。

    1. WebViewClient

    WebViewClient类定义了一系列事件方法,如果Android应用程序设置了WebViewClient派生对象,则在页面载入、资源载入、页面访问错误等情况发生时,该派生对象的相应方法会被调用。

    1. WebBackForwardListClient

    WebBackForwardListClient对象定义了对访问历史操作时可能产生的事件接口,当用户实现了该接口,则在操作访问历史时(访问历史移除、访问历史清空等)用户会得到通知。

    1. WebChromeClient

    WebChromeClient类定义了与浏览窗口修饰相关的事件。例如接收到Title、接收到Icon、进度变化时,WebChromeClient的相应方法会被调用。

     

     

    3.1.2 主要类的设计

    3.1.2.1 数据载入器的设计

    WebKit模块的Java部分框架中使用数据载入器来加载相应类型的数据,目前有CacheLoaderDataLoader以及FileLoader三类载入器,他们分别用于处理缓存数据、内存据,以及文件数据的载入操作。Java层(WebKit模块)所有的载入器都从StreamLoader继承(其父类为Handler),由于StreamLoader类的基类为Handler类,因此在构造载入器时,会开启一个事件处理线程,该线程负责实际的数据载入操作,而请求线程通过消息的方式驱动数据的载入。下图是数据载入器相关类的类图结构:

    StreamLoader类定义了4个不同的消息(MSG_STATUSMSG_HEADERSMSG_DATAMSG_END),分别表示发送状态消息、发送消息头消息、发送数据消息以及数据发送完毕消息。该类提供了2个抽象保护方法以及一个共有方法:setupStreamAndSendStatus保护方法主要是用于构造与通信协议相关的数据流,以及向LoadListener发送状态。buildHeaders方法是向子类提供构造特定协议消息头功能。所有载入器只有一个共有方法(load),因此当需要载入数据时,调用该方法即可。与数据载入流程相关的类还有LoaderListener以及BrowserFrame,当数据载入事件发生时, WebKit C库会更新载入进度,并且会通知BrowserFrameBroserFrame接收到进度条变更事件后会通过CallbackProxy对象,通知View类进度条数据变更。下面以DataLoader类为例子,说明数据载入以及与UI交互过程:

    上图中绿色部分是BrowserFrame处理进度变更事件时,调用CallbackProxy对象通知视图变更状态的操作,在这里省略。途中灰色部分表示C层代码,而白色部分表示Java层代码。

     

     

    3.2 C层框架

    3.2.1 C类与Java类的关系

    1BrowserFrame

    BrowserFrame Java类相对应的C++类为FrameBridge,该类为Dalvik虚拟机回调BrowserFrame类中定义的本地方法进行了封装。与BrowserFrame中回调函数(Java层)相对应的C层结构定义如下:

     

    该结构作为FrameBridgeC层)的一个成员变量(mJavaFrame),在FrameBridge构造函数中,用BrowserFrameJava层)类的回调方法的偏移量初始化JavaBrowserFrame结构的各个域。初始后,当WebCoreC层)在剖析网页数据时,有Frame相关的资源改变,比如WEB页面的主题变化,则会通过mJavaFrame结构,调用指定BrowserFrame对象的相应方法,通知Java层处理。

    2JWebCoreJavaBridge

    与该对象相对应的C层对象为JavaBridgeJavaBridge对象继承了TimerClientCookieClient类,负责WebCore中的定时器和Cookie管理。与JavaJWebCoreJavaBridge类中方法偏移量相关的是JavaBridege中几个成员变量,在构造JavaBridge对象时,会初始化这些成员变量,之后有Timer或者Cookies事件产生,WebCore会通过这些ID值,回调对应JWebCoreJavaBridge的相应方法。

    3LoadListener

    与该对象相关的C层结构是struct resourceloader_t,该结构保存了LoadListener对象IDCancelMethod ID以及DownloadFiledMethod ID值。当有Cancel或者Download事件产生,WebCore会回调LoadListener类中的CancelMethod或者DownloadFileMethod

    4WebViewCore

    WebViewCore相关的C类是WebCoreViewImplWebViewCoreImpl类有个JavaGlue对象作为成员变量,在构建WebCoreViewImpl对象时,用WebViewCoreJava层)中的方法ID值初始化该成员变量。并且会将构建的WebCoreViewImpl对象指针复制给WebViewCoreJava层)的mNativeClass,这样将WebViewCoreJava层)和WebViewCoreImpleC层)关联起来。

    5WebSettings

    WebSettings相关的C层结构是struct FieldIds,该结构保存了WebSettings类中定义的属性ID以及方法ID,在WebCore初始化时(WebViewCore的静态方法中使用System.loadLibrary载入)会设置这些方法和属性的ID值。

    6WebView

    WebView相关的C层类是WebViewNative,该类中的mJavaGlue中保存着WebView中定义的属性和方法ID,在WebViewNative构造方法中初始化,并且将构造的WebViewNative对象的指针,赋值给WebView类的mNativeClass变量,这样WebViewWebViewNative对象建立了关系。

    3.2.2 主要类关系

    Java层相关的C层类如下表所示:

    功能描述

    ChromeClientAndroid

    该类主要处理WebCore中与Frame装饰相关的操作。例如设置状态栏、滚动条、Javascript脚本提示框等。当浏览器中有相关事件产生,ChromeClientAndroid类的相应方法会被调用,该类会将相关的UI事件通过Bridge传递给Java层,由Java层负责绘制以及用户交互方面的处理。

    EditorClientAndroid

    该类负责处理页面中文本相关的处理,比如文本输入、取消、输入法数据处理、文本黏贴、文本编辑等操作。不过目前该类只对按键相关的时间进行了处理,其他操作均未支持。

    ContextMenuClient

    该类提供页面相关的功能菜单,比如图片拷贝、朗读、查找等功能。但是,目前项目中未实现具体功能。

    DragClient

    该类定义了与页面拖拽相关的处理,但是目前该类没有实现具体功能。

    FrameLoaderClientAndroid

    该类提供与Frame加载相关的操作,当用户请求加载一个页面时,WebCore分析完网页数据后,会通过该类调用Java层的回调方法,通知UI相关的组件处理。

    InspectorClientAndroid

    该类提供与窗口相关的操作,比如窗口显示、关闭窗口、附加窗口等。不过目前该类的各个方法均为空实现。

    Page

    该类提供与页面相关的操作,比如网页页面的前进、后退等操作。

    FrameAndroid

    该类为Android提供Frame管理。

    FrameBridge

    该类对Frame相关的Java层方法进行了封装,当有Frame事件产生时,WebCore通过FrameBridge回调Java的回调函数,完成用户交互过程。

    AssetManager

    该类为浏览器提供本地资源访问功能。

    RenderSkinAndroid

    该类与控件绘制相关,所有的须绘制控件都需要从该类派生,目前WebKit模块中有ButtonComboRadio三类控件。

     

    以上几个类会在Java层请求创建Web Frame的时候被建立,他们的关系如下图所示:

    上图中标注为深绿色的FrameAndroid是浏览器Frame,一个BrowserFrame对象对应着一个FrameAndroid对象。而其他8个标注为淡绿色的类,是与该Frame显示、布局等相关的类。WebKit模块中所有WebCore核心代码与用户交互的操作使用FrameAndroid对象中的Bridge处理(回调相应的Java方法)。

     

     

     

     

    四、基本操作分析

    4.1 WebKit模块初始化

    Android SDK中提供了WebView类,该类为客户提供客户化浏览显示的功能,如果客户需要加入浏览器的支持,可将该类的实例或者派生类的实例作为视图,调用Activity类的setContentView显示给用户。当客户代码中生成第一次生成WebView对象时,会初始化WebKit库(包括Java层和C层两个部分),之后用户可以操作WebView对象完成网络或者本地资源的访问。

    WebView对象的生成主要涉及3个类CallbackProxyWebViewCore以及WebViewDatabase。其中CallbackProxy对象为WebKit模块中UI线程和WebKit类库提供交互功能,WebViewCoreWebKit的核心层,负责与C层交互以及WebKit模块C层类库初始化,而WebViewDatabaseWebKit模块运行时缓存、数据存储提供支持。WebKit模块初始化流程如下:

    WebView

    +–创建CallbackProxy对象

    +–创建WebViewCore对象

    1–调用System.loadLibrary载入webcore相关类库(C层)

    2–如果是第一次初始化WebViewCore对象,创建WebCoreTherad线程

    3–创建EventHub对象,处理WebViewCore事件

    4–获取WebIconDatabase对象实例

    5–WebCoreThread发送初始化消息

    +–获取WebViewDatabase实例

    如上所叙,第一步调用System.loadLibrary方法载入webcore相关类库,该过程由Dalvik虚拟机完成,它会从动态链接库目录中寻找libWebCore.so类库,载入到内存中,并且调用WebKit初始化模块的JNI_OnLoad方法。WebKit模块的JNI_OnLoad方法中完成了如下初始化操作:

    a) 初始化framebridge[register_android_webcore_framebridge]

    初始化gFrameAndroidField静态变量,以及注册BrowserFrame类中的本地方法表。

    b) 初始化javabridge[register_android_webcore_javabridge]

    初始化gJavaBridge.mObject对象,以及注册JWebCoreJavaBridge类中的本地方法

    c) 初始化资源loader[register_android_webcore_resource_loader]

    初始化gResourceLoader静态变量,以及注册LoadListener类的本地方法

    d) 初始化webviewcore[register_android_webkit_webviewcore]

    初始化gWebCoreViewImplField静态变量,以及注册WebViewCore类的本地方法

    e) 初始化webhistory[register_android_webkit_webhistory]

    初始化gWebHistoryItem结构,以及注册WebBackForwardListWebHistoryItem类的本地方法

    f) 初始化webicondatabase[register_android_webkit_webicondatabase]

    注册WebIconDatabase类的本地方法

    g) 初始化websettings[register_android_webkit_websettings]

    初始化gFieldIds静态变量,以及注册WebSettings类的本地方法

    h) 初始化webview[register_android_webkit_webview]

    初始化gWebViewNativeField静态变量,以及注册WebView类的本地方法

    第二步是WebCoreThread初始化,该初始化只在第一次创建WebViewCore对象时完成,当用户代码第一次生成WebView对象,会在初始化WebViewCore类时创建WebCoreThread线程,该线程负责处理WebCore初始化事件。此时WebViewCore构造函数会被阻塞,直到一个WebView初始化请求完毕时,会在WebCoreThread线程中唤醒。

    第三步创建EventStub对象,该对象处理WebView类的事件,当WebCore初始化完成后会向WebView对象发送事件,WebView类的EventStub对象处理该事件,并且完成后续初始化工作。

    第四步获取WebIconDatabase对象实例。

    第五步向WebViewCore发送INITIALIZE事件,并且将this指针作为消息内容传递。WebView类主要负责处理UI相关的事件,而WebViewCore主要负责与WebCore库交互。在运行时期,UI线程和WebCore数据处理线程是运行在两个独立的线程当中。WebCoreThread线程接收到INITIALIZE线程后,会调用消息对象参数的initialize方法,而后唤醒阻塞的WebViewCore Java线程(该线程在WebViewCore的构造函数中被阻塞)。不同的WebView对象实例有不同的WebViewCore对象实例,因此通过消息的方式可以使得UI线程和WebViewCore线程解耦合。WebCoreThread的事件处理函数,处理INITIALIZE消息时,调用的是不同WebViewWebViewCore实例的initialize方法。WebViewCore类中的initialize方法中会创建BrowserFrame对象(该对象管理整个WEB窗体,以frame相关事件),并且向WebView对象发送WEBCORE_INITIALIZED_MSG_ID消息。WebView消息处理函数,会根据消息参数1初始化指定的WebViewCore对象,并且更新WebViewCoreFrame缓冲。

    初始化过程的序列图如下图所示:

    初始化完成后Java层和C层类图关系如下图所示

    上图中淡绿色的类表示Java层,而灰色类表示C层。

     

     

    4.2 数据载入

    4.2.1 载入网络数据

    客户代码中可以使用WebView类的loadUrl方法,请求访问指定的URL网页数据。WebView对象中保存着WebViewCore的引用,由于WebView属于UI线程,而WebViewCore属于后台线程,因此WebView对象的loadUrl被调用时,会通过消息的方式将URL信息传递给WebViewCore对象,该对象会调用成员变量mBrowserFrameloadUrl方法,进而调用WebKit库完成数据的载入。其调用函数序列如下所示:

    网络数据的载入分别由Java层和C层共同完成,Java层完成用户交互、资源下载等操作,而C层主要完成数据分析(建立DOM树、分析页面元素等)操作。由于UI线程和WebCore线程运行在不同的两个线程中,因此当用户请求访问网络资源时,通过消息的方式向WebViewCore对象发送载入资源请求。在Java层的WebKit模块中,所有与资源载入相关的操作都是由BrowserFrame类中对应的方法完成,这些方法是本地方法,会直接调用WebCore库的C层函数完成数据载入请求,以及资源分析等操作。如上图所示,C层的FrameLoader类是浏览框架的资源载入器,该类负责检查访问策略以及向Java层发送下载资源请求等功能。在FrameLoader中,当用户请求网络资源时,经过一系列的策略检查后会调用FrameBridgestartLoadingResource方法,该方法会回调BrowserFrameJava)类的startLoadingResource方法,完成网络数据的下载,而后BrowserFrameJava)类的startLoadingResource方法会返回一个LoadListener的对象,FrameLoader会删除原有的FrameLoader对象,将LoadListener对象封装成ResourceLoadHandler对象,并且将其设置为新的FrameLoader。到此完成了一次资源访问请求,接下来的任务即是WebCore库会根据资源数据进行分析和构建DOM,以及相关的数据结构。

     

    4.2.2 载入本地数据

    本地数据是以data://开头的URL表示,载入过程和网络数据一样,只不过在执行FrameLoader类的executeLoad方法时,会根据URLSCHEME类型区分,调用DataLoaderrequestUrl方法(参看3.1.2.1节对载入器的分析),而不是调用handleHTTPLoad建立实际的网络通信连接。

    4.2.3 载入文件数据

    文件数据是以file://开头的URL,载入的基本流程与网络数据载入流程基本一致,不同的是在运行FrameLoader类的executeLoad方法时,根据SCHEME类型,调用FileLoaderrequestUrl方法,完成数据加载(参看3.1.2.1节对载入器的分析)。

    4.3 刷新绘制

    当用户拖动滚动条、有窗口遮盖、或者有页面事件触发都会向WebViewCoreJava层)对象发送背景重绘消息,该消息会引起网页数据的绘制操作。WebKit的数据绘制可能出于效率上的考虑,没有通过Java层,而是直接在C层使用SGL库完成。与Java层图形绘制相关的Java对象有如下几个:

    1. Picture

    该类对SGL封装,其中变量mNativePicture实际上是保存着SkPicture对象的指针。WebViewCore中定义了两个Picture对象,当作双缓冲处理,在调用webKitDraw方法时,会交换两个缓冲区,加速刷新速度。

    1. WebView

    该类接受用户交互相关的操作,当有滚屏、窗口遮盖、用户点击页面按钮等相关操作时,WebView对象会与之相关的WebViewCore对象发送VIEW_SIZE_CHANGED消息。当WebViewCore对象接收到该消息后,将构建时建立的mContentPictureB刷新到屏幕上,然后将mContentPictureA与之交换。

    1. WebViewCore

    该类封装了WebKit C层代码,为视图类提供对WebKit的操作接口,所有对WebKit库的用户请求均由该类处理,并且该类还为视图类提供了两个Picture对象,用于图形数据刷新。

    下面以Web页面被鼠标拖拽的情况为例子,分析网页数据刷新过程。当用户使用手指点击触摸屏,并且移动手指,则会引发touch事件的产生,Android平台会将touch事件传递给最前端的视图相应(dispatchTouchEvent方法处理)。在WebView类中定义了5touch模式,在手指拖动Web页面的情况下,会触发mMotionDragMode,并且会调用View类的scrollBy方法,触发滚屏事件以及使视图无效(重绘,会调用ViewonDraw方法)。WebView视图中的滚屏事件由onScrollChanged方法响应,该方法向WebViewCore对象发送SET_VISIBLE_RECT事件。

    WebViewCore对象接收到SET_VISIBLE_RECT事件后,将消息参数中保存的新视图的矩形区域大小传递给nativeSetVisibleRect方法,通知WebCoreViewImpl对象(C层)视图矩形变更(WebCoreViewImpl::setVisibleRect方法)。在setVisibleRect方法中,会通过虚拟机调用WebViewCorecontentInvalidate方法,该方法会引发webkitDraw方法的调用(通过WEBKIT_DRAW消息)。在webkitDraw方法里,首先会将mContentPictureB对象传递给本地方法nativeDraw绘制,而后将mContentPictureB的内容与mContentPictureA的内容对调。在这里mContentPictureA缓冲区是供给WebViewCoredraw方法使用,如果用户选择某个控件,绘制焦点框时候WebViewCore对象的draw方法会调用,绘制的内容保存在mContentPictureA中,之后会通过Canvas对象(Java层)的drawPicture方法将其绘制到屏幕上,而mContentPictureB缓冲区是用于built操作的,nativeDraw方法中首先会将传递的mContentPictureB对象数据重置,而后在重新构建的mContentPictureB画布上,将层上相关的元素绘制到该画布上。上面提到,之后会将mContentPictureBmContentPictureA的内容对调,这样一次重绘事件产生时(会调用WebView.onDraw方法)会将mContentPictureA的数据使用Canvas类的drawPicture绘制到屏幕上。当webkitDraw方法将mContentPictureAmContentPictureB指针对调后,会向WebView对象发送NEW_PICTURE_MSG_ID消息,该消息会引发WebViewCoreVIEW_SIZE_CHANGED消息的产生,并且会使当前视图无效产生重绘事件(invalidate()),引发onDraw方法的调用,完成一次网页数据的绘制过程。

    转载于:https://www.cnblogs.com/sunfb/p/3154997.html

    展开全文
  • C# webkit内核的浏览器打开网页源码
  • wke.dll是国内大神封装的webkit,体积算是极小的,另外upx压缩下才3M多,不可多得的好东西哦,只是版本旧了些。
  • .NET webkit内核的浏览器打开网页源码
  • C# webkit内核的浏览器打开网页源码__(0521).rar
  • 简简单单的一个例程,需要调用第三方接口库,毫无技术含量,尽演示了这个库的调用格式和一些基本原理,源码在调试有时可能不能运行,编译试试,详情请参考引擎官网提供的源码例程.
  • 本系列通过分析WebKit的源代码,试图分析WebKit内核设计架构,模块之间的关系,分析的时候以QT的移植为参考,涉及移植的东西不多,主要还是以内核为主。在分析内核的时候,Frame是首当其冲的一个类,本文将分析...
  • webkit内核源码分析三

    2011-10-13 16:10:18
    摘要:浏览器的请求一般是以页面请求为单位,当用户通过网址栏输入一个url,浏览器就开始一个页面请求。而一个页面请求可能包含有一到多个页面子帧,以及...Page类是WebKit中非常重要的一个类,它就像内核对外的一个

    摘要:浏览器的请求一般是以页面请求为单位,当用户通过网址栏输入一个url,浏览器就开始一个页面请求。而一个页面请求可能包含有一到多个页面子帧,以及图片、CSS和插件等派生子资源。Page类就是用来对应这样的页面请求。Page类是WebKit中非常重要的一个类,它就像内核对外的一个聚合器。

    关键词:WebKit内核源代码,WebCore,Page,FrameWebKit架构

    1.概述

    浏览器的请求一般是以页面请求为单位,当用户通过网址栏输入一个url,浏览器就开始一个页面请求。而一个页面请求可能包含有一到多个页面子帧,以及图片、CSS和插件等派生子资源。Page类就是用来对应这样的页面请求。前进后退,导航,编辑,右键菜单,设置,Inspector等这些用户参与的动作,大部分是同Page相关的。而标记语言解析、排版、加载则更多地同Frame相关。

    我们通过几个图来看下Qt移植中Page类同应用之间的关系。

    WebKit内核源代码分析(三)
    QWebPage通过QWebPagePrivate维护Page类的指针,并在QWebPagePrivate的构造函数中实例化Page对象。QWebPage类通过之后的createMainFrame调用实例化QwebFrame,而在QwebFrameData的构造函数中,以Page指针为参数调用了Frame::create 创建出Frame对象。

    WebKit内核源代码分析(三)
    Page类通过组合其它类的方式,实现了很多功能,Page类本身并没有多少代码。

    2.类关系

    WebKit内核源代码分析(三)

    2.1PageGroup

    PageGroup并不是用来对Page进行管理的,而是设计用来将一些具有共同的属性或者设置的Page编成组的,以方便对这些属性进行管理。目前这样的属性包括localStorage的属性,IndexDBUserScriptUserStyleSheet等。最常见的同PageGroup相关的操作是维护已访问链接(如addVisitedLink等接口)。根据地瓜的理解,假设WebKit内核之上架设多个应用(浏览器是一个应用),比较可能的是,一个应用独立一个PageGroup。这里同多tab页没有关系,多tab页属于同一个PageGroup。地瓜曾在mailinggroup上就这个问题咨询过,一位RIM的同学给我举了一个例子,比如一个基于WebKit的邮件程序,一方面他可能调用基于webkitbrowser来显示网页,另外他本身也基于webkit来显示一些邮件,这两个之间的setting有很大可能不一样,他们就使用不同的PageGroup

    PageGroup中有这个Group已经安装并且使用的UserScriptUserStyleSheet的集合,一般在网页解析完毕后,这些UserScriptUserStyleSheet会插入到Document中。

    PageGroup中还维护了LocalStorageIndexDB相关的设置,比如它们的Path,上限等,通过GroupSettings类实现。

    PageGroup创建以后,每次创建一个新的Page对象,会通过addPage接口加入到这个PageGroupm_pages中。

    每次有导航行为发生的时候,会调用addVisitedLink来将url加入到已访问链接中。如果浏览器要跟踪已访问的接口,则在初始化的时候必须调用PageGroup::setShouldTrackVisitedLinks,且参数为true。此处shouldTrackVisitedLinks是一个静态的全局变量,也就是说,所有应用维护一样的行为(一个应用将其设置为false会影响到其它同样基于此核的应用)?

    Page类中维护了PageGroup的指针,并提供了group接口,这是个lazy接口,如果m_group不存在,会调用InitGroup来创建一个。对于Page类来说,如果没有设置GroupName,则在初始化的时候会生成一个空GroupNamePageGroup,由m_singlePageGroup维护,并把指针赋给m_group,如果以非空的名字调用了setGroupName,则会重新创建PageGroup,此时这个PageGroupm_group来维护。

    2.2Setting

    WebCore中的设置相关的类,浏览器应用的不少配置、选项同该类相关,Qt移植中,应用在创建Page对象后,会根据Page::settings来实例化QwebSetting

    2.3Chrome

    原生窗口接口类,参考地瓜写的”WebKit中的ChromeChromeClient”

    2.4其它

    SelectionController:负责管理Page中的选取操作,绝大部分选取操作是基于Frame的,只在FrameSelection为空的时候,对焦点游标的绘制工作才会使用到Page类的SelectionController

    SharedGraphicsContext3D:共享3D图形上下文,为了优化2D显示而加入。在加速的2Dcanvas中,引入的DrawingBuffer的概念,SharedGraphicsContext3D提供了createDrawingBuffer来创建DrawingBuffer

    DragController:拖拽控制器。Chrome的超级拖拽功能同这个有关?地瓜会在以后对此进行求证。

    FocusController:焦点控制器。考虑到焦点会在各个frame之间切换,所以由Page类维护焦点控制器最合适不过。

    ContextMenuController:右键下拉菜单控制器。

    InspectorController:Inspector控制器,浏览器中的很多开发工具都同这个类相关。

    GeolocationController:定位定位服务控制器。

    DeviceMotionController:设备移动控制器

    DeviceOrientationController:设备方向控制器

    SpeechInputClient:语音输入Client

    ProgressTracker:进度跟踪。

    BackForwardController:前进后退操作控制。

    Frame:一个Page由至少一个主帧和若干个其它子帧构成。

    HistoryItem:历史记录。

    PluginData:插件相关,未来可能同PluginDatabase类合并。主要是初始化Plugin的信息。

    PluginHalter:用来控制Plugin的停止和重新开始。

    RenderTheme:这个类提供了控件的渲染和绘制接口。Qt移植中,RenderThemeQtRenderTheme接口的具体实现。

    EditorClient:同编辑功能相关,比如拷贝、剪切、删除等操作。


    展开全文
  • 本系列通过分析WebKit的源代码,试图分析WebKit内核设计架构,模块之间的关系,分析时以QT的移植为参考,涉及移植的东西不多,主要还是以内核为主。FrameLoader类负责一个Frame的加载,在Frame的流程中起到非常...
  • WebKit 开源浏览器内核 源代码 完整版
  • 研究Webkit内核已经有一段时间了,在这期间我花了很多时间去研读webkit代码,并在网上查阅了不少的资料。在这之后,我开始尝试对Webkit内核进行剪裁,以便得到自己所需的部分。俗语有言,“独学而无友 则孤陋而寡闻...
  • 一、前言 移动互联网时代,网页依旧是内容展示的重要媒介,这离不开 WebKit 浏览内核技术的支持与发展。在 iOS 平台下开发者们需要通过 WKWebView 框架来与 WebKit 打交道。...内核源码复杂难懂:动辄几
  • webkit内核源码分析一

    2011-10-13 16:08:08
    摘要:本系列通过分析WebKit的源代码,试图分析WebKit内核设计架构,模块之间的关系,分析的时候以Qt的移植为参考,涉及移植的东西不多,主要还是以内核为主。在分析内核的时候,Frame是首当其冲的一个类,本文将...
  • 研究Webkit内核已经有一段时间了,在这期间我花了很多时间去研读webkit代码,并在网上查阅了不少的资料。在这之后,我开始尝试对Webkit内核进行剪裁,以便得到自己所需的部分。 俗语有言,“独学而无友 则孤陋而...
  • C# webkit内核的浏览器打开网页源码(0515).rar

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,695
精华内容 3,078
热门标签
关键字:

webkit内核源码下载