chromium CSS浅析(一) 默认htmlCss的形成逻辑(chromium39)

浏览器在将资源加载下来之后,则开始将资源进行解析和渲染。对于chromium来讲,它对网页有个默认的CSS,或者说缺省CSS。

一. 缺省样式表的形成

这些CSS有哪几个呢?我们来看看blink中文件:CSSDefaultStyleSheets.h

在这个文件中定义了几个成员变量:

    OwnPtrWillBeMember<RuleSet> m_defaultStyle;
    OwnPtrWillBeMember<RuleSet> m_defaultViewportStyle;
    OwnPtrWillBeMember<RuleSet> m_defaultQuirksStyle;
    OwnPtrWillBeMember<RuleSet> m_defaultPrintStyle;
    OwnPtrWillBeMember<RuleSet> m_defaultViewSourceStyle;
    OwnPtrWillBeMember<RuleSet> m_defaultXHTMLMobileProfileStyle;
    OwnPtrWillBeMember<RuleSet> m_defaultTransitionStyle;

    RefPtrWillBeMember<StyleSheetContents> m_defaultStyleSheet;
    RefPtrWillBeMember<StyleSheetContents> m_viewportStyleSheet;
    RefPtrWillBeMember<StyleSheetContents> m_quirksStyleSheet;
    RefPtrWillBeMember<StyleSheetContents> m_svgStyleSheet;
    RefPtrWillBeMember<StyleSheetContents> m_mathmlStyleSheet;
    RefPtrWillBeMember<StyleSheetContents> m_mediaControlsStyleSheet;
    RefPtrWillBeMember<StyleSheetContents> m_fullscreenStyleSheet;

从名字中,我们也大体也能知道其是作用于什么场景或者功能的。

这里,我们来看看m_defaultStyleSheet,这个样式表关系着整个网页的显示风格。

1. 我们来看看这个变量的初始化。

在类CSSDefaultStyleSheets的构造函数中,有代码段:

    String defaultRules = String(htmlCss, sizeof(htmlCss)) + RenderTheme::theme().extraDefaultStyleSheet();

    m_defaultStyleSheet = parseUASheet(defaultRules);
    m_defaultStyle->addRulesFromSheet(defaultStyleSheet(), screenEval());

2. 我们来分析下上面代码段中defaultRules的构成。

其由两部分构成:String(htmlCss, sizeof(htmlCss))  和 RenderTheme::theme().extraDefaultStyleSheet()

3. 我们先来看看第一部分:String(htmlCss, sizeof(htmlCss))

这里有个变量是htmlCss,这个变量定义在文件:UserAgentStyleSheets.h

这个文件是在out目录下,编译过程中形成的。

我们接着看看这个文件的形成。

先看看文件:core_generated.gyp

其中有代码段:

 {
          'action_name': 'UserAgentStyleSheets',
          'variables': {
            'scripts': [
              '../build/scripts/make-file-arrays.py',
            ],
            'stylesheets': [
              'css/html.css',
              'css/quirks.css',
              'css/view-source.css',
              'css/themeChromium.css',
              'css/themeChromiumAndroid.css',
              'css/themeChromiumLinux.css',
              'css/themeChromiumSkia.css',
              'css/themeInputMultipleFields.css',
              'css/themeMac.css',
              'css/themeWin.css',
              'css/themeWinQuirks.css',
              'css/svg.css',
              'css/navigationTransitions.css',
              'css/mathml.css',
              'css/mediaControls.css',
              'css/mediaControlsAndroid.css',
              'css/fullscreen.css',
              'css/xhtmlmp.css',
              'css/viewportAndroid.css',
             ],
          },
          'inputs': [
            '<@(scripts)',
            '<@(stylesheets)'
          ],
          'outputs': [
            '<(blink_core_output_dir)/UserAgentStyleSheets.h',
            '<(blink_core_output_dir)/UserAgentStyleSheetsData.cpp',
          ],
          'action': [
            'python',
            '<@(scripts)',
            '--namespace',
            'blink',
            '--out-h=<(blink_core_output_dir)/UserAgentStyleSheets.h',
            '--out-cpp=<(blink_core_output_dir)/UserAgentStyleSheetsData.cpp',
            '<@(stylesheets)',
          ],
        },

