`

浏览器内核引擎——浏览器容错

阅读更多
浏览器具有自动容错的功能,它可以修复无效的内容并继续工作
看下面的代码为例子

<html>

  <mytag>

</mytag>

<div>

  <p>

  </div>

     Really lousy HTML

</p>

</html>

这段html违法了很多规则,mytag不是合法的标签,P以及div错误i的嵌套等,但是浏览器仍然可以继续显示,他在解
析过程中修复了许多许多html作者的错误
浏览器具有错误处理的能力,但是令人惊讶的是,这并不是html最新规范的内容,就像书签隔和前进后退按钮一样,
他只是浏览器长期发展的结果,一些比较知名的html,在许多站点中出现过,浏览器都试着以一种和其他浏览器一直
的方式去修复。
html5规范定义了这些方面的需求,webkit在html解析类开始部分的注释中做了很好的总结
解析器将符号化的输入解析为文档并创建文档,但不幸的是,我们必须处理很多没有很好格式化的html文档,至少要小
心下面几种错误情况。
1.在未闭合的标签中添加明确禁止的元素。这种情况下,应该先将先将前一标签闭合
2.不能直接添加元素,有些人写文档的时候忘了中间的一些标签,比如html,head等
3.想在一个行内元素添加块元素,关闭所有行内元素,直到下一个更高的块状元素
4.如果这些都不行,就闭合当前标签直到添加该元素
下面我们来看一些webkit的容错的例子
</br>替代<br>
一些网站用</br>替代<br>,为了兼容IE和FIREFOX,webkit将其看做<br>
代码:

if (t->isCloseTag(brTag) &&m_document->inCompatMode()) {

     reportError(MalformedBRError);

     t->beginTag = true;

}

note这一错的处理在内部进行,用户看不到
迷失的表格
一个表格嵌套在另一个表格里,但不在他的某个单元格内
比如看下面的这个例子

<table>

     <table>

         <tr><td>inner table</td></tr>

         </table>

     <tr><td>outer table</td></tr>

</table>

webkit将会将嵌套的表格变为两个兄弟表格:

<table>

     <tr><td>outer table</td></tr>

</table>

<table>

     <tr><td>inner table</td></tr>

 </table>

代码:

if (m_inStrayTableContent && localName ==tableTag)

      popBlock(tableTag);

webkit使用堆栈存放当前元素内容,它将从外部表格的堆栈中弹出内部表格,则他们变为兄弟元素。
嵌套 的表格元素,用户一个表单嵌套到另一个表单中,则第二个表单将被忽略
代码:

if (!m_currentFormElement) {

        m_currentFormElement = new HTMLFormElement(formTag,    m_document);

}

大深的标签击继承
最多值允许20个相同类型的标签嵌套,其他的将被忽略
代码:

bool HTMLParser::allowNestedRedundantTag(const AtomicString& tagName)

{

 

unsigned i = 0;

for (HTMLStackElem* curr = m_blockStack;

         i < cMaxRedundantTagDepth && curr && curr->tagName == tagName;

     curr = curr->next, i++) { }

return i != cMaxRedundantTagDepth;

}

放错地方的html body 闭合标签
支持不完整的html,我们从来不闭合body,因为有些网页总是在还未真正结束时就闭合它,我们依赖用end方法去执
行关闭的处理
代码:

if (t->tagName == htmlTag || t->tagName ==bodyTag )

     return;





  


  
分享到:
评论

相关推荐

    浏览器内核知识你知多少.docx

    尽管所有浏览器内核的基本目标都是相同的——解析网页代码并呈现网页内容,但在实际操作过程中它们之间存在明显差异: - **兼容性**:不同的内核对Web标准的支持程度不同,这可能导致同一网页在不同浏览器中的呈现...

    浏览器原理和XSS蠕虫攻击

    下面将详细介绍几个重要的浏览器内核及其发展历程。 1. **Trident(MSHTML)** - **简介**:由微软开发,主要应用在Internet Explorer(IE)浏览器中。 - **特点**: - 长期未更新导致与W3C标准脱节。 - 存在较...

    什么是集约化政府门户网站.pdf

    随着基于云计算以及相关开源框架的成熟,以淘宝、京东为代表的商业软件平台纷纷用成本更低廉的软件——MySQL替代Oracle,使用PC Server替代EMC2、IBM小型机等设备,以消除小型机等设备,以消除对自己的数据库和硬件...

    neo4j-community-3.5.5-unix.tar.gz

    7. **图形浏览器**:Neo4j 提供了一个Web图形界面——Neo4j Browser,用于可视化数据和执行Cypher查询。 8. **配置与管理**:通过修改`conf/neo4j.conf`等配置文件,用户可以调整内存分配、设置访问控制等。 9. **...

    计算机三级考试

    - **选项**: 管理者/代理, 客户机/服务器, 网站/浏览器, CSMA/CD - **正确答案**: 管理者/代理 - **知识点**: - **管理者/代理**(Manager/Agent): 网络管理系统中的基本模型,管理者负责收集信息并执行操作,...

    windowsnt 技术内幕

    配置DNS集成WINS 微软网络浏览过程简介 理解计算机浏览器角色 理解浏览器选举 将计算机配置为不能参与浏览过程 理解网络数据报 Windows NT的RAS服务简介 比较RAS和RCS 使用RAS和拨号网络 PPTP协议(Point-to-Point ...

    玩转校内&时间观念(终结版Ⅱ)

    3、这是一款出色的浏览器。 4、…… 5、这个版本开发截止时间为:2007年9月27日21:34。 6、[Ver 1.5.0.1] &lt;br&gt;玩转校内Ver 1.8.0.27 1、完善了[无服务器]功能项,添加记数代码,用数据说明问题。...

    玩转校内[精简免安装版] Ver 2.4.27.95

    3、这是一款出色的浏览器。 4、…… 5、这个版本开发截止时间为:2007年9月27日21:34。 6、[Ver 1.5.0.1] &lt;br&gt;玩转校内Ver 1.8.0.27 1、完善了[无服务器]功能项,添加记数代码,用数据说明...

    玩转校内&时间观念

    3、这是一款出色的浏览器。 4、…… 5、这个版本开发截止时间为:2007年9月27日21:34。 6、[Ver 1.5.0.1] &lt;br&gt;玩转校内Ver 1.8.0.27 1、完善了[无服务器]功能项,添加记数代码,用数据说明...

Global site tag (gtag.js) - Google Analytics