<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test.js"></script>
</head>
<body>
<div id="container"></div>
<form id="testForm"></form>
<script>
description('Testing document.registerElement() type extension behaviours through createElement().');

function isFormControl(element)
{
    testForm.appendChild(element);
    return element.form == testForm;
}

if (window.testRunner)
    testRunner.dumpAsText();

//
// Inheritance here is shaped like this:
//
// HTMLElement <- input <- x-bar <- x-qux
//             <- x-foo <- x-baz
//

fooConstructor = document.registerElement('x-foo', { prototype: Object.create(HTMLElement.prototype) });
barConstructor = document.registerElement('x-bar', { extends: 'input', prototype: Object.create(HTMLInputElement.prototype) });
bazConstructor = document.registerElement('x-baz', { prototype: Object.create(fooConstructor.prototype) });
quxConstructor = document.registerElement('x-qux', { extends: 'input', prototype: Object.create(barConstructor.prototype) });

// Same name, different local name
shouldThrow('document.registerElement("x-foo", { prototype: Object.create(HTMLDivElement.prototype) })', '"NotSupportedError: Failed to execute \'registerElement\' on \'Document\': Registration failed for type \'x-foo\'. A type with that name is already registered."');

//
// Generated constructors
//

fooNewed = new fooConstructor();
fooOuterHTML = '<x-foo></x-foo>';
shouldBeEqualToString('fooNewed.outerHTML', fooOuterHTML);
shouldBeTrue('fooNewed instanceof fooConstructor && fooNewed instanceof HTMLElement');
shouldBeFalse('fooNewed instanceof HTMLUnknownElement');

barNewed = new barConstructor();
barOuterHTML = '<input is="x-bar">';
shouldBeEqualToString('barNewed.outerHTML', barOuterHTML);
shouldBeTrue('barNewed instanceof barConstructor && barNewed instanceof HTMLInputElement');
shouldBeTrue('isFormControl(barNewed)');

bazNewed = new bazConstructor();
bazOuterHTML = '<x-baz></x-baz>';
shouldBeEqualToString('bazNewed.outerHTML', bazOuterHTML);
shouldBeTrue('bazNewed instanceof bazConstructor && bazNewed instanceof HTMLElement');
shouldBeFalse('bazNewed instanceof HTMLUnknownElement');

quxNewed = new quxConstructor();
quxOuterHTML = '<input is="x-qux">';
shouldBeTrue('quxNewed instanceof quxConstructor && quxNewed instanceof barConstructor && quxNewed instanceof HTMLInputElement');
shouldBeEqualToString('quxNewed.outerHTML', quxOuterHTML);
shouldBeTrue('isFormControl(quxNewed)');

//
// Single parameter createElement()
//

fooCreated = document.createElement('x-foo');
shouldBeEqualToString('fooCreated.outerHTML', fooOuterHTML);
shouldBeTrue('fooCreated instanceof fooConstructor');

barCreated = document.createElement('x-bar');
shouldBeEqualToString('barCreated.outerHTML', '<x-bar></x-bar>');
shouldBeFalse('barCreated instanceof barConstructor');
shouldBeFalse('barCreated instanceof HTMLUnknownElement');
shouldBeTrue('barCreated instanceof HTMLElement');

bazCreated = document.createElement('x-baz');
shouldBeEqualToString('bazCreated.outerHTML', '<x-baz></x-baz>');
shouldBeTrue('bazCreated instanceof bazConstructor');
shouldBeFalse('bazCreated instanceof HTMLUnknownElement');

quxCreated = document.createElement('x-qux');
shouldBeEqualToString('quxCreated.outerHTML', '<x-qux></x-qux>');
shouldBeFalse('quxCreated instanceof quxConstructor');
shouldBeFalse('quxCreated instanceof HTMLUnknownElement');
shouldBeTrue('quxCreated instanceof HTMLElement');

//
// createElement() with type extensions
//

divFooCreated = document.createElement('div', 'x-foo');
shouldBeEqualToString('divFooCreated.outerHTML', '<div is="x-foo"></div>');
shouldBeFalse('divFooCreated instanceof fooConstructor');
shouldBeTrue('divFooCreated instanceof HTMLDivElement');

