WebKit gtk+学习文档
简介
WebKit 是一个开源浏览器网页排版引擎,与之相应的引擎有Gecko(Mozilla,Firefox 等使用的排版引擎)和Trident(也称为MSHTML,IE 使用的排版引擎)。同时WebKit 也是苹果Mac OS X 系统引擎框架版本的名称,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序。WebKit 所包含的WebCore 排版引擎和JSCore 引擎来自于KDE 的KHTML 和KJS开源项目,当年苹果比较了Gecko 和KHTML 后,仍然选择了后者,就因为它拥有清晰的源码结构、极快的渲染速度。
目前使用WebKit 引擎的浏览器主要有:Safari(apple出品),Midori,chrome(google出品)等。
Adobe AIR也采用了WebKit渲染HTML。
一、用到的库:
除了平台相关的库,WebKit 需要用到的一些主要的后台库有:
ICU :International Components for Unicode ,一个成熟,广泛使用的一套为C / C + + 和Java 库提供Unicode 的全球化支持软件;
XSLT :eXtensible Stylesheet Language Transformation, W3C 定义的用于XML 文档转换的规范;Curl :一个利用URL 语法的命令行数据传输工具,基于libcurl 。
Sqlite :SQLite 是实现了SQL92 标准的SQL 数据库引擎,它能在一个库里组合数据库引擎和接口,将所有数据存储于单个文件;
Gperf :一个很完美的哈希函数生成器;
Flex :Fast Lex, 快速词法分析生成器;
Bison :语法分析生成器,可以将一段带注释的上下文无关语法转化成LALR 或GLR 语法;
Enchant :一个拼写检查库,提供单词的拼写检查、纠错等功能;
二、代码目录结构
WebKitTools:一些测试WebKit 实现功能的程序;
WebKit:此目录位于WebKit 的最上层,定义了与应用相关的一些接口,因此它是平台相关的,子目录是对应平台的完整实现:
WebCore:WebKit 的核心部分,定义了浏览相关的数据IO 、页面加载、脚本分析、UI 组织、事件处理、网络分析、平台相关的具体实现等内容。
xml:提供xml 相关的内容;
html:提供html 相关的内容;其下的Canvas 目录定义了3D 画布以及WebGL 库相关的内容;
wml: Wireless Markup Language ;
css:提供css 相关的内容;
dom:提供dom 相关的内容;
editing:编辑相关的功能;
page:浏览相关内容,并非是我们看到的一个页面,在一次浏览会话中,它只有一个实例;
rendering:页面渲染相关的内容,在对页面脚本进行DOM 树分析之后,需要对这些元素进行渲染和显示;
notification:内部模块间的事件通信;
history:页面浏览历史记录相关的内容;
svg:矢量图形功能,有选项,--svg ;
mathml:W3C 为网页中的数学表达式制定的规范;有编译选项,--mathml ;loader:加载资源及Cache ;
workers:“ Web Workers 为WEB 前端网页上的脚本提供了一种能在后台进程中运行的方法。一旦它被创建,Web Workers 就可以通过postMessage() 向任务池发送任务请求,执行完之后再通过postMessage() 返回消息给创建者指定的事件处理程序( 通过onmessage 进行捕获) 。
Web Workers 进程能够在不影响用户界面的情况下处理任务,并且,它还可以使用XMLHttpRequest 来处理I/O ,无论responseXML 和channel 属性是否为null 。”
storage :Web Storage 相关的内容,保存页面的数据,可以看成是Cookie 的升级;
websockets :与网络连接相关的内容;
bridge: 主要包含NPPlugin(Netscape Plugin) 方面的接口访问等内容;
binding :Dom 与JavaScriptCore 绑定的功能;
accessibility :提供控件的可用性相关的内容,accessibility 常用来形容对一些特殊人群的功能支持,比如残障者、老人等;
icu :里面放了专门为Mac OS X 10.4 编译的icu 相关头文件;
platform :提供了平台相关的具体实现,如事件响应、本地化、网络连接等;
plugins :插件相关内容;
ForwardingHeaders :头文件;
inspector :Inspector 是WebKit 提供的查看网页源代码,DOM 树,以及调试脚本的工具,本目录包含了实现此功能的内容;
English.lproj :本地化文件;
Resources :资源,图标;
WebCore.gyp :工程文件。GYP(Generate Youre Project )是google 自己开发了一个脚本工具,这个工具也是采用python 编写的。它采用了自定义的一套规则,用于生成各种工程文件;
JavaScriptGlue
JavaScriptCore :有关JavaScript 的相关内容,包括了脚本解释器、分析器以及执行程序;
PlanetWebkit: 一个比较灵活的RSS 阅读器;Webkit 网站上的Planet :一站式的Webkit 开发与动态信息;
三、体系结构
WebKit 主要包括三部分:WebKit ,WebCore ,以及JavaScriptCore ,加上所使用的库,依托的平台,其基本的体系结构(Architecture) 如下所示:
注意有的模块相对于下面的模块有突出,这是因为此模块与下面几个模块直接相关,比如WebCore 模块就与JavaScriptCore 、Libraries 和Platforms 模块直接相关。
四、Webkit/gtk +中下层与gtk的接口
WebKit中实现网页上所有信息的显示一部分是由WebKit本身画出来的,一部分是利用gtk的接口实现部分对象的显示,其中本身画出来的部分的代码实现部分主要位于editing和rendering两个目录下,利用gtk提供的一些控件的接口实现网页上一些对象的显示主要集中于platform/gtk/目录下:
./platform/gtk/RenderThemeGtk.cpp
./platform/gtk/ContextMenuGtk.cpp
./platform/gtk/FileChooserGtk.cpp
./platform/gtk/WidgetGtk.cpp
./platform/gtk/Language.cpp
./platform/gtk/PasteboardGtk.cpp
./platform/gtk/CursorGtk.cpp
./platform/gtk/ContextMenuItemGtk.cpp
./platform/gtk/ScrollbarGtk.cpp
./platform/gtk/LocalizedStringsGtk.cpp
./platform/gtk/DragImageGtk.cpp
./platform/gtk/PlatformScreenGtk.cpp
./platform/gtk/PopupMenuGtk.cpp
./platform/gtk/PasteboardHelper.cpp
./platform/gtk/GRefPtrGtk.cpp
./platform/gtk/ScrollbarThemeGtk.cpp
./platform/gtk/ScrollViewGtk.cpp
./platform/gtk/ClipboardGtk.cpp
./platform/gtk/GtkPluginWidget.cpp
./platform/network/soup/ResourceHandleSoup.cpp
./platform/graphics/gtk/IconGtk.cpp
./platform/graphics/gtk/FontPlatformDataPango.cpp
./platform/graphics/gtk/ImageGtk.cpp
./platform/graphics/cairo/FontPlatformDataCairo.cpp
./plugins/gtk/PluginViewGtk.cpp
1、各个文件实现的功能
RenderThemeGtk.cpp
该文件主要实现了对一些基本控件的创建与属性的设置,例如:button,Toggle,Checkbox,RadioMenuList,Text,Background,Foreground,ListBox,Container,Entry,Tre eView,MediaSlider等
ContextMenuGtk.cpp
该文件主要是对文本菜单(ContextMenu)的创建
FileChooserGtk.cpp
该文件中包含两个函数:
static bool stringByAdoptingFileSystemRepresentation(gchar* systemFilename, String& result);
该函数是得到systemFilename中所包含的文件的名称,通过result值返回
String FileChooser::basenameForWidth(const Font& font, int width) const;
通过给定文本的字形名称,和一定的宽度,从而得到该长度下可以显示最长文本信息
WidgetGtk.cpp
该文件主要是对widget的一些属性的设置,例如:光标、焦点、显示,隐藏,还有对widget 自身的新建与销毁等等
Language.cpp
该文件仅包含一个函数:
String defaultLanguage();
该函数实现返回当前默认的语言类型
PasteboardGtk.cpp
该文件主要是对剪贴板的操作,文件中所包含的函数主要有:
static void clipboard_get_contents_cb(GtkClipboard *clipboard, GtkSelectionData *selection_data,
guint info, gpointer data);
得到指定剪贴板当前的内容
static void clipboard_clear_contents_cb(GtkClipboard *clipboard, gpointer data);
清空指定剪贴板中当前的内容
Pasteboard* Pasteboard::generalPasteboard();
创建一新的剪贴板
void Pasteboard::writeSelection(Range* selectedRange, bool canSmartCopyOrDelete, Frame* frame);
存储所选内容至剪贴板中
void Pasteboard::writePlainText(const String& text);
保存纯文本至剪贴板中
void Pasteboard::writeURL(const KURL& url, const String&, Frame* frame);
保存URL至剪贴板中
void Pasteboard::writeImage(Node* node, const KURL&, const String&);
保存图片文件至剪贴板中
void Pasteboard::clear();
清除默认剪贴板中的内容
PassRefPtr
//欠缺
String Pasteboard::plainText(Frame* frame);
返回当前剪贴板中的纯文本内容
CursorGtk.cpp
该文件主要实现了对各种不同光标类型的的创建
ContextMenuItemGtk.cpp
该文件主要实现了对文本菜单的一些操作,例如:
static const char* gtkStockIDFromContextMenuAction(const ContextMenuAction& action);
根据所操作的对象得到它所对应的stockID
GtkMenuItem* ContextMenuItem::createNativeMenuItem(const PlatformMenuItemDescription& menu);
创建菜单项
void ContextMenuItem::setSubMenu(ContextMenu* menu);
设置子菜单
void ContextMenuItem::setChecked(bool shouldCheck);
设置当前菜单项为已选或末选
void ContextMenuItem::setEnabled(bool shouldEnable);
设置当前菜单项为可用或不可用
ScrollbarGtk.cpp
该文件主要实现对流动条的创建与一些属性的设置
LocalizedStringsGtk.cpp
该文件实现对文本菜单项的文本内容的编码转换
DragImageGtk.cpp
该文件实现了对拖动图片的属性设置以及根据缓存中的图片创建一拖动图
PlatformScreenGtk.cpp
该文件主要实现了对screen的属性设置操作
static GdkVisual* getVisual(Widget* widget);
得到widget所在的Visual
int screenDepth(Widget* widget);
得到widget所在的visual的深度
int screenDepthPerComponent(Widget* widget);
得到widget所在的visual中的每个对象的深度
bool screenIsMonochrome(Widget* widget);
查看visual中是否只有chrome存在
FloatRect screenRect(Widget* widget)
得到widget所在的screen的位置和大小
FloatRect screenAvailableRect(Widget* widget);
得到当前widget所在的可用的屏幕区域的位置和大小
PopupMenuGtk.cpp
该文件主要是对弹出菜单的一些属性的设置,例如:
void PopupMenu::show(const IntRect& rect, FrameView* view, int index);
在鼠标当前位置显示弹出菜单
void PopupMenu::hide();
隐藏弹出菜单
void PopupMenu::updateFromElement();
更新弹出菜单的显示文本
void PopupMenu::menuItemActivated(GtkMenuItem* item, PopupMenu* that);
//欠缺
void PopupMenu::menuUnmapped(GtkWidget*, PopupMenu* that);
隐藏弹出菜单
void PopupMenu::menuPositionFunction(GtkMenu*, gint* x, gint* y, gboolean* pushIn, PopupMenu* that);
获得当前弹出菜单的位置
void PopupMenu::menuRemoveItem(GtkWidget* widget, PopupMenu* that);
删除弹出菜单中的某一项
PasteboardHelper.cpp
//欠缺
GRefPtrGtk.cpp
该文件主要实现TargetList和Cursor的创建与销毁
ScrollbarThemeGtk.cpp
返回滑块的宽度
ScrollViewGtk.cpp
该文件主要实现滚动条的创建以及滚动区域的一些属性的设置
PassRefPtr
创建方向为orientation的滚动条
static void AdjustmentConfigure(GtkAdjustment* adjustment, gdouble value, gdouble lower, gdouble upper, gdouble stepIncrement, gdouble pageIncrement, gdouble pageSize);
改变adjustment的各项属性
void ScrollView::setGtkAdjustments(GtkAdjustment* hadj, GtkAdjustment* vadj, bool resetValues);
重置水平和垂直滚动条的各项属性
void ScrollView::platformAddChild(Widget* child);
向滚动区域添加孩子
void ScrollView::platformRemoveChild(Widget* child);
移除滚动区域内指定的孩子
IntRect ScrollView::visibleContentRect(bool includeScrollbars) const;
返加当前可见的滚动区域的坐标和大小
void ScrollView::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode verticalMode);
设置滚动条的模式为水平或垂直
ClipboardGtk.cpp
主要是剪贴板的一些基本操作的实现,其中所包含的函数:
static ClipboardType dataObjectTypeFromHTMLClipboardType(const String& rawType);
该函数返回html上所得到的对象的类型
void ClipboardGtk::clearData(const String& typeString);
清除当前剪贴板中所存储的指定类型的数据
void ClipboardGtk::clearAllData();
清除当前剪贴板中所存储的所有类型的数据
static String joinURIList(Vector
//欠缺
String ClipboardGtk::getData(const String& typeString, bool& success) const;
得到剪贴板中指定类型的数据
bool ClipboardGtk::setData(const String& typeString, const String& data);
在当前的剪贴板中写入指定类型的数据
HashSet
//欠缺
GtkPluginWidget.cpp
该文件主要是对插件widget进行操作,主要包含以下函数:
GtkPluginWidget::GtkPluginWidget(GtkWidget* widget);
该文件主要实现对指定widget的隐藏
void GtkPluginWidget::invalidateRect(const IntRect& _rect);
置指定的rect区域为无效
void GtkPluginWidget::frameRectsChanged();
设置frameRect的位置和大小
void GtkPluginWidget::paint(GraphicsContext* context, const IntRect& rect);
重绘指定区域
./platform/network/soup/ResourceHandleSoup.cpp
//欠缺
./platform/graphics/gtk/IconGtk.cpp
该文件主要实现根据文件名,创建相应的不同类型的图标,并对其进行显示该文件主要包含以下函数:
static String lookupIconName(String MIMEType);
根据mime的类型得到与之相对应的名字,并返回该名称
PassRefPtr
根据给定文件名创建与之相对应的图标
void Icon::paint(GraphicsContext* context, const IntRect& rect);
在指定的区域重绘
./platform/graphics/gtk/FontPlatformDataPango.cpp
./platform/graphics/cairo/FontPlatformDataCairo.cpp
这两个文件主要是有关字体的一些操作其中用到了gtk的得到当前screen的函数和得到当前screen字体的一些属性
./platform/graphics/gtk/ImageGtk.cpp
该文件主要实现对指定的图片写入一个新的frame buffer之中
./plugins/gtk/PluginViewGtk.cpp