Turn x/y to presentation attributes
authorkrit@webkit.org <krit@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Jul 2014 09:52:25 +0000 (09:52 +0000)
committerkrit@webkit.org <krit@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 25 Jul 2014 09:52:25 +0000 (09:52 +0000)
https://bugs.webkit.org/show_bug.cgi?id=135215

Source/WebCore:
Patch by Dirk Schulze <krit@webkit.org> on 2014-07-24
Reviewed by Dean Jackson.

This follows the patch for width and height presentation attributes and
turns x and y to presentation attributes as well:

http://trac.webkit.org/changeset/171341

Tests: svg/css/parse-length.html
       transitions/svg-layout-transition.html

Added copyright where I forgot it in previous patch.

* css/CSSComputedStyleDeclaration.cpp: Computed style of x and y.
(WebCore::ComputedStyleExtractor::propertyValue):
* css/CSSParser.cpp:
(WebCore::isSimpleLengthPropertyID): Add x and y to list.
* css/DeprecatedStyleBuilder.cpp:
(WebCore::DeprecatedStyleBuilder::DeprecatedStyleBuilder): Resolve x and y.
* css/SVGCSSParser.cpp:
(WebCore::CSSParser::parseSVGValue): Parse x and y property.
* css/SVGCSSPropertyNames.in: Add x and y to list of names.
* css/StyleResolver.h:
* page/animation/CSSPropertyAnimation.cpp: Animate x and y as Length.
(WebCore::CSSPropertyAnimationWrapperMap::CSSPropertyAnimationWrapperMap):
* rendering/style/RenderStyle.h: Add x and y setters and getters.
* rendering/style/SVGRenderStyle.cpp: Add x and y setters for StyleLayoutData.
(WebCore::SVGRenderStyle::SVGRenderStyle):
(WebCore::SVGRenderStyle::operator==):
(WebCore::SVGRenderStyle::copyNonInheritedFrom):
(WebCore::SVGRenderStyle::diff):
* rendering/style/SVGRenderStyle.h:
(WebCore::SVGRenderStyle::setX):
(WebCore::SVGRenderStyle::setY):
(WebCore::SVGRenderStyle::x):
(WebCore::SVGRenderStyle::y):
* rendering/style/SVGRenderStyleDefs.cpp: Add StyleLayoutData for style storing.
(WebCore::StyleLayoutData::StyleLayoutData):
(WebCore::StyleLayoutData::copy):
(WebCore::StyleLayoutData::operator==):
* rendering/style/SVGRenderStyleDefs.h:
(WebCore::StyleLayoutData::create):
(WebCore::StyleLayoutData::operator!=):
* rendering/svg/RenderSVGRect.cpp:
(WebCore::RenderSVGRect::updateShapeFromElement):
* rendering/svg/SVGPathData.cpp: Use RenderStyle values rather than attribute values.
(WebCore::updatePathFromRectElement):
* svg/SVGAnimationElement.cpp:
(WebCore::SVGAnimationElement::isTargetAttributeCSSProperty): Fix text detection.
* svg/SVGElement.cpp: Add x and y to the relevant property lists.
(WebCore::populateAttributeNameToCSSPropertyIDMap):
(WebCore::populateCSSPropertyWithSVGDOMNameToAnimatedPropertyTypeMap):
* svg/SVGFilterElement.cpp: Style update on change of x and y.
(WebCore::SVGFilterElement::svgAttributeChanged):
* svg/SVGMaskElement.cpp: Ditto.
(WebCore::SVGMaskElement::svgAttributeChanged):
* svg/SVGPatternElement.cpp: Ditto.
(WebCore::SVGPatternElement::svgAttributeChanged):
* svg/SVGRectElement.cpp: Ditto.
(WebCore::SVGRectElement::svgAttributeChanged):
* svg/SVGTextPositioningElement.cpp: Exclude x and y of text elements since they
    are lists instead of individual values. Solution about to be discussed
    in the WG. Keep current behavior for now.
(WebCore::SVGTextPositioningElement::collectStyleForPresentationAttribute):
(WebCore::SVGTextPositioningElement::isPresentationAttribute):
* svg/SVGTextPositioningElement.h:

LayoutTests:
Test parsing of x and y attributes. Rendering and SVG animation
covered by existing tests.
CSS Transition test, test transition from specified attribute value
to new property value.

Patch by Dirk Schulze <krit@webkit.org> on 2014-07-24
Reviewed by Dean Jackson.

* svg/css/parse-length-expected.txt: Added.
* svg/css/parse-length.html: Renamed from LayoutTests/svg/css/parse-width.html.
* svg/css/parse-width-expected.txt: Removed.
* transitions/svg-layout-transition-expected.txt: Added.
* transitions/svg-layout-transition.html: Added.

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