inputBarCreated = document.createElement('input', 'x-bar');
shouldBeEqualToString('inputBarCreated.outerHTML', barOuterHTML);
shouldBeTrue('inputBarCreated instanceof barConstructor');
shouldBeFalse('inputBarCreated instanceof HTMLUnknownElement');
shouldBeTrue('isFormControl(inputBarCreated)');

divBarCreated = document.createElement('div', 'x-bar');
shouldBeEqualToString('divBarCreated.outerHTML', '<div is="x-bar"></div>');
shouldBeFalse('divBarCreated instanceof barConstructor');
shouldBeTrue('divBarCreated instanceof HTMLDivElement');

fooBarCreated = document.createElement('x-foo', 'x-bar');
shouldBeEqualToString('fooBarCreated.outerHTML', '<x-foo is="x-bar"></x-foo>');
shouldBeTrue('fooBarCreated instanceof fooConstructor');

barFooCreated = document.createElement('x-bar', 'x-foo');
shouldBeEqualToString('barFooCreated.outerHTML', '<x-bar is="x-foo"></x-bar>');
shouldBeFalse('barFooCreated instanceof HTMLUnknownElement');
shouldBeTrue('barFooCreated instanceof HTMLElement');

fooCreatedNull = document.createElement('x-foo', null);
shouldBeEqualToString('fooCreatedNull.outerHTML', fooOuterHTML);
shouldBeTrue('fooCreatedNull instanceof fooConstructor');

fooCreatedEmpty = document.createElement('x-foo', '');
shouldBeEqualToString('fooCreatedEmpty.outerHTML', fooOuterHTML);
shouldBeTrue('fooCreatedEmpty instanceof fooConstructor');

shouldThrow('document.createElement("@invalid", "x-bar")', '"InvalidCharacterError: Failed to execute \'createElement\' on \'Document\': The tag name provided (\'@invalid\') is not a valid name."');

//
// createElementNS() with type extensions
//

fooCreatedNS = document.createElementNS('http://www.w3.org/1999/xhtml', 'x-foo', null);
shouldBeEqualToString('fooCreatedNS.outerHTML', fooOuterHTML);
shouldBeTrue('fooCreatedNS instanceof fooConstructor');

barCreatedNS = document.createElementNS('http://www.w3.org/1999/xhtml', 'input', 'x-bar');
shouldBeEqualToString('barCreatedNS.outerHTML', barOuterHTML);
shouldBeTrue('barCreatedNS instanceof barConstructor');
shouldBeTrue('isFormControl(barCreatedNS)');

shouldThrow('document.createElementNS("http://example.com/2013/no-such-namespace", "xml:lang", "x-bar")', '"NamespaceError: Failed to execute \'createElementNS\' on \'Document\': The namespace URI provided (\'http://example.com/2013/no-such-namespace\') is not valid for the qualified name provided (\'xml:lang\')."');

// parser
function createElementFromHTML(html) {
   var container = document.createElement('div');
   container.innerHTML = html;
   return container.firstChild;
}

fooParsed = createElementFromHTML('<x-foo>');
shouldBeTrue('fooParsed instanceof fooConstructor');

barParsed = createElementFromHTML('<input is="x-bar">')
shouldBeTrue('barParsed instanceof barConstructor');
shouldBeTrue('isFormControl(barParsed)');

divFooParsed = createElementFromHTML('<div is="x-foo">')
shouldBeFalse('divFooParsed instanceof fooConstructor');
shouldBeTrue('divFooParsed instanceof HTMLDivElement');

namedBarParsed = createElementFromHTML('<x-bar>')
shouldBeFalse('namedBarParsed instanceof barConstructor');
shouldBeFalse('namedBarParsed instanceof HTMLUnknownElement');
shouldBeTrue('namedBarParsed instanceof HTMLElement');

divBarParsed = createElementFromHTML('<div is="x-bar">')
shouldBeFalse('divBarParsed instanceof barConstructor');
shouldBeTrue('divBarParsed instanceof HTMLDivElement');

</script>
</body>
</html>
