鸟食轩
Microsoft .NET[C#] MVP 2003
随笔 - 332, 文章 - 870, 评论 - 5722, 引用 - 356
被逮到一个初始状态考虑不周的Bug
这两天是产品beta1以后进行的新一轮bug扫荡,beta1以前产品的bug降低到了大家非常满意的水平。但是beta1以后QA Team发飚,bug总数biu的一下又上升到人均20个上下,真是让人恼火。不过幸好大部分是为了发布beta1而回归出来的UI方面的bug,不过今天却发现被逮到一个非常隐蔽的控件初始状态考虑不足的bug
。
这个bug发生在一个纯脚本的TreeView控件上面,其异常表现为:
当使用键盘Up&Down键移动TreeView上面被选中的Item时,IE报告currentNode为空的脚本错误。
关于这个功能的详细设计,可以参看
本文
,示例效果为:
上图中的node就是程序中的currentNode,Up&Down操作就是根据这个node来进行计算并移动的。在TreeView控件中,为了处理TreeView节点被多选时找到一个确切的currentNode,在每次选择操作时,我在TreeView实例的全局cache中纪录了一个叫m_LastSelected的值,保存最后一次选择动作中的第一个节点。如果是单选就是被选中的节点本身,如果是多选,就是多选时第一个被选中的节点。
Tree.__ContainerOnKeyDown
=
function
()
{
//
. . .
if
( innerCache.m_Selecteds.m_Count
==
0
)
{
return
;
}
var
currentNode
=
innerCache.m_LastSelected;
//
. . .
}
Review上面这段代码,取currentNode的地方似乎是已经做了安全检查,可是怎么还是出错了呢?其实除了本身程序有错,上面这个校验代码也是不对的,我检查的是m_Selecteds这个集合里面有没有东西,然后却是用m_LastSelected赋的值,这之间就可能出现m_Selecteds和m_LastSelected不同步的问题。结果确实是m_Selecteds和m_LastSelected之间的关联出了问题!看下面的代码:
TreeNode.__ContentOnMouseDown
=
function
()
{
//
. . .
if
( (
!
evt.shiftKey
&&
!
evt.ctrlKey)
||
!
objNode.Attributes('IsMultipleSelected') )
{
innerCache.UnselectAll();
objNode.SetSelected(
true
);
innerCache.m_LastSelected
=
objNode;
}
//
. . .
};
由于m_LastSelected和node的选取顺序有关系,它被实现在了鼠标选择TreeView节点的逻辑中,即每次节点被鼠标点选就会更新m_LastSelected的值。
这个逻辑似乎是没有什么问题,反正只要是选择了TreeView上的节点,就会有m_LastSelected的存在,我们也就会得到Up&Down操作的计步节点currentNode。可是就是这里漏掉了一个情况的考虑,如果被选中节点是在initialize我们的TreeView时,由调用代码来设置给节点的(示例如下)。那么由于实现时的疏忽,就出现了m_Selecteds非空,而m_LastSelected为空的情况。
var
tree
=
new
Tree();
var
node
=
TreeNode('
default
node');
tree.Add(node);
tree.Show(/* treeview container element*/);
node.SetSelected(
true
);
SetSelected(isSelected)方法实现如下:
TreeNode.prototype.SetSelected
=
function
(isSelected)
{
var
innerCache
=
this
.m_Tree.m_InnerCache;
if
( isSelected )
{
if
(
!
innerCache.m_Selecteds.Contains(
this
) )
{
innerCache.m_Selecteds.Add(
this
);
}
}
else
{
innerCache.m_Selecteds.Remove(
this
);
}
if
(
this
.m_Selected
!=
isSelected )
{
this
.m_Selected
=
isSelected;
if
(
this
.e_SelectedChanged )
{
this
.e_SelectedChanged.Execute(isSelected);
}
}
this
.ApplyUIChange();
};
问题就是这里了,调用SetSelected选中了节点后,m_Selecteds这个集合是更新了,可是却没有设置m_LastSelected(由于Last Selected Node的定义,本身是不该在这里设置),这样就造成了m_Selecteds和m_LastSelected的不同步。从而出现了开始说到的,进行Up&Down操作结果出现currentNode为空的错误。
这个bug如果是Review代码可能细心能找出来,可是直接被QA通过黑合测试给提了出来,确实是相当相当不容易的。因为刚初始化好的TreeView是没有获得焦点的,这时不管怎么按Up&Down键都不会有反映,也就看起来并没有什么错误。如果使用鼠标点击一下TreeView内的任何区域,让其获得焦点,那么至少都会选中一个TreeNode,这样一来m_LastSelected也就有值了。那么这个如此隐蔽的bug是怎么发现的呢?这需要在页面载入并在TreeView生成后,立即使用Tab键把焦点移到TreeView的container元素上,这时候按Up&Down键,如果TreeView上面有初始花时被SetSelected(isSelected)选中的节点,那么就出错了
。
绿色通道:
好文要顶
关注我
收藏该文
与我联系
posted on 2005-09-08 00:22
birdshome
阅读(2560)
评论(1)
编辑
收藏
评论
233977
#1楼
回复
引用
查看
向测试人员的专业精神致敬~~
2005-09-10 17:14
|
Teddy's Knowledge Base
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
伊朗封杀Gmail和Facebook等互联网服务
·
分析称专利之争让谷歌苹果两败俱伤
·
Android平台发现新型手机病毒Rootsmart
·
HTC首款Android4.0手机大曝光
·
这是不是你期待的 iPad 3?
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
导航
博客园
首页
新随笔
联系
订阅
管理
公告
Invert
原创
技术文章和心得,
转载
必须注明来源
"博客园"
!
贴子以"现状"提供,且没有任何担保,同时也没有授予任何权利。
昵称:
birdshome
园龄:
7年10个月
荣誉:
推荐博客
粉丝:
73
关注:
3
搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
我的标签
Nokia 6300
(2)
fan
(1)
qq
(1)
腾讯
(1)
输入法
(1)
隐私
(1)
随笔分类
(337)
.NET的私有工具类(2)
(rss)
.NET技术开发相关(34)
(rss)
Asp.net控件开发(14)
(rss)
Debug中的滑铁卢(9)
(rss)
Enjoy Computer :)(27)
(rss)
Jscript&Dhtml开发(162)
(rss)
技术区里的非技术(49)
(rss)
开发中遇到的虫子(14)
(rss)
其它编程相关内容(16)
(rss)
商务智能(BI)开发(10)
(rss)
文章分类
(147)
北京的幸福生活(29)
(rss)
不得不转载(19)
(rss)
乖乖的文章(6)
(rss)
那时还没有blog(4)
(rss)
那是相当八卦(10)
(rss)
手机短信息(1)
(rss)
我们的文章(40)
(rss)
珍贵照片的背景(4)
(rss)
重庆的幸福生活(34)
(rss)
相册
2005 Kick Off @ 涞滩
2006 Kick Off @ 钓鱼城
2006 Offsite @ 四面山
2006 Wedding @ 昆明
2007 Marriage @ 哈尔滨
2007 Offsite @ Thailand
2007 Offsite @ 海南云天
2007 Training @ Seattle
2007 Travelling @ 云南
2008 Travelling @ 天津
乱七八糟的收集
Ex-Colleagues
Jason Lei's Space
.Net Life
(rss)
Jasper
(rss)
Michelles Space
xingd.net
(rss)
玻璃缸
(rss)
短鲷生活
海阔天空
录一室
(rss)
完美的泡菜
(rss)
怡红公子
(rss)
竹叶尖的BLOG
常用链接
Engadget 中文版
PDFCHM eBooks
SitePoint Forums
The Code Project
安利上海直销店
哈尔滨工业大学
哈工大紫丁香
海归论坛
(rss)
沙坪坝区中医院
兄弟情深
没有可乐的日子
葡萄树下不乘凉
(rss)
斯普特尼克
猪头小队长
(rss)
积分与排名
积分 - 3145044
排名 - 6
最新评论
阅读排行榜
推荐排行榜