webkitgtk1.8.3阅读随笔(一)

来源:互联网 发布:日本三河黑松淘宝网 编辑:程序博客网 时间:2024/05/16 00:32

一、用到的库:

       除了平台相关的库,WebKit需要用到的一些主要的后台库有:

       ICU : InternationalComponents for Unicode , 一个成熟,广泛使用的一套为 C /C + + 和 Java 库提供 Unicode 的 全球化支持软件;

   XSLT : eXtensibleStylesheet Language Transformation, W3C 定义的用于 XML 文档转换的规范;        Curl : 一个利用 URL 语法的命令行数据传输工具,基于 libcurl 。

       Sqlite : SQLite是实现了 SQL92 标准的 SQL 数据库引擎,它能在一个库里组合数据库引擎和接口 , 将所有数据存储于单个文件 ;

       Gperf :一个很完美的哈希函数生成器;

       Flex : FastLex, 快速词法分析生成器;

       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 前端网页上的脚本提供了一种能在后台进程中运行的方法。一旦它被创建,WebWorkers 就可以通过 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的接口实现部分对象的显示,其中本身画出来的部分的代码实现部分主要位于editingrendering两个目录下,利用gtk提供的一些控件的接口实现网页上一些对象的显示主要集中于source/webcore/platform/gtk/目录下:


1、  各个文件实现的功能

              RenderThemeGtk.cpp