34 files changed:
LayoutTests/ChangeLog
LayoutTests/svg/css/parse-length-expected.txt [new file with mode: 0644]
LayoutTests/svg/css/parse-length.html [moved from LayoutTests/svg/css/parse-width.html with 56% similarity]
LayoutTests/svg/css/parse-width-expected.txt [deleted file]
LayoutTests/transitions/svg-layout-transition-expected.txt [new file with mode: 0644]
LayoutTests/transitions/svg-layout-transition.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/css/CSSComputedStyleDeclaration.cpp
Source/WebCore/css/CSSParser.cpp
Source/WebCore/css/DeprecatedStyleBuilder.cpp
Source/WebCore/css/SVGCSSParser.cpp
Source/WebCore/css/SVGCSSPropertyNames.in
Source/WebCore/css/StyleResolver.h
Source/WebCore/page/animation/CSSPropertyAnimation.cpp
Source/WebCore/rendering/style/RenderStyle.h
Source/WebCore/rendering/style/SVGRenderStyle.cpp
Source/WebCore/rendering/style/SVGRenderStyle.h
Source/WebCore/rendering/style/SVGRenderStyleDefs.cpp
Source/WebCore/rendering/style/SVGRenderStyleDefs.h
Source/WebCore/rendering/svg/RenderSVGRect.cpp
Source/WebCore/rendering/svg/SVGPathData.cpp
Source/WebCore/svg/SVGAnimateElement.cpp
Source/WebCore/svg/SVGAnimationElement.cpp
Source/WebCore/svg/SVGElement.cpp
Source/WebCore/svg/SVGFilterElement.cpp
Source/WebCore/svg/SVGForeignObjectElement.cpp
Source/WebCore/svg/SVGImageElement.cpp
Source/WebCore/svg/SVGLengthContext.cpp
Source/WebCore/svg/SVGMaskElement.cpp
Source/WebCore/svg/SVGPatternElement.cpp
Source/WebCore/svg/SVGRectElement.cpp
Source/WebCore/svg/SVGSVGElement.cpp
Source/WebCore/svg/SVGTextPositioningElement.cpp
Source/WebCore/svg/SVGTextPositioningElement.h

index 77fb1c2..2c51386 100644 (file)
@@ -1,3 +1,21 @@
+2014-07-24  Dirk Schulze  <krit@webkit.org>
+
+        Turn x/y to presentation attributes
+        https://bugs.webkit.org/show_bug.cgi?id=135215
+
+        Test parsing of x and y attributes. Rendering and SVG animation
+        covered by existing tests.
+        CSS Transition test, test transition from specified attribute value
+        to new property value.
+
+        Reviewed by Dean Jackson.
+
+        * svg/css/parse-length-expected.txt: Added.
+        * svg/css/parse-length.html: Renamed from LayoutTests/svg/css/parse-width.html.
+        * svg/css/parse-width-expected.txt: Removed.
+        * transitions/svg-layout-transition-expected.txt: Added.
+        * transitions/svg-layout-transition.html: Added.
+
 2014-07-24  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         CSS JIT: Implement Pseudo Element
diff --git a/LayoutTests/svg/css/parse-length-expected.txt b/LayoutTests/svg/css/parse-length-expected.txt
new file mode 100644 (file)
index 0000000..3346bf1
--- /dev/null
@@ -0,0 +1,67 @@
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="auto"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="  100"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="100   "
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute x="  100"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute x="100   "
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute y="  100"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute y="100   "
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="100   px"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="100px;"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="100px !important"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="{ 100px }"
+CONSOLE MESSAGE: Error: Invalid negative value for <rect> attribute width="-100px"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute x="auto"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute x="100   px"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute x="100px;"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute x="100px !important"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute x="{ 100px }"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute y="auto"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute y="100   px"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute y="100px;"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute y="100px !important"
+CONSOLE MESSAGE: Error: Invalid value for <rect> attribute y="{ 100px }"
+Test that 'with' presentation attribute is parsed with CSS presentation rules.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS computedStyle("width", "auto") is "auto"
+PASS computedStyle("width", "  100") is "100px"
+PASS computedStyle("width", "100   ") is "100px"
+PASS computedStyle("width", "100px") is "100px"
+PASS computedStyle("width", "1em") is "16px"
+PASS computedStyle("width", "1ex") is "12.800000190734863px"
+PASS computedStyle("width", "20%") is "20%"
+PASS computedStyle("x", "  100") is "100px"
+PASS computedStyle("x", "100   ") is "100px"
+PASS computedStyle("x", "100px") is "100px"
+PASS computedStyle("x", "1em") is "16px"
+PASS computedStyle("x", "1ex") is "12.800000190734863px"
+PASS computedStyle("x", "20%") is "20%"
+PASS computedStyle("x", "-200px") is "-200px"
+PASS computedStyle("y", "  100") is "100px"
+PASS computedStyle("y", "100   ") is "100px"
+PASS computedStyle("y", "100px") is "100px"
+PASS computedStyle("y", "1em") is "16px"
+PASS computedStyle("y", "1ex") is "12.800000190734863px"
+PASS computedStyle("y", "20%") is "20%"
+PASS computedStyle("y", "-200px") is "-200px"
+PASS computedStyle("width", "100   px") is "auto"
+PASS computedStyle("width", "100px;") is "auto"
+PASS computedStyle("width", "100px !important") is "auto"
+PASS computedStyle("width", "{ 100px }") is "auto"
+PASS computedStyle("width", "-100px") is "auto"
+PASS computedStyle("x", "auto") is "0px"
+PASS computedStyle("x", "100   px") is "0px"
+PASS computedStyle("x", "100px;") is "0px"
+PASS computedStyle("x", "100px !important") is "0px"
+PASS computedStyle("x", "{ 100px }") is "0px"
+PASS computedStyle("y", "auto") is "0px"
+PASS computedStyle("y", "100   px") is "0px"
+PASS computedStyle("y", "100px;") is "0px"
+PASS computedStyle("y", "100px !important") is "0px"
+PASS computedStyle("y", "{ 100px }") is "0px"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
similarity index 56%
rename from LayoutTests/svg/css/parse-width.html
rename to LayoutTests/svg/css/parse-length.html
index 8afb25f..ff551c7 100644 (file)
@@ -9,7 +9,7 @@ div { font-size: 8px; }
 <svg id="svg" width="0" height="0"></svg>
 <script src="../../resources/js-test-pre.js"></script>
 <script>
