zoukankan      html  css  js  c++  java
  • chromium ⑤

    我们都知道chromium是用webkit完成页面显示的,
     
    那么chromium是怎样集成和封装webkit的呢?
     
    是怎样将webkit整合到自己的框架中,并将一个页面渲染出来的?
     
    这篇我们主要研究这些问题。
     
        从源码看,chromium将webkit作为第三方库引用(src/third_party/WebKit下)。从框架和实现上,chromium实际上做了两件事情:webkit port和webkit glue。
     
        webkit port
     
        webkit port是在某种OS上运行webkit引擎的打包和实现,比如QtWebkit、Gtk+ port、Chromium port、Adobe AIR port等。webkit主要包括三部分:webcore、javascript core和ports。webcore和jscore处理DOM解析、页面渲染、js解析等浏览器核心功能,而ports则提供了一系列抽象接口,不同平台上可以完成各自的实现,这些接口包括网络访问、UI绘制、线程和文件操作等,同时还可以port一些接口给外部程序调用或由外部程序给webkit提供支持。换句话说,webkit将核心部分与外部应用(OS相关)之间定义了一个接口协议组,port对这些接口进行部分或全部的支持,达到核心部分与应用环境的整合。
        webkit port需要做哪些工作呢?基本都是OS相关的:
        1,线程(thread);
        2,网络访问(network access);
        3,时钟(timer),时间日期(date/time);
        4,图形渲染系统(graphics and rendering);
        5,widgets与OS绘图的对接;
        6,Unicode(chromium用icu库);
        7,定义API层(外部与内核之间的交互接口)。
        对chromium来说,这部分源码都直接提交到了webkit的源码库中。
        
        webkit glue
        webkit port之上,还有一层glue,顾名思义就是chromium对webkit的抽象接口层,目的是将chromium和webkit解耦,最重要的一点是数据类型的解耦。这样做的好处是,webkit内部的变化都不会影响到chromium对其的调用。
     
        chromium是怎么做的?来仔细研究这篇官方文档:How Chromium Displays Web Pages
        第一个图:
     
    chromium源码学习笔记(3) <wbr>-- <wbr>webkit
     
      
      首先最底层是webkit及其port,提供核心引擎;其上紧接着就是glue层;这两层已经将webkit封装完毕。
     
    Renderer和Renderer host两层构成chromium的“多进程嵌入层”,从图中看两层之间就是进程边界,可见其主要作用就是在进程间代理传递消息和命令。WebContents是一个内容层,对于chromium来说,一个html页面首先要被解释成content(src/content),然后由上层的Browser输出到窗口成为最终的视图。
     
    简单来说,Renderer通过多进程架构,将webkit解释html的结果转为content,再输出显示视图。层次结构最重要的特点是底层的模块从不依赖和访问上层模块(DEPS rules)。关于content层更详细的信息参考:Content module,还是用图来帮助理解:
    chromium源码学习笔记(3) <wbr>-- <wbr>webkit
        对于外部浏览器应用程序来说,有两个API可以直接调用:webkit API和content API。chromium设计content API的目的一是封装content内部负责的逻辑,二是划清browser和content的层次概念。content API的接口定义在src/content/public。关于content API的理解还可以参考这篇文章:理解WebKit和Chromium: Content API和CEF3,其中提到的CEF是个不错的开源,其致力于将chromium独立封装,使浏览器程序能方便地嵌入调用:chromiumembedded
     
        在此框架下,webkit的port尽量做到跨平台支持,比较重要的port设计:
        1,多进程的网络访问系统,与渲染进程分离;(后面具体研究chromium的进程和线程体系)
        2,图形系统采用了为Android系统开发的跨平台的skia库。
     
        关于Renderer部分,我们在后面研究chromium多进程架构时讨论。
     
        在网上找到一个chromium和webkit的类关系图,可以好好研究一下,引用自类图:WebKit WebCore到Chrome Browser
    chromium源码学习笔记(3) <wbr>-- <wbr>webkit

        了解了chromium对webkit封装的框架层次,对后面理解chromium的多进程架构至关重要!
     
  • 相关阅读:
    Luogu3119 [USACO15JAN]Grass Cownoisseur G
    BZOJ4361 isn
    洛谷1330 封锁阳光大学
    codechef AUG17 T2 Chef and Mover
    codechef AUG17 T1 Chef and Rainbow Array
    【bzoj3211】花神游历各国&&【bzoj3038】上帝造题的七分钟2
    noip 瑞士轮 ————归并排序解法
    记录string的妙用
    洛谷P1550 [USACO08OCT]打井Watering Hole
    汕头市队赛 SRM 09 C 撕书
  • 原文地址:https://www.cnblogs.com/dhsz/p/9252773.html
Copyright © 2011-2022 走看看