2011-09-30 69 views
3

有一个HTML5 conformance test suite与原型测试HTMLCanvasElement我们可以通过脚本删除HTML5 Canvas标签的“getContext”属性吗?

测试失败的Safari浏览器,火狐,但通过对Opera在Windows 7

测试有哪些尝试删除HTMLCanvasElementgetContext财产的脚本,并进一步尝试读取getContext应该给undefined

delete window.HTMLCanvasElement.prototype.getContext; 
_assertSame(window.HTMLCanvasElement.prototype.getContext, undefined, "window.HTMLCanvasElement.prototype.getContext", "undefined"); 

这个测试失败了的WebKit(Safari浏览器),因为getContext酒店DontDelete属性,所以它不会允许脚本删除此属性。

在HTML5规范中是否有任何描述说明通过脚本删除getContext属性是有效的?

+1

DontDelete似乎毫无用处,因为在WebKit中可以只执行'window.HTMLCanvasElement.prototype.getContext = null'。 – pimvdb

+0

是的,尽管我们可以用NULL覆盖或替换属性(getContext)的值,但属性“getContext”仍然存在,它保存从JS绑定图层查询的最后分配的值或默认值。这个测试说的是,查询window.HTMLCanvasElement.prototype.getContext应该在删除后返回一个未定义的值(属性不存在)。 – Priyanka

回答

2

据我了解的,可配置性([[DontDelete]在ES3,[配置]在ES5)getContext方法进行说明在WebIDL中 - 像任何其他CanvasRenderingContext2D方法一样。

有必须存在一个接口原型对象定义的每个接口,而不管该接口是否与[NoInterfaceObject]扩展属性声明是:

"Interface Prototype Object"部,它说看看。特定接口的接口原型对象具有与该接口上定义的属性和操作相对应的属性。这些属性在下面的4.5.5和4.5.6节中有更详细的描述。

而在4.5.6,可以看到:

对于接口上定义的操作的每个唯一标识符,必须有在接口原型对象上的相应的属性(如果它是一个常规操作)或接口对象(如果它是一个静态操作),除非为该标识符和操作设置的有效重载和参数计数为0(用于ECMAScript语言绑定)没有条目。是

这样的对应属性的特征如下:

的属性的名称是标识符。

财产有属性{[[可写]]:真,[可枚举]]:真,[[配置]]:真}。

注意 “[[配置]:真正的” 位(重点煤矿)。

+0

有趣; ES5的规范将'[[Configurable]]'定义为'If false,尝试删除属性,将属性更改为访问者属性或更改其属性(除[[Value]]之外)将失败。看起来像'[[Condigurable]]'应该是假的,如果它不应该被删除。 – pimvdb

+0

没错。这就是为什么OP提到的一致性测试期望值为'undefined'([[Configurable]]为'true',因此属性可以被删除)。 – kangax

3

在HTML5规范中是否有任何描述说脚本删除getContext属性是有效的?

不,规范中没有明确说明这一点。不知道为什么webkit与FF/Opera不同(为Chrome也不允许删除),但是规范本身并不要求Canvas上的任何东西都是DontDelete。 ECMAScript规范中的其他内容可能会有所不同。

Firefox 7和8 alpha不会删除window.HTMLCanvasElement.prototype.getContext。他们只是返回true,但getContext仍然存在。换句话说,你链接到的测试在同一个地方出于同样的原因失败。

的Webkit当然仍允许您覆盖任何你想要的:window.HTMLCanvasElement.prototype.getContext = undefined

+0

究竟是什么标准来决定哪些属性可以删除,哪些不能?有没有解释规范的链接可以决定哪些HTML元素的属性可以被删除? – Priyanka

相关问题