-description("Test that 'with' presentation attribute is parsed with CSS presentation rules.");
+description("Test that 'width' presentation attribute is parsed with CSS presentation rules.");
 
 function computedStyle(property, value) {
     var rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');
@@ -28,7 +28,11 @@ function negativeTest(property, value) {
     testComputed(property, value, "auto");
 }
 
-// test mask-image
+function negativeTestZero(property, value) {
+    testComputed(property, value, "0px");
+}
+
+// Test 'width'.
 testComputed("width", "auto", "auto");
 testComputed("width", "  100", "100px");
 testComputed("width", "100   ", "100px");
@@ -40,13 +44,44 @@ testComputed("width", "20%", "20%");
 // testComputed("width", "1vh", "7.869999885559082px");
 // testComputed("width", "1vw", "14.029999732971191px");
 
-// negative tests
+// Test 'x'.
+testComputed("x", "  100", "100px");
+testComputed("x", "100   ", "100px");
+testComputed("x", "100px", "100px");
+testComputed("x", "1em", "16px");
+testComputed("x", "1ex", "12.800000190734863px");
+testComputed("x", "20%", "20%");
+testComputed("x", "-200px", "-200px");
+
+// Test 'y'.
+testComputed("y", "  100", "100px");
+testComputed("y", "100   ", "100px");
+testComputed("y", "100px", "100px");
+testComputed("y", "1em", "16px");
+testComputed("y", "1ex", "12.800000190734863px");
+testComputed("y", "20%", "20%");
+testComputed("y", "-200px", "-200px");
+
+// Negative tests for 'width'.
 negativeTest("width", "100   px");
 negativeTest("width", "100px;");
 negativeTest("width", "100px !important");
 negativeTest("width", "{ 100px }");
 negativeTest("width", "-100px");
 
+// Negative tests for 'x'.
+negativeTestZero("x", "auto", "auto");
+negativeTestZero("x", "100   px");
+negativeTestZero("x", "100px;");
+negativeTestZero("x", "100px !important");
+negativeTestZero("x", "{ 100px }");
+
+// Negative tests for 'y'.
+negativeTestZero("y", "auto");
+negativeTestZero("y", "100   px");
+negativeTestZero("y", "100px;");
+negativeTestZero("y", "100px !important");
+negativeTestZero("y", "{ 100px }");
 </script>
 <script src="../../resources/js-test-post.js"></script>
 </body>
diff --git a/LayoutTests/svg/css/parse-width-expected.txt b/LayoutTests/svg/css/parse-width-expected.txt
deleted file mode 100644 (file)
index ead8714..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="auto"
-CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="  100"
-CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="100   "
-CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="100   px"
-CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="100px;"
-CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="100px !important"
-CONSOLE MESSAGE: Error: Invalid value for <rect> attribute width="{ 100px }"
-CONSOLE MESSAGE: Error: Invalid negative value for <rect> attribute width="-100px"
-Test that 'with' presentation attribute is parsed with CSS presentation rules.
-
-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
-
-
-PASS computedStyle("width", "auto") is "auto"
-PASS computedStyle("width", "  100") is "100px"
-PASS computedStyle("width", "100   ") is "100px"
-PASS computedStyle("width", "100px") is "100px"
-PASS computedStyle("width", "1em") is "16px"
-PASS computedStyle("width", "1ex") is "12.800000190734863px"
-PASS computedStyle("width", "20%") is "20%"
-PASS computedStyle("width", "100   px") is "auto"
-PASS computedStyle("width", "100px;") is "auto"
-PASS computedStyle("width", "100px !important") is "auto"
-PASS computedStyle("width", "{ 100px }") is "auto"
-PASS computedStyle("width", "-100px") is "auto"
-PASS successfullyParsed is true
-
-TEST COMPLETE
-
diff --git a/LayoutTests/transitions/svg-layout-transition-expected.txt b/LayoutTests/transitions/svg-layout-transition-expected.txt
new file mode 100644 (file)
index 0000000..ad898da
--- /dev/null
@@ -0,0 +1,5 @@
+PASS - "x" property for "x" element at 0.5s saw something close to: 150
+PASS - "y" property for "y" element at 0.5s saw something close to: 150
+PASS - "width" property for "width" element at 0.5s saw something close to: 150
+PASS - "height" property for "height" element at 0.5s saw something close to: 150
+
diff --git a/LayoutTests/transitions/svg-layout-transition.html b/LayoutTests/transitions/svg-layout-transition.html
new file mode 100644 (file)
index 0000000..fc92b86
--- /dev/null
@@ -0,0 +1,74 @@
+<!DOCTYPE>
+
+<html>
+<head>
+  <style>
+    .init {
+      -webkit-transition-duration: 1s;
+      -webkit-transition-timing-function: linear;
+    }
+    
+    #x {
+      -webkit-transition-property: x;
+    }
+    #x.final {
+      x: 200px;
+    }
+
+    #y {
+      -webkit-transition-property: y;
+    }
+    #y.final {
+      y: 200px;
+    }
+
+    #width {
+      -webkit-transition-property: width;
+    }
+    #width.final {
+      width: 200px;
+    }
+
+    #height {
+      -webkit-transition-property: height;
+    }
+    #height.final {
+      height: 200px;
+    }
+    
+  </style>
+  <script src="resources/transition-test-helpers.js"></script>
+  <script type="text/javascript">
+
+    const expectedValues = [
+      // [time, element-id, property, expected-value, tolerance]
+      [0.5, 'x', 'x', 150, 20],
+      [0.5, 'y', 'y', 150, 20],
+      [0.5, 'width', 'width', 150, 20],
+      [0.5, 'height', 'height', 150, 20],
+    ];
+  
+    function setupTest()
+    {
+      document.getElementById('x').setAttribute('class', 'init final');
+      document.getElementById('y').setAttribute('class', 'init final');
+      document.getElementById('width').setAttribute('class', 'init final');
+      document.getElementById('height').setAttribute('class', 'init final');
+    }
+  
+    runTransitionTest(expectedValues, setupTest, usePauseAPI);
+  </script>
+</head>
+<body>
+  <svg>
+    <rect x="100" y="100" width="100" height="100" class="init" id="x"/>
+    <rect x="100" y="100" width="100" height="100" class="init" id="y"/>
+    <rect x="100" y="100" width="100" height="100" class="init" id="width"/>
+    <rect x="100" y="100" width="100" height="100" class="init" id="height"/>
+  </svg>
+
+  <div id="result">
+  </div>
+
+</body>
+</html>
index 1423836..899c48d 100644 (file)
@@ -1,3 +1,74 @@
+2014-07-24  Dirk Schulze  <krit@webkit.org>
+
+        Turn x/y to presentation attributes
+        https://bugs.webkit.org/show_bug.cgi?id=135215
+
+        Reviewed by Dean Jackson.
+
+        This follows the patch for width and height presentation attributes and
+        turns x and y to presentation attributes as well:
+
+        http://trac.webkit.org/changeset/171341
+
+        Tests: svg/css/parse-length.html
+               transitions/svg-layout-transition.html
+
+        Added copyright where I forgot it in previous patch.
+
+        * css/CSSComputedStyleDeclaration.cpp: Computed style of x and y.
+        (WebCore::ComputedStyleExtractor::propertyValue):
+        * css/CSSParser.cpp:
+        (WebCore::isSimpleLengthPropertyID): Add x and y to list.
+        * css/DeprecatedStyleBuilder.cpp:
+        (WebCore::DeprecatedStyleBuilder::DeprecatedStyleBuilder): Resolve x and y.
+        * css/SVGCSSParser.cpp:
+        (WebCore::CSSParser::parseSVGValue): Parse x and y property.
+        * css/SVGCSSPropertyNames.in: Add x and y to list of names.
+        * css/StyleResolver.h:
+        * page/animation/CSSPropertyAnimation.cpp: Animate x and y as Length.
+        (WebCore::CSSPropertyAnimationWrapperMap::CSSPropertyAnimationWrapperMap):
+        * rendering/style/RenderStyle.h: Add x and y setters and getters.
+        * rendering/style/SVGRenderStyle.cpp: Add x and y setters for StyleLayoutData.
+        (WebCore::SVGRenderStyle::SVGRenderStyle):
+        (WebCore::SVGRenderStyle::operator==):
+        (WebCore::SVGRenderStyle::copyNonInheritedFrom):
+        (WebCore::SVGRenderStyle::diff):
+        * rendering/style/SVGRenderStyle.h:
+        (WebCore::SVGRenderStyle::setX):
+        (WebCore::SVGRenderStyle::setY):
+        (WebCore::SVGRenderStyle::x):
+        (WebCore::SVGRenderStyle::y):
+        * rendering/style/SVGRenderStyleDefs.cpp: Add StyleLayoutData for style storing.
+        (WebCore::StyleLayoutData::StyleLayoutData):
+        (WebCore::StyleLayoutData::copy):
+        (WebCore::StyleLayoutData::operator==):
+        * rendering/style/SVGRenderStyleDefs.h:
+        (WebCore::StyleLayoutData::create):
+        (WebCore::StyleLayoutData::operator!=):
+        * rendering/svg/RenderSVGRect.cpp:
+        (WebCore::RenderSVGRect::updateShapeFromElement):
+        * rendering/svg/SVGPathData.cpp: Use RenderStyle values rather than attribute values.
+        (WebCore::updatePathFromRectElement):
+        * svg/SVGAnimationElement.cpp:
+        (WebCore::SVGAnimationElement::isTargetAttributeCSSProperty): Fix text detection.
+        * svg/SVGElement.cpp: Add x and y to the relevant property lists.
+        (WebCore::populateAttributeNameToCSSPropertyIDMap):
+        (WebCore::populateCSSPropertyWithSVGDOMNameToAnimatedPropertyTypeMap):
+        * svg/SVGFilterElement.cpp: Style update on change of x and y.
+        (WebCore::SVGFilterElement::svgAttributeChanged):
+        * svg/SVGMaskElement.cpp: Ditto.
+        (WebCore::SVGMaskElement::svgAttributeChanged):
+        * svg/SVGPatternElement.cpp: Ditto.
+        (WebCore::SVGPatternElement::svgAttributeChanged):
+        * svg/SVGRectElement.cpp: Ditto.
+        (WebCore::SVGRectElement::svgAttributeChanged):
+        * svg/SVGTextPositioningElement.cpp: Exclude x and y of text elements since they
+            are lists instead of individual values. Solution about to be discussed
+            in the WG. Keep current behavior for now.
+        (WebCore::SVGTextPositioningElement::collectStyleForPresentationAttribute):
+        (WebCore::SVGTextPositioningElement::isPresentationAttribute):
+        * svg/SVGTextPositioningElement.h:
+
 2014-07-24  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         CSS JIT: Implement Pseudo Element
