您的位置:首页 > 其它

谷歌浏览器的源码分析(22)

2008-10-07 21:34 513 查看
上一次说到消息转发,并分析了RenderThread类里处理消息的函数,其实大部份的消息都是在RenderView类里的OnMessageReceived函数处理,比如浏览的消息也是在这里处理。它的代码如下:
#001 void RenderView::OnMessageReceived(const IPC::Message& message) {
#002 // Let the resource dispatcher intercept resource messages first.

如果是资源消息,就直接分发去处理,以便提高效率。
#003 if (resource_dispatcher_->OnMessageReceived(message))
#004 return;

下面开始处理RenderView类里所有的消息。
#005 IPC_BEGIN_MESSAGE_MAP(RenderView, message)
#006 IPC_MESSAGE_HANDLER(ViewMsg_CreatingNew_ACK, OnCreatingNewAck)
#007 IPC_MESSAGE_HANDLER(ViewMsg_CaptureThumbnail, SendThumbnail)
#008 IPC_MESSAGE_HANDLER(ViewMsg_GetPrintedPagesCount, OnGetPrintedPagesCount)
#009 IPC_MESSAGE_HANDLER(ViewMsg_PrintPages, OnPrintPages)
#010 IPC_MESSAGE_HANDLER(ViewMsg_Navigate, OnNavigate)
#011 IPC_MESSAGE_HANDLER(ViewMsg_Stop, OnStop)
#012 IPC_MESSAGE_HANDLER(ViewMsg_LoadAlternateHTMLText, OnLoadAlternateHTMLText)
#013 IPC_MESSAGE_HANDLER(ViewMsg_StopFinding, OnStopFinding)
#014 IPC_MESSAGE_HANDLER(ViewMsg_Undo, OnUndo)
#015 IPC_MESSAGE_HANDLER(ViewMsg_Redo, OnRedo)
#016 IPC_MESSAGE_HANDLER(ViewMsg_Cut, OnCut)
#017 IPC_MESSAGE_HANDLER(ViewMsg_Copy, OnCopy)
#018 IPC_MESSAGE_HANDLER(ViewMsg_Paste, OnPaste)
#019 IPC_MESSAGE_HANDLER(ViewMsg_Replace, OnReplace)
#020 IPC_MESSAGE_HANDLER(ViewMsg_Delete, OnDelete)
#021 IPC_MESSAGE_HANDLER(ViewMsg_SelectAll, OnSelectAll)
#022 IPC_MESSAGE_HANDLER(ViewMsg_CopyImageAt, OnCopyImageAt)
#023 IPC_MESSAGE_HANDLER(ViewMsg_Find, OnFind)
#024 IPC_MESSAGE_HANDLER(ViewMsg_AlterTextSize, OnAlterTextSize)
#025 IPC_MESSAGE_HANDLER(ViewMsg_SetPageEncoding, OnSetPageEncoding)
#026 IPC_MESSAGE_HANDLER(ViewMsg_InspectElement, OnInspectElement)
#027 IPC_MESSAGE_HANDLER(ViewMsg_ShowJavaScriptConsole, OnShowJavaScriptConsole)
#028 IPC_MESSAGE_HANDLER(ViewMsg_DownloadImage, OnDownloadImage)
#029 IPC_MESSAGE_HANDLER(ViewMsg_ScriptEvalRequest, OnScriptEvalRequest)
#030 IPC_MESSAGE_HANDLER(ViewMsg_AddMessageToConsole, OnAddMessageToConsole)
#031 IPC_MESSAGE_HANDLER(ViewMsg_DebugAttach, OnDebugAttach)
#032 IPC_MESSAGE_HANDLER(ViewMsg_DebugDetach, OnDebugDetach)
#033 IPC_MESSAGE_HANDLER(ViewMsg_ReservePageIDRange, OnReservePageIDRange)
#034 IPC_MESSAGE_HANDLER(ViewMsg_UploadFile, OnUploadFileRequest)
#035 IPC_MESSAGE_HANDLER(ViewMsg_FormFill, OnFormFill)
#036 IPC_MESSAGE_HANDLER(ViewMsg_FillPasswordForm, OnFillPasswordForm)
#037 IPC_MESSAGE_HANDLER(ViewMsg_DragTargetDragEnter, OnDragTargetDragEnter)
#038 IPC_MESSAGE_HANDLER(ViewMsg_DragTargetDragOver, OnDragTargetDragOver)
#039 IPC_MESSAGE_HANDLER(ViewMsg_DragTargetDragLeave, OnDragTargetDragLeave)
#040 IPC_MESSAGE_HANDLER(ViewMsg_DragTargetDrop, OnDragTargetDrop)
#041 IPC_MESSAGE_HANDLER(ViewMsg_AllowDomAutomationBindings,
#042 OnAllowDomAutomationBindings)
#043 IPC_MESSAGE_HANDLER(ViewMsg_AllowBindings, OnAllowBindings)
#044 IPC_MESSAGE_HANDLER(ViewMsg_SetDOMUIProperty, OnSetDOMUIProperty)
#045 IPC_MESSAGE_HANDLER(ViewMsg_DragSourceEndedOrMoved, OnDragSourceEndedOrMoved)
#046 IPC_MESSAGE_HANDLER(ViewMsg_DragSourceSystemDragEnded,
#047 OnDragSourceSystemDragEnded)
#048 IPC_MESSAGE_HANDLER(ViewMsg_SetInitialFocus, OnSetInitialFocus)
#049 IPC_MESSAGE_HANDLER(ViewMsg_FindReplyACK, OnFindReplyAck)
#050 IPC_MESSAGE_HANDLER(ViewMsg_UpdateTargetURL_ACK, OnUpdateTargetURLAck)
#051 IPC_MESSAGE_HANDLER(ViewMsg_UpdateWebPreferences, OnUpdateWebPreferences)
#052 IPC_MESSAGE_HANDLER(ViewMsg_SetAltErrorPageURL, OnSetAltErrorPageURL)
#053 IPC_MESSAGE_HANDLER(ViewMsg_InstallMissingPlugin, OnInstallMissingPlugin)
#054 IPC_MESSAGE_HANDLER(ViewMsg_RunFileChooserResponse, OnFileChooserResponse)
#055 IPC_MESSAGE_HANDLER(ViewMsg_EnableViewSourceMode, OnEnableViewSourceMode)
#056 IPC_MESSAGE_HANDLER(ViewMsg_UpdateBackForwardListCount,
#057 OnUpdateBackForwardListCount)
#058 IPC_MESSAGE_HANDLER(ViewMsg_GetAllSavableResourceLinksForCurrentPage,
#059 OnGetAllSavableResourceLinksForCurrentPage)
#060 IPC_MESSAGE_HANDLER(ViewMsg_GetSerializedHtmlDataForCurrentPageWithLocalLinks,
#061 OnGetSerializedHtmlDataForCurrentPageWithLocalLinks)
#062 IPC_MESSAGE_HANDLER(ViewMsg_GetApplicationInfo, OnGetApplicationInfo)
#063 IPC_MESSAGE_HANDLER(ViewMsg_ShouldClose, OnMsgShouldClose)
#064 IPC_MESSAGE_HANDLER(ViewMsg_ClosePage, OnClosePage)
#065 IPC_MESSAGE_HANDLER(ViewMsg_ThemeChanged, OnThemeChanged)
#066 #ifdef CHROME_PERSONALIZATION
#067 IPC_MESSAGE_HANDLER(ViewMsg_PersonalizationEvent, OnPersonalizationEvent)
#068 #endif
#069 IPC_MESSAGE_HANDLER(ViewMsg_HandleMessageFromExternalHost,
#070 OnMessageFromExternalHost)

