<!DOCTYPE html>
<html>
<head>
<title>Document.createElement() and Document.createElementNS() create custom element of type, specified by typeExtension argument</title>
<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru">
<meta name="assert" content="If an element definition with matching localName, namespace, and TYPE is registered then typeExtension is a TYPE">
<link rel="help" href="http://www.w3.org/TR/custom-elements/#extensions-to-document-interface-to-instantiate">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../../testcommon.js"></script>
<link rel="stylesheet" href="/resources/testharness.css">
</head>
<body>
<div id="log"></div>
<script>
test(function() {
    var doc = newHTMLDocument();
    var name1 = 'x-a';
    var GeneratedConstructor1 = doc.registerElement(name1);
    var name2 = 'x-b';
    var GeneratedConstructor2 = doc.registerElement(name2);
    var customElement = doc.createElement(name1, name2);

    assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor2.prototype,
        'Custom element type should be the type extension of the custom element');
}, 'Test Document.createElement() creates custom element of type, ' +
    'specified by typeExtension argument');


test(function() {
    var doc = newHTMLDocument();
    var name1 = 'x-c';
    var GeneratedConstructor1 = doc.registerElement(name1);
    var name2 = 'x-d';
    var GeneratedConstructor2 = doc.registerElement(name2);
    var customElement = doc.createElementNS(HTML_NAMESPACE, name1, name2);

    assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor2.prototype,
        'Custom element type should be the type extension of the custom element');
}, 'Test Document.createElementNS() creates custom element of type, ' +
    'specified by typeExtension argument');


test(function() {
    var doc = newHTMLDocument();
    var name1 = 'x-e';
    var name2 = 'x-f';
    var GeneratedConstructor2 = doc.registerElement(name2);
    var customElement = doc.createElement(name1, name2);

    assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor2.prototype,
        'Custom element type should be the type extension of the custom element');
}, 'Test Document.createElement() creates custom element of type, ' +
    'specified by typeExtension argument. Definition for localName is absent');


test(function() {
    var doc = newHTMLDocument();
    var name1 = 'x-g';
    var name2 = 'x-h';
    var GeneratedConstructor2 = doc.registerElement(name2);
    var customElement = doc.createElementNS(HTML_NAMESPACE, name1, name2);

    assert_equals(Object.getPrototypeOf(customElement), GeneratedConstructor2.prototype,
        'Custom element type should be the type extension of the custom element');
}, 'Test Document.createElementNS() creates custom element of type, ' +
    'specified by typeExtension argument. Definition for localName is absent');
</script>
</body>
</html>
