chromiumCSS浅析(一)默认htmlCss的形成逻辑(chromium39)_html/css_WEB-ITnose
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了chromiumCSS浅析(一)默认htmlCss的形成逻辑(chromium39)_html/css_WEB-ITnose,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6199字,纯文字阅读大概需要9分钟。
内容图文
![chromiumCSS浅析(一)默认htmlCss的形成逻辑(chromium39)_html/css_WEB-ITnose](/upload/InfoBanner/zyjiaocheng/401/160c0f97bcdf48dbafe9b3da52e51deb.jpg)
一. 缺省样式表的形成
这些CSS有哪几个呢?我们来看看blink中文件:CSSDefaultStyleSheets.h
在这个文件中定义了几个成员变量:
OwnPtrWillBeMemberm_defaultStyle; OwnPtrWillBeMember m_defaultViewportStyle; OwnPtrWillBeMember m_defaultQuirksStyle; OwnPtrWillBeMember m_defaultPrintStyle; OwnPtrWillBeMember m_defaultViewSourceStyle; OwnPtrWillBeMember m_defaultXHTMLMobileProfileStyle; OwnPtrWillBeMember m_defaultTransitionStyle; RefPtrWillBeMember m_defaultStyleSheet; RefPtrWillBeMember m_viewportStyleSheet; RefPtrWillBeMember m_quirksStyleSheet; RefPtrWillBeMember m_svgStyleSheet; RefPtrWillBeMember m_mathmlStyleSheet; RefPtrWillBeMember m_mediaControlsStyleSheet; RefPtrWillBeMember 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::endWritingW/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::updateRenderTreeW/WebKit ( 8157): Document::updateStyleW/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()
内容总结
以上是互联网集市为您收集整理的chromiumCSS浅析(一)默认htmlCss的形成逻辑(chromium39)_html/css_WEB-ITnose全部内容,希望文章能够帮你解决chromiumCSS浅析(一)默认htmlCss的形成逻辑(chromium39)_html/css_WEB-ITnose所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。