Web Inspector: [CSS Shapes] Refactor highlighting code to decrease Shapes API surface
authorbetravis@adobe.com <betravis@adobe.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Nov 2013 03:17:15 +0000 (03:17 +0000)
committerbetravis@adobe.com <betravis@adobe.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Nov 2013 03:17:15 +0000 (03:17 +0000)
https://bugs.webkit.org/show_bug.cgi?id=124737

Reviewed by Timothy Hatcher.

Source/WebCore:

Add a virtual method to Shapes, buildPath, that can be used to build the
path (in the Shape coordinate system) for display in the Inspector. This allows us
to remove methods such as type(), polygon(), and logicalRx/Ry() which exposed the
inner workings of the Shapes classes. Also covers the addition of the BoxShape type.

Refactoring, existing test is inspector-protocol/model/highlight-shape-outside.html.

* inspector/InspectorOverlay.cpp:
(WebCore::appendPathCommandAndPoints): Points need to be translated from shape space
to renderer space using ShapeInfo.
(WebCore::buildObjectForShapeOutside): Add the ShapeOutsideInfo to the path info struct.
* rendering/shapes/BoxShape.cpp:
(WebCore::BoxShape::buildPath): Build the path for a BoxShape.
* rendering/shapes/BoxShape.h:
* rendering/shapes/PolygonShape.cpp:
(WebCore::PolygonShape::buildPath): Build the path for a PolygonShape.
* rendering/shapes/PolygonShape.h:
* rendering/shapes/RasterShape.h:
* rendering/shapes/RectangleShape.cpp:
(WebCore::RectangleShape::buildPath): Build the path for a RectangleShape.
* rendering/shapes/RectangleShape.h:
* rendering/shapes/Shape.h:

LayoutTests:

The shapes paths are now drawn in shape-coordinate space before being translated to
renderer space. With different writing modes, shapes may have their coordinates
translated. For example, a rectangle specified as four points [top left, top right,
bottom right, bottom left] in vertical-lr space would appear as [top left, bottom left,
bottom right, top right] in horizontal-tb space. Adjusting the previous tests, and
adding a test for the new box value.

* inspector-protocol/model/highlight-shape-outside-expected.txt:
* inspector-protocol/model/highlight-shape-outside.html:

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

13 files changed:
LayoutTests/ChangeLog
LayoutTests/inspector-protocol/model/highlight-shape-outside-expected.txt
LayoutTests/inspector-protocol/model/highlight-shape-outside.html
Source/WebCore/ChangeLog
Source/WebCore/inspector/InspectorOverlay.cpp
Source/WebCore/rendering/shapes/BoxShape.cpp
Source/WebCore/rendering/shapes/BoxShape.h
Source/WebCore/rendering/shapes/PolygonShape.cpp
Source/WebCore/rendering/shapes/PolygonShape.h
Source/WebCore/rendering/shapes/RasterShape.h
Source/WebCore/rendering/shapes/RectangleShape.cpp
Source/WebCore/rendering/shapes/RectangleShape.h
Source/WebCore/rendering/shapes/Shape.h

index 65053f3..8d67e9f 100644 (file)
@@ -1,3 +1,20 @@
+2013-11-21  Bear Travis  <betravis@adobe.com>
+
+        Web Inspector: [CSS Shapes] Refactor highlighting code to decrease Shapes API surface
+        https://bugs.webkit.org/show_bug.cgi?id=124737
+
+        Reviewed by Timothy Hatcher.
+
+        The shapes paths are now drawn in shape-coordinate space before being translated to
+        renderer space. With different writing modes, shapes may have their coordinates
+        translated. For example, a rectangle specified as four points [top left, top right,
+        bottom right, bottom left] in vertical-lr space would appear as [top left, bottom left,
+        bottom right, top right] in horizontal-tb space. Adjusting the previous tests, and
+        adding a test for the new box value.
+
+        * inspector-protocol/model/highlight-shape-outside-expected.txt:
+        * inspector-protocol/model/highlight-shape-outside.html:
+
 2013-11-21  Sun-woo Nam  <sunny.nam@samsung.com>
 
         [EFL] Layout tests with editing need to be rebaselined.