index d44036e..eedf959 100644 (file)
@@ -428,7 +428,9 @@ static const CSSPropertyID computedProperties[] = {
     CSSPropertyGlyphOrientationHorizontal,
     CSSPropertyGlyphOrientationVertical,
     CSSPropertyWebkitSvgShadow,
-    CSSPropertyVectorEffect
+    CSSPropertyVectorEffect,
+    CSSPropertyX,
+    CSSPropertyY
 };
 
 const unsigned numComputedProperties = WTF_ARRAY_LENGTH(computedProperties);
@@ -2897,6 +2899,12 @@ PassRefPtr<CSSValue> ComputedStyleExtractor::propertyValue(CSSPropertyID propert
         case CSSPropertyBackgroundRepeatY:
             break;
 
+        // New positioning properties for SVG.
+        case CSSPropertyX:
+            return zoomAdjustedPixelValueForLength(style->svgStyle().x(), style.get());
+        case CSSPropertyY:
+            return zoomAdjustedPixelValueForLength(style->svgStyle().y(), style.get());
+
         /* Unimplemented CSS 3 properties (including CSS3 shorthand properties) */
         case CSSPropertyWebkitTextEmphasis:
         case CSSPropertyTextLineThrough:
index 125267e..75c9bf8 100644 (file)
@@ -569,6 +569,8 @@ static inline bool isSimpleLengthPropertyID(CSSPropertyID propertyId, bool& acce
     case CSSPropertyWebkitMarginBefore:
     case CSSPropertyWebkitMarginEnd:
     case CSSPropertyWebkitMarginStart:
+    case CSSPropertyX:
+    case CSSPropertyY:
         acceptsNegativeNumbers = true;
         return true;
     default:
index e463099..edaf75e 100644 (file)
@@ -2593,6 +2593,10 @@ DeprecatedStyleBuilder::DeprecatedStyleBuilder()
 
     // UAs must treat 'word-wrap' as an alternate name for the 'overflow-wrap' property. So using the same handlers.
     setPropertyHandler(CSSPropertyWordWrap, ApplyPropertyDefault<EOverflowWrap, &RenderStyle::overflowWrap, EOverflowWrap, &RenderStyle::setOverflowWrap, EOverflowWrap, &RenderStyle::initialOverflowWrap>::createHandler());
+
+    setPropertyHandler(CSSPropertyX, ApplyPropertyLength<&RenderStyle::x, &RenderStyle::setX, &RenderStyle::initialZeroLength>::createHandler());
+    setPropertyHandler(CSSPropertyY, ApplyPropertyLength<&RenderStyle::y, &RenderStyle::setY, &RenderStyle::initialZeroLength>::createHandler());
+
     setPropertyHandler(CSSPropertyZIndex, ApplyPropertyAuto<int, &RenderStyle::zIndex, &RenderStyle::setZIndex, &RenderStyle::hasAutoZIndex, &RenderStyle::setHasAutoZIndex>::createHandler());
     setPropertyHandler(CSSPropertyZoom, ApplyPropertyZoom::createHandler());
 }
index c87486d..f5bd411 100644 (file)
@@ -299,6 +299,10 @@ bool CSSParser::parseSVGValue(CSSPropertyID propId, bool important)
         m_implicitShorthand = false;
         return true;
     }
