• 一个浏览器内核几个主要部分,HTML/CSS解析器,网络处理,JavaScript引擎,2D/3D图形引擎,多媒体支持等;

HTML 解析和 DOM

网页基本结构

  • 一个网页(Page),每个Page都有一个主框(Main Frame),该框通常包含一个HTML Document, 主框也可能包含子框(sub frame);
  • 这些框构成一个树型结构,以主框为根节点,每个框也可能包含自己的HTML Document,它是一颗DOM树;
  • WebKit相对应的类,和网页的结构一一对应;

WebKit设计模式

  • 以类Chrome为例,需要实现:

    • 具备有获取各个平台资源的能力;
    • 把 WebKit 的状态和进度等信息分发给WebKit的使用者;
  • WebKit通过Chrome的接口来完成后使用ChromeClient抽象类来实现;
  • 每个port实现类ChromeClient,一方面监听WebKit状态,一方面返回WebKit所需要的资源和信息;
  • WebKit直接调用Chrome的接口,Chrome调用ChromeClient的接口,而ChromeClient的实现由各个移植来完成;
  • WebKit中很多都是该模式的类组合:
    • FrameFrameLoader:Frame是页面框和框的加载器;一个负责页面的表示,一个负责加载需要的接口及实现;
    • DocumentDocumentLoader;
    • CachedImageImageLoader;
    • WebViewPage:PageWebKit 内部表示网页的类,WebViewWebKit对外表示网页的类,Page只有一个实现,WebView`在不同的移植中有不同的实现;
  • Chrome是一个非常重要的类,是WebKit与它的使用者之间的桥梁,主要功能:
    • UI和渲染显示相关的需要移植实现的接口集合类;
    • 继承自HostWindow(宿主窗口),其包含一系列接口,用来通知重绘或者更新相应整个窗口,滚动窗口等;
    • 窗口相关操作,例如显示,隐藏等;
    • 显示/隐藏窗口中的toolbar,statusbar,scroolbar等;
    • 显示JavaScript相关的窗口,例如JavaScriptAlert,confirm, prompt窗口等;

HTML解析的一般过程

DOM 标准

  • 定义的是一组平台无关和语言无关的接口,该接口允许编程语言动态访问和更改结构化文档;

DOM level 1

  • Core:一 组底层的接口,其接口可以表示任何结构化的文档,同时也允许对其进行扩展,典型的例子是支持XML文档;
  • HTML:一组基于Core定义的上层接口,主要是为了方便HTML文档的访问;

DOM level 2

  • Core:对DOM level1core部分的扩展,如getElementById;还有很多跟名空间(namespace)相关的接口;
  • Views:允许动态访问和修改文档内容的表示,主要是两个接口AbstractViewDocumentView;
  • Events:主要有EventTarget,Mouse events等接口,但不支持Keyboard;
  • Style:加入接口可以修改样式属性;
  • Traversal and range:遍历树加上对制定范围的文档修改删除等操作;
  • HTML: 扩充DOM level1HTML部分,允许动态访问和修改HTML文档;

DOM level 3

  • Core:加入了新的adoptNodetextContent支持;
  • Load and save:动态加载和序列化DOM表示;
  • Validation:根据scheme验证文档的有效性;
  • Events:主要扩展对keyboard,Touch的支持
  • XPath: 使用XPath1.0来访问DOM树;是一种简单直观的检索DOM树节点的方式;

WebKit的CSS实现

解析器

  • 解析器对上层的接口是CSSParser,所有任务均有其处理;
  • 调用CSSParsercreateStyleRule函数,将选择器和属性列表处理生成StyleRule类型对象;
  • 可能调用情况:
    • DOM建立好之后在创建RenderObject的时候会调用CSSParser;
    • JS代码被执行时,JavaScript引擎会间接调用CSSParser为元素的 属性style解析;
  • 实际上WebKit会为每个网页设置一个缺省的样式,不同的的移植(port)会有不同的缺省样式;

内部表示

  • 被解析后的CSS样式就是一组样式规则,每一个规则包含一组选择器和一组样式属性;

  • 样式规则是一种基本的样式类型,CSS的标准包含了多种规则类型:
    • Style:这个是基本类型,一般大多数规则属于这个类型;
    • Import:是WebKit中为方便引入的,其对应的是一个导入CSS文件的Style元素;
    • Media: 对应于CSS标准中的@media类型;
    • Fontface:CSS3新引入的自定义字体的规则类型;
    • Page:对于CSS标准中的@page类型;
    • Keyframes:WebKit@-webkit-key-frames类型,用来指定特定帧的样式属性信息;
    • Region:对CSS标准正在进行中的Regions的支持,方便开发者对页面进行分区域来排版;

  • StyleRuleImport类,这个一个伪类型,CSS中并没有该类型的定义,是WebKit处理CSS文件方便引入的;
  • 该类需要两个类来辅助完成
    • StyleSheetContents类,就是 CSS 文件中各个规则的处理和内部表示,这些规则被称为子规则,构成一个列表;
    • CSSStyleSheet,该类是个包装类,代表CSS文件包,

      浏览器-05 HTML和CSS解析1的更多相关文章

      1. 浏览器-06 HTML和CSS解析2

        选择器 其实现由CSSSelector类来完成: CSSSelector的作用是储存从解析器生成的结果信息; 这里匹配指的是当需要为每个DOM中的节点计算样式时,WebKit需要根据当前的节点信息来从 ...

      2. IE浏览器没有加载CSS或js文件的秘密及解决办法

        其实是两处资料拼成这一篇博文的,因为在开发过程中遇到,有的文章只是说明原因,而没有给出解决方案,所以再次给出解释和解决方法,以供参考,如果有好的解决方法,也请分享下! ---------------- ...

      3. CSS Houdini:用浏览器引擎实现高级CSS效果

        vivo 互联网前端团队-Wei Xing Houdini被称之为Magic of styling and layout on the web,看起来十分神秘,但实际上,Houdini并非什么神秘组织 ...

      4. IE浏览器各版本的CSS Hack

        IE浏览器各版本的CSS   Hack 如下示例: .test{ color:black;/*W3C*/ color:red\9;/* IE6-IE10 */ _color:black;/*IE6*/ ...

      5. 判断浏览器是否支持某个css属性

        方法:直接判断浏览器是否支持某个CSS属性才是王道,document.documentElement.style 如:判断是否支持 transform if( 'MozTransform' in do ...

      6. 最全的CSS浏览器兼容问题【CSS技巧 】

        CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于web2.0的过度,请尽量用xhtml格 ...

      7. 在不同的浏览器使用不同的css样式,解决浏览器兼容问题

        区别IE6与FF:       background:orange;       *background:blue; 区别IE6与IE7:       background:green !import ...

      8. 如何让不同浏览器调用不同的CSS样式

        如何让不同浏览器调用不同的CSS样式 由 于对W3C标准支持程度的不同,往往导致同一个CSS样式表在各种Web浏览器中的呈现大相径庭.以目前市场占有率最高的两个浏览器Microsoft Interne ...

      9. 网站怎么布局能解决不同浏览器对CSS解析的差异,使用css reset

        很多地方都提到过CSS Reset这个概念,而且细心的朋友会发现,许多大网站的CSS文件中也含有CSS Reset内容. CSS Reset是什么? 在HTML标签在浏览器里有默认的样式,例如 p 标 ...

      随机推荐

      1. SNMP Message Format - SNMP Tutorial

        30.10 SNMP Message Format Unlike most TCP/IP protocols, SNMP messages do not have fixed fields. Inst ...

      2. 第一次作业——subway

        作业源程序代码:https://github.com/R-81/subway 作业程序使用说明:通过输入命令参数求解路线(仅支持-b,-c),根据参数得出路线后,程序不会结束,此时可输入地铁路线名(例 ...

      3. Socket异步通讯

        1.可以通过多线程来解决(一会补上) 2.Socket在tcp/udp两种通信协议下的异步通信: 基于TCP的异步通信: BeginAccept方法和endeaccept方法 包含在System.Ne ...

      4. Dapper.Net 应用

        Dapper应用 1.Dapper是什么 Dapper是一款轻量级ORM工具.如果你在小的项目中,使用Entity Framework.NHibernate 来处理大数据访问及关系映射,未免有点杀鸡用 ...

      5. 深入理解javascript原型和闭包(3)——prototype原型

        既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...

      6. Shell case esac语句

        case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构. case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: ...

      7. 利用Render Texture实现游戏的小雷达效果(摄影机分屏)

        最近游戏蛮牛在举办一个活动,就是要做出这样的效果: 题目:实现游戏分屏效果 要求:1.        分屏,且分割线不规则(即非水平或垂直):2.        各屏可单独操作(移动.缩放),操作指该 ...

      8. UIScrollView的常见属性

        @property(nonatomic) CGPoint contentOffset; 这个属性用来表示UIScrollView滚动的位置 (其实就是内容左上角与scrollView左上角的间距值) ...

      9. 微信公众平台"微信连Wi-Fi"功能来了 线下微信增粉利器

        微信连Wi-Fi功能在第三方开发者和服务商已经有出现了,但有些成本相对会高些.近日微信公众平台新添了一个功能插件“微信连Wi-Fi”,已有微信认证过的公众号即可申请开通.赶紧去布局这个线下微信增粉利器 ...

      10. 用C语言,如何判断主机是 大端还是小端(字节序)

        所谓大端就是指高位值在内存中放低位地址,所谓小端是指低位值在内存中放低位地址.比如 0x12345678 在大端机上是 12345678,在小端机上是 78564312,而一个主机是大端还是小端要看C ...