Crash in WebCore::SVGUseElement::instanceForShadowTreeElement
authorschenney@chromium.org <schenney@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Mar 2012 20:07:11 +0000 (20:07 +0000)
committerschenney@chromium.org <schenney@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Mar 2012 20:07:11 +0000 (20:07 +0000)
https://bugs.webkit.org/show_bug.cgi?id=80406

Reviewed by Nikolas Zimmermann.

Code assumes that an object that is an SVG Element and in a shadow
tree must be in an SVG use shadow tree, and casts the shadow host with
a static_cast. It may be that an SVG element appears in a non-use
shadow tree, in which case bad things happen. While it appears that
the current code prevents such a situation from arising (checks are
made within the shadow tree code to prevent it) there are also
indications that the situation may change.

No new tests. I believe that the problem here cannot currently be
reproduced. That is, other code prevents SVG elements from appearing
in non-svg shadow trees.

* dom/EventDispatcher.cpp:
(WebCore::eventTargetRespectingSVGTargetRules):
* svg/SVGStyledElement.cpp:
(WebCore::SVGStyledElement::title):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@110314 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/dom/EventDispatcher.cpp
Source/WebCore/svg/SVGStyledElement.cpp

index 207551b5d053f5859ae94f655076a13817d1aca6..c298808af8511db1ad258739ec4f67fd9c6f8591 100644 (file)
@@ -1,3 +1,27 @@
+2012-03-09  Stephen Chenney  <schenney@chromium.org>
+
+        Crash in WebCore::SVGUseElement::instanceForShadowTreeElement
+        https://bugs.webkit.org/show_bug.cgi?id=80406
+
+        Reviewed by Nikolas Zimmermann.
+
+        Code assumes that an object that is an SVG Element and in a shadow
+        tree must be in an SVG use shadow tree, and casts the shadow host with
+        a static_cast. It may be that an SVG element appears in a non-use
+        shadow tree, in which case bad things happen. While it appears that
+        the current code prevents such a situation from arising (checks are
+        made within the shadow tree code to prevent it) there are also
+        indications that the situation may change.
+
+        No new tests. I believe that the problem here cannot currently be
+        reproduced. That is, other code prevents SVG elements from appearing
+        in non-svg shadow trees.
+
+        * dom/EventDispatcher.cpp:
+        (WebCore::eventTargetRespectingSVGTargetRules):
+        * svg/SVGStyledElement.cpp:
+        (WebCore::SVGStyledElement::title):
+
 2012-03-09  Jon Lee  <jonlee@apple.com>
 
         Add support for ENABLE(LEGACY_NOTIFICATIONS)
index 49e78133e5df727609613b21c07cb6bb78a24f67..5866e6068d6f59ba621d321c544f4f28363bceb9 100644 (file)
@@ -65,11 +65,17 @@ inline static EventTarget* eventTargetRespectingSVGTargetRules(Node* referenceNo
 
     // Spec: The event handling for the non-exposed tree works as if the referenced element had been textually included
     // as a deeply cloned child of the 'use' element, except that events are dispatched to the SVGElementInstance objects
-    SVGUseElement* useElement = static_cast<SVGUseElement*>(referenceNode->treeScope()->rootNode()->shadowHost());
-    ASSERT(useElement);
-
-    if (SVGElementInstance* instance = useElement->instanceForShadowTreeElement(referenceNode))
-        return instance;
+    Element* shadowHostElement = referenceNode->treeScope()->rootNode()->shadowHost();
+    // At this time, SVG nodes are not allowed in non-<use> shadow trees, so any shadow root we do
+    // have should be a use. The assert and following test is here to catch future shadow DOM changes
+    // that do enable SVG in a shadow tree.
+    ASSERT(!shadowHostElement || shadowHostElement->hasTagName(SVGNames::useTag));
+    if (shadowHostElement && shadowHostElement->hasTagName(SVGNames::useTag)) {
+        SVGUseElement* useElement = static_cast<SVGUseElement*>(shadowHostElement);
+
+        if (SVGElementInstance* instance = useElement->instanceForShadowTreeElement(referenceNode))
+            return instance;
+    }
 #endif
 
     return referenceNode;
index 754282f5ede34a6b806be76bc3e5f4474982f882..a573b8dce2decede7ed137ae798d53b65910a3de 100644 (file)
@@ -90,13 +90,19 @@ String SVGStyledElement::title() const
 
     // Walk up the tree, to find out whether we're inside a <use> shadow tree, to find the right title.
     if (isInShadowTree()) {
-        SVGUseElement* useElement = static_cast<SVGUseElement*>(treeScope()->rootNode()->shadowHost());
-        ASSERT(useElement);
-
-        // If the <use> title is not empty we found the title to use.
-        String useTitle(useElement->title());
-        if (!useTitle.isEmpty())
-            return useTitle;
+        Element* shadowHostElement = treeScope()->rootNode()->shadowHost();
+        // At this time, SVG nodes are not allowed in non-<use> shadow trees, so any shadow root we do
+        // have should be a use. The assert and following test is here to catch future shadow DOM changes
+        // that do enable SVG in a shadow tree.
+        ASSERT(!shadowHostElement || shadowHostElement->hasTagName(SVGNames::useTag));
+        if (shadowHostElement && shadowHostElement->hasTagName(SVGNames::useTag)) {
+            SVGUseElement* useElement = static_cast<SVGUseElement*>(shadowHostElement);
+            // If the <use> title is not empty we found the title to use.
+            String useTitle(useElement->title());
+            if (!useTitle.isEmpty())
+               return useTitle;
+        }
     }
 
     // If we aren't an instance in a <use> or the <use> title was not found, then find the first