summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/shadow-dom
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/shadow-dom')
-rw-r--r--testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-basic.html43
-rw-r--r--testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-repeats-2.html36
-rw-r--r--testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-repeats.html53
-rw-r--r--testing/web-platform/tests/shadow-dom/declarative/gethtml.tentative.html25
-rw-r--r--testing/web-platform/tests/shadow-dom/focus/focus-scroll-under-delegatesFocus.html37
5 files changed, 162 insertions, 32 deletions
diff --git a/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-basic.html b/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-basic.html
index 8bc6bec5f5..4f174b8e5f 100644
--- a/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-basic.html
+++ b/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-basic.html
@@ -55,6 +55,49 @@ test(() => {
}, 'Shadowrootmode reflection, setter');
test(() => {
+ const t = document.createElement('template');
+ t.setAttribute('shadowrootdelegatesfocus','');
+ assert_equals(t.shadowRootDelegatesFocus,true,'The shadowRootDelegatesFocus IDL should reflect the content attribute');
+ t.setAttribute('shadowrootdelegatesfocus','foobar');
+ assert_equals(t.shadowRootDelegatesFocus,true,'The value doesn\'t matter');
+ t.removeAttribute('shadowrootdelegatesfocus');
+ assert_equals(t.shadowRootDelegatesFocus,false,'No shadowRootDelegatesFocus attribute maps to false');
+}, 'Shadowrootdelegatesfocus reflection');
+
+test(() => {
+ const t = document.createElement('template');
+ assert_equals(t.getAttribute('shadowrootdelegatesfocus'), null);
+ t.shadowRootDelegatesFocus = true;
+ assert_equals(t.getAttribute('shadowrootdelegatesfocus'), '');
+ assert_equals(t.shadowRootDelegatesFocus, true);
+ t.shadowRootDelegatesFocus = false;
+ assert_equals(t.getAttribute('shadowrootdelegatesfocus'), null);
+ assert_equals(t.shadowRootDelegatesFocus, false);
+}, 'Shadowrootdelegatesfocus reflection, setter');
+
+
+test(() => {
+ const t = document.createElement('template');
+ t.setAttribute('shadowrootclonable','');
+ assert_equals(t.shadowRootClonable,true,'The shadowRootClonable IDL should reflect the content attribute');
+ t.setAttribute('shadowrootclonable','foobar');
+ assert_equals(t.shadowRootClonable,true,'The value doesn\'t matter');
+ t.removeAttribute('shadowrootclonable');
+ assert_equals(t.shadowRootClonable,false,'No shadowRootClonable attribute maps to false');
+}, 'Shadowrootclonable reflection');
+
+test(() => {
+ const t = document.createElement('template');
+ assert_equals(t.getAttribute('shadowrootclonable'), null);
+ t.shadowRootClonable = true;
+ assert_equals(t.getAttribute('shadowrootclonable'), '');
+ assert_equals(t.shadowRootClonable, true);
+ t.shadowRootClonable = false;
+ assert_equals(t.getAttribute('shadowrootclonable'), null);
+ assert_equals(t.shadowRootClonable, false);
+}, 'Shadowrootclonable reflection, setter');
+
+test(() => {
const div = document.createElement('div');
div.setHTMLUnsafe(`
<div id="host">
diff --git a/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-repeats-2.html b/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-repeats-2.html
new file mode 100644
index 0000000000..74b14b8d8f
--- /dev/null
+++ b/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-repeats-2.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<title>Duplicate declarative shadow trees</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+
+<div id=multiple1>
+ <template shadowrootmode=open>1</template>
+ <template shadowrootmode=open>2</template>
+ <template shadowrootmode=open>3</template>
+</div>
+
+<div id=multiple2>
+ <template shadowrootmode=closed>1</template>
+ <template shadowrootmode=closed>2</template>
+ <template shadowrootmode=open>3</template>
+</div>
+
+<script>
+test((t) => {
+ t.add_cleanup(() => {
+ multiple1.remove();
+ multiple2.remove();
+ });
+ let shadow = multiple1.shadowRoot;
+ assert_true(!!shadow,'Remaining shadow root should be open');
+ assert_equals(shadow.textContent,"1");
+ assert_equals(multiple1.childElementCount, 2);
+ assert_equals(multiple1.firstElementChild.content.textContent, "2");
+ assert_equals(multiple1.lastElementChild.content.textContent, "3");
+ shadow = multiple2.shadowRoot;
+ assert_false(!!shadow,'Remaining shadow root should be closed');
+ assert_equals(multiple2.childElementCount, 2);
+ assert_equals(multiple2.firstElementChild.content.textContent, "2");
+ assert_equals(multiple2.lastElementChild.content.textContent, "3");
+},'Repeated declarative shadow roots keep only the first');
+</script>
diff --git a/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-repeats.html b/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-repeats.html
index 69f5c0f077..9cee41f2f3 100644
--- a/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-repeats.html
+++ b/testing/web-platform/tests/shadow-dom/declarative/declarative-shadow-dom-repeats.html
@@ -22,13 +22,19 @@
<script>
test((t) => {
+ t.add_cleanup(() => {
+ multiple1.remove();
+ multiple2.remove();
+ });
let shadow = multiple1.shadowRoot;
assert_true(!!shadow,'Remaining shadow root should be open');
assert_equals(shadow.textContent,"Open");
+ assert_equals(multiple1.childElementCount, 1);
+ assert_equals(multiple1.firstElementChild.shadowRootMode, "closed");
shadow = multiple2.shadowRoot;
assert_false(!!shadow,'Remaining shadow root should be closed');
- multiple1.remove(); // Cleanup
- multiple2.remove();
+ assert_equals(multiple2.childElementCount, 1);
+ assert_equals(multiple2.firstElementChild.shadowRootMode, "open");
},'Repeated declarative shadow roots keep only the first');
</script>
@@ -40,39 +46,48 @@ test((t) => {
test((t) => {
assert_throws_dom("NotSupportedError",() => {
open1.attachShadow({mode: "closed"});
- },'Mismatched shadow root type should throw');
+ },'Mismatched shadow root mode should throw');
const initialShadow = open1.shadowRoot;
const shadow = open1.attachShadow({mode: "open"}); // Shouldn't throw
assert_equals(shadow,initialShadow,'Same shadow should be returned');
assert_equals(shadow.textContent,'','Shadow should be empty');
-},'Calling attachShadow() on declarative shadow root must match type');
+},'Calling attachShadow() on declarative shadow root must match mode');
</script>
<div id=open2>
- <template shadowrootmode=open shadowrootdelegatesfocus shadowrootclonable>
+ <template shadowrootmode=open shadowrootdelegatesfocus shadowrootclonable serializable>
Open, delegates focus (not the default), clonable (not the default)
- named slot assignment (the default)
+ serializable (not the default), named slot assignment (the default)
</template>
</div>
<script>
test((t) => {
+ t.add_cleanup(() => open2.remove());
+ assert_true(!!open2.shadowRoot);
+ // Changing the mode should throw.
assert_throws_dom("NotSupportedError",() => {
- open2.attachShadow({mode: "closed", delegatesFocus: true, slotAssignment: "named", clonable: true});
- },'Mismatched shadow root type should throw');
+ open2.attachShadow({mode: "closed"});
+ },'Mismatched shadow root mode should throw');
assert_throws_dom("NotSupportedError",() => {
- open2.attachShadow({mode: "open", delegatesFocus: false, slotAssignment: "named", clonable: true});
- },'Mismatched shadow root delegatesFocus should throw');
- assert_throws_dom("NotSupportedError",() => {
- open2.attachShadow({mode: "open", delegatesFocus: true, slotAssignment: "manual", clonable: true});
- },'Mismatched shadow root slotAssignment should throw');
- assert_throws_dom("NotSupportedError",() => {
- open2.attachShadow({mode: "open", delegatesFocus: true, slotAssignment: "named", clonable: false});
- },'Mismatched shadow root clonable should throw');
+ open2.attachShadow({mode: "closed", delegatesFocus: true, slotAssignment: "named", clonable: true, serializable: true});
+ },'Mismatched shadow root mode should throw (explicit args)');
+ // Changing other things should not throw, and should not change the shadow root's settings
const initialShadow = open2.shadowRoot;
- const shadow = open2.attachShadow({mode: "open", delegatesFocus: true, slotAssignment: "named", clonable: true}); // Shouldn't throw
- assert_equals(shadow,initialShadow,'Same shadow should be returned');
- assert_equals(shadow.textContent,'','Shadow should be empty');
+ assert_equals(initialShadow.delegatesFocus,true);
+ assert_equals(initialShadow.slotAssignment,"named");
+ assert_true(initialShadow.clonable);
+ assert_true(initialShadow.serializable);
+ let newShadow = open2.attachShadow({mode: "open", delegatesFocus: false, slotAssignment: "manual", clonable: false, serializable: false});
+ assert_equals(newShadow,initialShadow,'Same shadow should be returned');
+ assert_equals(newShadow.textContent,'','Shadow should be empty');
+ assert_equals(newShadow.delegatesFocus,true);
+ assert_equals(newShadow.slotAssignment,"named");
+ assert_true(newShadow.clonable);
+ assert_true(newShadow.serializable);
+ assert_throws_dom("NotSupportedError",() => {
+ open2.attachShadow({mode: "open"});
+ },'Invoking attachShadow() on a non-declarative shadow root should throw');
},'Calling attachShadow() on declarative shadow root must match all parameters');
</script>
diff --git a/testing/web-platform/tests/shadow-dom/declarative/gethtml.tentative.html b/testing/web-platform/tests/shadow-dom/declarative/gethtml.tentative.html
index c48230c170..eabd39131b 100644
--- a/testing/web-platform/tests/shadow-dom/declarative/gethtml.tentative.html
+++ b/testing/web-platform/tests/shadow-dom/declarative/gethtml.tentative.html
@@ -69,29 +69,28 @@ function testElementType(allowsShadowDom, elementType, runGetHTMLOnShadowRoot, d
const emptyElement = `<${elementType}></${elementType}>`;
if (isOpen) {
if (expectedSerializable) {
- assert_equals(wrapper.getHTML({includeShadowRoots: true}), correctHtml);
+ assert_equals(wrapper.getHTML({serializableShadowRoots: true}), correctHtml);
} else {
- assert_equals(wrapper.getHTML({includeShadowRoots: true}), emptyElement);
+ assert_equals(wrapper.getHTML({serializableShadowRoots: true}), emptyElement);
}
} else {
// Closed shadow roots should not be returned unless shadowRoots specifically contains the shadow root:
- assert_equals(wrapper.getHTML({includeShadowRoots: true}), emptyElement);
- assert_equals(wrapper.getHTML({includeShadowRoots: true, shadowRoots: []}), emptyElement);
+ assert_equals(wrapper.getHTML({serializableShadowRoots: true}), emptyElement);
+ assert_equals(wrapper.getHTML({serializableShadowRoots: true, shadowRoots: []}), emptyElement);
}
- // If we provide the shadow root, serialize it, regardless of includeShadowRoots.
- assert_equals(wrapper.getHTML({includeShadowRoots: true, shadowRoots: [shadowRoot]}),correctHtml);
+ // If we provide the shadow root, serialize it, regardless of serializableShadowRoots.
+ assert_equals(wrapper.getHTML({serializableShadowRoots: true, shadowRoots: [shadowRoot]}),correctHtml);
+ assert_equals(wrapper.getHTML({serializableShadowRoots: false, shadowRoots: [shadowRoot]}),correctHtml);
assert_equals(wrapper.getHTML({shadowRoots: [shadowRoot]}),correctHtml);
- // This should always throw - includeShadowRoots false, but we've provided roots.
- assert_throws_dom("NotSupportedError",() => wrapper.getHTML({includeShadowRoots: false, shadowRoots: [shadowRoot]}));
} else {
// For non-shadow hosts, getHTML() should also match .innerHTML
- assert_equals(wrapper.getHTML({includeShadowRoots: true}),wrapper.innerHTML);
+ assert_equals(wrapper.getHTML({serializableShadowRoots: true}),wrapper.innerHTML);
}
- // Either way, make sure getHTML({includeShadowRoots: false}) matches .innerHTML
- assert_equals(wrapper.getHTML({includeShadowRoots: false}),wrapper.innerHTML,'getHTML() with includeShadowRoots false should return the same as .innerHTML');
- // ...and that the default for includeShadowRoots is false.
- assert_equals(wrapper.getHTML(),wrapper.innerHTML,'The default for includeShadowRoots should be false');
+ // Either way, make sure getHTML({serializableShadowRoots: false}) matches .innerHTML
+ assert_equals(wrapper.getHTML({serializableShadowRoots: false}),wrapper.innerHTML,'getHTML() with serializableShadowRoots false should return the same as .innerHTML');
+ // ...and that the default for serializableShadowRoots is false.
+ assert_equals(wrapper.getHTML(),wrapper.innerHTML,'The default for serializableShadowRoots should be false');
}, `${runGetHTMLOnShadowRoot ? 'ShadowRoot' : 'Element'}.getHTML() on <${elementType}>${allowsShadowDom ? `, with ${declarativeShadowDom ? 'declarative' : 'imperative'} shadow, mode=${mode}, delegatesFocus=${delegatesFocus}, serializable=${serializable}, clonable=${clonable}.` : ''}`);
}
diff --git a/testing/web-platform/tests/shadow-dom/focus/focus-scroll-under-delegatesFocus.html b/testing/web-platform/tests/shadow-dom/focus/focus-scroll-under-delegatesFocus.html
new file mode 100644
index 0000000000..ea5fc472b5
--- /dev/null
+++ b/testing/web-platform/tests/shadow-dom/focus/focus-scroll-under-delegatesFocus.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<link rel="author" href="mailto:masonf@chromium.org">
+<link rel="help" href="https://issues.chromium.org/issues/324112201">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-actions.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<div id=container style="border:1px solid red; width: 100px;">
+ <template shadowrootmode=open shadowrootdelegatesfocus>
+ <slot></slot>
+ </template>
+
+ <a id=anchor href="#heading">anchor</a>
+ <div style="height:2000px"></div>
+ <h1 id=heading>Heading</h1>
+</div>
+
+<script>
+promise_test(async (t) => {
+ t.add_cleanup(() => container.remove());
+ let scrolled = new Promise(resolve => {
+ document.addEventListener('scrollend',resolve,{once:true});
+ })
+ await test_driver.click(anchor);
+ await scrolled;
+
+ scrolled = false;
+ document.addEventListener('scroll',() => {
+ scrolled = true;
+ });
+ await test_driver.click(heading);
+ await new Promise(resolve => t.step_timeout(resolve, 500));
+ assert_false(scrolled,'The document should not scroll');
+},'delegatesFocus shouldn\'t cause extra focus steps');
+</script>