Bug 1465572: Changing the slot name should properly invalidate layout. r?smaug
Just something I found while trying to construct a test-case for this.
MozReview-Commit-ID: A01qzQ14QG9
--- a/dom/base/ShadowRoot.cpp
+++ b/dom/base/ShadowRoot.cpp
@@ -229,18 +229,20 @@ ShadowRoot::RemoveSlot(HTMLSlotElement*
nsAutoString name;
aSlot->GetName(name);
SlotArray* currentSlots = mSlotMap.Get(name);
MOZ_DIAGNOSTIC_ASSERT(currentSlots && currentSlots->Contains(aSlot),
"Slot to deregister wasn't found?");
if (currentSlots->Length() == 1) {
MOZ_ASSERT(currentSlots->ElementAt(0) == aSlot);
+
+ InvalidateStyleAndLayoutOnSubtree(aSlot);
+
mSlotMap.Remove(name);
-
if (!aSlot->AssignedNodes().IsEmpty()) {
aSlot->ClearAssignedNodes();
aSlot->EnqueueSlotChangeEvent();
}
return;
}
@@ -248,16 +250,17 @@ ShadowRoot::RemoveSlot(HTMLSlotElement*
currentSlots->RemoveElement(aSlot);
// Move assigned nodes from removed slot to the next slot in
// tree order with the same name.
if (!wasFirstSlot) {
return;
}
+ InvalidateStyleAndLayoutOnSubtree(aSlot);
HTMLSlotElement* replacementSlot = currentSlots->ElementAt(0);
const nsTArray<RefPtr<nsINode>>& assignedNodes = aSlot->AssignedNodes();
bool slottedNodesChanged = !assignedNodes.IsEmpty();
while (!assignedNodes.IsEmpty()) {
nsINode* assignedNode = assignedNodes[0];
aSlot->RemoveAssignedNode(assignedNode);
replacementSlot->AppendAssignedNode(assignedNode);
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -128996,16 +128996,28 @@
[
"/css/css-scoping/reference/green-box.html",
"=="
]
],
{}
]
],
+ "css/css-scoping/shadow-reassign-dynamic-002.html": [
+ [
+ "/css/css-scoping/shadow-reassign-dynamic-002.html",
+ [
+ [
+ "/css/css-scoping/reference/green-box.html",
+ "=="
+ ]
+ ],
+ {}
+ ]
+ ],
"css/css-scoping/shadow-root-insert-into-document.html": [
[
"/css/css-scoping/shadow-root-insert-into-document.html",
[
[
"/css/css-scoping/reference/green-box.html",
"=="
]
@@ -519983,16 +519995,20 @@
"css/css-scoping/shadow-fallback-dynamic-005.html": [
"ab3c3d205e59df800ba5b4217245b83685521c31",
"reftest"
],
"css/css-scoping/shadow-reassign-dynamic-001.html": [
"11ed4da2e6ce88d8a2b98a8f1c814417ef7770dd",
"reftest"
],
+ "css/css-scoping/shadow-reassign-dynamic-002.html": [
+ "130734170945e395bab92ac0ce799113d9ab9c96",
+ "reftest"
+ ],
"css/css-scoping/shadow-root-insert-into-document.html": [
"2cee9fff35c9222074f4ef78dcfcb8a3e02bbc98",
"reftest"
],
"css/css-scoping/slotted-invalidation.html": [
"c500e1ceba1b293d45df5f66fd89d4a5d9ceb952",
"testharness"
],
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/css/css-scoping/shadow-reassign-dynamic-002.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Scoping: Dynamic reassignment of a slot.</title>
+<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
+<link rel="help" href="https://drafts.csswg.org/css-scoping/#selectors-data-model">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1465572">
+<link rel="match" href="reference/green-box.html"/>
+<div id="host">
+ FAIL
+ <div style="background: green" slot="the-slot"></div>
+</div>
+<script>
+ document.body.offsetTop;
+ host.attachShadow({ mode: "open" }).innerHTML = `
+ <style>::slotted(div) { width: 100px; height: 100px }</style>
+ <p>Test passes if you see a single 100px by 100px green box below.</p>
+ <slot>FAIL</slot>
+ `;
+ document.body.offsetTop;
+ host.shadowRoot.querySelector("slot").setAttribute("name", "the-slot");
+</script>