通过这段python代码我们知道,UserAgentStyleSheetsData.cpp和其头文件是通过该段编译脚本形成。我们要找的htmlCSS与这里面的文件:html.css有关系。其他的css与其他的样式表有关。

感兴趣的同学可以看看html.css内容。

4. 我们来看看第二部分:RenderTheme::theme().extraDefaultStyleSheet()

这个方法在文件RenderTheme.cpp中:

String RenderTheme::extraDefaultStyleSheet()
{
    StringBuilder runtimeCSS;
    if (RuntimeEnabledFeatures::dialogElementEnabled()) {
        runtimeCSS.appendLiteral("dialog:not([open]) { display: none; }");
        runtimeCSS.appendLiteral("dialog { position: absolute; left: 0; right: 0; width: -webkit-fit-content; height: -webkit-fit-content; margin: auto; border: solid; padding: 1em; background: white; color: black;}");
        runtimeCSS.appendLiteral("dialog::backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; background: rgba(0,0,0,0.1); }");
    }

    if (RuntimeEnabledFeatures::contextMenuEnabled()) {
        runtimeCSS.appendLiteral("menu[type=\"popup\" i] { display: none; }");
    }

    return runtimeCSS.toString();
}

这个缺省样式表,只会初始化一次。这里介绍了它的组成,有兴趣的同学可以继续研究下。通过缺省样式表的更改,可以做好多事。

接下来我们来看看这个缺省样式表的创建逻辑。

二. 缺省样式表的创建逻辑

    我们从DocumentLoader::finishedLoading方法来看起。

方法DocumentLoader::finishedLoading,会调用同文件中方法:DocumentLoader::endWriting

从该方法开始的调用堆栈如下:

W/WebKit  ( 8157): DocumentLoader::endWriting
W/WebKit  ( 8157): DocumentWriter::end()
W/WebKit  ( 8157): HTMLDocumentParser::finish()
W/WebKit  ( 8157): HTMLDocumentParser::attemptToEnd()
W/WebKit  ( 8157): HTMLDocumentParser::prepareToStopParsing()

从prepareToStopParsing方法开始的调用逻辑如下:

W/WebKit  ( 8157): HTMLDocumentParser::prepareToStopParsing()
W/WebKit  ( 8157): HTMLDocumentParser::attemptToRunDeferredScriptsAndEnd()
W/WebKit  ( 8157): HTMLDocumentParser::end()
W/WebKit  ( 8157): HTMLTreeBuilder::finished()
W/WebKit  ( 8157): HTMLConstructionSite::finishedParsing()
W/WebKit  ( 8157): Document::finishedParsing()
W/WebKit  ( 8157): FrameLoader::finishedParsing()
W/WebKit  ( 8157): Document::explicitClose()
W/WebKit  ( 8157): FrameLoader::checkCompleted()
W/WebKit  ( 8157): FrameLoader::completed()
W/WebKit  ( 8157): FrameView::maintainScrollPositionAtAnchor
W/WebKit  ( 8157): FrameLoader::checkLoadComplete()
W/WebKit  ( 8157): FrameLoader::checkLoadCompleteForThisFrame()
W/WebKit  ( 8157): updateRenderTreeIfNeeded()
W/WebKit  ( 8157): Document::updateRenderTree
W/WebKit  ( 8157): Document::updateStyle
W/WebKit  ( 8157): Document::ensureStyleResolver()
W/WebKit  ( 8157): StyleResolver& ensureResolver()
W/WebKit  ( 8157): StyleEngine::createResolver()
W/WebKit  ( 8157): StyleEngine::appendActiveAuthorStyleSheets()
W/WebKit  ( 8157): StyleResolver::finishAppendAuthorStyleSheets()
W/WebKit  ( 8157): StyleResolver::collectFeatures()
W/WebKit  ( 8157): CSSDefaultStyleSheets::instance()
W/WebKit  ( 8157): CSSDefaultStyleSheets::CSSDefaultStyleSheets()
时间: 2024-11-07 22:27:43

chromium CSS浅析(一) 默认htmlCss的形成逻辑(chromium39)的相关文章

CSS重置标签默认样式