index 8a81d89..d7b444d 100644 (file)
@@ -2,8 +2,9 @@ PASS: Actual [M 50 50 L 150 50 L 150 100 L 50 100 L 50 50 Z] Expected [M 50 50 L
 PASS: Actual [M 50 50 L 100 50 L 100 100 L 50 100 Z] Expected [M 50 50 L 100 50 L 100 100 L 50 100 Z]
 PASS: Actual [M 75 75 L 175 75 L 175 125 L 75 125 L 75 75 Z] Expected [M 75 75 L 175 75 L 175 125 L 75 125 L 75 75 Z]
 PASS: Actual [M 50 50 L 150 50 L 150 100 L 50 100 L 50 50 Z] Expected [M 50 50 L 150 50 L 150 100 L 50 100 L 50 50 Z]
-PASS: Actual [M 50 50 L 150 50 L 150 100 L 50 100 L 50 50 Z] Expected [M 50 50 L 150 50 L 150 100 L 50 100 L 50 50 Z]
-PASS: Actual [M 50 50 L 150 50 L 150 100 L 50 100 L 50 50 Z] Expected [M 50 50 L 150 50 L 150 100 L 50 100 L 50 50 Z]
-PASS: Actual [M 75 75 L 175 75 L 175 125 L 75 125 L 75 75 Z] Expected [M 75 75 L 175 75 L 175 125 L 75 125 L 75 75 Z]
-PASS: Actual [M 50 50 L 150 50 L 150 100 L 50 100 L 50 50 Z] Expected [M 50 50 L 150 50 L 150 100 L 50 100 L 50 50 Z]
+PASS: Actual [M 50 50 L 50 100 L 150 100 L 150 50 L 50 50 Z] Expected [M 50 50 L 50 100 L 150 100 L 150 50 L 50 50 Z]
+PASS: Actual [M 150 50 L 150 100 L 50 100 L 50 50 L 150 50 Z] Expected [M 150 50 L 150 100 L 50 100 L 50 50 L 150 50 Z]
+PASS: Actual [M 175 75 L 175 125 L 75 125 L 75 75 L 175 75 Z] Expected [M 175 75 L 175 125 L 75 125 L 75 75 L 175 75 Z]
+PASS: Actual [M 150 50 L 150 100 L 50 100 L 50 50 L 150 50 Z] Expected [M 150 50 L 150 100 L 50 100 L 50 50 L 150 50 Z]
+PASS: Actual [M 25 25 L 125 25 L 125 125 L 25 125 L 25 25 Z] Expected [M 25 25 L 125 25 L 125 125 L 25 125 L 25 25 Z]
 
index e153562..79ddc1b 100644 (file)
@@ -30,6 +30,9 @@ body {
 .polygon {
     -webkit-shape-outside: polygon(50px 50px, 100px 50px, 100px 100px, 50px 100px);
 }
+.content-box {
+    -webkit-shape-outside: content-box;
+}
 </style>
 <script type="text/javascript" src="../../http/tests/inspector-protocol/resources/protocol-test.js"></script>
 <script type="text/javascript" src="../resources/shape-info-helper.js"></script>
@@ -54,19 +57,23 @@ function shapeTests() {
     },
     {
         'selector' : '.rectangle.vertical-lr',
-        'path' : ['M', 50, 50, 'L', 150, 50, 'L', 150, 100, 'L', 50, 100, 'L', 50, 50, 'Z']
+        'path' : ['M', 50, 50, 'L', 50, 100, 'L', 150, 100, 'L', 150, 50, 'L', 50, 50, 'Z']
     },
     {
         'selector' : '.rectangle.vertical-rl',
-        'path' : ['M', 50, 50, 'L', 150, 50, 'L', 150, 100, 'L', 50, 100, 'L', 50, 50, 'Z']
+        'path' : ['M', 150, 50, 'L', 150, 100, 'L', 50, 100, 'L', 50, 50, 'L', 150, 50, 'Z']
     },
     {
         'selector' : '.rectangle.padded.vertical-rl',
-        'path' : ['M', 75, 75, 'L', 175, 75, 'L', 175, 125, 'L', 75, 125, 'L', 75, 75, 'Z']
+        'path' : ['M', 175, 75, 'L', 175, 125, 'L', 75, 125, 'L', 75, 75, 'L', 175, 75, 'Z']
     },
     {
         'selector' : '.rectangle.padded.vertical-rl.border-box',
-        'path' : ['M', 50, 50, 'L', 150, 50, 'L', 150, 100, 'L', 50, 100, 'L', 50, 50, 'Z']
+        'path' : ['M', 150, 50, 'L', 150, 100, 'L', 50, 100, 'L', 50, 50, 'L', 150, 50, 'Z']
+    },
+    {
+        'selector' : '.content-box.padded',
+        'path' : ['M', 25, 25, 'L', 125, 25, 'L', 125, 125, 'L', 25, 125, 'L', 25, 25, 'Z']
     }
     ];
 
@@ -99,5 +106,6 @@ window.onload = function() { ShapeInfoHelper.runShapeTest(shapeTests); }
     <div class='shape rectangle vertical-rl'></div>
     <div class='shape padded rectangle vertical-rl'></div>
     <div class='shape padded rectangle vertical-rl border-box'></div>
+    <div class='shape padded content-box'></div>
 </body>
 </html>
index 871e118..0fa9537 100644 (file)
@@ -1,3 +1,33 @@
+2013-11-21  Bear Travis  <betravis@adobe.com>
+
+        Web Inspector: [CSS Shapes] Refactor highlighting code to decrease Shapes API surface
+        https://bugs.webkit.org/show_bug.cgi?id=124737
+
+        Reviewed by Timothy Hatcher.
+
+        Add a virtual method to Shapes, buildPath, that can be used to build the
+        path (in the Shape coordinate system) for display in the Inspector. This allows us
+        to remove methods such as type(), polygon(), and logicalRx/Ry() which exposed the
+        inner workings of the Shapes classes. Also covers the addition of the BoxShape type.
+
+        Refactoring, existing test is inspector-protocol/model/highlight-shape-outside.html.
+
+        * inspector/InspectorOverlay.cpp:
+        (WebCore::appendPathCommandAndPoints): Points need to be translated from shape space
+        to renderer space using ShapeInfo.
+        (WebCore::buildObjectForShapeOutside): Add the ShapeOutsideInfo to the path info struct.
+        * rendering/shapes/BoxShape.cpp:
+        (WebCore::BoxShape::buildPath): Build the path for a BoxShape.
+        * rendering/shapes/BoxShape.h:
+        * rendering/shapes/PolygonShape.cpp:
+        (WebCore::PolygonShape::buildPath): Build the path for a PolygonShape.
+        * rendering/shapes/PolygonShape.h:
+        * rendering/shapes/RasterShape.h:
+        * rendering/shapes/RectangleShape.cpp:
+        (WebCore::RectangleShape::buildPath): Build the path for a RectangleShape.
+        * rendering/shapes/RectangleShape.h:
+        * rendering/shapes/Shape.h:
+
 2013-11-21  Mark Rowe  <mrowe@apple.com>
 
         <https://webkit.org/b/124702> Stop overriding VALID_ARCHS.
index 4e827f1..81eba0b 100644 (file)
@@ -548,6 +548,7 @@ struct PathApplyInfo {
     FrameView* view;
     InspectorArray* array;
     RenderObject* renderer;
+    const ShapeOutsideInfo* shapeOutsideInfo;
 };
 
 static void appendPathCommandAndPoints(PathApplyInfo* info, const String& command, const FloatPoint points[], unsigned length)
@@ -555,7 +556,8 @@ static void appendPathCommandAndPoints(PathApplyInfo* info, const String& comman
     FloatPoint point;
     info->array->pushString(command);
     for (unsigned i = 0; i < length; i++) {
-        point = localPointToRoot(info->renderer, info->rootView, info->view, points[i]);
+        point = info->shapeOutsideInfo->shapeToRendererPoint(points[i]);
+        point = localPointToRoot(info->renderer, info->rootView, info->view, point);
         info->array->pushNumber(point.x());
         info->array->pushNumber(point.y());
     }
@@ -602,39 +604,7 @@ static PassRefPtr<InspectorObject> buildObjectForShapeOutside(Frame* containingF
     shapeObject->setArray("bounds", buildArrayForQuad(shapeQuad));
 
     Path path;
-    switch (shapeOutsideInfo->computedShape()->type()) {
-    case Shape::RoundedRectangleType: {
-        const RectangleShape* shape = static_cast<const RectangleShape*>(shapeOutsideInfo->computedShape());
-        FloatSize radii(shape->logicalRx(), shape->logicalRy());
-        radii = shapeOutsideInfo->shapeToRendererSize(radii);
-        path.addRoundedRect(shapeBounds, radii, Path::PreferBezierRoundedRect);
-        break;
-    }
-
-    case Shape::PolygonType: {
-        const PolygonShape* shape = static_cast<const PolygonShape*>(shapeOutsideInfo->computedShape());
-        const FloatPolygon& polygon = shape->polygon();
-        FloatPoint vertex;
-
-        if (polygon.numberOfVertices()) {
-            vertex = shapeOutsideInfo->shapeToRendererPoint(polygon.vertexAt(0));
-            path.moveTo(vertex);
-        }
-
-        for (size_t i = 1; i < polygon.numberOfVertices(); i++) {
-            FloatPoint vertex = shapeOutsideInfo->shapeToRendererPoint(polygon.vertexAt(i));
-            path.addLineTo(vertex);
-        }
-
-        if (polygon.numberOfVertices())
-            path.closeSubpath();
-        break;
-    }
-
-    case Shape::RasterType:
-        // FIXME: Bug 124080 - RasterShapes are not yet supported and only display their shape bounds
-        break;
-    }
+    shapeOutsideInfo->computedShape()->buildPath(path);
 
     if (path.length()) {
         RefPtr<InspectorArray> shapePath = InspectorArray::create();
@@ -643,6 +613,7 @@ static PassRefPtr<InspectorObject> buildObjectForShapeOutside(Frame* containingF
         info.view = containingFrame->view();
         info.array = shapePath.get();
         info.renderer = renderer;
+        info.shapeOutsideInfo = shapeOutsideInfo;
 
         path.apply(&info, &appendPathSegment);
 
index 0222e79..e55154f 100644 (file)
@@ -108,4 +108,11 @@ bool BoxShape::firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop,
     return true;
 }
 
+void BoxShape::buildPath(Path& path) const
+{
+    const FloatRect& rect = m_bounds.rect();
+    const FloatRoundedRect::Radii& radii = m_bounds.radii();
+    path.addRoundedRect(rect, radii.topLeft(), radii.topRight(), radii.bottomLeft(), radii.bottomRight(), Path::PreferBezierRoundedRect);
+}
+
 } // namespace WebCore
index c4213ef..2dae86f 100644 (file)
@@ -45,7 +45,8 @@ public:
     virtual void getExcludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const OVERRIDE;
     virtual void getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const OVERRIDE;
     virtual bool firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const LayoutSize& minLogicalIntervalSize, LayoutUnit&) const OVERRIDE;
-    virtual ShapeType type() const OVERRIDE { return Shape::RoundedRectangleType; }
+
+    virtual void buildPath(Path&) const OVERRIDE;
 
 private:
     FloatRoundedRect m_bounds;
index 480e231..2d2aa08 100644 (file)
@@ -523,4 +523,19 @@ bool PolygonShape::firstIncludedIntervalLogicalTop(LayoutUnit minLogicalInterval
     return firstFitFound;
 }
 
+void PolygonShape::buildPath(Path& path) const
+{
+    FloatPoint vertex;
+
+    if (!m_polygon.numberOfVertices())
+        return;
+
+    path.moveTo(m_polygon.vertexAt(0));
+
+    for (size_t i = 1; i < m_polygon.numberOfVertices(); i++)
+        path.addLineTo(m_polygon.vertexAt(i));
+
+    path.closeSubpath();
+}
+
 } // namespace WebCore
index e1a6575..3b59d74 100644 (file)
@@ -97,9 +97,7 @@ public:
     virtual void getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const OVERRIDE;
     virtual bool firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const LayoutSize& minLogicalIntervalSize, LayoutUnit&) const OVERRIDE;
 
