Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

html,custom-elements: Add tests for HTMLElement.attachInternals() #15123

Merged
merged 2 commits into from
Feb 21, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
82 changes: 82 additions & 0 deletions custom-elements/HTMLElement-attachInternals.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
<!DOCTYPE html>
<body>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="help" content="https://html.spec.whatwg.org/multipage/custom-elements.html#dom-attachinternals">
<div id="container"></div>
<script>
test(() => {
class MyElement1 extends HTMLElement {
}
customElements.define('my-element1', MyElement1);
const container = document.querySelector('#container');

let element = new MyElement1();
assert_true(element.attachInternals() instanceof ElementInternals,
'New - 1st call');
assert_throws('InvalidStateError', () => { element.attachInternals(); },
'New - 2nd call');

element = document.createElement('my-element1');
assert_true(element.attachInternals() instanceof ElementInternals,
'createElement - 1st call');
assert_throws('InvalidStateError', () => { element.attachInternals(); },
'createElement - 2nd call');

container.innerHTML = '<my-element1></my-element1>';
assert_true(container.firstChild.attachInternals() instanceof ElementInternals,
'Parser - 1st call');
assert_throws('InvalidStateError', () => {
container.firstChild.attachInternals();
}, 'Parser - 2nd call');
}, 'Successful attachInternals() and the second call.');

test(() => {
class MyDiv extends HTMLDivElement {}
customElements.define('my-div', MyDiv, { extends: 'div' });
const customizedBuiltin = document.createElement('div', { is: 'my-div'});
assert_throws('NotSupportedError', () => { customizedBuiltin.attachInternals() });
}, 'attachInternals() throws a NotSupportedError if it is called for ' +
'a customized built-in element');

test(() => {
const builtin = document.createElement('div');
assert_throws('InvalidStateError', () => { builtin.attachInternals() });

const doc = document.implementation.createDocument('foo', null);
const span = doc.appendChild(doc.createElementNS('http://www.w3.org/1999/xhtml', 'html:span'));
assert_true(span instanceof HTMLElement);
assert_throws('InvalidStateError', () => { span.attachInternals(); });

const undefinedCustom = document.createElement('undefined-element');
assert_throws('InvalidStateError', () => { undefinedCustom.attachInternals() });
}, 'If a custom element definition for the local name of the element doesn\'t' +
' exist, throw an InvalidStateError');

test(() => {
class MyElement2 extends HTMLElement {
static get disabledFeatures() { return ['internals']; }
}
customElements.define('my-element2', MyElement2);
const container = document.querySelector('#container');

assert_throws('NotSupportedError', () => {
(new MyElement2).attachInternals();
});
assert_throws('NotSupportedError', () => {
document.createElement('my-element2').attachInternals();
});
assert_throws('NotSupportedError', () => {
container.innerHTML = '<my-element2></my-element2>';
container.firstChild.attachInternals();
});

class MyElement3 extends HTMLElement {
static get disabledFeatures() { return ['INTERNALS']; }
}
customElements.define('my-element3', MyElement3);
assert_true((new MyElement3).attachInternals() instanceof ElementInternals);
}, 'If a custom element definition for the local name of the element has ' +
'disable internals flag, throw a NotSupportedError');
</script>
</body>
7 changes: 7 additions & 0 deletions interfaces/html.idl
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ interface HTMLElement : Element {
[CEReactions] attribute DOMString autocapitalize;

[CEReactions] attribute [TreatNullAs=EmptyString] DOMString innerText;

ElementInternals attachInternals();
};

HTMLElement includes GlobalEventHandlers;
Expand Down Expand Up @@ -1408,6 +1410,11 @@ dictionary ElementDefinitionOptions {
DOMString extends;
};

[Exposed=Window]
interface ElementInternals {

};

dictionary FocusOptions {
boolean preventScroll = false;
};
Expand Down