CSS重置标签默认样式:建议:尽可能的手写代码,可以有效的提高学习效率和深度.在默认情况下,很多标签都有自带的属性,例如body自带有margin.ul有自带的padding.h1-h6的字体大小各部相同.li前面带有的小圆圈等等.这些自带的默认属性会给实际的布局中带来不少的麻烦,我们可以再样式表的开始就重置这些默认的属性.实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8">

CSS之浏览器默认样式设置

今天自己写css样式时,其中用到了<ul>标签,设置了一系列效果后运行,发现位置与设置有出入.chrome上打开检查项,发现<ul>标签的styles底部多了以下一段: ul, menu, dir { display: block; list-style-type: disc; -webkit-margin-before: 1em; -webkit-margin-after: 1em; -webkit-margin-start: 0px; -webkit-margin-end: 0

CSS 去除浏览器默认 轮廓外框

在默认情况下,点击 a 标签,input,或者添加click事件的时候,浏览器留下一个轮廓外框(chrome之下为蓝色)~ 然而这些默认的轮廓外框,有时候很影响美观,并不是我们想保留的. 我们应如何消除这些讨厌的 轮廓外框呢? 使用outline:none去除轮廓外框 如: a{ outline:none; } PC端轮廓外框消失了,然而发现在手机上依然存在~~ 这时候添加如下代码便可 a{ outline:none; -webkit-tap-highlight-color:rgba(0,0,0

css display &lt;p&gt; 默认block

隐藏元素 - display:none或visibility:hidden 隐藏一个元素可以通过把display属性设置为"none",或把visibility属性设置为"hidden".但是请注意,这两种方法会产生不同的结果. visibility:hidden可以隐藏某个元素,但隐藏的元素仍需占用与未隐藏之前一样的空间.也就是说,该元素虽然被隐藏了,但仍然会影响布局. CSS Display - 块和内联元素 块元素是一个元素,占用了全部宽度,在前后都是换行符.

css 浅析display属性

继续开始我的css之旅吧.今天我们来说什么啊.构思了两天还是没有什么思路,但是学习的步伐我们不能停止下来.还是按照之前的计划来讲讲display,在讲这个之前我们还是按照老规矩来扯扯蛋,步子不能够迈大了.废话不说了.问大家一个问题哈?块级元素和行级元素,你们知道吗? 什么是块级元素了?(div)是块级元素 什么是行级元素?(span)你能看出他们两则的区别吗? 先上图 可能有时候大家不是特别的注意他们直接的区别.下面我们来说一下他们具体的特性: 块级元素: 1:块级元素会独占一行,其宽度自动填满

CSS 浅析position:relative/absolute定位方式

一.position:relative 相对定位 分两种情况分析:· 无 position: relative:· 有 position: relative. 代码如下图: 显示效果如下图:  我们给 box4加入 position: relative属性.  * 如果元素加上 position: relative 属性; 元素默认为 块级元素.  * 如果未给出TRBL(top, right, bottom, left), 元素位置不变, 样式不变.  * 给出 TRBL时,是相对于 之前的位

纯css改变select默认样式

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <style> select.sty1 { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ border: solid 1px #000; /*很关键:将默认的select选择框样式

CSS - 浅析css预处理器

为什么要预处理器 css层叠样式表是一门标记语言,并不是编程语言,因此不可以自定义变量,不可以引用等,它不具备任何语法支持,它主要缺陷如下: 语法不够强大,比如:无法嵌套书写,导致模块化开发中需要书写很多重复的选择器: 没有变量和合理的样式复用机制,使得逻辑上相关的属性值必须以字面量的形式重复输出,导致难以维护 这就导致了我们在工作中无端增加了许多工作量.为了解决这个问题,前端开发人员会使用一种称之为 [CSS 预处理器] 的工具,提供 CSS 缺失的样式层复用机制.减少冗余代码,提高样式代码的

css修改浏览器默认的滚动条样式

//滚动条样式 ::-webkit-scrollbar { width: 10px; } /* 垂直滚动条的滑动块 */ ::-webkit-scrollbar-thumb:vertical { border-radius: 4px; -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3); background-color:#717270; } ::-webkit-scrollbar-track { border: 1px #d3d3d3 solid;