<!DOCTYPE html>
<html>
<head>
<title>Invoke CALLBACK with ELEMENT as callback this value</title>
<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru">
<meta name="author" title="Sergey G. Grekhov" href="mailto:sgrekhov@unipro.ru">
<meta name="assert" content="Invoke CALLBACK with ELEMENT as callback this value">
<link rel="help" href="http://www.w3.org/TR/custom-elements/#enqueuing-and-invoking-callbacks">
<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 proto = newHTMLElementPrototype();
    var GeneratedConstructor = doc.registerElement('x-a', {prototype: proto});
    var customElement = new GeneratedConstructor();

    doc.body.innerHTML = '<x-a id="x-a"></x-a>';
    assert_equals(doc.querySelector('#x-a'), proto.createdCallbackThis,
        '\'this\' value of the created callback should be the custom element');
}, 'Test \'this\' value inside created callback.');


testInIFrame('../../resources/x-element.html', function(doc) {
    var proto = newHTMLElementPrototype();
    doc.registerElement('x-element', {prototype: proto});

    assert_equals(doc.querySelector('#x-element'), proto.attachedCallbackThis,
        '\'this\' value of the attached callback should be the custom element');
}, 'Test \'this\' value inside attached callback.');


testInIFrame('../../resources/x-element.html', function(doc) {
    var proto = newHTMLElementPrototype();
    doc.registerElement('x-element', {prototype: proto});

    var customElement = doc.querySelector('#x-element');
    doc.body.removeChild(customElement);
    assert_equals(customElement, proto.detachedCallbackThis,
        '\'this\' value of the detached callback should be the custom element');
}, 'Test \'this\' value inside detached callback.');


test(function() {
    var doc = newHTMLDocument();
    var proto = newHTMLElementPrototype();
    var GeneratedConstructor = doc.registerElement('x-b', {prototype: proto});
    var customElement = new GeneratedConstructor();

    customElement.setAttribute('class', 'someClass');
    assert_equals(customElement, proto.attributeChangedCallbackThis,
        '\'this\' value of the attributeChanged callback should be the custom element');
}, 'Test \'this\' value inside attributeChanged callback.');
</script>
</body>
</html>
