欧美三区_成人在线免费观看视频_欧美极品少妇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久久精品 | 97麻豆精品国产自产在线观看 | 男女无遮挡高清性视频直播 | 久久亚洲精品国产精品婷婷 | 国产视频一二区 | 欧美视频网站 | jiaduolu| 一区二区久久 | 蜜桃网在线观看 | 亚洲成a人片在线网站 | 男人激烈吮乳动态图 | 日韩久草 | 欧美一级片手机在线观看 | 日韩综合一区 | 二区视频 | 波多野结衣中文在线播放 | 久9视频这里只有精品8 | 欧美日韩不卡在线 | 日韩av线上| 免费国产一级特黄久久 | 91亚洲国产成人久久精品网站 | 5月激情网 | 国内精品一区二区三区最新 | 亚洲一区二区三区精品视频 | 日韩精品 | 97色免费视频| 久操青青| 欧美精品在线免费观看 | 情欲色香味 | 91麻豆精品国产91久久久久久 | 成人黄色免费电影 | 国产成人精品高清免费 | 亚洲视频一区在线观看 | 免费中文字幕 | 福利一区在线视频 | 亚洲视频在线一区 | 亚洲欧美激情精品一区二区 | 能直接看av的网站 | 色搞搞 | 久久无码AV亚洲精品色午夜 | 国产精品精品 |