WebKit的历史项管理
标准定义
关于历史的管理,和HTML页面载入一样,都有其相应的标准。地址例如以下:
WhatWG: https://html.spec.whatwg.org/multipage/browsers.html#history
当中关于历史项的要点例如以下:
1. 在onload之前。非用户操作引起的导航操作不建立历史项。
非用户操作比方页面中指定的Timer改动location或iframe的src引发的导航操作。而用户点击发起的Timer,则在timer中记录下在发起timer时标记手势来源。但有一个例外是由还有一个Timer发起的Timer或是反复运行的Timer, 则仅针对第一次运行有效(以nesting level标识)。
2. 子Frame载入完毕仍有未载入的上层Frame, 则不创建历史项。
3. 当前Frame仅仅有一个历史项。且为about:blank, 则不创建历史项。
4. 假设页面跳转的间隔小于1s,则不创建历史项。
关于Timer的nesting level能够參考这里:
http://www.w3.org/html/wg/drafts/html/CR/webappapis.html#timer-nesting-level
以上规则相应于以下三个WebKit的函数:
a. LockBackForwardList NavigationScheduler::mustLockBackForwardList(Frame& targetFrame)
LockBackForwardList NavigationScheduler::mustLockBackForwardList(Frame& targetFrame)
{
// Non-user navigation before the page has finished firing onload should not create a new back/forward item.
// See https://webkit.org/b/42861 for the original motivation for this.
if (!ScriptController::processingUserGesture() && targetFrame.loader().documentLoader() && !targetFrame.loader().documentLoader()->wasOnloadHandled())
return LockBackForwardList::Yes;
// Navigation of a subframe during loading of an ancestor frame does not create a new back/forward item.
// The definition of "during load" is any time before all handlers for the load event have been run.
// See https://bugs.webkit.org/show_bug.cgi?id=14957 for the original motivation for this.
for (Frame* ancestor = targetFrame.tree().parent(); ancestor; ancestor = ancestor->tree().parent()) {
Document* document = ancestor->document();
if (!ancestor->loader().isComplete() || (document && document->processingLoadEvent()))
return LockBackForwardList::Yes;
}
return LockBackForwardList::No;
}
b. HistoryController::currentItemShouldBeReplaced() const
{
// From the HTML5 spec for location.assign():
// "If the browsing context's session history contains only one Document,
// and that was the about:blank Document created when the browsing context
// was created, then the navigation must be done with replacement enabled."
return m_currentItem && !m_previousItem && equalIgnoringCase(m_currentItem->urlString(), blankURL());
}
c. void NavigationScheduler::scheduleRedirect(double delay, const URL& url)
{
if (!shouldScheduleNavigation(url))
return;
if (delay < 0 || delay > INT_MAX / 1000)
return;
if (url.isEmpty())
return;
// We want a new back/forward list item if the refresh timeout is > 1 second.
if (!m_redirect || delay <= m_redirect->delay()) {
LockBackForwardList lockBackForwardList = delay <= 1 ? LockBackForwardList::Yes : LockBackForwardList::No;
schedule(std::make_unique<ScheduledRedirect>(delay, m_frame.document()->securityOrigin(), url, LockHistory::Yes, lockBackForwardList));
}
}
页面问题分析
1. Timer问题
最初WebKit建一个全局的变量记录, easy受到不同页面。frame中Timer的影响。
id=137631
。如以下測试页面所看到的。当在一个document中。有一个repeat timer运行后, 且未载入完毕(onload事件没有运行)。其他Timer的跳转仍然无法创建历史项。
<head>
</head>
<body>
<input type="button" value="Goto next page" onclick="gotoNextPage();">
<input type="button" value="Start repeating timer" onclick="startRepeatingTimer();">
<p>
<div id="Timer">Paused</div>
</p>
<script type="text/javascript">
function gotoNextPage(){
setTimeout(function(){location.href="http://www.webkit.org/";},300);
}
function startRepeatingTimer(){
setInterval(function(){document.getElementById("Timer").innerHTML="Running...";},500);
}
</script>
<img src="http://therecoveringpolitician.com/wp-content/uploads/2013/01/moderate.jpg" width="640" height="480">
<img src="http://cullogo.com/full/wallpapers-high-resolution-widescreen-hd-pk.jpg" width="640" height="480">
<img src="http://www.highresolutionwallpapers.net/wallpapers/autumn-1680x1050.jpg" width="640" height="480">
</body>
</html>
2. 载入规则导致多余历史项问题
<head>
</head>
<body>
<p>
<div id="info">Loading...</div>
</p>
<script type="text/javascript">
setTimeout(function(){ attr("sub_iframe","http://m.baidu.com/?abc=23&t=20080225");},5000);
function attr(id,url){
var obj=document.getElementById(id);
obj.setAttribute("src", url);
}
window.onload=function(){
document.getElementById("info").innerHTML="Loaded.";
}
</script>
<iframe src="http://m.baidu.com/?abc=23&t=20080225" id="sub_iframe" width="320" height="480"></iframe><br/>
</body>
</html>
WebKit的历史项管理的更多相关文章
- WebKit历史项管理的实现
历史项管理依据标准定义,由Page管理一个Joint Session History, 包括了各个子Frame的历史项.逻辑上相应例如以下的关系: 从上面看三个层次:Page,Frame,以及JS B ...
- 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
随机推荐
- Scala写排序可以说是简洁又明了
例如归并排序,清晰明了. object MergeSort extends App { val oldList = List[Int](12, 40, 26, 89, 75, 44, 32, ...
- [原创]浅谈NT下Ring3无驱进入Ring0的方法
原文链接:浅谈NT下Ring3无驱进入Ring0的方法 (测试环境:Windows 2000 SP4,Windows XP SP2.Windows 2003 未测试) 在NT下无驱进入Ring0是一个 ...
- SQL Server 执行计划重编译的两大情况
1.与正确性相关的重编译 1.为表或视图添加列,删除列. 2.为表添加约束.默认值.规则,删除约束.默认值.规则. 3.为表或视图添加索引. 4.如果计划用不用索引而这个索引被删除. 5.删除表中的统 ...
- CSS选择器、优先级和匹配原理
作为一个Web开发者,掌握必要的前台技术也是很重要的,特别是在遇到一些实际问题的时候.这里给大家列举一个例子: 给一个p标签增加一个类(class),可是执行后该class中的有些属性并没有起作用.通 ...
- 详述USB OTG发展及协议标准
USB On-The-Go 扩大了USB 的应用领域,将USB 从传统的PC 与外设通讯的模式,扩展到移动电子和嵌入式领域中,抛开主机PC,实现通常的外设与外设之间点对点(Point to Point ...
- 一次性关闭所有的Activity
原文:一次性关闭所有的Activity 一次性关闭所有的Activity ActivityManager am = (ActivityManager)getSystemService (Context ...
- docker 数据映射方案
docker run -itd -v /data/:/data1 centos bash // -v 用来指定挂载目录, :前面的/data为本地目录,:后面的/data1 为容器里的目录: dock ...
- MojoliciousLite: 实时的web框架 概述
MojoliciousLite: 实时的web框架: SYNOPSIS 简介: # Automatically enables "strict", "warnings&q ...
- poj1651 最优矩阵乘法动态规划解题
题目描述: 有若干个矩阵{Ai},元素都为整数且已知矩阵大小. 如果要计算所有矩阵的乘积A1 * A2 * A3 .. Am,最少要多少次整数乘法? 输入 第一行一个整数n(n <= 100), ...
- 群星云集 BOSS上海时装秀—情沪魅影- 在线观看 - 乐视网
群星云集 BOSS上海时装秀-情沪魅影- 在线观看 - 乐视网 群星云集 BOSS上海时装秀-情沪魅影