WebKit历史项管理的实现
从上面看三个层次:Page,Frame,以及JS Binding的接口。页面载入的核心是由Frame通过FrameLoader来完毕的,HistoryController及BackForwardController能够视为页面载入进行历史项操作的接口。 Frame层次中通过HistoryController, Page层次中通过BackForwardController进行历史项操作。
BackForwardClient及HistoryItem则存储着历史项的详细内容。历史项的变化消息则由FrameLoaderClient负责发送(适配到WebKit层)。
Page层次中的主要类关系例如以下:
一个HistoryItem能够理解为标准中定义的state。HistoryItem存储和Joint Session History的关系表如今其存储的成员变量上:
m_target, m_parent存储的都是Frame名称,能够从FrameTree获取到Frame, 分别代表着此HistoryItem相应的Frame, 以及其父Frame。
m_scrollPoint则是当前显示的位置。假设是通过Anchor跳转,这个值就会有所区分。
m_stateObject则是通过HTML5 History API的pushState及replaceState所操作的内容。
JSBinding层则是由History通过Frame向JS提供服务。在Frame的层次上,Frame主要通过FrameLoader进行历史项操作。页面跳转操作则由Frame的NavigatorScheduler来完毕。在HTML5 Spec中关于Session History的操作集中在HistoryController里,一部分逻辑分散在NavigationScheduler里,比方NavigationScheduler::mustLockBackForwardList()函数,以及1秒内跳转的处理逻辑。
当页面前进后退时,详细的载入操作还是以FrameLoader为核心的,HistoryController和BackForwardController充其量还主要是存储操作。历史项的变化也还须要由FrameLoaderClient及其在各个平台的实现来派发到WebKit及UI层(上图中WebHistoryDelegate即为Mac OS下WebView接收历史项相关信息的Delegate)。
当页面通过JS运行pushState,在WebCore就会在HistoryController中生成一个含有此State的HistoryItem,然后加入到BackForwardList(BackForwardClient)中。下面是其时序图:
详细的行为逻辑,通读标准定义是最合适的。附链接例如以下:
https://html.spec.whatwg.org/multipage/browsers.html
从WebKit对外的适配,详细的实现差异比較大,但都会以历史项变化的消息通知来相应UI上的前进后退操作及状态显示,这样能够保持一致性。
比方在Mac OS下,一个历史项变化时,WebFrameLoaderClient::updateGlobalHistory()会使用例如以下的方式通知到WebView上:
if ([view historyDelegate]) {
WebHistoryDelegateImplementationCache* implementations = WebViewGetHistoryDelegateImplementations(view);
if (implementations->navigatedFunc) {
WebNavigationData *data = [[WebNavigationData alloc] initWithURLString:loader->url()
title:nilOrNSString(loader->title().string())
originalRequest:loader->originalRequestCopy().nsURLRequest(UpdateHTTPBody)
response:loader->response().nsURLResponse()
hasSubstituteData:loader->substituteData().isValid()
clientRedirectSource:loader->clientRedirectSourceForHistory()];
CallHistoryDelegate(implementations->navigatedFunc, view, @selector(webView:didNavigateWithNavigationData:inFrame:), data, m_webFrame.get());
[data release];
}
return;
}
历史项的创建及通知流程例如以下:
转载请注明出处: http://blog.csdn.net/horkychen
WebKit历史项管理的实现的更多相关文章
- WebKit的历史项管理
标准定义 关于历史的管理,和HTML页面载入一样,都有其相应的标准.地址例如以下: WhatWG: https://html.spec.whatwg.org/multipage/browsers.ht ...
- ASP.NET Core 1.0 中的依赖项管理
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- RDIFramework.NET ━ 9.7 操作权限项管理 ━ Web部分
RDIFramework.NET ━ .NET快速信息化系统开发框架 9.7 操作权限项管理 -Web部分 随着经济全球化趋势的发展和企业间竞争的加剧,企业对管理要求不断变化.提高,越来越多的信息都表 ...
- History API与浏览器历史堆栈管理
移动端开发在某些场景中有着特殊需求,如为了提高用户体验和加快响应速度,常常在部分工程采用SPA架构.传统的单页应用基于url的hash值进行路由,这种实现不存在兼容性问题,但是缺点也有--针对不支持o ...
- windows启动项管理
在运行框中输入 msconfig 选择启动栏 会跳转到任务管理器,可以管理启动项,可以看到我的启动项里有nc病毒 ,点击禁用即可.
- 什么是Maven? 使用Apache Maven构建和依赖项管理
通过优锐课java架构学习中,学到了不少干货,整理分享给大家学习. 开始使用最流行的Java构建和依赖管理工具Maven Apache Maven是Java开发的基石,也是Java使用最广泛的构建管理 ...
- Linux命令:history命令历史的管理及用法
bash可以保存的过去曾经执行过的命令.当某个用户登录到shell中,会读取该用户家目录中的~/.bash_history文件,并将历史命令列表保存到内存中.当用户退出当前shell时,会将内存中的历 ...
- Linux历史命令管理以及用法
history [-c] [-d offset] [n] history -anrw [filename] history -ps arg [arg...] -c: 清空命令历史 -d offset: ...
- ubuntu mint 开机启动项管理
使用工具 sysv-rc-conf,需要安装. 点击打开链接http://blog.chinaunix.net/uid-21516619-id-1825027.html
随机推荐
- 更改input【type=file】样式
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- 《JavaScript高级程序设计 第3版》-学习笔记-3
P84-P137页, 这一章看的真久,这个月事太多了.有些内容在代码注释里没提出来了 1.JS强大的数组类型,元素类型任意,提供了非常多的操作数组的方法和属性 /* 数组类型 */ //stack v ...
- js 删除数组方法
今天遇到一个比较脑残的问题 ,在在用js删除数组的时候 delete 数组[下标]的方法删除数组时,该数组的下标变为null,但是数组的长度并没有发生相应的变化 转而使用splice(小标,第N个)删 ...
- mvc Model元数据【学习笔记】
页面中Html.Editorfor(model=>model.fieldname)这些方法,都是通过Model的元数据来生成html的,我们如果想控制最终生成的html,可以通过修改元数据来实现 ...
- 大话设计模式之策略模式(strategy)
策略模式:它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响使用算法的用户. 针对商城收银模式,打折,返现促销等的例子: 打折还是促销其实都是一些算法,可以用工厂模式来 ...
- 领域驱动设计(Domain Driven Design)参考架构详解
摘要 本文将介绍领域驱动设计(Domain Driven Design)的官方参考架构,该架构分成了Interfaces.Applications和Domain三层以及包含各类基础设施的Infrast ...
- JSP中使用的模式——JSP+JavaBean
模式二:JSP+Servlet+JavaBean 链接地址:http://wxmimperio.coding.io/?p=189 JSP中两种模式的总结 链接地址:http://wxmimperio. ...
- Coursera《machine learning》--(14)数据降维
本笔记为Coursera在线课程<Machine Learning>中的数据降维章节的笔记. 十四.降维 (Dimensionality Reduction) 14.1 动机一:数据压缩 ...
- 【UVA11294】Wedding (2-SAT)
题意: 有N-1对夫妻参加一个婚宴,所有人都坐在一个长长的餐桌左侧或者右侧,新郎和新娘面做面坐在桌子的两侧.由于新娘的头饰很复杂,她无法看到和她坐在同一侧餐桌的人,只能看到对面餐桌的人.任意一对夫妻不 ...
- input text的outline属性
普通的text选中编辑时会出现蓝色的边框,感觉不太美观,怎么去掉呢? 可以在text对应的样式里加入:outline: 0;