上一次說到消息轉發,并分析了
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
腳本網頁下載的呢?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
