add css parsing of -webkit-flex
authortony@chromium.org <tony@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Apr 2012 00:24:28 +0000 (00:24 +0000)
committertony@chromium.org <tony@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 3 Apr 2012 00:24:28 +0000 (00:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=82927

Reviewed by Ojan Vafai.

Source/WebCore:

This is the new syntax for CSS3 flexbox:
http://dev.w3.org/csswg/css3-flexbox/#flexibility

Not hooked up to anything in the render tree yet so the old syntax is
still valid.

Test: css3/flexbox/flex-property-parsing.html

* css/CSSComputedStyleDeclaration.cpp:
(WebCore):
(WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue):
* css/CSSParser.cpp:
(WebCore::CSSParser::parseValue):
(WebCore::CSSParser::parseFlex):
* css/CSSParser.h:
(WebCore):
* css/CSSProperty.cpp:
(WebCore::CSSProperty::isInheritedProperty):
* css/CSSPropertyNames.in:
* css/CSSStyleApplyProperty.cpp:
(ApplyPropertyFlex):
(WebCore::ApplyPropertyFlex::applyInheritValue):
(WebCore::ApplyPropertyFlex::applyInitialValue):
(WebCore::ApplyPropertyFlex::applyValue):
(WebCore::ApplyPropertyFlex::createHandler):
(WebCore::ApplyPropertyFlex::getFlexValue):
(WebCore):
(WebCore::CSSStyleApplyProperty::CSSStyleApplyProperty):
* css/CSSStyleSelector.cpp:
(WebCore::CSSStyleSelector::collectMatchingRulesForList):
* rendering/style/RenderStyle.h:
* rendering/style/StyleFlexibleBoxData.cpp:
(WebCore::StyleFlexibleBoxData::StyleFlexibleBoxData):
(WebCore::StyleFlexibleBoxData::operator==):
* rendering/style/StyleFlexibleBoxData.h:
(StyleFlexibleBoxData):

LayoutTests:

* css3/flexbox/flex-property-parsing-expected.txt: Added.
* css3/flexbox/flex-property-parsing.html: Added.
* css3/flexbox/script-tests/css-properties.js:
* css3/flexbox/script-tests/flex-parsing.js:
* css3/flexbox/script-tests/flex-property-parsing.js: Added.
* fast/css/getComputedStyle/computed-style-expected.txt:
* fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
* platform/chromium-mac-snowleopard/svg/css/getComputedStyle-basic-expected.txt:
* platform/chromium-mac/fast/css/getComputedStyle/computed-style-expected.txt:
* platform/chromium-mac/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
* platform/chromium-win/fast/css/getComputedStyle/computed-style-expected.txt:
* platform/chromium-win/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
* platform/chromium-win/svg/css/getComputedStyle-basic-expected.txt:
* platform/efl/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
* platform/gtk/svg/css/getComputedStyle-basic-expected.txt:
* platform/mac/fast/css/getComputedStyle/computed-style-expected.txt:
* platform/mac/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
* platform/qt/svg/css/getComputedStyle-basic-expected.txt:
* svg/css/getComputedStyle-basic-expected.txt:

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

30 files changed:
LayoutTests/ChangeLog
LayoutTests/css3/flexbox/flex-property-parsing-expected.txt [new file with mode: 0644]
LayoutTests/css3/flexbox/flex-property-parsing.html [new file with mode: 0644]
LayoutTests/css3/flexbox/script-tests/css-properties.js
LayoutTests/css3/flexbox/script-tests/flex-parsing.js
LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt
LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt
LayoutTests/platform/chromium-mac-snowleopard/svg/css/getComputedStyle-basic-expected.txt
LayoutTests/platform/chromium-mac/fast/css/getComputedStyle/computed-style-expected.txt
LayoutTests/platform/chromium-mac/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt
LayoutTests/platform/chromium-win/fast/css/getComputedStyle/computed-style-expected.txt
LayoutTests/platform/chromium-win/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt
LayoutTests/platform/chromium-win/svg/css/getComputedStyle-basic-expected.txt
LayoutTests/platform/efl/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt
LayoutTests/platform/gtk/svg/css/getComputedStyle-basic-expected.txt
LayoutTests/platform/mac/fast/css/getComputedStyle/computed-style-expected.txt
LayoutTests/platform/mac/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt
LayoutTests/platform/qt/svg/css/getComputedStyle-basic-expected.txt
LayoutTests/svg/css/getComputedStyle-basic-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/css/CSSComputedStyleDeclaration.cpp
Source/WebCore/css/CSSParser.cpp
Source/WebCore/css/CSSParser.h
Source/WebCore/css/CSSProperty.cpp
Source/WebCore/css/CSSPropertyNames.in
Source/WebCore/css/CSSStyleApplyProperty.cpp
Source/WebCore/css/CSSStyleSelector.cpp
Source/WebCore/rendering/style/RenderStyle.h
Source/WebCore/rendering/style/StyleFlexibleBoxData.cpp
Source/WebCore/rendering/style/StyleFlexibleBoxData.h

index 3602a91..c330a62 100644 (file)
@@ -1,3 +1,30 @@
+2012-04-02  Tony Chang  <tony@chromium.org>
+
+        add css parsing of -webkit-flex
+        https://bugs.webkit.org/show_bug.cgi?id=82927
+
+        Reviewed by Ojan Vafai.
+
+        * css3/flexbox/flex-property-parsing-expected.txt: Added.
+        * css3/flexbox/flex-property-parsing.html: Added.
+        * css3/flexbox/script-tests/css-properties.js:
+        * css3/flexbox/script-tests/flex-parsing.js:
+        * css3/flexbox/script-tests/flex-property-parsing.js: Added.
+        * fast/css/getComputedStyle/computed-style-expected.txt:
+        * fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
+        * platform/chromium-mac-snowleopard/svg/css/getComputedStyle-basic-expected.txt:
+        * platform/chromium-mac/fast/css/getComputedStyle/computed-style-expected.txt:
+        * platform/chromium-mac/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
+        * platform/chromium-win/fast/css/getComputedStyle/computed-style-expected.txt:
+        * platform/chromium-win/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
+        * platform/chromium-win/svg/css/getComputedStyle-basic-expected.txt:
+        * platform/efl/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
+        * platform/gtk/svg/css/getComputedStyle-basic-expected.txt:
+        * platform/mac/fast/css/getComputedStyle/computed-style-expected.txt:
+        * platform/mac/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt:
+        * platform/qt/svg/css/getComputedStyle-basic-expected.txt:
+        * svg/css/getComputedStyle-basic-expected.txt:
+
 2012-04-02  Chris Rogers  <crogers@google.com>
 
         Rebaseline oscillator results
diff --git a/LayoutTests/css3/flexbox/flex-property-parsing-expected.txt b/LayoutTests/css3/flexbox/flex-property-parsing-expected.txt
new file mode 100644 (file)
index 0000000..4bde966
--- /dev/null
@@ -0,0 +1,109 @@
+Tests setting the -webkit-flex propery.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS flexitem.style.webkitFlex is ""
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is ""
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is ""
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "1 0 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "1 0 0px"
+PASS flexitem.style.webkitFlex is "0 0 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 0px"
+PASS flexitem.style.webkitFlex is "1.5 0 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "1.5 0 0px"
+PASS flexitem.style.webkitFlex is "1 0 auto"
+PASS getComputedStyle(flexitem).webkitFlex is "1 0 auto"
+PASS flexitem.style.webkitFlex is "1 0 1px"
+PASS getComputedStyle(flexitem).webkitFlex is "1 0 1px"
+PASS flexitem.style.webkitFlex is "1 0 2em"
+PASS getComputedStyle(flexitem).webkitFlex is "1 0 32px"
+PASS flexitem.style.webkitFlex is "1 0 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "1 0 0px"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "0 0 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 0px"
+PASS flexitem.style.webkitFlex is "0 1 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "0 1 0px"
+PASS flexitem.style.webkitFlex is "1 0 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "1 0 0px"
+PASS flexitem.style.webkitFlex is "2 0 auto"
+PASS getComputedStyle(flexitem).webkitFlex is "2 0 auto"
+PASS flexitem.style.webkitFlex is "3 0 4px"
+PASS getComputedStyle(flexitem).webkitFlex is "3 0 4px"
+PASS flexitem.style.webkitFlex is "5.25 0 auto"
+PASS getComputedStyle(flexitem).webkitFlex is "5.25 0 auto"
+PASS flexitem.style.webkitFlex is "4 0 6em"
+PASS getComputedStyle(flexitem).webkitFlex is "4 0 96px"
+PASS flexitem.style.webkitFlex is "4 0 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "4 0 0px"
+PASS flexitem.style.webkitFlex is "0 0 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 0px"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "1 2 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "1 2 0px"
+PASS flexitem.style.webkitFlex is "0 0 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 0px"
+PASS flexitem.style.webkitFlex is "1 2 auto"
+PASS getComputedStyle(flexitem).webkitFlex is "1 2 auto"
+PASS flexitem.style.webkitFlex is "1.75 2 3px"
+PASS getComputedStyle(flexitem).webkitFlex is "1.75 2 3px"
+PASS flexitem.style.webkitFlex is "1 2 3px"
+PASS getComputedStyle(flexitem).webkitFlex is "1 2 3px"
+PASS flexitem.style.webkitFlex is "1 2 3px"
+PASS getComputedStyle(flexitem).webkitFlex is "1 2 3px"
+PASS flexitem.style.webkitFlex is "0 0 auto"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "0 0 0px"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 0px"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "initial"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS flexitem.style.webkitFlex is "none"
+PASS getComputedStyle(flexitem).webkitFlex is "0 0 auto"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/css3/flexbox/flex-property-parsing.html b/LayoutTests/css3/flexbox/flex-property-parsing.html
new file mode 100644 (file)
index 0000000..6c3dc1e
--- /dev/null
@@ -0,0 +1,223 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<div id="flexbox">
+    <div id="flexitem"></div>
+</div>
+<script>
+description('Tests setting the -webkit-flex propery.');
+
+var flexbox = document.getElementById("flexbox");
+var flexitem = document.getElementById("flexitem");
+
+// Test default value.
+shouldBeEqualToString('flexitem.style.webkitFlex', '');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+// Should not inherit.
+flexbox.style.webkitFlex = '1 2 3px';
+shouldBeEqualToString('flexitem.style.webkitFlex', '');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+// Invalid value.
+flexitem.style.webkitFlex = 'junk';
+shouldBeEqualToString('flexitem.style.webkitFlex', '');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '1';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1 0 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1 0 0px');
+
+flexitem.style.webkitFlex = '0';
+shouldBeEqualToString('flexitem.style.webkitFlex', '0 0 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 0px');
+
+flexitem.style.webkitFlex = '1.5';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1.5 0 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1.5 0 0px');
+
+flexitem.style.webkitFlex = 'auto';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1 0 auto');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1 0 auto');
+
+flexitem.style.webkitFlex = '1px';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1 0 1px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1 0 1px');
+
+flexitem.style.webkitFlex = '2em';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1 0 2em');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1 0 32px');
+
+flexitem.style.webkitFlex = '0px';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1 0 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1 0 0px');
+
+flexitem.style.webkitFlex = 'none';
+flexitem.style.webkitFlex = '-2'; // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '0 0';
+shouldBeEqualToString('flexitem.style.webkitFlex', '0 0 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 0px');
+
+flexitem.style.webkitFlex = '0 1';
+shouldBeEqualToString('flexitem.style.webkitFlex', '0 1 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 1 0px');
+
+flexitem.style.webkitFlex = '1 0';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1 0 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1 0 0px');
+
+flexitem.style.webkitFlex = '2 auto';
+shouldBeEqualToString('flexitem.style.webkitFlex', '2 0 auto');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '2 0 auto');
+
+flexitem.style.webkitFlex = '3 4px';
+shouldBeEqualToString('flexitem.style.webkitFlex', '3 0 4px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '3 0 4px');
+
+flexitem.style.webkitFlex = 'auto 5.25';
+shouldBeEqualToString('flexitem.style.webkitFlex', '5.25 0 auto');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '5.25 0 auto');
+
+flexitem.style.webkitFlex = '6em 4';
+shouldBeEqualToString('flexitem.style.webkitFlex', '4 0 6em');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '4 0 96px');
+
+flexitem.style.webkitFlex = '4 0px';
+shouldBeEqualToString('flexitem.style.webkitFlex', '4 0 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '4 0 0px');
+
+flexitem.style.webkitFlex = '0 0px';
+shouldBeEqualToString('flexitem.style.webkitFlex', '0 0 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 0px');
+
+flexitem.style.webkitFlex = 'none';
+flexitem.style.webkitFlex = '-1 5'; // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '1 -1'; // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '-1 -1'; // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = 'auto 2em'; // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '2px 4px'; // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '0px 0px'; // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '1 2 0';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1 2 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1 2 0px');
+
+flexitem.style.webkitFlex = '0 0 0';
+shouldBeEqualToString('flexitem.style.webkitFlex', '0 0 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 0px');
+
+flexitem.style.webkitFlex = '1 2 auto';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1 2 auto');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1 2 auto');
+
+flexitem.style.webkitFlex = '1.75 2 3px';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1.75 2 3px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1.75 2 3px');
+
+flexitem.style.webkitFlex = '1 3px 2';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1 2 3px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1 2 3px');
+
+flexitem.style.webkitFlex = '3px 1 2';
+shouldBeEqualToString('flexitem.style.webkitFlex', '1 2 3px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '1 2 3px');
+
+flexitem.style.webkitFlex = 'auto 0 0';
+shouldBeEqualToString('flexitem.style.webkitFlex', '0 0 auto');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '0 0px 0';
+shouldBeEqualToString('flexitem.style.webkitFlex', '0 0 0px');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 0px');
+
+flexitem.style.webkitFlex = 'none';
+flexitem.style.webkitFlex = '1 2 3'; // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '0 2 3'; // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '1 0 3'; // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '0 0 1';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '1 -2 3px';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '1 2px 3px';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '1 2px auto';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '0px 0px 0';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '0 0 0 0';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '0 0 0px 0';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '0 0 0px 0px';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '0 0 0px 0';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '1, 2, 3px';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = '1,';  // Invalid, return previous value.
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = 'initial';
+shouldBeEqualToString('flexitem.style.webkitFlex', 'initial');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+
+flexitem.style.webkitFlex = 'none';
+shouldBeEqualToString('flexitem.style.webkitFlex', 'none');
+shouldBeEqualToString('getComputedStyle(flexitem).webkitFlex', '0 0 auto');
+</script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
index 9be6a00..676bbe0 100644 (file)
@@ -283,5 +283,3 @@ shouldBeEqualToString('window.getComputedStyle(flexbox, null).webkitFlexLinePack
 flexbox.style.webkitFlexLinePack = 'foo';
 shouldBeEqualToString('flexbox.style.webkitFlexLinePack', '');
 shouldBeEqualToString('window.getComputedStyle(flexbox, null).webkitFlexLinePack', 'stretch');
-
-successfullyParsed = true;
index 28e923e..e0eac1a 100644 (file)
@@ -67,4 +67,3 @@ for (var i in attributesToTest) {
     shouldBeEqualToString('testFlex("-webkit-flex(1) foo", "' + attribute + '")', '');
     shouldBeEqualToString('testFlex("10px -webkit-flex(1)", "' + attribute + '")', '');
 }
-successfullyParsed = true;
index abba436..eb429f7 100644 (file)
@@ -142,6 +142,7 @@ zoom: 1;
 -webkit-column-rule-width: 0px;
 -webkit-column-span: 1;
 -webkit-column-width: auto;
+-webkit-flex: 0 0 auto;
 -webkit-flex-order: 0;
 -webkit-flex-pack: start;
 -webkit-flex-align: stretch;
index 2263ebf..4ac4826 100644 (file)
@@ -141,6 +141,7 @@ Computed style of an element whose parent's 'display' value is 'none':
     -webkit-column-rule-width: 0px
     -webkit-column-span: 1
     -webkit-column-width: auto
+    -webkit-flex: 0 0 auto
     -webkit-flex-order: 0
     -webkit-flex-pack: start
     -webkit-flex-align: stretch
index a1e4f90..60688f5 100644 (file)
@@ -282,6 +282,8 @@ rect: style.getPropertyValue(-webkit-column-span) : 1
 rect: style.getPropertyCSSValue(-webkit-column-span) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(-webkit-column-width) : auto
 rect: style.getPropertyCSSValue(-webkit-column-width) : [object CSSPrimitiveValue]
+rect: style.getPropertyValue(-webkit-flex) : 0 0 auto
+rect: style.getPropertyCSSValue(-webkit-flex) : [object CSSValueList]
 rect: style.getPropertyValue(-webkit-flex-order) : 0
 rect: style.getPropertyCSSValue(-webkit-flex-order) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(-webkit-flex-pack) : start
@@ -806,6 +808,8 @@ g: style.getPropertyValue(-webkit-column-span) : 1
 g: style.getPropertyCSSValue(-webkit-column-span) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(-webkit-column-width) : auto
 g: style.getPropertyCSSValue(-webkit-column-width) : [object CSSPrimitiveValue]
+g: style.getPropertyValue(-webkit-flex) : 0 0 auto
+g: style.getPropertyCSSValue(-webkit-flex) : [object CSSValueList]
 g: style.getPropertyValue(-webkit-flex-order) : 0
 g: style.getPropertyCSSValue(-webkit-flex-order) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(-webkit-flex-pack) : start
index eb4bf2d..1d22e48 100644 (file)
@@ -142,6 +142,7 @@ zoom: 1;
 -webkit-column-rule-width: 0px;
 -webkit-column-span: 1;
 -webkit-column-width: auto;
+-webkit-flex: 0 0 auto;
 -webkit-flex-order: 0;
 -webkit-flex-pack: start;
 -webkit-flex-align: stretch;
index 9c07344..7021a1d 100644 (file)
@@ -141,6 +141,7 @@ Computed style of an element whose parent's 'display' value is 'none':
     -webkit-column-rule-width: 0px
     -webkit-column-span: 1
     -webkit-column-width: auto
+    -webkit-flex: 0 0 auto
     -webkit-flex-order: 0
     -webkit-flex-pack: start
     -webkit-flex-align: stretch
index 65ba5bb..5a6948b 100644 (file)
@@ -142,6 +142,7 @@ zoom: 1;
 -webkit-column-rule-width: 0px;
 -webkit-column-span: 1;
 -webkit-column-width: auto;
+-webkit-flex: 0 0 auto;
 -webkit-flex-order: 0;
 -webkit-flex-pack: start;
 -webkit-flex-align: stretch;
index f0adc09..29566c4 100644 (file)
@@ -141,6 +141,7 @@ Computed style of an element whose parent's 'display' value is 'none':
     -webkit-column-rule-width: 0px
     -webkit-column-span: 1
     -webkit-column-width: auto
+    -webkit-flex: 0 0 auto
     -webkit-flex-order: 0
     -webkit-flex-pack: start
     -webkit-flex-align: stretch
index 980a180..75851ef 100644 (file)
@@ -282,6 +282,8 @@ rect: style.getPropertyValue(-webkit-column-span) : 1
 rect: style.getPropertyCSSValue(-webkit-column-span) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(-webkit-column-width) : auto
 rect: style.getPropertyCSSValue(-webkit-column-width) : [object CSSPrimitiveValue]
+rect: style.getPropertyValue(-webkit-flex) : 0 0 auto
+rect: style.getPropertyCSSValue(-webkit-flex) : [object CSSValueList]
 rect: style.getPropertyValue(-webkit-flex-order) : 0
 rect: style.getPropertyCSSValue(-webkit-flex-order) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(-webkit-flex-pack) : start
@@ -806,6 +808,8 @@ g: style.getPropertyValue(-webkit-column-span) : 1
 g: style.getPropertyCSSValue(-webkit-column-span) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(-webkit-column-width) : auto
 g: style.getPropertyCSSValue(-webkit-column-width) : [object CSSPrimitiveValue]
+g: style.getPropertyValue(-webkit-flex) : 0 0 auto
+g: style.getPropertyCSSValue(-webkit-flex) : [object CSSValueList]
 g: style.getPropertyValue(-webkit-flex-order) : 0
 g: style.getPropertyCSSValue(-webkit-flex-order) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(-webkit-flex-pack) : start
index b282da1..200aea9 100644 (file)
@@ -141,6 +141,7 @@ Computed style of an element whose parent's 'display' value is 'none':
     -webkit-column-rule-width: 0px
     -webkit-column-span: 1
     -webkit-column-width: auto
+    -webkit-flex: 0 0 auto
     -webkit-flex-order: 0
     -webkit-flex-pack: start
     -webkit-flex-align: stretch
index ee0dcb3..5d4ea06 100644 (file)
@@ -282,6 +282,8 @@ rect: style.getPropertyValue(-webkit-column-span) : 1
 rect: style.getPropertyCSSValue(-webkit-column-span) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(-webkit-column-width) : auto
 rect: style.getPropertyCSSValue(-webkit-column-width) : [object CSSPrimitiveValue]
+rect: style.getPropertyValue(-webkit-flex) : 0 0 auto
+rect: style.getPropertyCSSValue(-webkit-flex) : [object CSSValueList]
 rect: style.getPropertyValue(-webkit-flex-order) : 0
 rect: style.getPropertyCSSValue(-webkit-flex-order) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(-webkit-flex-pack) : start
@@ -804,6 +806,8 @@ g: style.getPropertyValue(-webkit-column-span) : 1
 g: style.getPropertyCSSValue(-webkit-column-span) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(-webkit-column-width) : auto
 g: style.getPropertyCSSValue(-webkit-column-width) : [object CSSPrimitiveValue]
+g: style.getPropertyValue(-webkit-flex) : 0 0 auto
+g: style.getPropertyCSSValue(-webkit-flex) : [object CSSValueList]
 g: style.getPropertyValue(-webkit-flex-order) : 0
 g: style.getPropertyCSSValue(-webkit-flex-order) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(-webkit-flex-pack) : start
index d720bb3..751a21a 100644 (file)
@@ -142,6 +142,7 @@ zoom: 1;
 -webkit-column-rule-width: 0px;
 -webkit-column-span: 1;
 -webkit-column-width: auto;
+-webkit-flex: 0 0 auto;
 -webkit-flex-order: 0;
 -webkit-flex-pack: start;
 -webkit-flex-align: stretch;
index bc325f7..ea9da48 100644 (file)
@@ -141,6 +141,7 @@ Computed style of an element whose parent's 'display' value is 'none':
     -webkit-column-rule-width: 0px
     -webkit-column-span: 1
     -webkit-column-width: auto
+    -webkit-flex: 0 0 auto
     -webkit-flex-order: 0
     -webkit-flex-pack: start
     -webkit-flex-align: stretch
index ee0dcb3..5d4ea06 100644 (file)
@@ -282,6 +282,8 @@ rect: style.getPropertyValue(-webkit-column-span) : 1
 rect: style.getPropertyCSSValue(-webkit-column-span) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(-webkit-column-width) : auto
 rect: style.getPropertyCSSValue(-webkit-column-width) : [object CSSPrimitiveValue]
+rect: style.getPropertyValue(-webkit-flex) : 0 0 auto
+rect: style.getPropertyCSSValue(-webkit-flex) : [object CSSValueList]
 rect: style.getPropertyValue(-webkit-flex-order) : 0
 rect: style.getPropertyCSSValue(-webkit-flex-order) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(-webkit-flex-pack) : start
@@ -804,6 +806,8 @@ g: style.getPropertyValue(-webkit-column-span) : 1
 g: style.getPropertyCSSValue(-webkit-column-span) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(-webkit-column-width) : auto
 g: style.getPropertyCSSValue(-webkit-column-width) : [object CSSPrimitiveValue]
+g: style.getPropertyValue(-webkit-flex) : 0 0 auto
+g: style.getPropertyCSSValue(-webkit-flex) : [object CSSValueList]
 g: style.getPropertyValue(-webkit-flex-order) : 0
 g: style.getPropertyCSSValue(-webkit-flex-order) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(-webkit-flex-pack) : start
index 22ab415..b4350b8 100644 (file)
@@ -282,6 +282,8 @@ rect: style.getPropertyValue(-webkit-column-span) : 1
 rect: style.getPropertyCSSValue(-webkit-column-span) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(-webkit-column-width) : auto
 rect: style.getPropertyCSSValue(-webkit-column-width) : [object CSSPrimitiveValue]
+rect: style.getPropertyValue(-webkit-flex) : 0 0 auto
+rect: style.getPropertyCSSValue(-webkit-flex) : [object CSSValueList]
 rect: style.getPropertyValue(-webkit-flex-order) : 0
 rect: style.getPropertyCSSValue(-webkit-flex-order) : [object CSSPrimitiveValue]
 rect: style.getPropertyValue(-webkit-flex-pack) : start
@@ -808,6 +810,8 @@ g: style.getPropertyValue(-webkit-column-span) : 1
 g: style.getPropertyCSSValue(-webkit-column-span) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(-webkit-column-width) : auto
 g: style.getPropertyCSSValue(-webkit-column-width) : [object CSSPrimitiveValue]
+g: style.getPropertyValue(-webkit-flex) : 0 0 auto
+g: style.getPropertyCSSValue(-webkit-flex) : [object CSSValueList]
 g: style.getPropertyValue(-webkit-flex-order) : 0
 g: style.getPropertyCSSValue(-webkit-flex-order) : [object CSSPrimitiveValue]
 g: style.getPropertyValue(-webkit-flex-pack) : start
index 2979270..a5cc339 100644 (file)
@@ -1,3 +1,47 @@
+2012-04-02  Tony Chang  <tony@chromium.org>
+
+        add css parsing of -webkit-flex
+        https://bugs.webkit.org/show_bug.cgi?id=82927
+
+        Reviewed by Ojan Vafai.
+
+        This is the new syntax for CSS3 flexbox:
+        http://dev.w3.org/csswg/css3-flexbox/#flexibility
+
+        Not hooked up to anything in the render tree yet so the old syntax is
+        still valid.
+
+        Test: css3/flexbox/flex-property-parsing.html
+
+        * css/CSSComputedStyleDeclaration.cpp:
+        (WebCore):
+        (WebCore::CSSComputedStyleDeclaration::getPropertyCSSValue):
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::parseValue):
+        (WebCore::CSSParser::parseFlex):
+        * css/CSSParser.h:
+        (WebCore):
+        * css/CSSProperty.cpp:
+        (WebCore::CSSProperty::isInheritedProperty):
+        * css/CSSPropertyNames.in:
+        * css/CSSStyleApplyProperty.cpp:
+        (ApplyPropertyFlex):
+        (WebCore::ApplyPropertyFlex::applyInheritValue):
+        (WebCore::ApplyPropertyFlex::applyInitialValue):
+        (WebCore::ApplyPropertyFlex::applyValue):
+        (WebCore::ApplyPropertyFlex::createHandler):
+        (WebCore::ApplyPropertyFlex::getFlexValue):
+        (WebCore):
+        (WebCore::CSSStyleApplyProperty::CSSStyleApplyProperty):
+        * css/CSSStyleSelector.cpp:
+        (WebCore::CSSStyleSelector::collectMatchingRulesForList):
+        * rendering/style/RenderStyle.h:
+        * rendering/style/StyleFlexibleBoxData.cpp:
+        (WebCore::StyleFlexibleBoxData::StyleFlexibleBoxData):
+        (WebCore::StyleFlexibleBoxData::operator==):
+        * rendering/style/StyleFlexibleBoxData.h:
+        (StyleFlexibleBoxData):
+
 2012-04-02  Daniel Cheng  <dcheng@chromium.org>
 
         Having a drop handler prevents navigation on drop even if event is not cancelled
index 07a0343..04840be 100644 (file)
@@ -221,6 +221,7 @@ static const CSSPropertyID computedProperties[] = {
 #if ENABLE(DASHBOARD_SUPPORT)
     CSSPropertyWebkitDashboardRegion,
 #endif
+    CSSPropertyWebkitFlex,
     CSSPropertyWebkitFlexOrder,
     CSSPropertyWebkitFlexPack,
     CSSPropertyWebkitFlexAlign,
@@ -1632,6 +1633,21 @@ PassRefPtr<CSSValue> CSSComputedStyleDeclaration::getPropertyCSSValue(int proper
             return cssValuePool->createValue(style->display());
         case CSSPropertyEmptyCells:
             return cssValuePool->createValue(style->emptyCells());
+        case CSSPropertyWebkitFlex: {
+            RefPtr<CSSValueList> list = CSSValueList::createSpaceSeparated();
+            list->append(cssValuePool->createValue(style->positiveFlex()));
+            list->append(cssValuePool->createValue(style->negativeFlex()));
+
+            Length preferredSize = style->flexPreferredSize();
+            if (preferredSize.isAuto())
+                list->append(cssValuePool->createIdentifierValue(CSSValueAuto));
+            else if (preferredSize.isPercent())
+                list->append(cssValuePool->createValue(preferredSize.value(), CSSPrimitiveValue::CSS_PERCENTAGE));
+            else
+                list->append(cssValuePool->createValue(preferredSize.value(), CSSPrimitiveValue::CSS_PX));
+
+            return list.release();
+        }
         case CSSPropertyWebkitFlexOrder:
             return cssValuePool->createValue(style->flexOrder(), CSSPrimitiveValue::CSS_NUMBER);
         case CSSPropertyWebkitFlexPack:
index 142fa91..5e6e40d 100644 (file)
@@ -1787,8 +1787,12 @@ bool CSSParser::parseValue(int propId, bool important)
         else if (!id && validUnit(value, FLength | FPercent | FNonNeg))
             // ### handle multilength case where we allow relative units
             validPrimitive = true;
-        else if (value->unit == CSSParserValue::Function)
-            return parseFlex(propId, important);
+        else if (value->unit == CSSParserValue::Function) {
+            // FIXME: Remove -webkit-flex() handling once we finish implementing the -webkit-flex propery.
+            if (!equalIgnoringCase(value->function->name, "-webkit-flex(") || m_valueList->next())
+                return false;
+            parsedValue = parseFlex(value->function->args.get());
+        }
         break;
 
     case CSSPropertyBottom:               // <length> | <percentage> | auto | inherit
@@ -2015,6 +2019,18 @@ bool CSSParser::parseValue(int propId, bool important)
         }
         break;
 #endif
+    case CSSPropertyWebkitFlex: {
+        if (id == CSSValueNone)
+            validPrimitive = true;
+        else if (RefPtr<CSSFlexValue> flexValue = parseFlex(m_valueList.get())) {
+            RefPtr<CSSValueList> flexList = CSSValueList::createSpaceSeparated();
+            flexList->append(cssValuePool()->createValue(flexValue->positiveFlex(), CSSPrimitiveValue::CSS_NUMBER));
+            flexList->append(cssValuePool()->createValue(flexValue->negativeFlex(), CSSPrimitiveValue::CSS_NUMBER));
+            flexList->append(flexValue->preferredSize());
+            parsedValue = flexList;
+        }
+        break;
+    }
     case CSSPropertyWebkitFlexOrder:
         if (validUnit(value, FInteger, CSSStrictMode)) {
             // We restrict the smallest value to int min + 2 because we use int min and int min + 1 as special values in a hash set.
@@ -5496,13 +5512,10 @@ bool CSSParser::parseReflect(int propId, bool important)
     return true;
 }
 
-bool CSSParser::parseFlex(int propId, bool important)
+PassRefPtr<CSSFlexValue> CSSParser::parseFlex(CSSParserValueList* args)
 {
-    CSSParserValue* value = m_valueList->current();
-    CSSParserValueList* args = value->function->args.get();
-    if (!equalIgnoringCase(value->function->name, "-webkit-flex(") || !args || !args->size() || args->size() > 3 || m_valueList->next())
-        return false;
-
+    if (!args || !args->size() || args->size() > 3)
+        return 0;
     static const double unsetValue = -1;
     double positiveFlex = unsetValue;
     double negativeFlex = unsetValue;
@@ -5519,13 +5532,13 @@ bool CSSParser::parseFlex(int propId, bool important)
                 preferredSize = cssValuePool()->createValue(0, CSSPrimitiveValue::CSS_PX);
             } else {
                 // We only allow 3 numbers without units if the last value is 0. E.g., flex(1 1 1) is invalid.
-                return false;
+                return 0;
             }
         } else if (!preferredSize && (arg->id == CSSValueAuto || validUnit(arg, FLength | FPercent | FNonNeg)))
             preferredSize = parseValidPrimitive(arg->id, arg);
         else {
             // Not a valid arg for flex().
-            return false;
+            return 0;
         }
         args->next();
     }
