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