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] : "http://www.google.com/");

    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>);

        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/webkitwebkitwebview.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类又有loadxxx)成员函数,,,(好纠结)我估计webkkit是将“->”运算符重载了。反正就是要加载网址uriwebview中显示。

⊙﹏⊙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函数以及第二层(接口函数)现在我们就走通了,,,咱是不是也可以写一个简单的浏览器了呐?嘎嘎O(_)O,,,欲知后事如何,且看下回分解。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值