+    case CSSPropertyX:
+    case CSSPropertyY:
+        valid_primitive = (!id && validUnit(value, FLength | FPercent));
+        break;
     default:
         // If you crash here, it's because you added a css property and are not handling it
         // in either this switch statement or the one in CSSParser::parseValue
index 8c3f9b0..a817d68 100644 (file)
@@ -51,3 +51,7 @@ vector-effect
 writing-mode [Inherited]
 
 -webkit-svg-shadow
+
+x
+y
+
index 3a1cc49..9e1736f 100644 (file)
@@ -88,6 +88,7 @@ class StyleRuleRegion;
 class StyleSheet;
 class StyleSheetList;
 class StyledElement;
+class SVGSVGElement;
 class ViewportStyleResolver;
 class WebKitCSSFilterValue;
 struct ResourceLoaderOptions;
index 5e6ef2a..2717053 100644 (file)
@@ -1256,6 +1256,9 @@ CSSPropertyAnimationWrapperMap::CSSPropertyAnimationWrapperMap()
         new PropertyWrapper<SVGLength>(CSSPropertyStrokeDashoffset, &RenderStyle::strokeDashOffset, &RenderStyle::setStrokeDashOffset),
         new PropertyWrapper<float>(CSSPropertyStrokeMiterlimit, &RenderStyle::strokeMiterLimit, &RenderStyle::setStrokeMiterLimit),
 
+        new LengthPropertyWrapper<Length>(CSSPropertyX, &RenderStyle::x, &RenderStyle::setX),
+        new LengthPropertyWrapper<Length>(CSSPropertyY, &RenderStyle::y, &RenderStyle::setY),
+
         new PropertyWrapper<float>(CSSPropertyFloodOpacity, &RenderStyle::floodOpacity, &RenderStyle::setFloodOpacity),
         new PropertyWrapperMaybeInvalidColor(CSSPropertyFloodColor, &RenderStyle::floodColor, &RenderStyle::setFloodColor),
 
