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

pworld 2012-09-09

浏览器具有自动容错的功能,它可以修复无效的内容并继续工作
看下面的代码为例子
<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;

相关推荐

玫瑰余香000 / 0评论 2013-05-30