前段时间研究了下android平台的webcore,害怕以后忘记,作个记录。
android4.1 external/webkit/路径下就是浏览器的引擎的核心代码。
一:先就 external/webkit/Source/webcore/目录下的主要文件夹进行说明:
1:css文件夹下主要包括与css方面相关的内容如解析,包括字体,颜色,样式以及多媒体控制等的处理和解析。
2:dom文件夹下包括dom方面相关的内容如不同dom元素的定义与实现。
3:html文件夹下主要包括html方面相关的内容如不同html元素的定义与实现。
4:loader文件夹下主要包括装载资源如html页面、css、js及image等方面内容;
5:page文件夹是关于网页的主要包括描述一个网页页面所涉及的内容如page、frame、frameview、frametree、setting、history、chrome、chromeclient等内容;
6:rendering文件夹主要包括对对html等标签的渲染显示。
xml 文件夹下是有关XML文件的解析。
二:下面着重分析HTML文件中的重要文件。
html文件夹下有三个子文件夹 Canvas Parser Shadow
canvas文件夹下主要是
Parer文件夹下主要是对各种网页元素进行解析,
Shadow 文件夹下主要用于创建各种功能性的网页元素,例如播放控制的按钮及文本控制等网页元素。
html根目录下个类(cpp文件)的用途:
1:AsyncImageResizer类用来处理Image标签元素
2: BaseButtonInputType类用来对于基于按键时间的输入进行处理包括创建输入按钮的渲染,并处理一些按键事件.
3: BaseCheckableInputType类的作用是查看html表单的输入状态,以及对有关Input按键事件的处理.
4: BaseDateAndTimeInputType类的用途是对于时间类型的输入进行处理。
5:BaseTextInputType类的作用是对text文本输入类型进行处理。
6:ButtonInputType类用来处理button input 的类型,包括表单和文本。
7:CheckboxInputType类用来处理网页上的复选框标签。
8:ClassList类的作用是处理网页的列表
9:DataGridColumnList类是用来处理日期格式的布局
10:DateComponents主要是一些日期相关的组件
11:DateInputType类是关于日期输入类型的处理,只是一些接口。
12: EmailInputType是Email的输入类型处理类
13:FileInputType文件输入类型的处理类。
14:FormAssociatedElement表单相关的元素处理。
15:FTPDirectoryDocument类是关于FTP文件路径的一些处理,与网页FTP服务相关的类
16:HiddenInputType隐藏输入类型的处理,是个接口类
17:HTMLAppletElement网页上小控件的元素处理类
18:HTMLAreaElement对web上某块区域进行解析,包括鼠标事件和键盘事件的处理。
19:HTMLAudioElement类的作用是对于网页上的audio标签进行创建JS构造函数
20:HTMLBaseFontElement类是对于网页上字体的处理
21:HTMLBodyElement类是对于网页body标签的处理和解析
22:HTMLBRElement类是对于网页br标签的处理和解析
23:HTMLButtonElement类是对于网页button标签的处理和解析,包括对button事件的处理
24:HTMLCanvasElement类是对HTML的canvas标签的处理和解析,包括图形,图片等
25:HTMLDivElement类用来处理div标签元素
26:HTMLDocument类用来处理html Document对象
27:HTMLEmbedElement类是用来处理HTML5的新的标签 EMBED
28:HTMLFieldSetElement的作用是处理和解析Fieldset标签
29:HTMLFontElement是对于html Font标签的数量和解析,包括字体的大小,颜色和样式
30:HTMLFormCollection类是对于表单元素集合的处理和解析
31:HTMLFormControlElement是对表单控制元素的处理和解析,包括键盘事件和鼠标事件
32:HTMLFormElement类的作用是对form标签的解析
33:HTMLFrameElement是对于frame 标签的处理
34:HTMLHRElement是对于HR 标签的处理
35:HTMLImageElement是对于Image 标签的处理和解析
36:HTMLImageLoader类的作用是是对于图像资源的load
37: HTMLInputElement类的作用是对于网页Input元素的处理,包括对单选框和编辑框等的处理和解析
38:HTMLKeygenElement类是处理Keygen标签,与表单的秘钥有关
39:HTMLMediaElement是对网页中多媒体元素的解析,包括获得媒体的URL,对媒体文件的播放控制,以及对于媒体播放状态的改变,是很重要的类,video元素大部分行为和属性的定义.包括audio元素也是继承该类.
40:HTMLMetaElement类是对于meta标签的处理和解析,<meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词
41:HTMLMeterElement类是对meter标签的处理和解析,<meter> 标签定义度量衡。仅用于已知最大和最小值的度量。
42: HTMLOptGroupElement类是对于optGroup 标签的处理和解析,<optgroup> 标签定义选项组
43:HTMLOptionElement类是对于option标签的处理和解析
44:HTMLOutputElement类是对于output 标签的处理和解析,和输出有关
45:HTMLPreElement是对Pre标签的处理和解析
46:HTMLScriptElement类是对Script的标签进行处理和解析 <script> 标签用于定义客户端脚本,比如 JavaScript。
47:HTMLSelectElement类是对Select的标签进行处理和解析
48: HTMLTableElement类是表单相关的解析,包括table的标题,表头,行,列等于table相关的类还有HTMLTablePartElement,HTMLTableRowElement,HTMLTableRowsCollection和HTMLTableSectionElement
49:HTMLTextAreaElement类的作用是对于text区域的解析
50:HTMLTitleElement类是对title标签的处理和解析
51:HTMLVideoElement对video标签的处理和解析,对视频的宽,高,播放模式的处理
52:ImageDocument类是对image图像的控制处理,包括图片更新,扩大缩小等操作的处理
53:ImageResizerThread是对网页图片的调整线程类
54:InputType输入类型的基类,对所有input类型进行处理,包括,文本,日期,邮件,密码,数字,单选框等,不同的输入类型有不同的类进行解析。
三:external/webkit/Source/webwebkit/目录下的文件主要是不同平台的处理接口,包括QT,WIN,MAC,WINCE 等,我们只来看android平台下的
android根目录下的文件分析
1:RenderSkinAndroid类与控件渲染相关,所有的渲染控件类都需要从该类派生,是重要的类
2:RenderSkinMediaButton是多媒体相关的控件的渲染和绘制,play ,pause等
android/WebCoreSuport/目录西主要类分析
1:ChromeClientAndroid类主要处理WebCore中与Frame相关的操作。包括设置状态栏、滚动条、Javascript脚本提示框等。当浏览器中有关事件产生时,ChromeClientAndroid类的相应方法会被调用
2: FrameLoaderClientAndroid类提供与Frame加载相关的操作
3:MediaPlayerPrivateAndroid此类是android平台很重要的类,继承自 MediaPlayerPrivateInterface类。该类主要用于和HTML5VideoviewProxy类交互。定义了一个HTML5VideoviewProxy类的代理结构成员变量m_glue,用来保存HTML5VideoviewProxy类的实例和方法。,并对Media(video和audio)控制的接口封装,包括对media资源的load,play,和其他控制等
4:WebRequest类是对网页请求的处理
5:WebResourceRequest类是对网页资源的请求处理。
6:WebResponse类是对网页请求的响应处理。
四:播放流程:
浏览器引擎加载完 HTML 文档后,开始解析里面的元素搭建 DOM tree, Render tree 和加载子资源。在解析 video 元素时,会创建 HTMLVideoElement 类对象和对应的 RenderVideo 对象
Play()----------->playInternal()--------------------->updatePlayState()------------------------->play()------------------->>play()
ResourceLoader.cpp HTMLMediaElement.cpp MediaPlayerPrivateAndroid.cpp MediaPlayer.cpp HTML5VideoViewProxy.java
加载网络资源 解析media相关元素 java层