blob: 960c0ad84482b547d50dc9bd94c501d8faad7cad [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>Test detached callback of a custom element when moving custom element between different documents</title>
<meta name="author" title="Aleksei Yu. Semenov" href="mailto:a.semenov@unipro.ru">
<meta name="assert" content="detached callback ... must be enqueued whenever custom element is removed from the document and this document has a browsing context.">
<link rel="help" href="http://www.w3.org/TR/custom-elements/#types-of-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();
doc.registerElement('x-a', {prototype: proto});
var customElement = doc.createElement('x-a');
doc.body.appendChild(customElement);
var divElement = doc.createElement('div');
doc.body.appendChild(divElement);
divElement.appendChild(customElement);
assert_equals(proto.detachedCallbackCalledCounter, 0,
'Callback detached should not be called in document without a browsing context');
}, 'Test detached callback is not called if moving custom element inside document ' +
'without browsing context');
testInIFrame('../../resources/blank.html', function(docWithBrowsingContext) {
var docNoBrowsingContext = newHTMLDocument();
var proto1 = newHTMLElementPrototype();
docNoBrowsingContext.registerElement('x-b', {prototype: proto1});
var customElement = docNoBrowsingContext.createElement('x-b');
docNoBrowsingContext.body.appendChild(customElement);
var proto2 = newHTMLElementPrototype();
docWithBrowsingContext.registerElement('x-b', {prototype: proto2});
docWithBrowsingContext.body.appendChild(customElement);
assert_equals(proto1.detachedCallbackCalledCounter, 0,
'Callback detached should not be called in document without browsing context');
assert_equals(proto2.detachedCallbackCalledCounter, 0,
'Callback detached, defined in receiving document, should not be called');
}, 'Test detached callback is not called if moving custom element from ' +
'document without browsing context to document with browsing context');
testInIFrame('../../resources/blank.html', function(docWithBrowsingContext) {
var proto1 = newHTMLElementPrototype();
docWithBrowsingContext.registerElement('x-c', {prototype: proto1});
var customElement = docWithBrowsingContext.createElement('x-c');
docWithBrowsingContext.body.appendChild(customElement);
var docNoBrowsingContext = newHTMLDocument();
var proto2 = newHTMLElementPrototype();
docNoBrowsingContext.registerElement('x-c', {prototype: proto2});
docNoBrowsingContext.body.appendChild(customElement);
assert_equals(proto1.detachedCallbackCalledCounter, 1,
'Callback detached should be called in documents with browsing context');
assert_equals(proto2.detachedCallbackCalledCounter, 0,
'Callback detached, defined in receiving document, should not be called');
}, 'Test detached callback if moving custom element from ' +
'document with browsing context to document without browsing context');
testInIFrame('../../resources/blank.html', function(doc) {
var proto = newHTMLElementPrototype();
doc.registerElement('x-d', {prototype: proto});
var customElement = doc.createElement('x-d');
doc.body.appendChild(customElement);
var divElement = doc.createElement('div');
doc.body.appendChild(divElement);
divElement.appendChild(customElement);
assert_equals(proto.detachedCallbackCalledCounter, 1,
'Callback detached should be called in documents with browsing context');
}, 'Test detached callback if moving custom element inside document ' +
'with browsing context');
var moveTest = async_test('Test detached callback if moving custom element from ' +
'document with browsing context to document with browsing context');
moveTest.step(function() {
var iframe1 = newIFrame('../../resources/blank.html');
iframe1.onload = moveTest.step_func(function() {
var doc1 = iframe1.contentDocument;
// register custom element type
var proto1 = newHTMLElementPrototype();
doc1.registerElement('x-e', {prototype: proto1});
// create custom element
var customElement = doc1.createElement('x-e');
doc1.body.appendChild(customElement);
assert_equals(proto1.detachedCallbackCalledCounter, 0,
'Callback detached should not be called when element is created');
// create second iframe
var iframe2 = newIFrame('../../resources/x-element.html');
iframe2.onload = moveTest.step_func(function() {
var doc2 = iframe2.contentDocument;
// register custom element type
var proto2 = newHTMLElementPrototype();
doc2.registerElement('x-e', {prototype: proto2});
// move element
doc2.body.appendChild(customElement);
assert_equals(proto1.detachedCallbackCalledCounter, 1,
'Callback detached should be called in documents with browsing context');
assert_equals(proto2.detachedCallbackCalledCounter, 0,
'Callback detached, defined in receiving document, should not be called');
// test clean up
iframe1.remove();
iframe2.remove();
moveTest.done();
});
});
});
</script>
</body>
</html>