Chrome导航和会话历史

来源:互联网 发布:黑色沙漠捏脸数据放哪 编辑:程序博客网 时间:2024/06/03 19:07

每个NavigationEntry都会存储一个页面ID和历史状态数据。页面ID用来唯一标识一个页面载入,这样我们就知道哪一个NavigationEntry与之对应。它在页面被提交时分配,所以一个pending状态的NavigationEntry的页面ID是-1。历史状态数据就是WebCore::HistoryItem序列化的一个字符串。它里面包含了页面URL,子frame URL,以及表格数据。


1.当浏览器初始化请求时(在地址栏中输入,或者点击后退/前进/刷新)


2.生成一个WebRequest来表示导航,它会一直为书记员(bookkeeping)带着页面ID之类的信息。新导航的ID是-1。当页面是第一次访问时,旧入口的导航会把ID分配给NavigationEntry。到后面载入提交时,还会查询这个信息。


3.主WebFrame会被调用来载入新的请求。


4.渲染器初始化请求时(用户点击链接,js改变了location,等)


5.WebCore::FrameLoader的各个载入方法会被调用来载入请求。


6.无论什么情况,当收到服务器返回的第一个包时,载入会被提交(不再是"pending"或"provisional"状态)。


7.如果有一个新的导航,会fork出一个新的WebCore,它会创建一个新的HistoryItem,并加到BackForwardList中。用这个方法,我们可以区分哪个导航是新的,哪个是会话历史导航。


8.RenderView::DidCommitLoadForFrame处理载入的提交。在这,前一个页面的状态通过ViewHostMsg_UpdateState消息被存储在会话历史中。这告诉浏览器去更新对应的NavigationEntry(通过RenderView的当前页面ID标识)为新的历史状态。


9.RenderView的当前页面ID被更新为提交页面的ID。对于新的导航,会生成一个新的唯一页面ID。对会话历史导航,页面ID是第一次访问时的ID,初始化导航时,已经把它存在WebRequest里了。


10.发送一个ViewHostMsg_FrameNavigate消息给浏览器,更新对应的NavigationEntry(由RenderView刚更新的页面ID标识)的新URL和其他信息。

原创粉丝点击