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

系统 1927 0
 

继续上一次分析到类 WebContents Navigate 函数,在这个函数里通过参数 entry 传送入来,这样它只需要根据这个参数去下载网页回来显示,应就可以了吧,但到底是怎么样工作的呢?这需要深入去分析它,才知道它是什么样的结果。

#001  

#002   bool WebContents::Navigate(const NavigationEntry& entry, bool reload) {

 

从渲染显示管理器里获取当前连接渲染显示对象。

#003     RenderViewHost* dest_render_view_host = render_manager_.Navigate(entry);

#004  

 

设置开始下载计时的时钟。

#005     // Used for page load time metrics.

#006     current_load_start_ = TimeTicks::Now();

#007  

 

在渲染显示对象里进行浏览处理。

#008     // Navigate in the desired RenderViewHost

#009     dest_render_view_host->NavigateToEntry(entry, reload);

#010  

#011     if (entry.page_id() == -1) {

#012       // HACK!!   This code suppresses javascript: URLs from being added to

#013       // session history, which is what we want to do for javascript: URLs that

#014       // do not generate content.   What we really need is a message from the

#015       // renderer telling us that a new page was not created.   The same message

#016       // could be used for mailto: URLs and the like.

#017       if (entry.url().SchemeIs("javascript"))

#018         return false;

#019     }

#020  

 

判断是否重新加载旧的连接处理。

#021     if (reload && !profile()->IsOffTheRecord()) {

#022       HistoryService* history =

#023           profile()->GetHistoryService(Profile::IMPLICIT_ACCESS);

#024       if (history)

#025         history->SetFavIconOutOfDateForPage(entry.url());

#026     }

#027  

#028     return true;

#029   }

 

在这个函数最主要的工作,就是调用类 RenderViewHost 函数 NavigateToEntry ,这个函数的代码如下:

#001   void RenderViewHost::NavigateToEntry(const NavigationEntry& entry,

#002                                        bool is_reload) {

 

创建浏览参数。

#003      ViewMsg_Navigate_Params params;

#004     MakeNavigateParams(entry, is_reload, &params);

#005  

 

授权渲染进程可以显示这个连接。

#006     RendererSecurityPolicy::GetInstance()->GrantRequestURL(

#007         process()->host_id(), params.url);

#008  

 

发送浏览下载连接参数给进程处理。

#009     DoNavigate(new ViewMsg_Navigate(routing_id_, params));

#010  

 

更新列表计数。

#011     UpdateBackForwardListCount();

#012   }

 

在这个函数里,主要创建浏览参数,然后调用函数 DoNavigate 来发送一个消息 ViewMsg_Navigate RHV 进程,在 UpdateBackForwardListCount 函数里也发送一个消息 ViewMsg_UpdateBackForwardListCount RHV 进程。

 

继续分析函数 DoNavigate

#001   void RenderViewHost::DoNavigate(ViewMsg_Navigate* nav_message) {

#002     // Only send the message if we aren't suspended at the start of a cross-site

#003     // request.

 

如果已经挂起,就开始重新复位这个消息。

#004     if (navigations_suspended_) {

#005       // Shouldn't be possible to have a second navigation while suspended, since

#006       // navigations will only be suspended during a cross-site request.   If a

#007       // second navigation occurs, WebContents will cancel this pending RVH

#008        // create a new pending RVH.

#009       DCHECK(!suspended_nav_message_.get());

#010       suspended_nav_message_.reset(nav_message);

#011     } else {

 

或者直接发送这个消息出去。

#012       Send(nav_message);

#013     }

#014   }

 

函数 UpdateBackForwardListCount 的代码如下:

#001   void RenderViewHost::UpdateBackForwardListCount() {

#002     int back_list_count, forward_list_count;

#003     delegate_->GetHistoryListCount(&back_list_count, &forward_list_count);

#004     Send(new ViewMsg_UpdateBackForwardListCount(

#005         routing_id_, back_list_count, forward_list_count));

#006   }

 

可以从函数 DoNavigate UpdateBackForwardListCount 里看到,最后都把这些事件变成消息,通过类 RenderProcessHost 来发送出去,主要使用 IPC 的通讯机制。具体是怎么样通讯的呢?下一次再来分析它。

 

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论