该文件主要实现了对一些基本控件的创建与属性的设置,例如:button,Toggle,Checkbox,RadioMenuList,Text,Background,Foreground,ListBox,Container,Entry,TreeView,MediaSlider

              ContextMenuGtk.cpp

              该文件主要是对文本菜单(ContextMenu)的创建

              FileChooserGtk.cpp

             该文件中包含两个函数:

              static boolstringByAdoptingFileSystemRepresentation(gchar* systemFilename, String&result);

              该函数是得到systemFilename中所包含的文件的名称,通过result值返回

              StringFileChooser::basenameForWidth(const Font& font, int width) const;

              通过给定文本的字形名称,和一定的宽度,从而得到该长度下可以显示最长文本信息

             WidgetGtk.cpp

             该文件主要是对widget的一些属性的设置,例如:光标、焦点、显示,隐藏,还有对widget自身的新建与销毁等等

              Language.cpp

              该文件仅包含一个函数:

              StringdefaultLanguage();

              该函数实现返回当前默认的语言类型

              PasteboardGtk.cpp

              该文件主要是对剪贴板的操作,文件中所包含的函数主要有:

              static voidclipboard_get_contents_cb(GtkClipboard *clipboard, GtkSelectionData*selection_data,

                                      guintinfo, gpointer data);

              得到指定剪贴板当前的内容

              static voidclipboard_clear_contents_cb(GtkClipboard *clipboard, gpointer data);

              清空指定剪贴板中当前的内容

              Pasteboard*Pasteboard::generalPasteboard();

              创建一新的剪贴板

              voidPasteboard::writeSelection(Range* selectedRange, bool canSmartCopyOrDelete,Frame* frame);

              存储所选内容至剪贴板中

              voidPasteboard::writePlainText(const String& text);

              保存纯文本至剪贴板中

              voidPasteboard::writeURL(const KURL& url, const String&, Frame* frame);

              保存URL至剪贴板中

              voidPasteboard::writeImage(Node* node, const KURL&, const String&);

              保存图片文件至剪贴板中

              voidPasteboard::clear();

              清除默认剪贴板中的内容

            PassRefPtr<DocumentFragment>Pasteboard::documentFragment(Frame* frame, PassRefPtr<Range>context,  bool allowPlainText, bool&chosePlainText);

              //欠缺

              StringPasteboard::plainText(Frame* frame);

              返回当前剪贴板中的纯文本内容

              CursorGtk.cpp

              该文件主要实现了对各种不同光标类型的的创建

              ContextMenuItemGtk.cpp

              该文件主要实现了对文本菜单的一些操作,例如:

              static constchar* gtkStockIDFromContextMenuAction(const ContextMenuAction& action);

              根据所操作的对象得到它所对应的stockID

              GtkMenuItem*ContextMenuItem::createNativeMenuItem(const PlatformMenuItemDescription&menu);

              创建菜单项

              voidContextMenuItem::setSubMenu(ContextMenu* menu);

              设置子菜单

              voidContextMenuItem::setChecked(bool shouldCheck);

              设置当前菜单项为已选或末选

              voidContextMenuItem::setEnabled(bool shouldEnable);

              设置当前菜单项为可用或不可用

              ScrollbarGtk.cpp

              该文件主要实现对流动条的创建与一些属性的设置

              LocalizedStringsGtk.cpp

              该文件实现对文本菜单项的文本内容的编码转换

             DragImageGtk.cpp

              该文件实现了对拖动图片的属性设置以及根据缓存中的图片创建一拖动图

              PlatformScreenGtk.cpp

              该文件主要实现了对screen的属性设置操作

              staticGdkVisual* getVisual(Widget* widget);

              得到widget所在的Visual

              intscreenDepth(Widget* widget);

              得到widget所在的visual的深度

              intscreenDepthPerComponent(Widget* widget);

              得到widget所在的visual中的每个对象的深度

              boolscreenIsMonochrome(Widget* widget);

              查看visual中是否只有chrome存在

              FloatRectscreenRect(Widget* widget)

              得到widget所在的screen的位置和大小

              FloatRectscreenAvailableRect(Widget* widget);

              得到当前widget所在的可用的屏幕区域的位置和大小

              PopupMenuGtk.cpp

              该文件主要是对弹出菜单的一些属性的设置,例如:

              voidPopupMenu::show(const IntRect& rect, FrameView* view, int index);

              在鼠标当前位置显示弹出菜单

              voidPopupMenu::hide();

              隐藏弹出菜单

              voidPopupMenu::updateFromElement();

              更新弹出菜单的显示文本

              voidPopupMenu::menuItemActivated(GtkMenuItem* item, PopupMenu* that);

              //欠缺

              voidPopupMenu::menuUnmapped(GtkWidget*, PopupMenu* that);

              隐藏弹出菜单

              voidPopupMenu::menuPositionFunction(GtkMenu*, gint* x, gint* y, gboolean* pushIn,PopupMenu* that);

              获得当前弹出菜单的位置

              voidPopupMenu::menuRemoveItem(GtkWidget* widget, PopupMenu* that);

              删除弹出菜单中的某一项

              PasteboardHelper.cpp

              //欠缺

              GRefPtrGtk.cpp

              该文件主要实现TargetListCursor的创建与销毁

              ScrollbarThemeGtk.cpp

              返回滑块的宽度

              ScrollViewGtk.cpp

             该文件主要实现滚动条的创建以及滚动区域的一些属性的设置

              PassRefPtr<Scrollbar>ScrollView::createScrollbar(ScrollbarOrientation orientation);

              创建方向为orientation的滚动条

              static voidAdjustmentConfigure(GtkAdjustment* adjustment, gdouble value, gdouble lower,gdouble upper,  gdouble stepIncrement,gdouble pageIncrement, gdouble pageSize);

              改变adjustment的各项属性

              voidScrollView::setGtkAdjustments(GtkAdjustment* hadj, GtkAdjustment* vadj, boolresetValues);

              重置水平和垂直滚动条的各项属性

              voidScrollView::platformAddChild(Widget* child);

              向滚动区域添加孩子

              voidScrollView::platformRemoveChild(Widget* child)

              移除滚动区域内指定的孩子

              IntRectScrollView::visibleContentRect(bool includeScrollbars) const;

              返加当前可见的滚动区域的坐标和大小

              voidScrollView::setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarModeverticalMode);

              设置滚动条的模式为水平或垂直

              ClipboardGtk.cpp   

              主要是剪贴板的一些基本操作的实现,其中所包含的函数:

              staticClipboardType dataObjectTypeFromHTMLClipboardType(const String& rawType);

              该函数返回html上所得到的对象的类型

              voidClipboardGtk::clearData(const String& typeString);

              清除当前剪贴板中所存储的指定类型的数据

              voidClipboardGtk::clearAllData();

              清除当前剪贴板中所存储的所有类型的数据

              static StringjoinURIList(Vector<KURL> uriList);

              //欠缺

              StringClipboardGtk::getData(const String& typeString, bool& success) const;

              得到剪贴板中指定类型的数据

              boolClipboardGtk::setData(const String& typeString, const String& data);

              在当前的剪贴板中写入指定类型的数据

              HashSet<String>ClipboardGtk::types() const;

              //欠缺

              GtkPluginWidget.cpp

              该文件主要是对插件widget进行操作,主要包含以下函数:

              GtkPluginWidget::GtkPluginWidget(GtkWidget*widget);

              该文件主要实现对指定widget的隐藏

              voidGtkPluginWidget::invalidateRect(const IntRect& _rect);

              置指定的rect区域为无效

              voidGtkPluginWidget::frameRectsChanged();

              设置frameRect的位置和大小

              voidGtkPluginWidget::paint(GraphicsContext* context, const IntRect& rect);

              重绘指定区域

              ./platform/network/soup/ResourceHandleSoup.cpp

              //欠缺

              ./platform/graphics/gtk/IconGtk.cpp

              该文件主要实现根据文件名,创建相应的不同类型的图标,并对其进行显示该文件主要包含以下函数:

              static StringlookupIconName(String MIMEType);

              根据mime的类型得到与之相对应的名字,并返回该名称

              PassRefPtr<Icon>Icon::createIconForFiles(const Vector<String>& filenames);

              根据给定文件名创建与之相对应的图标

              voidIcon::paint(GraphicsContext* context, const IntRect& rect);

              在指定的区域重绘

              ./platform/graphics/gtk/FontPlatformDataPango.cpp

              ./platform/graphics/cairo/FontPlatformDataCairo.cpp

              这两个文件主要是有关字体的一些操作其中用到了gtk的得到当前screen的函数和得到当前screen字体的一些属性

              ./platform/graphics/gtk/ImageGtk.cpp

              该文件主要实现对指定的图片写入一个新的framebuffer之中

              ./plugins/gtk/PluginViewGtk.cpp