gecko-dev/dom/html/test/test_bug1081037.html

134 строки
3.7 KiB
HTML

<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1081037
-->
<head>
<meta charset="utf-8">
<title>Test for Bug 1081037</title>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript">
/** Test for Bug 1081037 **/
function shouldThrow(fun, msg, ex, todo) {
try {
fun();
ok(todo, msg);
} catch (e) {
ok(new RegExp(ex).test(e), msg + " (thrown:" + e + ")")
}
}
var Foo = document.registerElement('x-foo', {
prototype: {bar: 5}
});
Foo.prototype.bar = 6;
var foo = new Foo();
is(foo.bar, 6, "prototype of the ctor returned from registerElement works");
var protoDesc = Object.getOwnPropertyDescriptor(Foo, "prototype");
is(protoDesc.configurable, false, "proto should be non-configurable");
is(protoDesc.enumerable, false, "proto should be non-enumerable");
is(protoDesc.writable, false, "proto should be non-writable");
// TODO: FIXME!
shouldThrow(function() {
document.registerElement('x-foo2', {
prototype: Foo.prototype
});
},
"if proto is an interface prototype object, registerElement should throw",
"not supported",
/* todo = */ true);
var nonConfigReadonlyProto = Object.create(HTMLElement.prototype,
{ constructor: { configurable: false, writable: false, value: 42 } });
shouldThrow(function() {
document.registerElement('x-nonconfig-readonly', {
prototype: nonConfigReadonlyProto
});
},
"non-configurable and not-writable constructor property",
"not supported");
// this is not defined in current spec:
var readonlyProto = Object.create(HTMLElement.prototype,
{ constructor: { configurable: true, writable: false, value: 42 } });
var Readonly = document.registerElement('x-nonconfig-readonly', {
prototype: readonlyProto
});
is(Readonly.prototype, readonlyProto, "configurable readonly constructor property");
var handler = {
getOwnPropertyDescriptor: function(target, name) {
return name == "constructor" ? undefined : Object.getOwnPropertyDescriptor(target,name);
},
defineProperty: function(target, name, propertyDescriptor) {
if (name == "constructor") {
throw "spec this";
}
return Object.defineProperty(target, name, propertyDescriptor);
},
has: function(target, name) {
if (name == "constructor") {
return false;
}
return name in target;
}
};
var proxy = new Proxy({}, handler);
shouldThrow(function() {
document.registerElement('x-proxymagic', {
prototype: proxy
});
},
"proxy magic",
"spec this");
var getOwn = 0;
var defineProp = 0;
var handler2 = {
getOwnPropertyDescriptor: function(target, name) {
if (name == "constructor") {
getOwn++;
}
return Object.getOwnPropertyDescriptor(target,name);
},
defineProperty: function(target, name, propertyDescriptor) {
if (name == "constructor") {
defineProp++;
}
return Object.defineProperty(target, name, propertyDescriptor);
}
};
var proxy2 = new Proxy({}, handler2);
document.registerElement('x-proxymagic2', {
prototype: proxy2
});
is(getOwn, 1, "number of getOwnPropertyDescriptor calls from registerElement: " + getOwn);
is(defineProp, 1, "number of defineProperty calls from registerElement: " + defineProp);
</script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1081037">Mozilla Bug 1081037</a>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
</pre>
</body>
</html>