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

原创 2008年10月03日 20:07:00
 

继续上一次分析到类WebContentsNavigate函数,在这个函数里通过参数entry传送入来,这样它只需要根据这个参数去下载网页回来显示,应就可以了吧,但到底是怎么样工作的呢?这需要深入去分析它,才知道它是什么样的结果。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

#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_NavigateRHV进程,在UpdateBackForwardListCount函数里也发送一个消息ViewMsg_UpdateBackForwardListCountRHV进程。

 

继续分析函数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  }

 

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

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

上一次介绍到怎么样从其它地方返回搜索到的超级连接,现在就来分析一下使用搜索引擎去查找的类SearchProvider,它是通过搜索引擎来查找出来的,在这里是通过GOOGLE搜索引擎来查找出来。它的声明...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年04月27日 12:41
  • 778

suricata 3.1 源码分析19 (数据包获取)

初始化完成后,TmThreadsSlotPktAcqLoop函数将进入一个while循环,调用slot的PktAcqLoop函数获取并处理数据包。对应的模块函数原型为: TmEcod...
  • superbfly
  • superbfly
  • 2016年09月22日 09:02
  • 1020

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

上一次说到需要调用这个OpenURLFromTab函数,那么这个函数是做什么的呢?从名称上可能猜到它是打开网页,但是是从目前TAB页里打开呢?还是新建一个?或者使用每个TAB页一个进程呢?这些疑惑,只...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年04月27日 12:43
  • 757

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

上一次说到通过管道把接收到的HTTP数据通知另一个线程处理,它不是直接发送数据过去,而是把数据在共享内存里的句柄发送过去,达到高效通讯的目的。下面就来分析资源处理进程里,接收到这个消息之后,做些什么处...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年04月27日 12:51
  • 926

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

上一次说到发送命令给浏览器对象打开网页显示,但还没有分析它是怎么实现的,现在就来分析这方面的内容,如下:#001  voidBrowser::ExecuteCommand(int id) {...
  • caimouse
  • caimouse
  • 2008年09月29日 23:45
  • 5737

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

 上一次说到控制类的派生类LocationBarView,现在就来分析这个函数的功能,看看它又把URL连接传到那里去,立即就去看代码,在这行代码controller_->OnAutocompleteA...
  • caimouse
  • caimouse
  • 2008年09月26日 22:09
  • 7731

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

 上一次说到调用函数OpenURL来打开网络连接,这仅是网络浏览的开始,现在再来分析它怎么样去下载网页数据,然后再显示出来。#001  void AutocompleteEdit::OpenURL(c...
  • caimouse
  • caimouse
  • 2008年09月24日 21:29
  • 7879

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

 当我们键入字母或者文字开始时,那么类AutocompleteEdit就会从窗口消息里获取到相应的字母或者文字,然后根据输入的信息到本地或者网络上保存的信息库里查找相应的输入提示,这就是自动完成的实现...
  • caimouse
  • caimouse
  • 2008年09月16日 23:00
  • 12133

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

  当用户打开浏览器之后,最希望输入的地方,是浏览器的连接框。目前谷歌浏览器把输入连接框与搜索引擎输入合并到一起,可以说完美的组合,让界面更加简洁,方便实用,并且它自动完成的功能更加强劲,如下图所示:...
  • caimouse
  • caimouse
  • 2008年09月12日 23:32
  • 14710

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

 上一次说到类RenderThread和类RenderView把消息处理,那么这两个类是怎么样处理消息的呢?又是怎么样处理浏览的消息呢?现在就带着这两个问题去分析它的源码,理解它处理消息的方法。类Re...
  • caimouse
  • caimouse
  • 2008年10月05日 11:55
  • 6696
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:谷歌浏览器的源码分析(19)
举报原因:
原因补充:

(最多只允许输入30个字)