这是大神的代码,运行的时候报错
1993年 Marc Andreessen 的团队开发了 Mosaic,1994年推出我们熟悉的 Netscape Navigator 网景浏览器,在最火爆的时候曾占是绝大多数人的选择。同时他还成立了网景公司。
1998年网景公司成立了 Mozilla 基金会组织,同时开源浏览器代码,2004年推出有多标签和支持扩展的 Firefox 火狐浏览器开始慢慢的占领市场份额。
完整的浏览器发展史可以在这里看:
可以看到浏览器技术的发展到了后期基本都是基于 WebKit 开发的,那么我们就来了解下 WebKit 吧。先看看它的全貌。 先看看它的大模块:
WebKit 为了能够具有 Chromium 那样的多进程优点而推出了 WebKit2 抽象出一组新的编程接口,下面是 WebKit2 的进程结构模型:
实线部分是共享的,虚线部分会根据不同的平台有不同的实现。
下面是 WebKit 最核心最复杂的排版引擎 WebCore 的结构图:
从网页 URL 到构建完 DOM 树的过程如图
下面可以看看在 WebKit 里使用了哪些设计模式,是如何使用的。
上图可以看到渲染引擎处于浏览器三层结构的最上层。下面是渲染的过程:
解析中发现 iframe 时的调用顺序
会创建出用于排版的 FrameView 对象。需要一些和排版相关的信息,比如初始 viewport 的大小,背景色,滚动条模式等,完成创建调用 Frame::setView 设置为当前 FrameView。 调用顺序
js 脚本更改数据时的调用顺序
全称是 Web Template Library,是 WebKit 的基础库,实现了智能指针,字符串和 Container,提供跨平台原子操作,时间和线程的封装,能够高效的对内存进行管理。WebCore 里都是 WTF 的代码而没有 STL。
对原生指针的封装,这样 C++ 可以自动化的实现资源管理和指针衍生操作比如拷贝,引用计数,autoLocker 和 Lazy evaluation 等。
智能指针主要就是实现动态分配对象的内存并且能自动回收,原理就是智能指针的对象会作为栈上分配的自动变量在退出作用域时被自动析构。
方法里完成,具体实现代码如下:
判断值的类型是固定值还是百分比的方法
经过计算后的 Render Tree 具有布局信息,比如下面的 html 代码:
布局计算后带布局信息的 Render Tree 如下:
所有的 elements 都有 display 属性用来确定显示类型。属性值有
默认是 inline 的,但是浏览器会设置其它默认值,比如说 div 就是 block 的,完整的定义可以参看 w3c 定义的:
如果是 float 或者 inline-block ,宽度靠内容来撑,行内的内容会将间隔控制成一个空格,前后空格和多余空格都会忽略。
Block 是按照垂直排列,Inline 是按照水平来排列
下面举个例子看看 Inline 类型的例子,比如有如下的 html:
Relative:相对定位,先按照正常的定位然后根据设置的值再移动。
Float:会被移动到左边或右边侧
可以看到层级是按照 z-index 来排的。
border 及以内区域使用 m_frameRect 对象表示。不同方法通过不同的计算能够获取到不同的值比如 clientWidth 的计算方法是
位置的计算,即 x 和 y 是通过下面两个函数计算得到
计算是个递归过程,由子元素到父元素。这样做的原因是有的父元素的高是由子元素撑起的,需要先知道子元素才能够推出父元素。
}版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。