亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

谷歌瀏覽器的源碼分析(22)

系統 1783 0
?

上一次說到消息轉發,并分析了 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 腳本網頁下載的呢?

谷歌瀏覽器的源碼分析(22)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲国产精品一区二区不卡 | 国产精品综合视频 | 精品一区二区三区免费毛片爱 | 亚洲精品高清国产一线久久97 | 狠狠色成人综合 | 日本一级欧美一级中文 | 欧美三区在线 | 欧美国产一区二区三区 | 美女操穴 | 激情综合网婷婷 | 精品91精品91精品国产片 | 香蕉尹人综合精品 | 99久久www免费人成精品 | 亚洲欧美日韩久久精品第一区 | 4虎影院在线观看 | 黄色在线网站视频 | 亚洲午夜在线观看 | 欧洲精品在线观看 | 亚洲欧美日韩国产一区图片 | 中国免费毛片 | 国产欧美亚洲三区久在线观看 | 久久久亚洲欧美综合 | 毛片在线播 | 黄页免费观看1 | 999热视频| 久久精品国产亚洲片 | 日本一级在线观看视频播放 | 久久久久香蕉 | 国产亚洲在线 | 精品国产一区二区二三区在线观看 | 四虎免费久久影院 | 四虎影院成人在线观看 | 日韩欧美在线不卡 | 欧美区视频 | 免费午夜在线视频 | 亚洲欧美人成人综合在线50p | 亚洲日本一区二区三区高清在线 | 欧美一区高清 | 黄色毛片毛茸茸 | 噜噜色噜噜色 | 中文字幕久久久久久久系列 |