webkit自带谷歌浏览器实例分析

发布时间 : 星期二 文章webkit自带谷歌浏览器实例分析更新完毕开始阅读

Webkit自带谷歌浏览器实例分析(1)

先看下这个简单浏览器的图片效果

我这个程序源代码是用source insight阅读的,,,source insight怎一个强字了得?! 从main函数开始分析: int

main (int argc, char* argv[]) {

gtk_init (&argc, &argv); /*初始化gtk整个实例,每个gtk中必有的*/ if (!g_thread_supported ()) g_thread_init (NULL);

GtkWidget* vbox = gtk_vbox_new (FALSE, 0); /*创建一个垂直的box来存放下列 部件,创建并添加工具栏(toolbar)、浏览器(browser)、状态栏(statusbar)*/ gtk_box_pack_start (GTK_BOX (vbox), create_toolbar (), FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), create_browser (), TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (vbox), create_statusbar (), FALSE, FALSE, 0);

main_window = create_window ();/*创建主窗口,放置vbox*/

gtk_container_add (GTK_CONTAINER (main_window), vbox); /*将vbox放入主窗口*/

/*判断是否输入网址也就是命令行参数,有的话将值给uri,没有的话设为默认*/ gchar* uri = (gchar*) (argc > 1 ? argv[1] : \ webkit_web_view_load_uri (web_view, uri);/*调用webkit库函数加载uri网址*/

gtk_widget_grab_focus (GTK_WIDGET (web_view));/抓取web_view上的焦点?*/

/*现实整个主窗口,也就是浏览器窗口*/ gtk_widget_show_all (main_window); gtk_main ();

return 0; }

主函数从前到后读下来基本没什么问题,只是对web_view有点困惑,于是找到定义的地方

static WebKitWebView* web_view; /*很显然是一个全局静态变量*/

在webkit的源码包中的gtk目录下的webkit下的Webkitwebview.h查找WebKitWebView: 发现typedef struct _WebKitWebView WebKitWebView; struct _WebKitWebView的结构为: struct _WebKitWebView {

GtkContainer parent_instance; /*< private >*/

WebKitWebViewPrivate *priv; };

依然不大懂,继续挖掘WebKitWebViewPrivate:真是有种取之不尽挖之不绝的感觉 O(∩_∩)O

typedef struct _WebKitWebViewPrivate WebKitWebViewPrivate; 再往下看终于看到曙光了:

struct _WebKitWebViewPrivate {

WebCore::Page* corePage; /*这个应该是核心页面吧*/

WebKitWebSettings* webSettings; /*页面有关的设置木有细挖,水太深*/ WebKitWebInspector* webInspector; /*什么检查员?*/

WebKitWebWindowFeatures* webWindowFeatures; /*Window的特性*/

WebKitWebFrame* mainFrame; /*web主框架*/

WebKitWebBackForwardList* backForwardList; /*保存前进后退的链表*/

gint lastPopupXPosition; /*不太懂*/ gint lastPopupYPosition; /*依然不太懂*/ 此处也省略很多

};

WebCore::Page*?是什么东东?真是一波未平一波又起,杯具之情油然而生,究竟何时是尽头,,,?放弃or继续走下去?其实本来想放弃的,但是想想都挖了这么深了,放弃了可惜哇,,,go ahead!继续挖:

何为命名空间?据《c++primer》传言,一般大型程序或者库文件有很多全局变量,这些变量重名的概率是相当的高,所以就会引起名字冲突,《C++primer》起了个洋气的名字,叫“命名空间污染”,其实就是重名引起冲突而已。为了避免这种污染,就有了命名空间。

