浏览器具有自动容错的功能,它可以修复无效的内容并继续工作
看下面的代码为例子
<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;
分享到:
相关推荐
**Cef浏览器内核**是基于Chromium Embedded Framework (CEF) 的一款开源浏览器组件,它为开发者提供了在C#编程环境中构建嵌入式浏览器应用的能力。CEF是一个强大的框架,允许开发者将Chromium浏览器引擎集成到自己的...
webkitbrowser的dll 内核是谷歌浏览器与IE浏览器//////////////////////////// WebKit是开源的Web浏览器引擎,苹果的Safari、谷歌的Chrome浏览器都是基于这个框架来开发的。
与用户线程不同,内核线程直接运行在内核模式下,无需通过系统调用来进入内核空间。 #### 1.7 非运行状态进程的组织 非运行状态的进程通常指的是处于挂起状态的进程,这类进程不在运行队列中,而是被组织成等待...
WebKit是一个开源的渲染引擎,广泛用于许多浏览器,如早期的Safari和Google Chrome。它由Apple公司发起,后来发展成为Chromium项目的一部分。WebKit提供了高效的页面加载和渲染能力,支持最新的Web标准,同时也兼容...
开源浏览器内核原码是软件开发领域中的一个重要话题,它涉及到如何构建、理解和修改网络浏览器的核心组件。在本案例中,我们关注的是一个名为“csEXWB”的项目,这是一个基于C#语言的开源浏览器内核。C#是一种现代、...
腾讯X5浏览器内核是腾讯开发的一款高性能、高效能的移动设备浏览器核心,它被广泛应用于许多Android应用中,提供快速的网页加载速度和优秀的页面渲染效果。在本"腾讯X5浏览器内核静态集成demo"中,我们将探讨两种...
浏览器内核Chromium 84是Google Chrome浏览器的核心组件,它是开源的,允许开发者们根据自己的需求进行定制和改进。这个版本在2020年发布,主要关注性能优化、安全更新以及对Web标准的支持。在游戏开发领域,尤其是...
Android framework 系统编译 新版WebView浏览器内核101.0.4951.61
VB环境下使用非IE内核的浏览器控件,Google
- **模块化设计**:内核采用了模块化设计,这意味着不同的功能可以通过加载或卸载内核模块来动态地添加或移除,提高了系统的灵活性和可定制性。 - **虚拟文件系统(VFS)**:VFS是Linux内核的核心组件之一,它提供了一...
浏览器内核检测工具浏览器内核检测工具浏览器内工具.核检测工具浏览器内核检测工具浏览器内核检测工具ss
标题中的“cpp”通常指的是C++编程语言,而“wke”和“libcef”是两种不同的浏览器内核。在IT行业中,浏览器内核是控制网页渲染和与用户交互的关键组件。现在,我们来深入探讨这个话题。 首先,Wke(Webkit for ...
在计算机科学和互联网领域,渲染引擎或浏览器内核对于用户与网络世界的交互起着至关重要的作用。不同的浏览器内核有着各自的特点和解析机制,这使得它们在处理HTML、CSS、JavaScript等网页语言时存在差异,从而影响...
这篇博文可能是关于如何获取浏览器窗口的尺寸以及识别浏览器所使用的渲染引擎(内核)。在网页开发中,了解这些信息对于实现响应式设计、适配不同设备和优化用户体验至关重要。 首先,获取浏览器尺寸通常涉及到...
Java调用Chrome浏览器内核是开发桌面应用时一个常见的需求,尤其在需要嵌入Web页面或者与Web内容交互的场景下。CEF(Chromium Embedded Framework)是一个开源项目,它允许开发者将Google Chrome的Blink渲染引擎和V8...
WebKit以其开源、高性能和对Web标准的良好支持而著称,Google的Chrome浏览器使用的是WebKit的一个分支——Blink内核,它进一步优化了WebKit的性能和内存管理。 除此之外,还有其他一些内核,比如Gecko,它是Mozilla...
尽管所有浏览器内核的基本目标都是相同的——解析网页代码并呈现网页内容,但在实际操作过程中它们之间存在明显差异: - **兼容性**:不同的内核对Web标准的支持程度不同,这可能导致同一网页在不同浏览器中的呈现...
- **内核引导程序**: 引导程序是计算机启动过程中的第一步,负责加载操作系统内核到内存中并执行。对于Linux来说,常见的引导程序有GRUB和LILO等。 #### 2. 内核映像的形成 - **MakeFile预备知识**: - **Makefile...
浏览器内核的选择直接影响到浏览器的性能、兼容性和网页展示效果。以下是一些关于浏览器内核的重要知识点: 1. **Trident内核**:由微软开发,主要用于Windows平台上的Internet Explorer系列浏览器。Trident内核因...