Changeset 98775 in webkit
- Timestamp:
- Oct 28, 2011 4:08:51 PM (13 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r98773 r98775 1 2011-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 1 14 2011-10-28 Chris Marrin <cmarrin@apple.com> 2 15 -
trunk/Source/WebCore/ChangeLog
r98774 r98775 1 2011-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 1 45 2011-10-28 Dan Bernstein <mitz@apple.com> 2 46 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r98755 r98775 685 685 2BE8E2C912A58A0100FAD550 /* HTMLMetaCharsetParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2BE8E2C812A58A0100FAD550 /* HTMLMetaCharsetParser.cpp */; }; 686 686 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 */; }; 687 689 2D9066060BE141D400956998 /* LayoutState.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2D9066040BE141D400956998 /* LayoutState.cpp */; }; 688 690 2D9066070BE141D400956998 /* LayoutState.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D9066050BE141D400956998 /* LayoutState.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 7753 7755 2BE8E2C812A58A0100FAD550 /* HTMLMetaCharsetParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HTMLMetaCharsetParser.cpp; path = parser/HTMLMetaCharsetParser.cpp; sourceTree = "<group>"; }; 7754 7756 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>"; }; 7755 7759 2D9066040BE141D400956998 /* LayoutState.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = LayoutState.cpp; sourceTree = "<group>"; }; 7756 7760 2D9066050BE141D400956998 /* LayoutState.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = LayoutState.h; sourceTree = "<group>"; }; … … 20460 20464 A80E6CCF0A1989CA007FB8C5 /* CSSCharsetRule.h */, 20461 20465 85C56CAC0AA89F8E00D95755 /* CSSCharsetRule.idl */, 20466 2D8FEBDA143E3EF70072502B /* CSSCrossfadeValue.cpp */, 20467 2D8FEBDB143E3EF70072502B /* CSSCrossfadeValue.h */, 20462 20468 BCEA477C097CAAC80094C9E4 /* CSSComputedStyleDeclaration.cpp */, 20463 20469 BCEA477D097CAAC80094C9E4 /* CSSComputedStyleDeclaration.h */, … … 24545 24551 9B3A8872145632F9003AE8F5 /* DOMDOMSettableTokenList.h in Headers */, 24546 24552 FD62F52E145898D80094B0ED /* AudioSourceProviderClient.h in Headers */, 24553 2D8FEBDD143E3EF70072502B /* CSSCrossfadeValue.h in Headers */, 24547 24554 ); 24548 24555 runOnlyForDeploymentPostprocessing = 0; … … 27392 27399 A0EE0DF7144F825500F80B0D /* WebGLDebugShaders.cpp in Sources */, 27393 27400 A3BB59F31457A40D00AC56FE /* DocumentEventQueue.cpp in Sources */, 27401 2D8FEBDC143E3EF70072502B /* CSSCrossfadeValue.cpp in Sources */, 27394 27402 ); 27395 27403 runOnlyForDeploymentPostprocessing = 0; -
trunk/Source/WebCore/css/CSSParser.cpp
r98714 r98775 29 29 #include "CSSCanvasValue.h" 30 30 #include "CSSCharsetRule.h" 31 #include "CSSCrossfadeValue.h" 31 32 #include "CSSCursorImageValue.h" 32 33 #include "CSSFlexValue.h" … … 1214 1215 } 1215 1216 } else if (isGeneratedImageValue(value)) { 1216 if (parseGeneratedImage( parsedValue))1217 if (parseGeneratedImage(m_valueList, parsedValue)) 1217 1218 m_valueList->next(); 1218 1219 else … … 2730 2731 return false; 2731 2732 } else if (isGeneratedImageValue(val)) { 2732 if (!parseGeneratedImage( parsedValue))2733 if (!parseGeneratedImage(m_valueList, parsedValue)) 2733 2734 return false; 2734 2735 } else … … 2802 2803 } 2803 2804 2804 bool CSSParser::parseFillImage( RefPtr<CSSValue>& value)2805 { 2806 if ( m_valueList->current()->id == CSSValueNone) {2805 bool CSSParser::parseFillImage(CSSParserValueList* valueList, RefPtr<CSSValue>& value) 2806 { 2807 if (valueList->current()->id == CSSValueNone) { 2807 2808 value = CSSImageValue::create(); 2808 2809 return true; 2809 2810 } 2810 if ( m_valueList->current()->unit == CSSPrimitiveValue::CSS_URI) {2811 if (valueList->current()->unit == CSSPrimitiveValue::CSS_URI) { 2811 2812 // FIXME: The completeURL call should be done when using the CSSImageValue, 2812 2813 // not when creating it. 2813 2814 if (m_styleSheet) 2814 value = CSSImageValue::create(m_styleSheet->completeURL( m_valueList->current()->string));2815 value = CSSImageValue::create(m_styleSheet->completeURL(valueList->current()->string)); 2815 2816 return true; 2816 2817 } 2817 2818 2818 if (isGeneratedImageValue( m_valueList->current()))2819 return parseGeneratedImage(value );2819 if (isGeneratedImageValue(valueList->current())) 2820 return parseGeneratedImage(valueList, value); 2820 2821 2821 2822 return false; … … 3079 3080 case CSSPropertyBackgroundImage: 3080 3081 case CSSPropertyWebkitMaskImage: 3081 if (parseFillImage( currValue))3082 if (parseFillImage(m_valueList, currValue)) 3082 3083 m_valueList->next(); 3083 3084 break; … … 5267 5268 } else if (isGeneratedImageValue(val)) { 5268 5269 RefPtr<CSSValue> value; 5269 if (parseGeneratedImage( value))5270 if (parseGeneratedImage(m_valueList, value)) 5270 5271 context.commitImage(value); 5271 5272 else … … 5773 5774 } 5774 5775 5775 bool CSSParser::parseDeprecatedGradient( RefPtr<CSSValue>& gradient)5776 bool CSSParser::parseDeprecatedGradient(CSSParserValueList* valueList, RefPtr<CSSValue>& gradient) 5776 5777 { 5777 5778 // Walk the arguments. 5778 CSSParserValueList* args = m_valueList->current()->function->args.get();5779 CSSParserValueList* args = valueList->current()->function->args.get(); 5779 5780 if (!args || args->size() == 0) 5780 5781 return false; … … 5932 5933 } 5933 5934 5934 bool CSSParser::parseLinearGradient( RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating)5935 bool CSSParser::parseLinearGradient(CSSParserValueList* valueList, RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating) 5935 5936 { 5936 5937 RefPtr<CSSLinearGradientValue> result = CSSLinearGradientValue::create(repeating); 5937 5938 5938 5939 // Walk the arguments. 5939 CSSParserValueList* args = m_valueList->current()->function->args.get();5940 CSSParserValueList* args = valueList->current()->function->args.get(); 5940 5941 if (!args || !args->size()) 5941 5942 return false; … … 6002 6003 } 6003 6004 6004 bool CSSParser::parseRadialGradient( RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating)6005 bool CSSParser::parseRadialGradient(CSSParserValueList* valueList, RefPtr<CSSValue>& gradient, CSSGradientRepeat repeating) 6005 6006 { 6006 6007 RefPtr<CSSRadialGradientValue> result = CSSRadialGradientValue::create(repeating); 6007 6008 6008 6009 // Walk the arguments. 6009 CSSParserValueList* args = m_valueList->current()->function->args.get();6010 CSSParserValueList* args = valueList->current()->function->args.get(); 6010 6011 if (!args || !args->size()) 6011 6012 return false; … … 6169 6170 || equalIgnoringCase(val->function->name, "-webkit-radial-gradient(") 6170 6171 || 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 6176 bool CSSParser::parseGeneratedImage(CSSParserValueList* valueList, RefPtr<CSSValue>& value) 6177 { 6178 CSSParserValue* val = valueList->current(); 6177 6179 6178 6180 if (val->unit != CSSParserValue::Function) … … 6180 6182 6181 6183 if (equalIgnoringCase(val->function->name, "-webkit-gradient(")) 6182 return parseDeprecatedGradient(value );6184 return parseDeprecatedGradient(valueList, value); 6183 6185 6184 6186 if (equalIgnoringCase(val->function->name, "-webkit-linear-gradient(")) 6185 return parseLinearGradient(value , NonRepeating);6187 return parseLinearGradient(valueList, value, NonRepeating); 6186 6188 6187 6189 if (equalIgnoringCase(val->function->name, "-webkit-repeating-linear-gradient(")) 6188 return parseLinearGradient(value , Repeating);6190 return parseLinearGradient(valueList, value, Repeating); 6189 6191 6190 6192 if (equalIgnoringCase(val->function->name, "-webkit-radial-gradient(")) 6191 return parseRadialGradient(value , NonRepeating);6193 return parseRadialGradient(valueList, value, NonRepeating); 6192 6194 6193 6195 if (equalIgnoringCase(val->function->name, "-webkit-repeating-radial-gradient(")) 6194 return parseRadialGradient(value , Repeating);6196 return parseRadialGradient(valueList, value, Repeating); 6195 6197 6196 6198 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); 6198 6203 6199 6204 return false; 6200 6205 } 6201 6206 6202 bool CSSParser::parseCanvas(RefPtr<CSSValue>& canvas) 6207 bool 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 6251 bool CSSParser::parseCanvas(CSSParserValueList* valueList, RefPtr<CSSValue>& canvas) 6203 6252 { 6204 6253 RefPtr<CSSCanvasValue> result = CSSCanvasValue::create(); 6205 6254 6206 6255 // Walk the arguments. 6207 CSSParserValueList* args = m_valueList->current()->function->args.get();6256 CSSParserValueList* args = valueList->current()->function->args.get(); 6208 6257 if (!args || args->size() != 1) 6209 6258 return false; -
trunk/Source/WebCore/css/CSSParser.h
r98714 r98775 92 92 PassRefPtr<CSSValue> parseBackgroundColor(); 93 93 94 bool parseFillImage( RefPtr<CSSValue>&);94 bool parseFillImage(CSSParserValueList*, RefPtr<CSSValue>&); 95 95 96 96 enum FillPositionFlag { InvalidFillPosition = 0, AmbiguousFillPosition = 1, XFillPosition = 2, YFillPosition = 4 }; … … 177 177 178 178 // 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); 184 184 bool parseGradientColorStops(CSSParserValueList*, CSSGradientValue*, bool expectComma); 185 186 bool parseCrossfade(CSSParserValueList*, RefPtr<CSSValue>&); 185 187 186 188 #if ENABLE(CSS_FILTERS) … … 318 320 319 321 bool isGeneratedImageValue(CSSParserValue*) const; 320 bool parseGeneratedImage( RefPtr<CSSValue>&);322 bool parseGeneratedImage(CSSParserValueList*, RefPtr<CSSValue>&); 321 323 322 324 bool parseValue(CSSMutableStyleDeclaration*, int propId, const String&, bool important);
Note: See TracChangeset
for help on using the changeset viewer.