这里对于没有处理的消息进行提示。
#071 // Have the super handle all other messages.
#072 IPC_MESSAGE_UNHANDLED(RenderWidget::OnMessageReceived(message))
#073 IPC_END_MESSAGE_MAP()
#074 }

从上面这个函数可以看到,它的消息处理是非常多的,下面来分析一个浏览网络连接的消息,它就是ViewMsg_Navigate,可以看到这个消息后面响应函数是OnNavigate,也就是说,当你输入网络地址之后按回车,就会通过上说过的IPC机制把消息发送到这里,接着来看这个函数OnNavigate的代码,如下:
#001 void RenderView::OnNavigate(const ViewMsg_Navigate_Params& params) {

判断窗口是否关闭,如果关闭就不用去打开连接地址了。
#002 if (!webview())
#003 return;
#004

处理一些about的连接处理,比如about:crash。
#005 AboutHandler::MaybeHandle(params.url);
#006

保存是否重新加载网页。
#007 bool is_reload = params.reload;
#008

获取WEB的显示框架。
#009 WebFrame* main_frame = webview()->GetMainFrame();

判断当是重新加载时,而当前又不是历史网页的情况。
#010 if (is_reload && !main_frame->HasCurrentState()) {
#011 // We cannot reload if we do not have any history state. This happens, for
#012 // example, when recovering from a crash. Our workaround here is a bit of
#013 // a hack since it means that reload after a crashed tab does not cause an
#014 // end-to-end cache validation.
#015 is_reload = false;
#016 }
#017

下面设置缓冲策略。
#018 WebRequestCachePolicy cache_policy;
#019 if (is_reload) {
#020 cache_policy = WebRequestReloadIgnoringCacheData;
#021 } else if (params.page_id != -1 || main_frame->GetInViewSourceMode()) {
#022 cache_policy = WebRequestReturnCacheDataElseLoad;
#023 } else {
#024 cache_policy = WebRequestUseProtocolCachePolicy;
#025 }
#026

下面创建一个下载请求,并把相关参数设置到请求里面。
#027 scoped_ptr<WebRequest> request(WebRequest::Create(params.url));
#028 request->SetCachePolicy(cache_policy);
#029 request->SetExtraData(new RenderViewExtraRequestData(
#030 params.page_id, params.transition, params.url));
#031

设置WEBKIT的请求状态。
#032 // If we are reloading, then WebKit will use the state of the current page.
#033 // Otherwise, we give it the state to navigate to.
#034 if (!is_reload)
#035 request->SetHistoryState(params.state);
#036

让主WEB显示框架去下载请求显示。
#037 main_frame->LoadRequest(request.get());
#038 }

分析这个函数,就可以知道处理浏览消息的过程,下一次来分析WebFrame里的接口函数LoadRequest处理过程,到底它是怎么样处理javascript脚本网页下载的呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: