WebKit源码解析 -- WebCore::CSSValue

     转载,请注明出处!

     在创建了CSSParserValue对象之后,会将CSSParserValue对象转换为CSSValue对象,最后使用CSSValue对象以及属性名称propId创建Property对象。可以认为CSS属性值在WebCore模块有两中存储形式:CSSParserValue,CSSValue。CSSParserValue是在CSS语法分析器解析过程中创建的、只能被CSS语法分析器使用的。CSSValue是CSS语法分析器创建的,可以被CSS模块其他的对象使用的类型。

     CSS模块使用了一个继承体系来表示所有的属性值。继承体系如下所示。


图1

     

图2

     CSSParserValue对象实际会被转换为CSSValue子类对象,而不是直接转换为CSSValue对象。在WebKit引擎中根本会存在CSSValue类型对象。CSSValue构造函数的访问权限是protected,只能被子类调用,不能被其他类型调用。
     CSSValue具有的属性如下。

  • m_primitiveUnitType,这个成员变量仅当对象实际类型是CSSPrimitiveValue时,才有意义。CSS基本类型的值包括多种子类型,如整型值、em长度、px长度等。CSSPrimitiveValue类使用一个Union空间来存储CSS基本类型值。在存储CSS基本类型值时,必须将属性值的子类型也存储下来。需要查询属性值时,必须先获得属性值的存储形式,然后才能正确的取出值。m_primitiveUnitType就是用来存储属性值类型的。
  • m_hasCachedCSSText,这个成员变量仅当对象实际类型是CSSPrimitiveValue时,才有意义。在CSSValue继承体系中,只有CSSPrimitiveValue提供了缓存CSS文本的功能。如果CSSPrimitiveValue的CSS文本值被缓存了,那么m_hasCachedCSSText为true。
  • m_isQuirkValue,这个成员变量仅当对象实际类型是CSSPrimitiveValue时,才有意义。Quirk Mode的意义是什么呢?一些旧版本浏览器的布局方式与现W3C推荐的方式不同。如何让新版本浏览器展示旧网页的效果与旧版本浏览器展示旧网页的效果相同,另外还需保证新版本浏览器展示新网页的效果符合W3C标准呢?方法就是引入Quirk Mode。使用Quirk Mode显示旧网页,使用Standard Mode显示新网页。如果html源文件首行是<doctype>标签,那么使用standard mode。否则,使用quirk mode。
  • m_isImplicitInitialValue,这个成员变量仅当对象实际类型是CSSInitialValue时,才有意义。表示CSS属性值是否是默认的初始化值。如果CSS属性值不是被样式表设置的,那么这个成员变量为true。如果CSS属性值是被样式表设置的,那么这个成员变量为false。
  • m_isSpaceSeparatedValueList,这个成员变量仅当对象实际类型是CSSValueList时,才有意义。有一种CSS属性值是类别样式的,以空格作为分隔符。例如:“border:10px 20px 20px 10px”。如果属性值确实是以空格分隔的列表,那么这个成员变量为true。
  • m_classType,这个成员变量是用来区分对象实际类型的。这个成员变量的取值范围是enum ClassType。

     CSSValue具有的方法有:1)查询CSSValue对象的实际类型,这种方法通过检测m_classType来实现;2)设置/查询属性值对应的CSS源码;3)addSubresourceStyleURLs以及cssValueType。
     关于第二种接口,需要多说几句。如果属性值类型类型不同,那么获取CSS源码的方法也不同。CSSValue的实现方法是:先利用m_classType获得对象的实际类型,然后再调用该类的customCssText方法来查询CSS源码。疑问:这里为什么不用虚方法呢?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值