@@ -5538,8 +5551,7 @@ bool CSSParser::parseFlex(int propId, bool important)
         preferredSize = cssValuePool()->createValue(0, CSSPrimitiveValue::CSS_PX);
 
     RefPtr<CSSFlexValue> flex = CSSFlexValue::create(clampToFloat(positiveFlex), clampToFloat(negativeFlex), preferredSize);
-    addProperty(propId, flex.release(), important);
-    return true;
+    return flex;
 }
 
 struct BorderImageParseContext {
index 53f3321..4a4b897 100644 (file)
@@ -53,6 +53,7 @@ class CSSSelectorList;
 class CSSStyleSheet;
 class CSSValue;
 class CSSValueList;
+class CSSFlexValue;
 class CSSWrapShape;
 class Document;
 class MediaQueryExp;
@@ -187,7 +188,7 @@ public:
 
     bool parseReflect(int propId, bool important);
 
-    bool parseFlex(int propId, bool important);
+    PassRefPtr<CSSFlexValue> parseFlex(CSSParserValueList* args);
 
     // Image generators
     bool parseCanvas(CSSParserValueList*, RefPtr<CSSValue>&);
index 160f02d..19578de 100644 (file)
@@ -536,6 +536,7 @@ bool CSSProperty::isInheritedProperty(unsigned propertyID)
 #if ENABLE(CSS_FILTERS)
     case CSSPropertyWebkitFilter:
 #endif
+    case CSSPropertyWebkitFlex:
     case CSSPropertyWebkitFlexOrder:
     case CSSPropertyWebkitFlexPack:
     case CSSPropertyWebkitFlexAlign:
index d6374ae..aee5c06 100644 (file)
@@ -255,6 +255,7 @@ z-index
 #if defined(ENABLE_CSS_FILTERS) && ENABLE_CSS_FILTERS
 -webkit-filter
 #endif
+-webkit-flex
 -webkit-flex-align
 -webkit-flex-direction
 -webkit-flex-flow
index 3061f05..da89247 100644 (file)
@@ -1723,6 +1723,67 @@ public:
     }
 };
 
