Changeset 98775 in webkit


Ignore:
Timestamp:
Oct 28, 2011 4:08:51 PM (12 years ago)
Author:
timothy_horton@apple.com
Message:

Implement CSS3 Images cross-fade() image function
https://bugs.webkit.org/show_bug.cgi?id=52162
<rdar://problem/10209254>

Reviewed by Simon Fraser.

Parse -webkit-cross-fade according to the CSS3 Images Values specification.

Also, adjust other CSS parsing functions to support nested functions, by using a specific CSS value list
instead of the global one. This allows - for example - cross-fade to pass each of its arguments back into
parseFillImage and to successfully parse image functions in this fashion.

Test: fast/css/getComputedStyle/computed-style-cross-fade.html

  • WebCore.xcodeproj/project.pbxproj:
  • css/CSSCrossfadeValue.cpp: Added.

(WebCore::CSSCrossfadeValue::~CSSCrossfadeValue):
(WebCore::CSSCrossfadeValue::cssText):
(WebCore::CSSCrossfadeValue::fixedSize):
(WebCore::CSSCrossfadeValue::image):

  • css/CSSCrossfadeValue.h: Added.

(WebCore::CSSCrossfadeValue::create):
(WebCore::CSSCrossfadeValue::isFixedSize):
(WebCore::CSSCrossfadeValue::setFromImage):
(WebCore::CSSCrossfadeValue::setToImage):
(WebCore::CSSCrossfadeValue::setPercentage):
(WebCore::CSSCrossfadeValue::CSSCrossfadeValue):

  • css/CSSParser.cpp:

(WebCore::CSSParser::parseValue):
(WebCore::CSSParser::parseContent):
(WebCore::CSSParser::parseFillImage):
(WebCore::CSSParser::parseFillProperty):
(WebCore::CSSParser::parseBorderImage):
(WebCore::CSSParser::parseDeprecatedGradient):
(WebCore::CSSParser::parseLinearGradient):
(WebCore::CSSParser::parseRadialGradient):
(WebCore::CSSParser::isGeneratedImageValue):
(WebCore::CSSParser::parseGeneratedImage):
(WebCore::CSSParser::parseCrossfade):
(WebCore::CSSParser::parseCanvas):

  • css/CSSParser.h:

Add tests to ensure that -webkit-cross-fade is parsed correctly.

  • fast/css/getComputedStyle/computed-style-cross-fade-expected.txt: Added.
  • fast/css/getComputedStyle/computed-style-cross-fade.html: Added.
