зеркало из https://github.com/mozilla/gecko-dev.git
134 строки
3.7 KiB
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>
|