An SVG element without intrinsic size inherits the container size as its viewport...
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Mar 2015 18:15:48 +0000 (18:15 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 6 Mar 2015 18:15:48 +0000 (18:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=141725.

Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2015-03-06
Reviewed by Darin Adler.

Source/WebCore:

The current viewport of the <svg> element should be retrieved from its
renderer if the renderer is available. If the renderer is not created yet,
this means the viewport is needed to calculate the size of the renderer.
In this case, we should return the element size if it is intrinsic size.

Test: svg/css/svg-css-different-intrinsic-sizes.html

* svg/SVGSVGElement.cpp:
(WebCore::SVGSVGElement::currentViewportSize): Change the order for
returning the viewport of the <svg> element. We should consider the case
of a valid renderer before considering the case of an intrinsic size.

LayoutTests:

* svg/css/svg-css-different-intrinsic-sizes-expected.html: Added.
* svg/css/svg-css-different-intrinsic-sizes.html: Added.
The intrinsic size of the <svg> element is overridden by CSS. The elements
inside the <svg> should consider the css size (which is equal to the <svg>
element viewport) instead of the <svg> element intrinsic size.

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

LayoutTests/ChangeLog
LayoutTests/svg/css/svg-css-different-intrinsic-sizes-expected.html [new file with mode: 0644]
LayoutTests/svg/css/svg-css-different-intrinsic-sizes.html [new file with mode: 0644]
Source/WebCore/ChangeLog
Source/WebCore/svg/SVGSVGElement.cpp

index 8f3cecc..b59636c 100644 (file)
@@ -1,3 +1,16 @@
+2015-03-06  Said Abou-Hallawa  <sabouhallawa@apple.com>
+
+        An SVG element without intrinsic size inherits the container size as its viewport instead of inheriting the container viewport.
+        https://bugs.webkit.org/show_bug.cgi?id=141725.
+
+        Reviewed by Darin Adler.
+
+        * svg/css/svg-css-different-intrinsic-sizes-expected.html: Added.
+        * svg/css/svg-css-different-intrinsic-sizes.html: Added.
+        The intrinsic size of the <svg> element is overridden by CSS. The elements
+        inside the <svg> should consider the css size (which is equal to the <svg>
+        element viewport) instead of the <svg> element intrinsic size.
+
 2015-03-06  Simon Fraser  <simon.fraser@apple.com>
 
         Allow composited clip-path to be updated without a layer repaint
diff --git a/LayoutTests/svg/css/svg-css-different-intrinsic-sizes-expected.html b/LayoutTests/svg/css/svg-css-different-intrinsic-sizes-expected.html
new file mode 100644 (file)
index 0000000..d3b757e
--- /dev/null
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <style>
+    div {
+      background-image: url("data:image/svg+xml, \
+      <svg xmlns='http://www.w3.org/2000/svg'> \
+        <rect width='75' height='75' fill='yellow'/> \
+        <rect width='50' height='50' fill='lime'/> \
+        <rect width='25' height='25' fill='red'/> \
+      </svg>");
+      width: 75px;
+      height: 75px;
+    }
+  </style>
+</head>
+<body>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+  <div></div>
+</body>
+</html>
diff --git a/LayoutTests/svg/css/svg-css-different-intrinsic-sizes.html b/LayoutTests/svg/css/svg-css-different-intrinsic-sizes.html
new file mode 100644 (file)
index 0000000..d67c792
--- /dev/null
@@ -0,0 +1,81 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <style>
+    div {
+      background: yellow;
+      width: 75px;
+      height: 75px;
+    }
+    svg {
+      background: lime;
+    }
+    svg.intrinsic-size {
+      width: 50px;
+      height: 50px;
+    }
+    rect {
+      fill: red;
+    }
+  </style>
+</head>
+<body>
+  <div>
+    <svg class='intrinsic-size' width='100' height='100'>
+         <rect width='50%' height='50%'/>
+    </svg>
+  </div>
+  <div>
+    <svg width='100' height='100'>
+      <style>
+        svg {
+          width: 50px;
+          height: 50px;
+        }
+      </style>
+         <rect width='50%' height='50%'/>
+    </svg>
+  </div>
+  <div>
+    <svg class='intrinsic-size' width='100' height='100'>
+         <svg viewbox='0 0 100 100'>
+           <rect width='50%' height='50%'/>
+         </svg>
+    </svg>
+  </div>
+  <div>
+    <svg class='intrinsic-size' width='100' height='100'>
+         <svg class='intrinsic-size' viewbox='0 0 100 100'>
+           <rect width='50' height='50'/>
+         </svg>
+    </svg>
+  </div>
+  <div>
+    <svg class='intrinsic-size' width='100' height='100'>
+         <svg class='intrinsic-size' width='50%' height='50%' viewbox='0 0 100 100'>
+           <rect width='100%' height='100%'/>
+         </svg>
+    </svg>
+  </div>
+  <div>
+    <svg class='intrinsic-size' width='100' height='100'>
+         <svg width='50%' height='50%' viewbox='0 0 100 100'>
+           <rect width='100' height='100'/>
+         </svg>
+    </svg>
+  </div>
+  <div>
+    <svg width='100' height='100'>
+      <style>
+        svg {
+          width: 50px;
+          height: 50px;
+        }
+      </style>
+         <svg width='50%' height='50%' viewbox='0 0 100 100'>
+           <rect width='100' height='100'/>
+         </svg>
+    </svg>
+  </div>
+</body>
+</html>
index 30a289e..4e693fd 100644 (file)
@@ -1,3 +1,22 @@
+2015-03-06  Said Abou-Hallawa  <sabouhallawa@apple.com>
+
+        An SVG element without intrinsic size inherits the container size as its viewport instead of inheriting the container viewport.
+        https://bugs.webkit.org/show_bug.cgi?id=141725.
+
+        Reviewed by Darin Adler.
+
+        The current viewport of the <svg> element should be retrieved from its
+        renderer if the renderer is available. If the renderer is not created yet,
+        this means the viewport is needed to calculate the size of the renderer.
+        In this case, we should return the element size if it is intrinsic size.
+        
+        Test: svg/css/svg-css-different-intrinsic-sizes.html
+
+        * svg/SVGSVGElement.cpp:
+        (WebCore::SVGSVGElement::currentViewportSize): Change the order for
+        returning the viewport of the <svg> element. We should consider the case
+        of a valid renderer before considering the case of an intrinsic size.
+
 2015-03-06  Simon Fraser  <simon.fraser@apple.com>
 
         Allow composited clip-path to be updated without a layer repaint
index 8f3ae42..ea531c1 100644 (file)
@@ -526,18 +526,23 @@ FloatRect SVGSVGElement::currentViewBoxRect() const
 
 FloatSize SVGSVGElement::currentViewportSize() const
 {
-    if (hasIntrinsicWidth() && hasIntrinsicHeight())
-        return FloatSize(floatValueForLength(intrinsicWidth(), 0), floatValueForLength(intrinsicHeight(), 0));
+    FloatSize viewportSize;
+
+    if (renderer()) {
+        if (is<RenderSVGRoot>(*renderer())) {
+            auto& root = downcast<RenderSVGRoot>(*renderer());
+            viewportSize = root.contentBoxRect().size() / root.style().effectiveZoom();
+        } else
+            viewportSize = downcast<RenderSVGViewportContainer>(*renderer()).viewport().size();
+    }
 
-    if (!renderer())
-        return { };
+    if (!viewportSize.isEmpty())
+        return viewportSize;
 
-    if (is<RenderSVGRoot>(*renderer())) {
-        auto& root = downcast<RenderSVGRoot>(*renderer());
-        return root.contentBoxRect().size() / root.style().effectiveZoom();
-    }
+    if (!(hasIntrinsicWidth() && hasIntrinsicHeight()))
+        return { };
 
-    return downcast<RenderSVGViewportContainer>(*renderer()).viewport().size();
+    return FloatSize(floatValueForLength(intrinsicWidth(), 0), floatValueForLength(intrinsicHeight(), 0));
 }
 
 bool SVGSVGElement::hasIntrinsicWidth() const