-    virtual ShapeType type() const OVERRIDE { return Shape::PolygonType; }
-
-    const FloatPolygon& polygon() const { return m_polygon; }
+    virtual void buildPath(Path&) const OVERRIDE;
 
 private:
     const FloatPolygon& shapeMarginBounds() const;
index f0f8cb3..731e097 100644 (file)
@@ -101,7 +101,8 @@ public:
     virtual void getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const OVERRIDE;
     virtual bool firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const LayoutSize& minLogicalIntervalSize, LayoutUnit&) const OVERRIDE;
 
-    virtual ShapeType type() const OVERRIDE { return Shape::RasterType; }
+    // FIXME: Bug 124080 - RasterShapes are not yet supported and only display their shape bounds
+    virtual void buildPath(Path& path) const OVERRIDE { UNUSED_PARAM(path); }
 
 private:
     const RasterShapeIntervals& marginIntervals() const;
index 9b8420e..7d0be62 100644 (file)
@@ -228,4 +228,9 @@ bool RectangleShape::firstIncludedIntervalLogicalTop(LayoutUnit minLogicalInterv
     return false;
 }
 
+void RectangleShape::buildPath(Path& path) const
+{
+    path.addRoundedRect(m_bounds, FloatSize(m_bounds.rx(), m_bounds.ry()), Path::PreferBezierRoundedRect);
+}
+
 } // namespace WebCore
