<!DOCTYPE html>
<html>
<head>
<title>Custom element constructor sets owner document to the document, where custom element type is registered</title>
<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru">
<meta name="assert" content="Custom element constructor sets custom element node document to the document, where custom element type is registered">
<link rel="help" href="http://www.w3.org/TR/custom-elements/#instantiating-custom-elements">
<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 GeneratedConstructor = doc.registerElement('x-a');
    var customElement = new GeneratedConstructor();
    assert_equals(customElement.ownerDocument, doc,
        'Custom element owner document should be the document, where custom element ' +
        'type is registered');
}, 'Custom element constructor sets owner document to the document, where custom element ' +
    'type is registered');


test(function() {
    var doc = newHTMLDocument();
    HTML5_ELEMENTS.forEach(function(tagName) {
        var obj = doc.createElement(tagName);
        var name = 'x-b-' + tagName;
        var proto = Object.create(obj.constructor.prototype);
        var GeneratedConstructor = doc.registerElement(name, {
            prototype: proto,
            extends: tagName
        });
        var customElement = new GeneratedConstructor();

        assert_equals(customElement.ownerDocument, doc,
            'Custom element owner document should be the document, where custom element ' +
            'type is registered');
    });
}, 'Custom element constructor sets owner document to the document, where custom element ' +
    'type is registered. Test constructor of extended HTML element');


test(function() {
    var doc = newHTMLDocument();
    var sharedRegistryDocument = doc.implementation.createHTMLDocument('Document 2');

    var name = 'x-c';
    var GeneratedConstructor = doc.registerElement(name);
    var customElement = new GeneratedConstructor();
    assert_equals(customElement.ownerDocument, doc,
        'Custom element owner document should be the document, where custom element ' +
        'type is registered');

    var name2 = 'x-d';
    var GeneratedConstructor2 = sharedRegistryDocument.registerElement(name2);
    var customElement2 = new GeneratedConstructor2();
    assert_equals(customElement2.ownerDocument, sharedRegistryDocument,
        'Custom element owner document should be the document, where custom element ' +
        'type is registered');
}, 'Custom element constructor sets owner document to the document, where custom element ' +
    'type is registered. Test different documents with shared registry');


test(function() {
    var doc = newHTMLDocument();
    var sharedRegistryDocument = doc.implementation.createHTMLDocument('Document 2');
    HTML5_ELEMENTS.forEach(function(tagName) {
        var obj = doc.createElement(tagName);
        var name = 'x-e-' + tagName;
        var proto = Object.create(obj.constructor.prototype);
        var GeneratedConstructor = doc.registerElement(name, {
            prototype: proto,
            extends: tagName
        });
        var customElement = new GeneratedConstructor();
        assert_equals(customElement.ownerDocument, doc,
            'Custom element owner document should be the document, where custom element ' +
            'type is registered');

        var obj2 = sharedRegistryDocument.createElement(tagName);
        var name2 = 'x-f-' + tagName;
        var proto2 = Object.create(obj2.constructor.prototype);
        var GeneratedConstructor2 = sharedRegistryDocument.registerElement(name2, {
            prototype: proto2,
            extends: tagName
        });
        var customElement2 = new GeneratedConstructor2();
        assert_equals(customElement2.ownerDocument, sharedRegistryDocument,
            'Custom element owner document should be the document, where custom element ' +
            'type is registered');
    });
}, 'Custom element constructor sets owner document to the document, where custom element ' +
    'type is registered. Test constructor of extended HTML element for different documents ' +
    'with shared registry');
</script>
</body>
</html>
