tapir-dream / compatibility-detector

Automatically exported from code.google.com/p/compatibility-detector
Apache License 2.0
2 stars 5 forks source link

BX1030 marquee_width #13

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
第一次检测:有误报 (采样较少[1个]) 

----------------------------[误报]

Detector 的脚本使用 chrome_comp.getDefinedStylePropertyByName(node, false, 
'width') 获取到的 MARQUEE 的 'width' 是 'undefined'。
然后将 MARQUEE 的 'display' 设置为 'none',取其 
parentNode.offsetWidth,得到 0。从而导致误报。
造成上述现象需要一个条件:代码 </marquee></td> 
之间不能有空白字符,必须紧密相联。这个问题的根本原因��
�在分析中。

以一个空元素替换 MARQUEE,而不将 MARQUEE 设为 display:none 
可避免形成“空单元格”(这并不是空单元格,但其表现很��
�空单元格)导致判断错误。
var node = document.getElementsByTagName("marquee")[0];
var parentNode = node.parentNode;
var oldWidth = parentNode.offsetWidth;
var placeHolder = document.createElement("var");
parentNode.replaceChild(placeHolder, node);
alert("replaceChild\n新宽度:" + parentNode.offsetWidth + "\n旧宽度:" 
+ oldWidth);
parentNode.replaceChild(node, placeHolder);
placeHolder = null;
谨慎起见,还要提前准备一个特殊的样式,并加强所有设置��
�的优先级,以避免受用户设定的样式影响。如:
#chrome_comp_placeHolder{
position: static !important;
float: none !important;
display: inline !important;
width: 0 !important;
height: 0 !important;
margin: 0 !important;
padding: 0 !important;
border: 0 none !important;
...
}
请参考 test case。

测试用例:
marquee_width.html

URL:
http://www.chinanews.com.cn/

----------------------------------------------------------------------

第二次检测:误报 0% (0/3)

二次测试依然由于采样较少无法确定测试精度,但第一次测��
�提出的 testcase 检测已不误报。

Original issue reported on code.google.com by qianbao...@beyondsoft.com on 15 Nov 2010 at 11:24

Attachments:

GoogleCodeExporter commented 9 years ago

Original comment by qianbao...@beyondsoft.com on 16 Nov 2010 at 11:14

GoogleCodeExporter commented 9 years ago

Original comment by wangju...@beyondsoft.com on 19 Nov 2010 at 3:12

GoogleCodeExporter commented 9 years ago
修正对父元素的确定以及TalbeLayout认定等
修正依靠替换元素取得宽度的破坏性方法

自测准确率结果 100% (20/20)

Original comment by qianbao...@beyondsoft.com on 1 Dec 2010 at 9:11

GoogleCodeExporter commented 9 years ago
第三次检测:

准确率 35%(7/20)

-------------------#误报[1]

文档结构的确有问题,理论上提示准确。但是,各浏览器无��
�显表现差异的。
实际上,是由于父容器之上的祖先容器多次被设定宽度,导��
� marquee 实际上无法撑开布局。

URL
http://c9.17173.com/
http://www.dolarshop.com/
http://www.hf878.com/
http://www.zjjpark.com/
http://www.zibo.gov.cn/
http://www.moe.edu.cn/
……

Original comment by qianbao...@beyondsoft.com on 2 Dec 2010 at 8:55

GoogleCodeExporter commented 9 years ago
修正算法,针对布局撑开的表现建立新计算规则,放弃根据 
RCA 内容描述的算法。
新算法为:
1.检测 margin 的父元素为 td 并且 table-layout 为 auto
2.取得该 td 的 getBoundingClientRect 值
3.取得 body 的 getBoundingClientRect 值
4.display:none 掉 marquee 元素
5.td 的 getBoundingClientRect.left 和 body.getBoundingClientRect.width 
当前值分别与老值比对
6.如果两组值发生变化,说明布局有变更,则命中
7.恢复被 display:none 掉的 marquee 元素。

-----------------------------------------

自测准确率 100%(23/23)

Original comment by qianbao...@beyondsoft.com on 2 Dec 2010 at 9:16

GoogleCodeExporter commented 9 years ago
第四次检测:

准确率 100%(38/38)

Original comment by qianbao...@beyondsoft.com on 3 Dec 2010 at 6:07

GoogleCodeExporter commented 9 years ago

Original comment by sundongg...@beyondsoft.com on 8 Dec 2010 at 10:13