WebKit之Port

来源:互联网 发布:js中的事件委托 编辑:程序博客网 时间:2024/06/05 17:58

原文链接:http://blog.csdn.net/leeeryan/article/details/6131098


====================================================================================================================================

转自:浅谈WebKit之Port篇 (自备梯子)

 

1、与WebCore交互接口的实现 
        在WebKit源代码目录结构中WebKit目录下分别包含gtk、mac、qt、win、wx目录,其分别对应不同的Port移植方式,在每一个目录下面都包括 WebCoreSupport目录,而在不同的WebCoreSupport目录下分别包含有对类接口WebCore::ChromeClient、 WebCore::ContextMenuClient、WebCore::DragClient、WebCore::EditorClient、 WebCore::FrameLoaderClient、WebCore::InspectorClient等的实现,它们代表外部程序提供给 WebKit内部使用的接口实现,其中WebCore::ChromeClient、WebCore::FrameLoaderClient非常重要。

      

初步了解其接口定义能基本了解其对应的含义,这些接口往往需要由Port移植部分来提供实现,往往由WebKit内部根据一定的条件来调用。下面初步来了解几个主要接口:

WebCore::ChromeClient接口:

//往往在运行window.open脚本时调用,以便由外部程序决定如何打开一个新页面如新建一个窗口、新建一个Tab页签等;virtual WebCore::Page* createWindow(WebCore::Frame*, const WebCore::FrameLoadRequest&, const WebCore::WindowFeatures&);//通知外部程序显示页面;virtual void show();virtual bool canRunModal();//通知外部程序以Modal的方式显示页面;virtual void runModal();//通知外部程序显示JS警告提示窗口;virtual void runJavaScriptAlert(WebCore::Frame*, const WebCore::String&);//通知外部程序显示JS警告确认窗口;virtual bool runJavaScriptConfirm(WebCore::Frame*, const WebCore::String&);WebCore::FrameLoaderClient接口://检查是否拥有主页面窗口;virtual bool hasWebView() const;//检查是否拥有页面窗口;virtual bool hasFrameView() const;//通知外部程序有关http请求开始、结束、获取数据等,如通常浏览器状态栏显示的信息;virtual void dispatchDidReceiveResponse(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::ResourceResponse&);virtual void dispatchDidReceiveContentLength(WebCore::DocumentLoader*, unsigned long identifier, int lengthReceived);virtual void dispatchDidFinishLoading(WebCore::DocumentLoader*, unsigned long identifier);virtual void dispatchDidFailLoading(WebCore::DocumentLoader*, unsigned long identifier, const WebCore::ResourceError&);//通知外部程序WebKit内部主要事件处理,以便外部程序及时响应或创建维护数据等virtual void dispatchDidHandleOnloadEvents();virtual void dispatchDidReceiveServerRedirectForProvisionalLoad();virtual void dispatchDidCancelClientRedirect();virtual void dispatchWillPerformClientRedirect(const WebCore::KURL&, double interval, double fireDate);virtual void dispatchDidChangeLocationWithinPage();virtual void dispatchWillClose();virtual void dispatchDidReceiveIcon();virtual void dispatchDidStartProvisionalLoad();virtual void dispatchDidReceiveTitle(const WebCore::String&);virtual void dispatchDidCommitLoad();virtual void dispatchDidFinishDocumentLoad();virtual void dispatchDidFinishLoad();virtual void dispatchDidFirstLayout();//告诉外部程序需要提供切换到一个新页面状态。此时外部程序往往会新建FrameView,并将FrameView与Frame关联,设置原生窗口句柄及其消息处理机制等等;virtual void transitionToCommittedForNewPage();//告诉外部程序创建一个新的Frame,如遇到html中iframe标签时,需要外部程序创建一个新的Frame及原生窗口句柄等;virtual PassRefPtr createFrame(const WebCore::KURL& url, const WebCore::String& name, WebCore::HTMLFrameOwnerElement* ownerElement,const WebCore::String& referrer, bool allowsScrolling, int marginWidth, int marginHeight);//告诉外部程序需要创建一个Plugin实例,从而创建其原生窗口等等;virtual WebCore::Widget* createPlugin(const WebCore::IntSize&, WebCore::Element*, const WebCore::KURL&, const Vector&, const Vector&, const WebCore::String&, bool loadManually);

2、对WebCore中的page/loader等方面的类提供对应Port的实现支持 
      如EventHandlerWin.cpp、FrameLoaderWin.cpp、DocumentLoaderWin.cpp、DocumentLoaderWin.cpp、WidgetWin.cpp、KeyEventWin.cpp等

3、实现WebView及WebFrame等以便外部程序嵌入WebKit 
      不同的Port移植对WebView及WebFrame的定义及实现有所不同,但其与WebCore中的Page、Frame之间的关系大致与浅谈WebKit之WebCore篇图一描述相一致。

      具体关于WebView、WebFrame的定义与实现,特别是初始化时的动作可根据不同的Port移植而有所不同,同时初始化时会将上面提到的WebCore Port接口实现告诉WebKit内部。主要示例代码如下:

static void webkit_web_view_init(WebKitWebView* webView){WebKitWebViewPrivate* priv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);webView->priv = priv;priv->corePage = new Page(new WebKit::ChromeClient(webView), new WebKit::ContextMenuClient(webView), new WebKit::EditorClient(webView), new WebKit::DragClient, new WebKit::InspectorClient);priv->mainFrame = WEBKIT_WEB_FRAME(webkit_web_frame_new(webView));priv->lastPopupXPosition = priv->lastPopupYPosition = -1;priv->editable = false;................................priv->webSettings = webkit_web_settings_new();webkit_web_view_update_settings(webView);..................................}WebKitWebFrame* webkit_web_frame_new(WebKitWebView* webView){g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);WebKitWebFrame* frame = WEBKIT_WEB_FRAME(g_object_new(WEBKIT_TYPE_WEB_FRAME, NULL));WebKitWebFramePrivate* priv = frame->priv;WebKitWebViewPrivate* viewPriv = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);priv->webView = webView;priv->client = new WebKit::FrameLoaderClient(frame);priv->coreFrame = Frame::create(viewPriv->corePage, 0, priv->client).get();priv->coreFrame->init();return frame;}

4、Chrome中对Port移植方面的实现 
        其基本上与其他Port移植类似,其主要代码在webkit/glue目录中,可重点关注带client_impl.cc后缀的文件、 webview_impl.cc、webwidget_impl.cc等;但是其究竟如何创建原生windows窗口、如何创建Render进程、 Render进程与创建的原生windows窗口的关系如何等需要更进一步深入研究Chrome,如果能从上面提到的Port部分入手也许很快就可得到答案,这一点以后有机会单独研究。


原创粉丝点击