namespace WebCore {

AccessibilityARIAGrid::AccessibilityARIAGrid(RenderObject* renderer) : AccessibilityTable(renderer)

{

#if ACCESSIBILITY_TABLES

m_isAccessibilityTable = true; #else

m_isAccessibilityTable = false; #endif

}/*擦??无穷尽呐~*/

挖了半天,还是没有看到page,原来是文件找错了⊙﹏⊙b汗,,,继续挖,,,终于在WebKit-r47011\\WebCore\\page\\gtk下面的EventHandlerGtk.cpp中发现了这个东东,但是凭我的智商,暂时这块还是先不挖了,为啥?请注意看??见证历史的时刻到了

namespace WebCore {

class Chrome;

class Page : public Noncopyable

{

public:

static void setNeedsReapplyStyles();

Page(ChromeClient*, ContextMenuClient*, EditorClient*, DragClient*, InspectorClient*);

~Page();

RenderTheme* theme() const { return m_theme.get(); };

static void refreshPlugins(bool reload); PluginData* pluginData() const;

void setCanStartPlugins(bool);

bool canStartPlugins() const { return m_canStartPlugins; } void addUnstartedPlugin(PluginView*); void removeUnstartedPlugin(PluginView*);

EditorClient* editorClient() const { return m_editorClient; }

void setMainFrame(PassRefPtr);

Frame* mainFrame() const { return m_mainFrame.get(); }

BackForwardList* backForwardList(); ????

此处省略n多行个??,n>100 }?end Page?/*貌似这个是webkit特有的注释( ⊙o⊙ )哇,经查证是SI的风格*/

} ?end WebCore?

至此 本文件的WebCore命名空间总算是完成了,,,我这里贴过来的代码大概是十分之一左右,,,╭(╯^╰)╮,知道我为啥不挖了吧,,,挖不完(⊙o⊙)!,大概知道就行了嘛!Page是干嘛的?与页面相关的风格、主题、框架的设置、插件、前进后退的链表,等等等等。整个文件就先不挖了,,,现在挖完以后就没事干了

看到这里,,,懵懵懂懂的貌似知道了web_view是什么东东了,,,应该就是浏览器显示网站的那部分视图哇,其中就包含page,不管了先这么理解,等真正理解了再反过来看

现在,main函数中依然朦胧的函数就是下面的两个了,,,哇!挖!马上挖完了 webkit_web_view_load_uri (web_view, uri); gtk_widget_grab_focus (GTK_WIDGET (web_view));

这个可比web_view好挖多了,,,WebKit-r47011\\WebKit\\gtk\\webkit的webkitwebview.h下面,一目了然!

void webkit_web_view_load_uri(WebKitWebView* webView, const gchar* uri) {

g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));/*这里应该是错误检测机制*/ g_return_if_fail(uri);

WebKitWebFrame* frame = webView->priv->mainFrame; webkit_web_frame_load_uri(frame, uri); }

void webkit_web_frame_load_uri(WebKitWebFrame* frame, const gchar* uri) {

g_return_if_fail(WEBKIT_IS_WEB_FRAME(frame)); g_return_if_fail(uri);

Frame* coreFrame = core(frame); if (!coreFrame) return;

coreFrame->loader()->load(ResourceRequest(KURL(KURL(), String::fromUTF8(uri))), false); }

意思就是Frame类型的coreFrame对象的loader()成员函数的返回值是FrameLoader类型的对象,然后FrameLoader类又有load(x,x,x)成员函数,,,(好纠结)我估计webkkit是将“->”运算符重载了。反正就是要加载网址uri在webview中显示。

⊙﹏⊙b汗,,,说来杯具,,,我是用GTK作为开发工具,,,所以一直以为webkit是用GObject实现的,,,知道看到现在才发现webkit是用C++实现的,,,我勒个去!我说这个webkit模仿C++也模仿的忒像了吧,啊哦,杯具??

下面看下gtk_widget_grab_focus (GTK_WIDGET (web_view)),这个是Gtk的函数,比webkit好多了,,,嘎嘎~

Void gtk_widget_grab_focus (GtkWidget *widget)我是这样理解的:让widget能够为整个窗口捕获键盘的焦点。

那么整个main函数以及第二层(接口函数)现在我们就走通了,,,咱是不是也可以写

联系合同范文客服:xxxxx#qq.com(#替换为@)