<!DOCTYPE html>
<html>
<head>
<title>Document.createElement() and Document.createElementNS() set IS attribute to type</title>
<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru">
<meta name="assert" content="If TYPE is not the same as localName, set the value of ELEMENT's IS attribute to 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();
    HTML5_ELEMENTS.forEach(function(tagName) {
        var obj = doc.createElement(tagName);
        var name = 'x-a-' + tagName;
        var proto = Object.create(obj.constructor.prototype);
        doc.registerElement(name, {prototype: proto, extends: tagName});
        var customElement = doc.createElement(tagName, name);
        assert_equals(customElement.getAttribute('is'), name,
            'Value of the IS attribute should be set to type by Document.createElement()');
    });
}, 'Test Document.createElement() sets the element\'s IS attribute value to type, ' +
    'if type is not the same as localName');


test(function() {
    var doc = newHTMLDocument();
    HTML5_ELEMENTS.forEach(function(tagName) {
        var name = 'x-b-' + tagName;
        var customElement = doc.createElement(tagName, name);
        assert_equals(customElement.getAttribute('is'), name,
            'Value of the IS attribute should be set to type by Document.createElement()');
    });
}, 'Test Document.createElement() sets the element\'s IS attribute value to type, ' +
    'if type is not the same as localName and an element definition with matching ' +
    'localName, namespace, and type is not registered');


test(function() {
    var doc = newHTMLDocument();
    HTML5_ELEMENTS.forEach(function(tagName) {
        var obj = doc.createElement(tagName);
        var name = 'x-c-' + tagName;
        var proto = Object.create(obj.constructor.prototype);
        doc.registerElement(name, {prototype: proto, extends: tagName});
        var customElement = doc.createElementNS(HTML_NAMESPACE, tagName, name);
        assert_equals(customElement.getAttribute('is'), name,
            'Value of the IS attribute should be set to type by Document.createElementNS()');
    });
}, 'Test Document.createElementNS() sets the element\'s IS attribute value to type, ' +
    'if type is not the same as localName');


test(function() {
    var doc = newHTMLDocument();
    HTML5_ELEMENTS.forEach(function(tagName) {
        var name = 'x-d-' + tagName;
        var customElement = doc.createElementNS(HTML_NAMESPACE, tagName, name);
        assert_equals(customElement.getAttribute('is'), name,
            'Value of the IS attribute should be set to type by Document.createElementNS()');
    });
}, 'Test Document.createElementNS() sets the element\'s IS attribute value to type, ' +
    'if type is not the same as localNameand and an element definition with matching ' +
    'localName, namespace, and type is not registered ');
</script>
</body>
</html>