index 7f25075..198aaf8 100644 (file)
@@ -56,10 +56,7 @@ public:
     virtual void getIncludedIntervals(LayoutUnit logicalTop, LayoutUnit logicalHeight, SegmentList&) const OVERRIDE;
     virtual bool firstIncludedIntervalLogicalTop(LayoutUnit minLogicalIntervalTop, const LayoutSize& minLogicalIntervalSize, LayoutUnit&) const OVERRIDE;
 
-    LayoutUnit logicalRx() const { return m_bounds.rx(); }
-    LayoutUnit logicalRy() const { return m_bounds.ry(); }
-
-    virtual ShapeType type() const OVERRIDE { return Shape::RoundedRectangleType; }
+    virtual void buildPath(Path&) const OVERRIDE;
 
 private:
     class ShapeBounds : public FloatRect {
index 023ff82..d6798c4 100644 (file)
@@ -32,6 +32,7 @@
 
 #include "BasicShapes.h"
 #include "LayoutRect.h"
+#include "Path.h"
 #include "StyleImage.h"
 #include "WritingMode.h"
 #include <wtf/PassOwnPtr.h>
@@ -60,12 +61,6 @@ typedef Vector<LineSegment> SegmentList;
 
 class Shape {
 public:
-    enum ShapeType {
-        RoundedRectangleType,
-        PolygonType,
-        RasterType
-    };
-
     static PassOwnPtr<Shape> createShape(const BasicShape*, const LayoutSize& logicalBoxSize, WritingMode, Length margin, Length padding);
     static PassOwnPtr<Shape> createShape(const StyleImage*, float threshold, const LayoutSize& logicalBoxSize, WritingMode, Length margin, Length padding);
     static PassOwnPtr<Shape> createShape(const LayoutSize& logicalBoxSize, const LayoutSize& logicalRadii, WritingMode, Length margin, Length padding);
@@ -81,7 +76,7 @@ public:
     bool lineOverlapsShapeMarginBounds(LayoutUnit lineTop, LayoutUnit lineHeight) const { return lineOverlapsBoundingBox(lineTop, lineHeight, shapeMarginLogicalBoundingBox()); }
     bool lineOverlapsShapePaddingBounds(LayoutUnit lineTop, LayoutUnit lineHeight) const { return lineOverlapsBoundingBox(lineTop, lineHeight, shapePaddingLogicalBoundingBox()); }
 
-    virtual ShapeType type() const = 0;
+    virtual void buildPath(Path&) const = 0;
 
 protected:
     float shapeMargin() const { return m_margin; }