Needs Detach on shadow root creation for v0 as well.

We don't DetachLayoutTree outside of the flat tree. Adding a shadow root
makes host children no longer part of the flat tree. At least not until
we add slots to the shadow tree. We already did this for v1 roots. It is
necessary for v0 roots as well.

Bug: 955861, 954826
Change-Id: I4de06ae5067297476a1c0a3a91d56696d71b4c86
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1581972
Reviewed-by: Anders Hartvoll Ruud <andruud@chromium.org>
Commit-Queue: Rune Lillesveen <futhark@chromium.org>
Cr-Commit-Position: refs/heads/master@{#653938}
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index fae5d258..319ab57 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2714,10 +2714,7 @@
 
   auto* shadow_root = MakeGarbageCollected<ShadowRoot>(GetDocument(), type);
 
-  if (type != ShadowRootType::V0 && InActiveDocument()) {
-    // Detach the host's children here for v1 (including UA shadow root),
-    // because we skip SetNeedsDistributionRecalc() in attaching v1 shadow root.
-    // See https://crrev.com/2822113002 for details.
+  if (InActiveDocument()) {
     // We need to call child.RemovedFromFlatTree() before setting a shadow
     // root to the element because detach must use the original flat tree
     // structure before attachShadow happens. We cannot use
diff --git a/third_party/blink/renderer/core/dom/shadow_dom_v0_test.cc b/third_party/blink/renderer/core/dom/shadow_dom_v0_test.cc
index 4d47b90..2eca5af 100644
--- a/third_party/blink/renderer/core/dom/shadow_dom_v0_test.cc
+++ b/third_party/blink/renderer/core/dom/shadow_dom_v0_test.cc
@@ -171,6 +171,24 @@
   EXPECT_FALSE(span->NeedsReattachLayoutTree());
 }
 
+TEST_F(ShadowDOMV0Test, DetachLayoutTreeOnShadowRootCreation) {
+  LoadURL("about:blank");
+
+  auto* host = GetDocument().CreateRawElement(html_names::kDivTag);
+  host->SetInlineStyleProperty(CSSPropertyID::kDisplay, CSSValueID::kContents);
+  auto* span = GetDocument().CreateRawElement(html_names::kSpanTag);
+  host->appendChild(span);
+  GetDocument().body()->appendChild(host);
+  GetDocument().View()->UpdateAllLifecyclePhases(
+      DocumentLifecycle::LifecycleUpdateReason::kTest);
+
+  EXPECT_TRUE(span->GetLayoutObject());
+
+  host->CreateV0ShadowRootForTesting();
+
+  EXPECT_FALSE(span->GetLayoutObject());
+}
+
 }  // namespace
 
 }  // namespace blink