+class ApplyPropertyFlex {
+public:
+    static void applyInheritValue(CSSStyleSelector* selector)
+    {
+        ApplyPropertyDefaultBase<float, &RenderStyle::positiveFlex, float, &RenderStyle::setPositiveFlex, float, &RenderStyle::initialNegativeFlex>::applyInheritValue(selector);
+        ApplyPropertyDefaultBase<float, &RenderStyle::negativeFlex, float, &RenderStyle::setNegativeFlex, float, &RenderStyle::initialPositiveFlex>::applyInheritValue(selector);
+        ApplyPropertyDefaultBase<Length, &RenderStyle::flexPreferredSize, Length, &RenderStyle::setFlexPreferredSize, Length, &RenderStyle::initialFlexPreferredSize>::applyInheritValue(selector);
+    }
+
+    static void applyInitialValue(CSSStyleSelector* selector)
+    {
+        selector->style()->setPositiveFlex(RenderStyle::initialPositiveFlex());
+        selector->style()->setNegativeFlex(RenderStyle::initialNegativeFlex());
+        selector->style()->setFlexPreferredSize(RenderStyle::initialFlexPreferredSize());
+    }
+
+    static void applyValue(CSSStyleSelector* selector, CSSValue* value)
+    {
+        if (value->isPrimitiveValue()) {
+            CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
+            if (primitiveValue->getIdent() == CSSValueNone)
+                applyInitialValue(selector);
+            return;
+        }
+
+        if (!value->isValueList())
+            return;
+        CSSValueList* valueList = static_cast<CSSValueList*>(value);
+        if (valueList->length() != 3)
+            return;
+
+        float flexValue = 0;
+        if (!getFlexValue(valueList->itemWithoutBoundsCheck(0), flexValue))
+            return;
+        selector->style()->setPositiveFlex(flexValue);
+
+        if (!getFlexValue(valueList->itemWithoutBoundsCheck(1), flexValue))
+            return;
+        selector->style()->setNegativeFlex(flexValue);
+
+        ApplyPropertyLength<&RenderStyle::flexPreferredSize, &RenderStyle::setFlexPreferredSize, &RenderStyle::initialFlexPreferredSize, AutoEnabled>::applyValue(selector, valueList->itemWithoutBoundsCheck(2));
+    }
+
+    static PropertyHandler createHandler()
+    {
+        return PropertyHandler(&applyInheritValue, &applyInitialValue, &applyValue);
+    }
+private:
+    static bool getFlexValue(CSSValue* value, float& flexValue)
+    {
+        if (!value->isPrimitiveValue())
+            return false;
+        CSSPrimitiveValue* primitiveValue = static_cast<CSSPrimitiveValue*>(value);
+        if (!primitiveValue->isNumber())
+            return false;
+        flexValue = primitiveValue->getFloatValue();
+        return true;
+    }
+
+};
+
 const CSSStyleApplyProperty& CSSStyleApplyProperty::sharedCSSStyleApplyProperty()
 {
     DEFINE_STATIC_LOCAL(CSSStyleApplyProperty, cssStyleApplyPropertyInstance, ());
@@ -1889,6 +1950,7 @@ CSSStyleApplyProperty::CSSStyleApplyProperty()
     setPropertyHandler(CSSPropertyWebkitColumnSpan, ApplyPropertyDefault<ColumnSpan, &RenderStyle::columnSpan, ColumnSpan, &RenderStyle::setColumnSpan, ColumnSpan, &RenderStyle::initialColumnSpan>::createHandler());
     setPropertyHandler(CSSPropertyWebkitColumnRuleStyle, ApplyPropertyDefault<EBorderStyle, &RenderStyle::columnRuleStyle, EBorderStyle, &RenderStyle::setColumnRuleStyle, EBorderStyle, &RenderStyle::initialBorderStyle>::createHandler());
     setPropertyHandler(CSSPropertyWebkitColumnWidth, ApplyPropertyAuto<float, &RenderStyle::columnWidth, &RenderStyle::setColumnWidth, &RenderStyle::hasAutoColumnWidth, &RenderStyle::setHasAutoColumnWidth, ComputeLength>::createHandler());
+    setPropertyHandler(CSSPropertyWebkitFlex, ApplyPropertyFlex::createHandler());
     setPropertyHandler(CSSPropertyWebkitFlexAlign, ApplyPropertyDefault<EFlexAlign, &RenderStyle::flexAlign, EFlexAlign, &RenderStyle::setFlexAlign, EFlexAlign, &RenderStyle::initialFlexAlign>::createHandler());
     setPropertyHandler(CSSPropertyWebkitFlexDirection, ApplyPropertyDefault<EFlexDirection, &RenderStyle::flexDirection, EFlexDirection, &RenderStyle::setFlexDirection, EFlexDirection, &RenderStyle::initialFlexDirection>::createHandler());
     setPropertyHandler(CSSPropertyWebkitFlexFlow, ApplyPropertyExpanding<SuppressValue, CSSPropertyWebkitFlexDirection, CSSPropertyWebkitFlexWrap>::createHandler());
index 22778a2..5e6d0e9 100644 (file)
@@ -4038,6 +4038,7 @@ void CSSStyleSelector::applyProperty(int id, CSSValue *value)
     case CSSPropertyWebkitColumns:
     case CSSPropertyWebkitColumnSpan:
     case CSSPropertyWebkitColumnWidth:
+    case CSSPropertyWebkitFlex:
     case CSSPropertyWebkitFlexAlign:
     case CSSPropertyWebkitFlexDirection:
     case CSSPropertyWebkitFlexFlow:
index 6b4c1ed..b6581b9 100644 (file)
@@ -811,6 +811,9 @@ public:
     float flexboxWidthNegativeFlex() const { return rareNonInheritedData->m_flexibleBox->m_widthNegativeFlex; }
     float flexboxHeightPositiveFlex() const { return rareNonInheritedData->m_flexibleBox->m_heightPositiveFlex; }
     float flexboxHeightNegativeFlex() const { return rareNonInheritedData->m_flexibleBox->m_heightNegativeFlex; }
+    float positiveFlex() const { return rareNonInheritedData->m_flexibleBox->m_positiveFlex; }
+    float negativeFlex() const { return rareNonInheritedData->m_flexibleBox->m_negativeFlex; }
+    Length flexPreferredSize() const { return rareNonInheritedData->m_flexibleBox->m_preferredSize; }
     int flexOrder() const { return rareNonInheritedData->m_flexibleBox->m_flexOrder; }
     EFlexPack flexPack() const { return static_cast<EFlexPack>(rareNonInheritedData->m_flexibleBox->m_flexPack); }
     EFlexAlign flexAlign() const { return static_cast<EFlexAlign>(rareNonInheritedData->m_flexibleBox->m_flexAlign); }
@@ -1251,6 +1254,9 @@ public:
     void setFlexboxWidthNegativeFlex(float f) { SET_VAR(rareNonInheritedData.access()->m_flexibleBox, m_widthNegativeFlex, f); }
     void setFlexboxHeightPositiveFlex(float f) { SET_VAR(rareNonInheritedData.access()->m_flexibleBox, m_heightPositiveFlex, f); }
     void setFlexboxHeightNegativeFlex(float f) { SET_VAR(rareNonInheritedData.access()->m_flexibleBox, m_heightNegativeFlex, f); }
+    void setPositiveFlex(float f) { SET_VAR(rareNonInheritedData.access()->m_flexibleBox, m_positiveFlex, f); }
+    void setNegativeFlex(float f) { SET_VAR(rareNonInheritedData.access()->m_flexibleBox, m_negativeFlex, f); }
+    void setFlexPreferredSize(Length l) { SET_VAR(rareNonInheritedData.access()->m_flexibleBox, m_preferredSize, l); }
     void setFlexOrder(int o) { SET_VAR(rareNonInheritedData.access()->m_flexibleBox, m_flexOrder, o); }
     void setFlexPack(EFlexPack p) { SET_VAR(rareNonInheritedData.access()->m_flexibleBox, m_flexPack, p); }
     void setFlexAlign(EFlexAlign a) { SET_VAR(rareNonInheritedData.access()->m_flexibleBox, m_flexAlign, a); }
@@ -1582,10 +1588,9 @@ public:
     static unsigned int initialBoxOrdinalGroup() { return 1; }
     static EBoxSizing initialBoxSizing() { return CONTENT_BOX; }
     static StyleReflection* initialBoxReflect() { return 0; }
-    static float initialFlexboxWidthPositiveFlex() { return 0; }
-    static float initialFlexboxWidthNegativeFlex() { return 0; }
-    static float initialFlexboxHeightPositiveFlex() { return 0; }
-    static float initialFlexboxHeightNegativeFlex() { return 0; }
+    static float initialPositiveFlex() { return 0; }
+    static float initialNegativeFlex() { return 0; }
+    static Length initialFlexPreferredSize() { return Length(Auto); }
     static int initialFlexOrder() { return 0; }
     static EFlexPack initialFlexPack() { return PackStart; }
     static EFlexAlign initialFlexAlign() { return AlignStretch; }
index 065b7ab..0ae7e96 100644 (file)
 namespace WebCore {
 
 StyleFlexibleBoxData::StyleFlexibleBoxData()
-    : m_widthPositiveFlex(RenderStyle::initialFlexboxWidthPositiveFlex())
-    , m_widthNegativeFlex(RenderStyle::initialFlexboxWidthNegativeFlex())
-    , m_heightPositiveFlex(RenderStyle::initialFlexboxHeightPositiveFlex())
-    , m_heightNegativeFlex(RenderStyle::initialFlexboxHeightNegativeFlex())
+    : m_widthPositiveFlex(RenderStyle::initialPositiveFlex())
+    , m_widthNegativeFlex(RenderStyle::initialNegativeFlex())
+    , m_heightPositiveFlex(RenderStyle::initialPositiveFlex())
+    , m_heightNegativeFlex(RenderStyle::initialNegativeFlex())
+    , m_positiveFlex(RenderStyle::initialPositiveFlex())
+    , m_negativeFlex(RenderStyle::initialNegativeFlex())
+    , m_preferredSize(RenderStyle::initialFlexPreferredSize())
     , m_flexOrder(RenderStyle::initialFlexOrder())
     , m_flexPack(RenderStyle::initialFlexPack())
     , m_flexAlign(RenderStyle::initialFlexAlign())
@@ -51,6 +54,9 @@ StyleFlexibleBoxData::StyleFlexibleBoxData(const StyleFlexibleBoxData& o)
     , m_widthNegativeFlex(o.m_widthNegativeFlex)
     , m_heightPositiveFlex(o.m_heightPositiveFlex)
     , m_heightNegativeFlex(o.m_heightNegativeFlex)
+    , m_positiveFlex(o.m_positiveFlex)
+    , m_negativeFlex(o.m_negativeFlex)
+    , m_preferredSize(o.m_preferredSize)
     , m_flexOrder(o.m_flexOrder)
     , m_flexPack(o.m_flexPack)
     , m_flexAlign(o.m_flexAlign)
@@ -65,6 +71,7 @@ bool StyleFlexibleBoxData::operator==(const StyleFlexibleBoxData& o) const
 {
     return m_widthPositiveFlex == o.m_widthPositiveFlex && m_widthNegativeFlex == o.m_widthNegativeFlex
         && m_heightPositiveFlex == o.m_heightPositiveFlex && m_heightNegativeFlex == o.m_heightNegativeFlex
+        && m_positiveFlex == o.m_positiveFlex && m_negativeFlex == o.m_negativeFlex && m_preferredSize == o.m_preferredSize
         && m_flexOrder == o.m_flexOrder && m_flexPack == o.m_flexPack && m_flexAlign == o.m_flexAlign
         && m_flexItemAlign == o.m_flexItemAlign && m_flexDirection == o.m_flexDirection && m_flexWrap == o.m_flexWrap
         && m_flexLinePack == o.m_flexLinePack;
index 2373779..cf5b656 100644 (file)
@@ -26,6 +26,8 @@
 #ifndef StyleFlexibleBoxData_h
 #define StyleFlexibleBoxData_h
 
+#include "Length.h"
+
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
 
@@ -42,11 +44,16 @@ public:
         return !(*this == o);
     }
 
+    // FIXME: Remove these once we finish implementing the -webkit-flex property.
     float m_widthPositiveFlex;
     float m_widthNegativeFlex;
     float m_heightPositiveFlex;
     float m_heightNegativeFlex;
 
+    float m_positiveFlex;
+    float m_negativeFlex;
+    Length m_preferredSize;
+
     int m_flexOrder;
 
     unsigned m_flexPack : 3; // EFlexPack