[CSS Parser] Fix crash in -webkit-shape-outside parsing
authorhyatt@apple.com <hyatt@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 30 Nov 2016 18:42:14 +0000 (18:42 +0000)
committerhyatt@apple.com <hyatt@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 30 Nov 2016 18:42:14 +0000 (18:42 +0000)
https://bugs.webkit.org/show_bug.cgi?id=165202

Reviewed by Dean Jackson.

* css/CSSBasicShapes.cpp:
(WebCore::buildSerializablePositionOffset):
The old parser never passed in a singleton value ID for top/right/bottom/left.
The new parser does, and it exposed a bug in the serialization code for
shapes that didn't properly create the offset primitive value as a percentage
in those cases.

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

Source/WebCore/ChangeLog
Source/WebCore/css/CSSBasicShapes.cpp

index dd42df1..a0607ce 100644 (file)
@@ -1,3 +1,17 @@
+2016-11-30  Dave Hyatt  <hyatt@apple.com>
+
+        [CSS Parser] Fix crash in -webkit-shape-outside parsing
+        https://bugs.webkit.org/show_bug.cgi?id=165202
+
+        Reviewed by Dean Jackson.
+
+        * css/CSSBasicShapes.cpp:
+        (WebCore::buildSerializablePositionOffset):
+        The old parser never passed in a singleton value ID for top/right/bottom/left.
+        The new parser does, and it exposed a bug in the serialization code for
+        shapes that didn't properly create the offset primitive value as a percentage
+        in those cases.
+
 2016-11-30  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [GLIB] IndexedDB: Switch to use new encoder for IDBKeyData
index e412595..6f67620 100644 (file)
@@ -67,10 +67,12 @@ static Ref<CSSPrimitiveValue> buildSerializablePositionOffset(CSSPrimitiveValue*
         amount = offset;
 
     auto& cssValuePool = CSSValuePool::singleton();
-    if (side == CSSValueCenter) {
+    if (!amount)
+        amount = cssValuePool.createValue(Length(side == CSSValueCenter ? 50 : 0, Percent));
+    
+    if (side == CSSValueCenter)
         side = defaultSide;
-        amount = cssValuePool.createValue(Length(50, Percent));
-    } else if ((side == CSSValueRight || side == CSSValueBottom)
+    else if ((side == CSSValueRight || side == CSSValueBottom)
         && amount->isPercentage()) {
         side = defaultSide;
         amount = cssValuePool.createValue(Length(100 - amount->floatValue(), Percent));