index 539ff4c..b38727b 100644 (file)
@@ -1632,6 +1632,11 @@ public:
     float strokeMiterLimit() const { return svgStyle().strokeMiterLimit(); }
     void setStrokeMiterLimit(float f) { accessSVGStyle().setStrokeMiterLimit(f); }
 
+    const Length& x() const { return svgStyle().x(); }
+    void setX(Length x) { accessSVGStyle().setX(x); }
+    const Length& y() const { return svgStyle().y(); }
+    void setY(Length y) { accessSVGStyle().setY(y); }
+
     float floodOpacity() const { return svgStyle().floodOpacity(); }
     void setFloodOpacity(float f) { accessSVGStyle().setFloodOpacity(f); }
 
@@ -1787,6 +1792,7 @@ public:
     static Length initialMargin() { return Length(Fixed); }
     static Length initialPadding() { return Length(Fixed); }
     static Length initialTextIndent() { return Length(Fixed); }
+    static Length initialZeroLength() { return Length(Fixed); }
 #if ENABLE(CSS3_TEXT)
     static TextIndentLine initialTextIndentLine() { return TextIndentFirstLine; }
     static TextIndentType initialTextIndentType() { return TextIndentNormal; }
index 757cf51..7d29ca8 100644 (file)
@@ -56,6 +56,7 @@ SVGRenderStyle::SVGRenderStyle()
     , stops(defaultSVGStyle().stops)
     , misc(defaultSVGStyle().misc)
     , shadowSVG(defaultSVGStyle().shadowSVG)
