diff options
Diffstat (limited to 'dom/html/test/test_bug1081037.html')
-rw-r--r-- | dom/html/test/test_bug1081037.html | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/dom/html/test/test_bug1081037.html b/dom/html/test/test_bug1081037.html new file mode 100644 index 000000000..9d8782580 --- /dev/null +++ b/dom/html/test/test_bug1081037.html @@ -0,0 +1,133 @@ +<!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> |