Unify SVG parent checks for LayoutObject construction using always the light tree parent.

This is the last cleanup spawned from [1].

I've used the light tree parent because there are a lot of other checks that are
wrong, as noted in that discussion, and updating all those and ensuring it's
correct is a fair amount of work.

This patch ensures we're consistent, and that there's only one place to change
if we want to change the isLayoutObjectNeeded check to use the flat tree.

[1]: https://codereview.chromium.org/2684833003/

Review-Url: https://codereview.chromium.org/2688343002
Cr-Commit-Position: refs/heads/master@{#449893}
diff --git a/third_party/WebKit/Source/core/svg/SVGElement.cpp b/third_party/WebKit/Source/core/svg/SVGElement.cpp
index 961d67e..d6b1fec8 100644
--- a/third_party/WebKit/Source/core/svg/SVGElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGElement.cpp
@@ -1027,18 +1027,14 @@
 }
 
 bool SVGElement::layoutObjectIsNeeded(const ComputedStyle& style) {
-  // SVG elements only render when inside <svg>, or if the element is an <svg>
-  // itself.
-  if (!isSVGSVGElement(*this)) {
-    ContainerNode* parent = FlatTreeTraversal::parent(*this);
-    if (!parent || !parent->isSVGElement())
-      return false;
-  }
+  return isValid() && hasSVGParent() && Element::layoutObjectIsNeeded(style);
+}
 
-  if (!isValid())
-    return false;
-
-  return Element::layoutObjectIsNeeded(style);
+bool SVGElement::hasSVGParent() const {
+  // Should we use the flat tree parent instead? If so, we should probably fix a
+  // few other checks.
+  return parentOrShadowHostElement() &&
+         parentOrShadowHostElement()->isSVGElement();
 }
 
 MutableStylePropertySet* SVGElement::animatedSMILStyleProperties() const {
diff --git a/third_party/WebKit/Source/core/svg/SVGElement.h b/third_party/WebKit/Source/core/svg/SVGElement.h
index 22a6c1e..bc0f635 100644
--- a/third_party/WebKit/Source/core/svg/SVGElement.h
+++ b/third_party/WebKit/Source/core/svg/SVGElement.h
@@ -236,6 +236,8 @@
 
   virtual bool selfHasRelativeLengths() const { return false; }
 
+  bool hasSVGParent() const;
+
   SVGElementRareData* ensureSVGRareData();
   inline bool hasSVGRareData() const { return m_SVGRareData; }
   inline SVGElementRareData* svgRareData() const {
diff --git a/third_party/WebKit/Source/core/svg/SVGGElement.cpp b/third_party/WebKit/Source/core/svg/SVGGElement.cpp
index 3198284c..1d5541a 100644
--- a/third_party/WebKit/Source/core/svg/SVGGElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGGElement.cpp
@@ -48,8 +48,7 @@
   // Unlike SVGElement::layoutObjectIsNeeded(), we still create layoutObjects,
   // even if display is set to 'none' - which is special to SVG <g> container
   // elements.
-  return parentOrShadowHostElement() &&
-         parentOrShadowHostElement()->isSVGElement() && isValid();
+  return isValid() && hasSVGParent();
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/svg/SVGMarkerElement.cpp b/third_party/WebKit/Source/core/svg/SVGMarkerElement.cpp
index f44a077..1925c5d 100644
--- a/third_party/WebKit/Source/core/svg/SVGMarkerElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGMarkerElement.cpp
@@ -159,8 +159,7 @@
 }
 
 bool SVGMarkerElement::layoutObjectIsNeeded(const ComputedStyle&) {
-  ContainerNode* parent = FlatTreeTraversal::parent(*this);
-  return parent && parent->isSVGElement() && isValid();
+  return isValid() && hasSVGParent();
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp b/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp
index 7b4c270..79dcc61 100644
--- a/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGSVGElement.cpp
@@ -510,7 +510,10 @@
   // https://bugs.webkit.org/show_bug.cgi?id=103493
   if (document().documentElement() == this)
     return true;
-  return SVGElement::layoutObjectIsNeeded(style);
+
+  // <svg> elements don't need an SVG parent to render, so we bypass
+  // SVGElement::layoutObjectIsNeeded.
+  return isValid() && Element::layoutObjectIsNeeded(style);
 }
 
 LayoutObject* SVGSVGElement::createLayoutObject(const ComputedStyle&) {