+    , layout(defaultSVGStyle().layout)
     , resources(defaultSVGStyle().resources)
 {
     setBitDefaults();
@@ -69,6 +70,7 @@ SVGRenderStyle::SVGRenderStyle(CreateDefaultType)
     , stops(StyleStopData::create())
     , misc(StyleMiscData::create())
     , shadowSVG(StyleShadowSVGData::create())
+    , layout(StyleLayoutData::create())
     , resources(StyleResourceData::create())
 {
     setBitDefaults();
@@ -85,6 +87,7 @@ inline SVGRenderStyle::SVGRenderStyle(const SVGRenderStyle& other)
     , stops(other.stops)
     , misc(other.misc)
     , shadowSVG(other.shadowSVG)
+    , layout(other.layout)
     , resources(other.resources)
 {
 }
@@ -106,6 +109,7 @@ bool SVGRenderStyle::operator==(const SVGRenderStyle& other) const
         && stops == other.stops
         && misc == other.misc
         && shadowSVG == other.shadowSVG
+        && layout == other.layout
         && inheritedResources == other.inheritedResources
         && resources == other.resources
         && svg_inherited_flags == other.svg_inherited_flags
@@ -140,6 +144,7 @@ void SVGRenderStyle::copyNonInheritedFrom(const SVGRenderStyle* other)
     stops = other->stops;
     misc = other->misc;
     shadowSVG = other->shadowSVG;
+    layout = other->layout;
     resources = other->resources;
 }
 
@@ -223,6 +228,10 @@ StyleDifference SVGRenderStyle::diff(const SVGRenderStyle* other) const
     if (shadowSVG != other->shadowSVG)
         return StyleDifferenceLayout;
 
+    // The x or y properties require relayout.
+    if (layout != other->layout)
+        return StyleDifferenceLayout; 
+
     // Some stroke properties, requires relayouts, as the cached stroke boundaries need to be recalculated.
     if (stroke != other->stroke) {
         if (stroke->width != other->stroke->width
index b40bd27..2b13eca 100644 (file)
@@ -3,6 +3,7 @@
                   2004, 2005 Rob Buis <buis@kde.org>
     Copyright (C) 2005, 2006 Apple Inc.
     Copyright (C) Research In Motion Limited 2010. All rights reserved.
+    Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
 
     This library is free software; you can redistribute it and/or
     modify it under the terms of the GNU Library General Public
@@ -145,6 +146,16 @@ public:
     void setGlyphOrientationVertical(EGlyphOrientation val) { svg_inherited_flags._glyphOrientationVertical = val; }
     void setMaskType(EMaskType val) { svg_noninherited_flags.f.maskType = val; }
     void setPaintOrder(PaintOrder val) { svg_inherited_flags.paintOrder = val; }
+    void setX(const Length& obj)
+    {
+        if (!(layout->x == obj))
+            layout.access()->x = obj;
+    }
+    void setY(const Length& obj)
+    {
+        if (!(layout->y == obj))
+            layout.access()->y = obj;
+    }
 
     void setFillOpacity(float obj)
     {
@@ -342,6 +353,8 @@ public:
     const Color& lightingColor() const { return misc->lightingColor; }
     SVGLength baselineShiftValue() const { return misc->baselineShiftValue; }
     ShadowData* shadow() const { return shadowSVG->shadow.get(); }
+    const Length& x() const { return layout->x; }
+    const Length& y() const { return layout->y; }
     String clipperResource() const { return resources->clipper; }
     String filterResource() const { return resources->filter; }
     String maskerResource() const { return resources->masker; }
@@ -440,6 +453,7 @@ protected:
     DataRef<StyleStopData> stops;
     DataRef<StyleMiscData> misc;
     DataRef<StyleShadowSVGData> shadowSVG;
+    DataRef<StyleLayoutData> layout;
     DataRef<StyleResourceData> resources;
 
 private:
index 77a1a30..c22ccf1 100644 (file)
@@ -2,6 +2,7 @@
     Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
                   2004, 2005, 2007 Rob Buis <buis@kde.org>
     Copyright (C) Research In Motion Limited 2010. All rights reserved.
+    Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
 
     Based on khtml code by:
     Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
@@ -276,4 +277,28 @@ bool StyleInheritedResourceData::operator==(const StyleInheritedResourceData& ot
         && markerEnd == other.markerEnd;
 }
 
+StyleLayoutData::StyleLayoutData()
+    : x(RenderStyle::initialZeroLength())
+    , y(RenderStyle::initialZeroLength())
+{
+}
+
+inline StyleLayoutData::StyleLayoutData(const StyleLayoutData& other)
+    : RefCounted<StyleLayoutData>()
+    , x(other.x)
+    , y(other.y)
+{
+}
+
+PassRef<StyleLayoutData> StyleLayoutData::copy() const
+{
+    return adoptRef(*new StyleLayoutData(*this));
+}
+
+bool StyleLayoutData::operator==(const StyleLayoutData& other) const
+{
+    return x == other.x
+        && y == other.y;
+}
+
 }
index 6dc6678..63259dd 100644 (file)
@@ -2,6 +2,7 @@
     Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
                   2004, 2005 Rob Buis <buis@kde.org>
     Copyright (C) Research In Motion Limited 2010. All rights reserved.
+    Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
 
     Based on khtml code by:
     Copyright (C) 2000-2003 Lars Knoll (knoll@kde.org)
@@ -28,6 +29,7 @@
 #ifndef SVGRenderStyleDefs_h
 #define SVGRenderStyleDefs_h
 
+#include "Length.h"
 #include "SVGLength.h"
 #include "SVGPaint.h"
 #include "ShadowData.h"
@@ -288,6 +290,26 @@ namespace WebCore {
         StyleInheritedResourceData(const StyleInheritedResourceData&);
     };
 
+    // Positioning and sizing properties.
+    class StyleLayoutData : public RefCounted<StyleLayoutData> {
+    public:
+        static PassRef<StyleLayoutData> create() { return adoptRef(*new StyleLayoutData); }
+        PassRef<StyleLayoutData> copy() const;
+
+        bool operator==(const StyleLayoutData&) const;
+        bool operator!=(const StyleLayoutData& other) const
+        {
+            return !(*this == other);
+        }
+
+        Length x;
+        Length y;
+
+    private:        
+        StyleLayoutData();
+        StyleLayoutData(const StyleLayoutData&);
+    };
+
 } // namespace WebCore
 
 #endif // SVGRenderStyleDefs_h
index f528519..ea770e6 100644 (file)
@@ -73,7 +73,9 @@ void RenderSVGRect::updateShapeFromElement()
         m_usePathFallback = false;
     }
 
-    m_fillBoundingBox = FloatRect(FloatPoint(rectElement().x().value(lengthContext), rectElement().y().value(lengthContext)), boundingBoxSize);
+    m_fillBoundingBox = FloatRect(FloatPoint(lengthContext.valueForLength(style().svgStyle().x(), LengthModeWidth),
+        lengthContext.valueForLength(style().svgStyle().y(), LengthModeHeight)),
+        boundingBoxSize);
 
     // To decide if the stroke contains a point we create two rects which represent the inner and
     // the outer stroke borders. A stroke contains the point, if the point is between them.
index 8dc6641..7e5b31a 100644 (file)
@@ -119,8 +119,8 @@ static void updatePathFromRectElement(SVGElement* element, Path& path)
     float height = lengthContext.valueForLength(style.height(), LengthModeHeight);
     if (height <= 0)
         return;
-    float x = rect->x().value(lengthContext);
-    float y = rect->y().value(lengthContext);
+    float x = lengthContext.valueForLength(style.svgStyle().x(), LengthModeWidth);
+    float y = lengthContext.valueForLength(style.svgStyle().y(), LengthModeHeight);
     float rx = rect->rx().value(lengthContext);
     float ry = rect->ry().value(lengthContext);
     bool hasRx = rx > 0;
index fda1407..0f77845 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
  * Copyright (C) 2008 Apple Inc. All rights reserved.
  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index d9585af..2ba769f 100644 (file)
@@ -5,6 +5,7 @@
  * Copyright (C) 2008 Apple Inc. All rights reserved.
  * Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au>
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -355,8 +356,7 @@ bool SVGAnimationElement::isAccumulated() const
 
 bool SVGAnimationElement::isTargetAttributeCSSProperty(SVGElement* element, const QualifiedName& attributeName)
 {
-    // FIXME: Must be isSVGTextPositioningElement(element) instead.
-    if (isSVGTextElement(element)
+    if (element->isTextContent()
         && (attributeName == SVGNames::xAttr || attributeName == SVGNames::yAttr))
         return false;
 
index 2d266f2..cee33d2 100644 (file)
@@ -144,6 +144,8 @@ static NEVER_INLINE void populateAttributeNameToCSSPropertyIDMap(HashMap<AtomicS
         &SVGNames::widthAttr,
         &word_spacingAttr,
         &writing_modeAttr,
+        &xAttr,
+        &yAttr,
     };
 
     for (unsigned i = 0; i < WTF_ARRAY_LENGTH(attributeNames); ++i) {
@@ -244,6 +246,8 @@ static NEVER_INLINE void populateCSSPropertyWithSVGDOMNameToAnimatedPropertyType
     static const TableEntry table[] = {
         { SVGNames::heightAttr, AnimatedLength },
         { SVGNames::widthAttr, AnimatedLength },
+        { xAttr, AnimatedLength },
+        { yAttr, AnimatedLength },
     };
 
     for (unsigned i = 0; i < WTF_ARRAY_LENGTH(table); ++i)
index d328951..8ab7353 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
  * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -168,16 +169,14 @@ void SVGFilterElement::svgAttributeChanged(const QualifiedName& attrName)
 
     SVGElementInstance::InvalidationGuard invalidationGuard(this);
 
-    if (attrName == SVGNames::widthAttr
+    if (attrName == SVGNames::xAttr
+        || attrName == SVGNames::yAttr
+        || attrName == SVGNames::widthAttr
         || attrName == SVGNames::heightAttr) {
         invalidateSVGPresentationAttributeStyle();
         return;
     }
 
-    if (attrName == SVGNames::xAttr
-        || attrName == SVGNames::yAttr)
-        updateRelativeLengthsInformation();
-
     if (RenderObject* object = renderer())
         object->setNeedsLayout();
 }
index 5f7bb30..baf82bf 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2006 Apple Inc. All rights reserved.
  * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index 36fcd73..5748765 100644 (file)
@@ -2,6 +2,7 @@
  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Rob Buis <buis@kde.org>
  * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org>
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index 0afeda0..69a860f 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
  * Copyright (C) 2007 Apple Inc. All rights reserved.
  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index a4ff8d2..431f26a 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2005 Alexander Kellett <lypanov@kde.org>
  * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
  * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -135,16 +136,14 @@ void SVGMaskElement::svgAttributeChanged(const QualifiedName& attrName)
 
     SVGElementInstance::InvalidationGuard invalidationGuard(this);
 
-    if (attrName == SVGNames::widthAttr
+    if (attrName == SVGNames::xAttr
+        || attrName == SVGNames::yAttr
+        || attrName == SVGNames::widthAttr
         || attrName == SVGNames::heightAttr) {
         invalidateSVGPresentationAttributeStyle();
         return;
     }
 
-    if (attrName == SVGNames::xAttr
-        || attrName == SVGNames::yAttr)
-        updateRelativeLengthsInformation();
-
     if (RenderObject* object = renderer())
         object->setNeedsLayout();
 }
index 4754d66..b5a6ddf 100644 (file)
@@ -2,6 +2,7 @@
  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -160,16 +161,14 @@ void SVGPatternElement::svgAttributeChanged(const QualifiedName& attrName)
 
     SVGElementInstance::InvalidationGuard invalidationGuard(this);
 
-    if (attrName == SVGNames::widthAttr
+    if (attrName == SVGNames::xAttr
+        || attrName == SVGNames::yAttr
+        || attrName == SVGNames::widthAttr
         || attrName == SVGNames::heightAttr) {
         invalidateSVGPresentationAttributeStyle();
         return;
     }
 
-    if (attrName == SVGNames::xAttr
-        || attrName == SVGNames::yAttr)
-        updateRelativeLengthsInformation();
-
     if (RenderObject* object = renderer())
         object->setNeedsLayout();
 }
index b86b793..aa8d48a 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -121,15 +122,15 @@ void SVGRectElement::svgAttributeChanged(const QualifiedName& attrName)
 
     SVGElementInstance::InvalidationGuard invalidationGuard(this);
 
-    if (attrName == SVGNames::widthAttr
+    if (attrName == SVGNames::xAttr
+        || attrName == SVGNames::yAttr
+        || attrName == SVGNames::widthAttr
         || attrName == SVGNames::heightAttr) {
         invalidateSVGPresentationAttributeStyle();
         return;
     }
 
-    bool isLengthAttribute = attrName == SVGNames::xAttr
-                          || attrName == SVGNames::yAttr
-                          || attrName == SVGNames::rxAttr
+    bool isLengthAttribute = attrName == SVGNames::rxAttr
                           || attrName == SVGNames::ryAttr;
 
     if (isLengthAttribute)
index b024265..c134d1e 100644 (file)
@@ -2,6 +2,7 @@
  * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Rob Buis <buis@kde.org>
  * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
index 73ce435..6903596 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Rob Buis <buis@kde.org>
+ * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -117,6 +118,20 @@ void SVGTextPositioningElement::parseAttribute(const QualifiedName& name, const
     ASSERT_NOT_REACHED();
 }
 
+void SVGTextPositioningElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStyleProperties& style)
+{
+    if (name == SVGNames::xAttr || name == SVGNames::yAttr)
+        return;
+    SVGTextContentElement::collectStyleForPresentationAttribute(name, value, style);
+}
+
+bool SVGTextPositioningElement::isPresentationAttribute(const QualifiedName& name) const
+{
+    if (name == SVGNames::xAttr || name == SVGNames::yAttr)
+        return false;
+    return SVGTextContentElement::isPresentationAttribute(name);
+}
+
 void SVGTextPositioningElement::svgAttributeChanged(const QualifiedName& attrName)
 {
     if (!isSupportedAttribute(attrName)) {
index fbd29e2..b9d9e5e 100644 (file)
@@ -34,6 +34,8 @@ public:
 protected:
     SVGTextPositioningElement(const QualifiedName&, Document&);
 
+    virtual bool isPresentationAttribute(const QualifiedName&) const override final;
+    virtual void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStyleProperties&) override final;
     bool isSupportedAttribute(const QualifiedName&);
     virtual void parseAttribute(const QualifiedName&, const AtomicString&) override;
     virtual void svgAttributeChanged(const QualifiedName&) override;