Location:
trunk
Files:
4 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r98773 r98775  
     12011-10-28  Tim Horton  <timothy_horton@apple.com>
     2
     3        Implement CSS3 Images cross-fade() image function
     4        https://bugs.webkit.org/show_bug.cgi?id=52162
     5        <rdar://problem/10209254>
     6
     7        Reviewed by Simon Fraser.
     8
     9        Add tests to ensure that -webkit-cross-fade is parsed correctly.
     10
     11        * fast/css/getComputedStyle/computed-style-cross-fade-expected.txt: Added.
     12        * fast/css/getComputedStyle/computed-style-cross-fade.html: Added.
     13
    1142011-10-28  Chris Marrin  <cmarrin@apple.com>
    215
  • trunk/Source/WebCore/ChangeLog

    r98774 r98775  
     12011-10-28  Tim Horton  <timothy_horton@apple.com>
     2
     3        Implement CSS3 Images cross-fade() image function
     4        https://bugs.webkit.org/show_bug.cgi?id=52162
     5        <rdar://problem/10209254>
     6
     7        Reviewed by Simon Fraser.
     8
     9        Parse -webkit-cross-fade according to the CSS3 Images Values specification.
     10
     11        Also, adjust other CSS parsing functions to support nested functions, by using a specific CSS value list
     12        instead of the global one. This allows - for example - cross-fade to pass each of its arguments back into
     13        parseFillImage and to successfully parse image functions in this fashion.
     14
     15        Test: fast/css/getComputedStyle/computed-style-cross-fade.html
     16
     17        * WebCore.xcodeproj/project.pbxproj:
     18        * css/CSSCrossfadeValue.cpp: Added.
     19        (WebCore::CSSCrossfadeValue::~CSSCrossfadeValue):
     20        (WebCore::CSSCrossfadeValue::cssText):
     21        (WebCore::CSSCrossfadeValue::fixedSize):
     22        (WebCore::CSSCrossfadeValue::image):
     23        * css/CSSCrossfadeValue.h: Added.
     24        (WebCore::CSSCrossfadeValue::create):
     25        (WebCore::CSSCrossfadeValue::isFixedSize):
     26        (WebCore::CSSCrossfadeValue::setFromImage):
     27        (WebCore::CSSCrossfadeValue::setToImage):
     28        (WebCore::CSSCrossfadeValue::setPercentage):
     29        (WebCore::CSSCrossfadeValue::CSSCrossfadeValue):
     30        * css/CSSParser.cpp:
     31        (WebCore::CSSParser::parseValue):
     32        (WebCore::CSSParser::parseContent):
     33        (WebCore::CSSParser::parseFillImage):
     34        (WebCore::CSSParser::parseFillProperty):
     35        (WebCore::CSSParser::parseBorderImage):
     36        (WebCore::CSSParser::parseDeprecatedGradient):
     37        (WebCore::CSSParser::parseLinearGradient):
     38        (WebCore::CSSParser::parseRadialGradient):
     39        (WebCore::CSSParser::isGeneratedImageValue):
     40        (WebCore::CSSParser::parseGeneratedImage):
     41        (WebCore::CSSParser::parseCrossfade):
     42        (WebCore::CSSParser::parseCanvas):
     43        * css/CSSParser.h:
     44
    1452011-10-28  Dan Bernstein  <mitz@apple.com>
    246
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r98755 r98775  
    685685                2BE8E2C912A58A0100FAD550 /* HTMLMetaCharsetParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BE8E2C812A58A0100FAD550 /* HTMLMetaCharsetParser.cpp */; };
    686686                2D3A0E3613A7D76100E85AF0 /* SVGParsingError.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D3A0E3513A7D76100E85AF0 /* SVGParsingError.h */; settings = {ATTRIBUTES = (Private, ); }; };
     687                2D8FEBDC143E3EF70072502B /* CSSCrossfadeValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2D8FEBDA143E3EF70072502B /* CSSCrossfadeValue.cpp */; };
     688                2D8FEBDD143E3EF70072502B /* CSSCrossfadeValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D8FEBDB143E3EF70072502B /* CSSCrossfadeValue.h */; };
    687689                2D9066060BE141D400956998 /* LayoutState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2D9066040BE141D400956998 /* LayoutState.cpp */; };
    688690                2D9066070BE141D400956998 /* LayoutState.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D9066050BE141D400956998 /* LayoutState.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    77537755                2BE8E2C812A58A0100FAD550 /* HTMLMetaCharsetParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HTMLMetaCharsetParser.cpp; path = parser/HTMLMetaCharsetParser.cpp; sourceTree = "<group>"; };
    77547756                2D3A0E3513A7D76100E85AF0 /* SVGParsingError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGParsingError.h; sourceTree = "<group>"; };
     7757                2D8FEBDA143E3EF70072502B /* CSSCrossfadeValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSSCrossfadeValue.cpp; sourceTree = "<group>"; };
     7758                2D8FEBDB143E3EF70072502B /* CSSCrossfadeValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSCrossfadeValue.h; sourceTree = "<group>"; };
    77557759                2D9066040BE141D400956998 /* LayoutState.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutState.cpp; sourceTree = "<group>"; };
    77567760                2D9066050BE141D400956998 /* LayoutState.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = LayoutState.h; sourceTree = "<group>"; };
     
    2046020464                                A80E6CCF0A1989CA007FB8C5 /* CSSCharsetRule.h */,
    2046120465                                85C56CAC0AA89F8E00D95755 /* CSSCharsetRule.idl */,
     20466                                2D8FEBDA143E3EF70072502B /* CSSCrossfadeValue.cpp */,
     20467                                2D8FEBDB143E3EF70072502B /* CSSCrossfadeValue.h */,
    2046220468                                BCEA477C097CAAC80094C9E4 /* CSSComputedStyleDeclaration.cpp */,
    2046320469                                BCEA477D097CAAC80094C9E4 /* CSSComputedStyleDeclaration.h */,
     
    2454524551                                9B3A8872145632F9003AE8F5 /* DOMDOMSettableTokenList.h in Headers */,
    2454624552                                FD62F52E145898D80094B0ED /* AudioSourceProviderClient.h in Headers */,
     24553                                2D8FEBDD143E3EF70072502B /* CSSCrossfadeValue.h in Headers */,
    2454724554                        );
    2454824555                        runOnlyForDeploymentPostprocessing = 0;
     
    2739227399                                A0EE0DF7144F825500F80B0D /* WebGLDebugShaders.cpp in Sources */,
    2739327400                                A3BB59F31457A40D00AC56FE /* DocumentEventQueue.cpp in Sources */,
     27401                                2D8FEBDC143E3EF70072502B /* CSSCrossfadeValue.cpp in Sources */,
    2739427402                        );
    2739527403                        runOnlyForDeploymentPostprocessing = 0;
  • trunk/Source/WebCore/css/CSSParser.cpp

    r98714 r98775  
    2929#include "CSSCanvasValue.h"
    3030#include "CSSCharsetRule.h"
     31#include "CSSCrossfadeValue.h"
    3132#include "CSSCursorImageValue.h"
    3233#include "CSSFlexValue.h"
     
    12141215            }
    12151216        } else if (isGeneratedImageValue(value)) {
    1216             if (parseGeneratedImage(parsedValue))
     1217            if (parseGeneratedImage(m_valueList, parsedValue))
    12171218                m_valueList->next();
    12181219            else
     
    27302731                    return false;
    27312732            } else if (isGeneratedImageValue(val)) {
    2732                 if (!parseGeneratedImage(parsedValue))
     2733                if (!parseGeneratedImage(m_valueList, parsedValue))
    27332734                    return false;
    27342735            } else
     
    28022803}
    28032804
    2804 bool CSSParser::parseFillImage(RefPtr<CSSValue>& value)
    2805 {
    2806     if (m_valueList->current()->id == CSSValueNone) {
     2805bool CSSParser::parseFillImage(CSSParserValueList* valueList, RefPtr<CSSValue>& value)
     2806{
     2807    if (valueList->current()->id == CSSValueNone) {
    28072808        value = CSSImageValue::create();
    28082809        return true;
    28092810    }
    2810     if (m_valueList->current()->unit == CSSPrimitiveValue::CSS_URI) {
     2811    if (valueList->current()->unit == CSSPrimitiveValue::CSS_URI) {
    28112812        // FIXME: The completeURL call should be done when using the CSSImageValue,
    28122813        // not when creating it.
    28132814        if (m_styleSheet)
    2814             value = CSSImageValue::create(m_styleSheet->completeURL(m_valueList->current()->string));
     2815            value = CSSImageValue::create(m_styleSheet->completeURL(valueList->current()->string));
    28152816        return true;
    28162817    }
    28172818
    2818     if (isGeneratedImageValue(m_valueList->current()))
    2819         return parseGeneratedImage(value);
     2819    if (isGeneratedImageValue(valueList->current()))
     2820        return parseGeneratedImage(valueList, value);
    28202821
    28212822    return false;
     
    30793080                case CSSPropertyBackgroundImage:
    30803081                case CSSPropertyWebkitMaskImage:
    3081                     if (parseFillImage(currValue))
     3082                    if (parseFillImage(m_valueList, currValue))
    30823083                        m_valueList->next();
    30833084                    break;
     
    52675268            } else if (isGeneratedImageValue(val)) {
    52685269                RefPtr<CSSValue> value;
    5269                 if (parseGeneratedImage(value))
     5270                if (parseGeneratedImage(m_valueList, value))
    52705271                    context.commitImage(value);
    52715272                else
     
    57735774}
    57745775
    5775 bool CSSParser::parseDeprecatedGradient(RefPtr<CSSValue>& gradient)
     5776bool CSSParser::parseDeprecatedGradient(CSSParserValueList* valueList, RefPtr<CSSValue>& gradient)
    57765777{
    57775778    // Walk the arguments.
    5778     CSSParserValueList* args = m_valueList->current()->function->args.get();
     5779    CSSParserValueList* args = valueList->current()->function->args.get();
    57795780    if (!args || args->size() == 0)
    57805781        return false;
     
    59325933}
    59335934
    5934 bool CSSParser::parseLinearGradient(RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating)
     5935bool CSSParser::parseLinearGradient(CSSParserValueList* valueList, RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating)
    59355936{
    59365937    RefPtr<CSSLinearGradientValue> result = CSSLinearGradientValue::create(repeating);
    59375938
    59385939    // Walk the arguments.
    5939     CSSParserValueList* args = m_valueList->current()->function->args.get();
     5940    CSSParserValueList* args = valueList->current()->function->args.get();
    59405941    if (!args || !args->size())
    59415942        return false;
     
    60026003}
    60036004
    6004 bool CSSParser::parseRadialGradient(RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating)
     6005bool CSSParser::parseRadialGradient(CSSParserValueList* valueList, RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating)
    60056006{
    60066007    RefPtr<CSSRadialGradientValue> result = CSSRadialGradientValue::create(repeating);
    60076008
    60086009    // Walk the arguments.
    6009     CSSParserValueList* args = m_valueList->current()->function->args.get();
     6010    CSSParserValueList* args = valueList->current()->function->args.get();
    60106011    if (!args || !args->size())
    60116012        return false;
     
    61696170        || equalIgnoringCase(val->function->name, "-webkit-radial-gradient(")
    61706171        || equalIgnoringCase(val->function->name, "-webkit-repeating-radial-gradient(")
    6171         || equalIgnoringCase(val->function->name, "-webkit-canvas(");
    6172 }
    6173 
    6174 bool CSSParser::parseGeneratedImage(RefPtr<CSSValue>& value)
    6175 {
    6176     CSSParserValue* val = m_valueList->current();
     6172        || equalIgnoringCase(val->function->name, "-webkit-canvas(")
     6173        || equalIgnoringCase(val->function->name, "-webkit-cross-fade(");
     6174}
     6175
     6176bool CSSParser::parseGeneratedImage(CSSParserValueList* valueList, RefPtr<CSSValue>& value)
     6177{
     6178    CSSParserValue* val = valueList->current();
    61776179
    61786180    if (val->unit != CSSParserValue::Function)
     
    61806182
    61816183    if (equalIgnoringCase(val->function->name, "-webkit-gradient("))
    6182         return parseDeprecatedGradient(value);
     6184        return parseDeprecatedGradient(valueList, value);
    61836185
    61846186    if (equalIgnoringCase(val->function->name, "-webkit-linear-gradient("))
    6185         return parseLinearGradient(value, NonRepeating);
     6187        return parseLinearGradient(valueList, value, NonRepeating);
    61866188
    61876189    if (equalIgnoringCase(val->function->name, "-webkit-repeating-linear-gradient("))
    6188         return parseLinearGradient(value, Repeating);
     6190        return parseLinearGradient(valueList, value, Repeating);
    61896191
    61906192    if (equalIgnoringCase(val->function->name, "-webkit-radial-gradient("))
    6191         return parseRadialGradient(value, NonRepeating);
     6193        return parseRadialGradient(valueList, value, NonRepeating);
    61926194
    61936195    if (equalIgnoringCase(val->function->name, "-webkit-repeating-radial-gradient("))
    6194         return parseRadialGradient(value, Repeating);
     6196        return parseRadialGradient(valueList, value, Repeating);
    61956197
    61966198    if (equalIgnoringCase(val->function->name, "-webkit-canvas("))
    6197         return parseCanvas(value);
     6199        return parseCanvas(valueList, value);
     6200
     6201    if (equalIgnoringCase(val->function->name, "-webkit-cross-fade("))
     6202        return parseCrossfade(valueList, value);
    61986203
    61996204    return false;
    62006205}
    62016206
    6202 bool CSSParser::parseCanvas(RefPtr<CSSValue>& canvas)
     6207bool CSSParser::parseCrossfade(CSSParserValueList* valueList, RefPtr<CSSValue>& crossfade)
     6208{
     6209    RefPtr<CSSCrossfadeValue> result;
     6210
     6211    // Walk the arguments.
     6212    CSSParserValueList* args = valueList->current()->function->args.get();
     6213    if (!args || args->size() != 5)
     6214        return false;
     6215    CSSParserValue* a = args->current();
     6216    RefPtr<CSSValue> fromImageValue;
     6217    RefPtr<CSSValue> toImageValue;
     6218
     6219    // The first argument is the "from" image. It is a fill image.
     6220    if (!a || !parseFillImage(args, fromImageValue))
     6221        return false;
     6222    a = args->next();
     6223
     6224    // Skip a comma
     6225    if (a->unit != CSSParserValue::Operator || a->iValue != ',')
     6226        return false;
     6227    a = args->next();
     6228
     6229    // The second argument is the "to" image. It is a fill image.
     6230    if (!a || !parseFillImage(args, toImageValue))
     6231        return false;
     6232    a = args->next();
     6233
     6234    // Skip a comma
     6235    if (a->unit != CSSParserValue::Operator || a->iValue != ',')
     6236        return false;
     6237    a = args->next();
     6238
     6239    // The third argument is the crossfade value. It is a percentage.
     6240    if (!a || a->unit != CSSPrimitiveValue::CSS_PERCENTAGE)
     6241        return false;
     6242
     6243    result = CSSCrossfadeValue::create(static_cast<CSSImageValue*>(fromImageValue.get()), static_cast<CSSImageValue*>(toImageValue.get()));
     6244    result->setPercentage(createPrimitiveNumericValue(a));
     6245
     6246    crossfade = result;
     6247
     6248    return true;
     6249}
     6250
     6251bool CSSParser::parseCanvas(CSSParserValueList* valueList, RefPtr<CSSValue>& canvas)
    62036252{
    62046253    RefPtr<CSSCanvasValue> result = CSSCanvasValue::create();
    62056254
    62066255    // Walk the arguments.
    6207     CSSParserValueList* args = m_valueList->current()->function->args.get();
     6256    CSSParserValueList* args = valueList->current()->function->args.get();
    62086257    if (!args || args->size() != 1)
    62096258        return false;
  • trunk/Source/WebCore/css/CSSParser.h

    r98714 r98775  
    9292    PassRefPtr<CSSValue> parseBackgroundColor();
    9393
    94     bool parseFillImage(RefPtr<CSSValue>&);
     94    bool parseFillImage(CSSParserValueList*, RefPtr<CSSValue>&);
    9595
    9696    enum FillPositionFlag { InvalidFillPosition = 0, AmbiguousFillPosition = 1, XFillPosition = 2, YFillPosition = 4 };
     
    177177
    178178    // Image generators
    179     bool parseCanvas(RefPtr<CSSValue>&);
    180 
    181     bool parseDeprecatedGradient(RefPtr<CSSValue>&);
    182     bool parseLinearGradient(RefPtr<CSSValue>&, CSSGradientRepeat repeating);
    183     bool parseRadialGradient(RefPtr<CSSValue>&, CSSGradientRepeat repeating);
     179    bool parseCanvas(CSSParserValueList*, RefPtr<CSSValue>&);
     180
     181    bool parseDeprecatedGradient(CSSParserValueList*, RefPtr<CSSValue>&);
     182    bool parseLinearGradient(CSSParserValueList*, RefPtr<CSSValue>&, CSSGradientRepeat repeating);
     183    bool parseRadialGradient(CSSParserValueList*, RefPtr<CSSValue>&, CSSGradientRepeat repeating);
    184184    bool parseGradientColorStops(CSSParserValueList*, CSSGradientValue*, bool expectComma);
     185
     186    bool parseCrossfade(CSSParserValueList*, RefPtr<CSSValue>&);
    185187
    186188#if ENABLE(CSS_FILTERS)
     
    318320
    319321    bool isGeneratedImageValue(CSSParserValue*) const;
    320     bool parseGeneratedImage(RefPtr<CSSValue>&);
     322    bool parseGeneratedImage(CSSParserValueList*, RefPtr<CSSValue>&);
    321323
    322324    bool parseValue(CSSMutableStyleDeclaration*, int propId, const String&, bool important);
Note: See TracChangeset for help on using the changeset viewer.