欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統(tǒng) 1847 0
?

上一次說到消息轉(zhuǎn)發(fā),并分析了 RenderThread 類里處理消息的函數(shù),其實(shí)大部份的消息都是在 RenderView 類里的 OnMessageReceived 函數(shù)處理,比如瀏覽的消息也是在這里處理。它的代碼如下:

#001 ? void RenderView::OnMessageReceived(const IPC::Message& message) {

#002 ??? // Let the resource dispatcher intercept resource messages first.

?

如果是資源消息,就直接分發(fā)去處理,以便提高效率。

#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)

?

這里對于沒有處理的消息進(jìn)行提示。

#071 ????? // Have the super handle all other messages.

#072 ????? IPC_MESSAGE_UNHANDLED(RenderWidget::OnMessageReceived(message))

#073 ??? IPC_END_MESSAGE_MAP()

#074 ? }

?

從上面這個函數(shù)可以看到,它的消息處理是非常多的,下面來分析一個瀏覽網(wǎng)絡(luò)連接的消息,它就是 ViewMsg_Navigate ,可以看到這個消息后面響應(yīng)函數(shù)是 OnNavigate ,也就是說,當(dāng)你輸入網(wǎng)絡(luò)地址之后按回車,就會通過上說過的 IPC 機(jī)制把消息發(fā)送到這里,接著來看這個函數(shù) OnNavigate 的代碼,如下:

#001 ? void RenderView::OnNavigate(const ViewMsg_Navigate_Params& params) {

?

判斷窗口是否關(guān)閉,如果關(guān)閉就不用去打開連接地址了。

#002 ??? if (!webview())

#003 ????? return;

#004 ?

?

處理一些 about 的連接處理,比如 about:crash

#005 ??? AboutHandler::MaybeHandle(params.url);

#006 ?

?

保存是否重新加載網(wǎng)頁。

#007 ??? bool is_reload = params.reload;

#008 ?

?

獲取 WEB 的顯示框架。

#009 ??? WebFrame* main_frame = webview()->GetMainFrame();

?

判斷當(dāng)是重新加載時(shí),而當(dāng)前又不是歷史網(wǎng)頁的情況。

#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 ?

?

下面設(shè)置緩沖策略。

#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 ?

?

下面創(chuàng)建一個下載請求,并把相關(guān)參數(shù)設(shè)置到請求里面。

#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 ?

?

設(shè)置 WEBKIT 的請求狀態(tài)。

#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 ? }

?

分析這個函數(shù),就可以知道處理瀏覽消息的過程,下一次來分析 WebFrame 里的接口函數(shù) LoadRequest 處理過程,到底它是怎么樣處理 javascript 腳本網(wǎng)頁下載的呢?

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


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

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

【本文對您有幫助就好】

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

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产欧美日韩在线观看 | www.在线播放| 女人裸体让男人桶全过程 | 国产精品免费一区二区三区都可以 | 日韩在线免费视频 | 亚洲第一成网站 | 91成人短视频 | 久久成人国产 | jizz国产精品免费麻豆 | 性视频网站免费 | 国产精品久久久久无码av | 鲁在线视频 | 美女超碰| 日韩 欧美 国产 师生 制服 | 草草视频手机在线观看视频 | 欧美黄色网| 国产精品成人一区二区1 | 国产成人系列 | 婷婷色综合久久 | 国产精品人妻无码久久久2022 | 777xacom | 在线观看亚洲一区 | 波多野结衣三级在线观看 | 久久蜜桃亚洲一区二区 | 精品一二区 | 国产精彩视频 | 亚洲精品国产第一综合99久久 | 欧美精品一区二区免费 | 成人视品 | 91高清国产视频 | 日韩欧美一区二区三区四区 | 国产成人亚洲毛片 | 亚洲视频在线播放 | 日韩 亚洲 欧美 中文 高清 | hd性videos意大利复古 | 欧美高清视频一区 | 久草免费在线视频 | 国产精品久久久久久影视 | 波多野结衣在线高清视频 | 午夜你懂得 | 精品欧美一区二区三区久久久 |