OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2004 Zack Rusin <zack@kde.org> | |
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc.
All rights reserved. | |
4 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | |
5 * Copyright (C) 2007 Nicholas Shanks <webkit@nickshanks.com> | |
6 * Copyright (C) 2011 Sencha, Inc. All rights reserved. | |
7 * Copyright (C) 2015 Google Inc. All rights reserved. | |
8 * | |
9 * This library is free software; you can redistribute it and/or | |
10 * modify it under the terms of the GNU Lesser General Public | |
11 * License as published by the Free Software Foundation; either | |
12 * version 2 of the License, or (at your option) any later version. | |
13 * | |
14 * This library is distributed in the hope that it will be useful, | |
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * Lesser General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU Lesser General Public | |
20 * License along with this library; if not, write to the Free Software | |
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
22 * 02110-1301 USA | |
23 */ | |
24 | |
25 #include "config.h" | |
26 #include "core/css/LayoutStyleCSSValueMapping.h" | |
27 | |
28 #include "core/StylePropertyShorthand.h" | |
29 #include "core/css/BasicShapeFunctions.h" | |
30 #include "core/css/CSSBorderImage.h" | |
31 #include "core/css/CSSBorderImageSliceValue.h" | |
32 #include "core/css/CSSFontFeatureValue.h" | |
33 #include "core/css/CSSFontValue.h" | |
34 #include "core/css/CSSFunctionValue.h" | |
35 #include "core/css/CSSGridLineNamesValue.h" | |
36 #include "core/css/CSSGridTemplateAreasValue.h" | |
37 #include "core/css/CSSPathValue.h" | |
38 #include "core/css/CSSPrimitiveValueMappings.h" | |
39 #include "core/css/CSSReflectValue.h" | |
40 #include "core/css/CSSShadowValue.h" | |
41 #include "core/css/CSSTimingFunctionValue.h" | |
42 #include "core/css/CSSValueList.h" | |
43 #include "core/css/CSSValuePool.h" | |
44 #include "core/css/Pair.h" | |
45 #include "core/css/Rect.h" | |
46 #include "core/layout/LayoutBlock.h" | |
47 #include "core/layout/LayoutBox.h" | |
48 #include "core/layout/LayoutGrid.h" | |
49 #include "core/layout/LayoutObject.h" | |
50 #include "core/layout/style/ContentData.h" | |
51 #include "core/layout/style/LayoutStyle.h" | |
52 #include "core/layout/style/PathStyleMotionPath.h" | |
53 #include "core/layout/style/ShadowList.h" | |
54 #include "platform/LengthFunctions.h" | |
55 | |
56 namespace blink { | |
57 | |
58 inline static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> zoomAdjustedPixelValue(d
ouble value, const LayoutStyle& style) | |
59 { | |
60 return cssValuePool().createValue(adjustFloatForAbsoluteZoom(value, style),
CSSPrimitiveValue::CSS_PX); | |
61 } | |
62 | |
63 inline static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> zoomAdjustedNumberValue(
double value, const LayoutStyle& style) | |
64 { | |
65 return cssValuePool().createValue(value / style.effectiveZoom(), CSSPrimitiv
eValue::CSS_NUMBER); | |
66 } | |
67 | |
68 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> zoomAdjustedPixelValueForLength
(const Length& length, const LayoutStyle& style) | |
69 { | |
70 if (length.isFixed()) | |
71 return zoomAdjustedPixelValue(length.value(), style); | |
72 return cssValuePool().createValue(length, style); | |
73 } | |
74 | |
75 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> pixelValueForUnzoomedLength(con
st UnzoomedLength& unzoomedLength, const LayoutStyle& style) | |
76 { | |
77 const Length& length = unzoomedLength.length(); | |
78 if (length.isFixed()) | |
79 return cssValuePool().createValue(length.value(), CSSPrimitiveValue::CSS
_PX); | |
80 return cssValuePool().createValue(length, style); | |
81 } | |
82 | |
83 static PassRefPtrWillBeRawPtr<CSSValueList> createPositionListForLayer(CSSProper
tyID propertyID, const FillLayer& layer, const LayoutStyle& style) | |
84 { | |
85 RefPtrWillBeRawPtr<CSSValueList> positionList = CSSValueList::createSpaceSep
arated(); | |
86 if (layer.isBackgroundXOriginSet()) { | |
87 ASSERT_UNUSED(propertyID, propertyID == CSSPropertyBackgroundPosition ||
propertyID == CSSPropertyWebkitMaskPosition); | |
88 positionList->append(cssValuePool().createValue(layer.backgroundXOrigin(
))); | |
89 } | |
90 positionList->append(zoomAdjustedPixelValueForLength(layer.xPosition(), styl
e)); | |
91 if (layer.isBackgroundYOriginSet()) { | |
92 ASSERT(propertyID == CSSPropertyBackgroundPosition || propertyID == CSSP
ropertyWebkitMaskPosition); | |
93 positionList->append(cssValuePool().createValue(layer.backgroundYOrigin(
))); | |
94 } | |
95 positionList->append(zoomAdjustedPixelValueForLength(layer.yPosition(), styl
e)); | |
96 return positionList.release(); | |
97 } | |
98 | |
99 PassRefPtrWillBeRawPtr<CSSPrimitiveValue> LayoutStyleCSSValueMapping::currentCol
orOrValidColor(const LayoutStyle& style, const StyleColor& color) | |
100 { | |
101 // This function does NOT look at visited information, so that computed styl
e doesn't expose that. | |
102 return cssValuePool().createColorValue(color.resolve(style.color()).rgb()); | |
103 } | |
104 | |
105 static PassRefPtrWillBeRawPtr<CSSValue> valueForFillSize(const FillSize& fillSiz
e, const LayoutStyle& style) | |
106 { | |
107 if (fillSize.type == Contain) | |
108 return cssValuePool().createIdentifierValue(CSSValueContain); | |
109 | |
110 if (fillSize.type == Cover) | |
111 return cssValuePool().createIdentifierValue(CSSValueCover); | |
112 | |
113 if (fillSize.size.height().isAuto()) | |
114 return zoomAdjustedPixelValueForLength(fillSize.size.width(), style); | |
115 | |
116 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
117 list->append(zoomAdjustedPixelValueForLength(fillSize.size.width(), style)); | |
118 list->append(zoomAdjustedPixelValueForLength(fillSize.size.height(), style))
; | |
119 return list.release(); | |
120 } | |
121 | |
122 static PassRefPtrWillBeRawPtr<CSSValue> valueForFillRepeat(EFillRepeat xRepeat,
EFillRepeat yRepeat) | |
123 { | |
124 // For backwards compatibility, if both values are equal, just return one of
them. And | |
125 // if the two values are equivalent to repeat-x or repeat-y, just return the
shorthand. | |
126 if (xRepeat == yRepeat) | |
127 return cssValuePool().createValue(xRepeat); | |
128 if (xRepeat == RepeatFill && yRepeat == NoRepeatFill) | |
129 return cssValuePool().createIdentifierValue(CSSValueRepeatX); | |
130 if (xRepeat == NoRepeatFill && yRepeat == RepeatFill) | |
131 return cssValuePool().createIdentifierValue(CSSValueRepeatY); | |
132 | |
133 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
134 list->append(cssValuePool().createValue(xRepeat)); | |
135 list->append(cssValuePool().createValue(yRepeat)); | |
136 return list.release(); | |
137 } | |
138 | |
139 static PassRefPtrWillBeRawPtr<CSSValue> valueForFillSourceType(EMaskSourceType t
ype) | |
140 { | |
141 switch (type) { | |
142 case MaskAlpha: | |
143 return cssValuePool().createValue(CSSValueAlpha); | |
144 case MaskLuminance: | |
145 return cssValuePool().createValue(CSSValueLuminance); | |
146 } | |
147 | |
148 ASSERT_NOT_REACHED(); | |
149 | |
150 return nullptr; | |
151 } | |
152 | |
153 static PassRefPtrWillBeRawPtr<CSSValue> valueForPositionOffset(const LayoutStyle
& style, CSSPropertyID propertyID, const LayoutObject* renderer) | |
154 { | |
155 Length offset; | |
156 switch (propertyID) { | |
157 case CSSPropertyLeft: | |
158 offset = style.left(); | |
159 break; | |
160 case CSSPropertyRight: | |
161 offset = style.right(); | |
162 break; | |
163 case CSSPropertyTop: | |
164 offset = style.top(); | |
165 break; | |
166 case CSSPropertyBottom: | |
167 offset = style.bottom(); | |
168 break; | |
169 default: | |
170 return nullptr; | |
171 } | |
172 | |
173 if (offset.isPercent() && renderer && renderer->isBox()) { | |
174 LayoutUnit containingBlockSize = (propertyID == CSSPropertyLeft || prope
rtyID == CSSPropertyRight) ? | |
175 toLayoutBox(renderer)->containingBlockLogicalWidthForContent() : | |
176 toLayoutBox(renderer)->containingBlockLogicalHeightForContent(Exclud
eMarginBorderPadding); | |
177 return zoomAdjustedPixelValue(valueForLength(offset, containingBlockSize
), style); | |
178 } | |
179 if (offset.isAuto()) { | |
180 // FIXME: It's not enough to simply return "auto" values for one offset
if the other side is defined. | |
181 // In other words if left is auto and right is not auto, then left's com
puted value is negative right(). | |
182 // So we should get the opposite length unit and see if it is auto. | |
183 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
184 } | |
185 | |
186 return zoomAdjustedPixelValueForLength(offset, style); | |
187 } | |
188 | |
189 static PassRefPtrWillBeRawPtr<CSSBorderImageSliceValue> valueForNinePieceImageSl
ice(const NinePieceImage& image) | |
190 { | |
191 // Create the slices. | |
192 RefPtrWillBeRawPtr<CSSPrimitiveValue> top = nullptr; | |
193 RefPtrWillBeRawPtr<CSSPrimitiveValue> right = nullptr; | |
194 RefPtrWillBeRawPtr<CSSPrimitiveValue> bottom = nullptr; | |
195 RefPtrWillBeRawPtr<CSSPrimitiveValue> left = nullptr; | |
196 | |
197 if (image.imageSlices().top().isPercent()) | |
198 top = cssValuePool().createValue(image.imageSlices().top().value(), CSSP
rimitiveValue::CSS_PERCENTAGE); | |
199 else | |
200 top = cssValuePool().createValue(image.imageSlices().top().value(), CSSP
rimitiveValue::CSS_NUMBER); | |
201 | |
202 if (image.imageSlices().right() == image.imageSlices().top() && image.imageS
lices().bottom() == image.imageSlices().top() | |
203 && image.imageSlices().left() == image.imageSlices().top()) { | |
204 right = top; | |
205 bottom = top; | |
206 left = top; | |
207 } else { | |
208 if (image.imageSlices().right().isPercent()) | |
209 right = cssValuePool().createValue(image.imageSlices().right().value
(), CSSPrimitiveValue::CSS_PERCENTAGE); | |
210 else | |
211 right = cssValuePool().createValue(image.imageSlices().right().value
(), CSSPrimitiveValue::CSS_NUMBER); | |
212 | |
213 if (image.imageSlices().bottom() == image.imageSlices().top() && image.i
mageSlices().right() == image.imageSlices().left()) { | |
214 bottom = top; | |
215 left = right; | |
216 } else { | |
217 if (image.imageSlices().bottom().isPercent()) | |
218 bottom = cssValuePool().createValue(image.imageSlices().bottom()
.value(), CSSPrimitiveValue::CSS_PERCENTAGE); | |
219 else | |
220 bottom = cssValuePool().createValue(image.imageSlices().bottom()
.value(), CSSPrimitiveValue::CSS_NUMBER); | |
221 | |
222 if (image.imageSlices().left() == image.imageSlices().right()) { | |
223 left = right; | |
224 } else { | |
225 if (image.imageSlices().left().isPercent()) | |
226 left = cssValuePool().createValue(image.imageSlices().left()
.value(), CSSPrimitiveValue::CSS_PERCENTAGE); | |
227 else | |
228 left = cssValuePool().createValue(image.imageSlices().left()
.value(), CSSPrimitiveValue::CSS_NUMBER); | |
229 } | |
230 } | |
231 } | |
232 | |
233 RefPtrWillBeRawPtr<Quad> quad = Quad::create(); | |
234 quad->setTop(top); | |
235 quad->setRight(right); | |
236 quad->setBottom(bottom); | |
237 quad->setLeft(left); | |
238 | |
239 return CSSBorderImageSliceValue::create(cssValuePool().createValue(quad.rele
ase()), image.fill()); | |
240 } | |
241 | |
242 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForNinePieceImageQuad(cons
t BorderImageLengthBox& box, const LayoutStyle& style) | |
243 { | |
244 // Create the slices. | |
245 RefPtrWillBeRawPtr<CSSPrimitiveValue> top = nullptr; | |
246 RefPtrWillBeRawPtr<CSSPrimitiveValue> right = nullptr; | |
247 RefPtrWillBeRawPtr<CSSPrimitiveValue> bottom = nullptr; | |
248 RefPtrWillBeRawPtr<CSSPrimitiveValue> left = nullptr; | |
249 | |
250 if (box.top().isNumber()) | |
251 top = cssValuePool().createValue(box.top().number(), CSSPrimitiveValue::
CSS_NUMBER); | |
252 else | |
253 top = cssValuePool().createValue(box.top().length(), style); | |
254 | |
255 if (box.right() == box.top() && box.bottom() == box.top() && box.left() == b
ox.top()) { | |
256 right = top; | |
257 bottom = top; | |
258 left = top; | |
259 } else { | |
260 if (box.right().isNumber()) | |
261 right = cssValuePool().createValue(box.right().number(), CSSPrimitiv
eValue::CSS_NUMBER); | |
262 else | |
263 right = cssValuePool().createValue(box.right().length(), style); | |
264 | |
265 if (box.bottom() == box.top() && box.right() == box.left()) { | |
266 bottom = top; | |
267 left = right; | |
268 } else { | |
269 if (box.bottom().isNumber()) | |
270 bottom = cssValuePool().createValue(box.bottom().number(), CSSPr
imitiveValue::CSS_NUMBER); | |
271 else | |
272 bottom = cssValuePool().createValue(box.bottom().length(), style
); | |
273 | |
274 if (box.left() == box.right()) { | |
275 left = right; | |
276 } else { | |
277 if (box.left().isNumber()) | |
278 left = cssValuePool().createValue(box.left().number(), CSSPr
imitiveValue::CSS_NUMBER); | |
279 else | |
280 left = cssValuePool().createValue(box.left().length(), style
); | |
281 } | |
282 } | |
283 } | |
284 | |
285 RefPtrWillBeRawPtr<Quad> quad = Quad::create(); | |
286 quad->setTop(top); | |
287 quad->setRight(right); | |
288 quad->setBottom(bottom); | |
289 quad->setLeft(left); | |
290 | |
291 return cssValuePool().createValue(quad.release()); | |
292 } | |
293 | |
294 static CSSValueID valueForRepeatRule(int rule) | |
295 { | |
296 switch (rule) { | |
297 case RepeatImageRule: | |
298 return CSSValueRepeat; | |
299 case RoundImageRule: | |
300 return CSSValueRound; | |
301 case SpaceImageRule: | |
302 return CSSValueSpace; | |
303 default: | |
304 return CSSValueStretch; | |
305 } | |
306 } | |
307 | |
308 static PassRefPtrWillBeRawPtr<CSSValue> valueForNinePieceImageRepeat(const NineP
ieceImage& image) | |
309 { | |
310 RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalRepeat = nullptr; | |
311 RefPtrWillBeRawPtr<CSSPrimitiveValue> verticalRepeat = nullptr; | |
312 | |
313 horizontalRepeat = cssValuePool().createIdentifierValue(valueForRepeatRule(i
mage.horizontalRule())); | |
314 if (image.horizontalRule() == image.verticalRule()) | |
315 verticalRepeat = horizontalRepeat; | |
316 else | |
317 verticalRepeat = cssValuePool().createIdentifierValue(valueForRepeatRule
(image.verticalRule())); | |
318 return cssValuePool().createValue(Pair::create(horizontalRepeat.release(), v
erticalRepeat.release(), Pair::DropIdenticalValues)); | |
319 } | |
320 | |
321 static PassRefPtrWillBeRawPtr<CSSValue> valueForNinePieceImage(const NinePieceIm
age& image, const LayoutStyle& style) | |
322 { | |
323 if (!image.hasImage()) | |
324 return cssValuePool().createIdentifierValue(CSSValueNone); | |
325 | |
326 // Image first. | |
327 RefPtrWillBeRawPtr<CSSValue> imageValue = nullptr; | |
328 if (image.image()) | |
329 imageValue = image.image()->cssValue(); | |
330 | |
331 // Create the image slice. | |
332 RefPtrWillBeRawPtr<CSSBorderImageSliceValue> imageSlices = valueForNinePiece
ImageSlice(image); | |
333 | |
334 // Create the border area slices. | |
335 RefPtrWillBeRawPtr<CSSValue> borderSlices = valueForNinePieceImageQuad(image
.borderSlices(), style); | |
336 | |
337 // Create the border outset. | |
338 RefPtrWillBeRawPtr<CSSValue> outset = valueForNinePieceImageQuad(image.outse
t(), style); | |
339 | |
340 // Create the repeat rules. | |
341 RefPtrWillBeRawPtr<CSSValue> repeat = valueForNinePieceImageRepeat(image); | |
342 | |
343 return createBorderImageValue(imageValue.release(), imageSlices.release(), b
orderSlices.release(), outset.release(), repeat.release()); | |
344 } | |
345 | |
346 static PassRefPtrWillBeRawPtr<CSSValue> valueForReflection(const StyleReflection
* reflection, const LayoutStyle& style) | |
347 { | |
348 if (!reflection) | |
349 return cssValuePool().createIdentifierValue(CSSValueNone); | |
350 | |
351 RefPtrWillBeRawPtr<CSSPrimitiveValue> offset = nullptr; | |
352 if (reflection->offset().isPercent()) | |
353 offset = cssValuePool().createValue(reflection->offset().percent(), CSSP
rimitiveValue::CSS_PERCENTAGE); | |
354 else | |
355 offset = zoomAdjustedPixelValue(reflection->offset().value(), style); | |
356 | |
357 RefPtrWillBeRawPtr<CSSPrimitiveValue> direction = nullptr; | |
358 switch (reflection->direction()) { | |
359 case ReflectionBelow: | |
360 direction = cssValuePool().createIdentifierValue(CSSValueBelow); | |
361 break; | |
362 case ReflectionAbove: | |
363 direction = cssValuePool().createIdentifierValue(CSSValueAbove); | |
364 break; | |
365 case ReflectionLeft: | |
366 direction = cssValuePool().createIdentifierValue(CSSValueLeft); | |
367 break; | |
368 case ReflectionRight: | |
369 direction = cssValuePool().createIdentifierValue(CSSValueRight); | |
370 break; | |
371 } | |
372 | |
373 return CSSReflectValue::create(direction.release(), offset.release(), valueF
orNinePieceImage(reflection->mask(), style)); | |
374 } | |
375 | |
376 static ItemPosition resolveAlignmentAuto(ItemPosition position, Node* element) | |
377 { | |
378 if (position != ItemPositionAuto) | |
379 return position; | |
380 | |
381 bool isFlexOrGrid = element && element->computedStyle() | |
382 && element->computedStyle()->isDisplayFlexibleOrGridBox(); | |
383 | |
384 return isFlexOrGrid ? ItemPositionStretch : ItemPositionStart; | |
385 } | |
386 | |
387 static PassRefPtrWillBeRawPtr<CSSValueList> valueForItemPositionWithOverflowAlig
nment(ItemPosition itemPosition, OverflowAlignment overflowAlignment, ItemPositi
onType positionType) | |
388 { | |
389 RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated
(); | |
390 if (positionType == LegacyPosition) | |
391 result->append(CSSPrimitiveValue::createIdentifier(CSSValueLegacy)); | |
392 result->append(CSSPrimitiveValue::create(itemPosition)); | |
393 if (itemPosition >= ItemPositionCenter && overflowAlignment != OverflowAlign
mentDefault) | |
394 result->append(CSSPrimitiveValue::create(overflowAlignment)); | |
395 ASSERT(result->length() <= 2); | |
396 return result.release(); | |
397 } | |
398 | |
399 static PassRefPtrWillBeRawPtr<CSSValueList> valuesForGridShorthand(const StylePr
opertyShorthand& shorthand, const LayoutStyle& style, const LayoutObject* render
er, Node* styledNode, bool allowVisitedStyle) | |
400 { | |
401 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSlashSeparated()
; | |
402 for (size_t i = 0; i < shorthand.length(); ++i) { | |
403 RefPtrWillBeRawPtr<CSSValue> value = LayoutStyleCSSValueMapping::get(sho
rthand.properties()[i], style, renderer, styledNode, allowVisitedStyle); | |
404 ASSERT(value); | |
405 list->append(value.release()); | |
406 } | |
407 return list.release(); | |
408 } | |
409 | |
410 static PassRefPtrWillBeRawPtr<CSSValueList> valuesForShorthandProperty(const Sty
lePropertyShorthand& shorthand, const LayoutStyle& style, const LayoutObject* re
nderer, Node* styledNode, bool allowVisitedStyle) | |
411 { | |
412 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
413 for (size_t i = 0; i < shorthand.length(); ++i) { | |
414 RefPtrWillBeRawPtr<CSSValue> value = LayoutStyleCSSValueMapping::get(sho
rthand.properties()[i], style, renderer, styledNode, allowVisitedStyle); | |
415 ASSERT(value); | |
416 list->append(value); | |
417 } | |
418 return list.release(); | |
419 } | |
420 | |
421 static PassRefPtrWillBeRawPtr<CSSValueList> valuesForBackgroundShorthand(const L
ayoutStyle& style, const LayoutObject* renderer, Node* styledNode, bool allowVis
itedStyle) | |
422 { | |
423 RefPtrWillBeRawPtr<CSSValueList> ret = CSSValueList::createCommaSeparated(); | |
424 const FillLayer* currLayer = &style.backgroundLayers(); | |
425 for (; currLayer; currLayer = currLayer->next()) { | |
426 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSlashSeparat
ed(); | |
427 RefPtrWillBeRawPtr<CSSValueList> beforeSlash = CSSValueList::createSpace
Separated(); | |
428 if (!currLayer->next()) { // color only for final layer | |
429 RefPtrWillBeRawPtr<CSSValue> value = LayoutStyleCSSValueMapping::get
(CSSPropertyBackgroundColor, style, renderer, styledNode, allowVisitedStyle); | |
430 ASSERT(value); | |
431 beforeSlash->append(value); | |
432 } | |
433 beforeSlash->append(currLayer->image() ? currLayer->image()->cssValue()
: cssValuePool().createIdentifierValue(CSSValueNone)); | |
434 beforeSlash->append(valueForFillRepeat(currLayer->repeatX(), currLayer->
repeatY())); | |
435 beforeSlash->append(cssValuePool().createValue(currLayer->attachment()))
; | |
436 beforeSlash->append(createPositionListForLayer(CSSPropertyBackgroundPosi
tion, *currLayer, style)); | |
437 list->append(beforeSlash); | |
438 RefPtrWillBeRawPtr<CSSValueList> afterSlash = CSSValueList::createSpaceS
eparated(); | |
439 afterSlash->append(valueForFillSize(currLayer->size(), style)); | |
440 afterSlash->append(cssValuePool().createValue(currLayer->origin())); | |
441 afterSlash->append(cssValuePool().createValue(currLayer->clip())); | |
442 list->append(afterSlash); | |
443 ret->append(list); | |
444 } | |
445 return ret.release(); | |
446 } | |
447 | |
448 static ContentPosition resolveContentAlignmentAuto(ContentPosition position, Con
tentDistributionType distribution, Node* element) | |
449 { | |
450 if (position != ContentPositionAuto || distribution != ContentDistributionDe
fault) | |
451 return position; | |
452 | |
453 bool isFlex = element && element->computedStyle() | |
454 && element->computedStyle()->isDisplayFlexibleBox(); | |
455 | |
456 return isFlex ? ContentPositionFlexStart : ContentPositionStart; | |
457 } | |
458 | |
459 static PassRefPtrWillBeRawPtr<CSSValueList> valueForContentPositionAndDistributi
onWithOverflowAlignment(ContentPosition position, OverflowAlignment overflowAlig
nment, ContentDistributionType distribution) | |
460 { | |
461 RefPtrWillBeRawPtr<CSSValueList> result = CSSValueList::createSpaceSeparated
(); | |
462 if (distribution != ContentDistributionDefault) | |
463 result->append(CSSPrimitiveValue::create(distribution)); | |
464 if (distribution == ContentDistributionDefault || position != ContentPositio
nAuto) | |
465 result->append(CSSPrimitiveValue::create(position)); | |
466 if ((position >= ContentPositionCenter || distribution != ContentDistributio
nDefault) && overflowAlignment != OverflowAlignmentDefault) | |
467 result->append(CSSPrimitiveValue::create(overflowAlignment)); | |
468 ASSERT(result->length() > 0); | |
469 ASSERT(result->length() <= 3); | |
470 return result.release(); | |
471 } | |
472 | |
473 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForLineHeight(const Layout
Style& style) | |
474 { | |
475 Length length = style.lineHeight(); | |
476 if (length.isNegative()) | |
477 return cssValuePool().createIdentifierValue(CSSValueNormal); | |
478 | |
479 float floatValue = floatValueForLength(length, style.fontDescription().speci
fiedSize()); | |
480 if (length.isPercent()) | |
481 return cssValuePool().createValue(floatValue, CSSPrimitiveValue::CSS_PX)
; | |
482 | |
483 return zoomAdjustedPixelValue(floatValue, style); | |
484 } | |
485 | |
486 static CSSValueID identifierForFamily(const AtomicString& family) | |
487 { | |
488 if (family == FontFamilyNames::webkit_cursive) | |
489 return CSSValueCursive; | |
490 if (family == FontFamilyNames::webkit_fantasy) | |
491 return CSSValueFantasy; | |
492 if (family == FontFamilyNames::webkit_monospace) | |
493 return CSSValueMonospace; | |
494 if (family == FontFamilyNames::webkit_pictograph) | |
495 return CSSValueWebkitPictograph; | |
496 if (family == FontFamilyNames::webkit_sans_serif) | |
497 return CSSValueSansSerif; | |
498 if (family == FontFamilyNames::webkit_serif) | |
499 return CSSValueSerif; | |
500 return CSSValueInvalid; | |
501 } | |
502 | |
503 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFamily(const AtomicStri
ng& family) | |
504 { | |
505 if (CSSValueID familyIdentifier = identifierForFamily(family)) | |
506 return cssValuePool().createIdentifierValue(familyIdentifier); | |
507 return cssValuePool().createValue(family.string(), CSSPrimitiveValue::CSS_CU
STOM_IDENT); | |
508 } | |
509 | |
510 static PassRefPtrWillBeRawPtr<CSSValueList> valueForFontFamily(const LayoutStyle
& style) | |
511 { | |
512 const FontFamily& firstFamily = style.fontDescription().family(); | |
513 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated()
; | |
514 for (const FontFamily* family = &firstFamily; family; family = family->next(
)) | |
515 list->append(valueForFamily(family->family())); | |
516 return list.release(); | |
517 } | |
518 | |
519 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFontSize(const LayoutSt
yle& style) | |
520 { | |
521 return zoomAdjustedPixelValue(style.fontDescription().computedSize(), style)
; | |
522 } | |
523 | |
524 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFontStretch(const Layou
tStyle& style) | |
525 { | |
526 return cssValuePool().createValue(style.fontDescription().stretch()); | |
527 } | |
528 | |
529 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFontStyle(const LayoutS
tyle& style) | |
530 { | |
531 return cssValuePool().createValue(style.fontDescription().style()); | |
532 } | |
533 | |
534 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFontVariant(const Layou
tStyle& style) | |
535 { | |
536 return cssValuePool().createValue(style.fontDescription().variant()); | |
537 } | |
538 | |
539 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> valueForFontWeight(const Layout
Style& style) | |
540 { | |
541 return cssValuePool().createValue(style.fontDescription().weight()); | |
542 } | |
543 | |
544 static PassRefPtrWillBeRawPtr<CSSValue> specifiedValueForGridTrackBreadth(const
GridLength& trackBreadth, const LayoutStyle& style) | |
545 { | |
546 if (!trackBreadth.isLength()) | |
547 return cssValuePool().createValue(trackBreadth.flex(), CSSPrimitiveValue
::CSS_FR); | |
548 | |
549 const Length& trackBreadthLength = trackBreadth.length(); | |
550 if (trackBreadthLength.isAuto()) | |
551 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
552 return zoomAdjustedPixelValueForLength(trackBreadthLength, style); | |
553 } | |
554 | |
555 static PassRefPtrWillBeRawPtr<CSSValue> specifiedValueForGridTrackSize(const Gri
dTrackSize& trackSize, const LayoutStyle& style) | |
556 { | |
557 switch (trackSize.type()) { | |
558 case LengthTrackSizing: | |
559 return specifiedValueForGridTrackBreadth(trackSize.length(), style); | |
560 case MinMaxTrackSizing: | |
561 RefPtrWillBeRawPtr<CSSFunctionValue> minMaxTrackBreadths = CSSFunctionVa
lue::create(CSSValueMinmax); | |
562 minMaxTrackBreadths->append(specifiedValueForGridTrackBreadth(trackSize.
minTrackBreadth(), style)); | |
563 minMaxTrackBreadths->append(specifiedValueForGridTrackBreadth(trackSize.
maxTrackBreadth(), style)); | |
564 return minMaxTrackBreadths.release(); | |
565 } | |
566 ASSERT_NOT_REACHED(); | |
567 return nullptr; | |
568 } | |
569 | |
570 static void addValuesForNamedGridLinesAtIndex(const OrderedNamedGridLines& order
edNamedGridLines, size_t i, CSSValueList& list) | |
571 { | |
572 const Vector<String>& namedGridLines = orderedNamedGridLines.get(i); | |
573 if (namedGridLines.isEmpty()) | |
574 return; | |
575 | |
576 RefPtrWillBeRawPtr<CSSGridLineNamesValue> lineNames = CSSGridLineNamesValue:
:create(); | |
577 for (size_t j = 0; j < namedGridLines.size(); ++j) | |
578 lineNames->append(cssValuePool().createValue(namedGridLines[j], CSSPrimi
tiveValue::CSS_CUSTOM_IDENT)); | |
579 list.append(lineNames.release()); | |
580 } | |
581 | |
582 static PassRefPtrWillBeRawPtr<CSSValue> valueForGridTrackList(GridTrackSizingDir
ection direction, const LayoutObject* renderer, const LayoutStyle& style) | |
583 { | |
584 const Vector<GridTrackSize>& trackSizes = direction == ForColumns ? style.gr
idTemplateColumns() : style.gridTemplateRows(); | |
585 const OrderedNamedGridLines& orderedNamedGridLines = direction == ForColumns
? style.orderedNamedGridColumnLines() : style.orderedNamedGridRowLines(); | |
586 bool isLayoutGrid = renderer && renderer->isLayoutGrid(); | |
587 | |
588 // Handle the 'none' case. | |
589 bool trackListIsEmpty = trackSizes.isEmpty(); | |
590 if (isLayoutGrid && trackListIsEmpty) { | |
591 // For grids we should consider every listed track, whether implicitly o
r explicitly created. If we don't have | |
592 // any explicit track and there are no children then there are no implic
it tracks. We cannot simply check the | |
593 // number of rows/columns in our internal grid representation because it
's always at least 1x1 (see r143331). | |
594 trackListIsEmpty = !toLayoutBlock(renderer)->firstChild(); | |
595 } | |
596 | |
597 if (trackListIsEmpty) { | |
598 ASSERT(orderedNamedGridLines.isEmpty()); | |
599 return cssValuePool().createIdentifierValue(CSSValueNone); | |
600 } | |
601 | |
602 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
603 if (isLayoutGrid) { | |
604 const Vector<LayoutUnit>& trackPositions = direction == ForColumns ? toL
ayoutGrid(renderer)->columnPositions() : toLayoutGrid(renderer)->rowPositions(); | |
605 // There are at least #tracks + 1 grid lines (trackPositions). Apart fro
m that, the grid container can generate implicit grid tracks, | |
606 // so we'll have more trackPositions than trackSizes as the latter only
contain the explicit grid. | |
607 ASSERT(trackPositions.size() - 1 >= trackSizes.size()); | |
608 | |
609 for (size_t i = 0; i < trackPositions.size() - 1; ++i) { | |
610 addValuesForNamedGridLinesAtIndex(orderedNamedGridLines, i, *list); | |
611 list->append(zoomAdjustedPixelValue(trackPositions[i + 1] - trackPos
itions[i], style)); | |
612 } | |
613 } else { | |
614 for (size_t i = 0; i < trackSizes.size(); ++i) { | |
615 addValuesForNamedGridLinesAtIndex(orderedNamedGridLines, i, *list); | |
616 list->append(specifiedValueForGridTrackSize(trackSizes[i], style)); | |
617 } | |
618 } | |
619 // Those are the trailing <string>* allowed in the syntax. | |
620 addValuesForNamedGridLinesAtIndex(orderedNamedGridLines, trackSizes.size(),
*list); | |
621 return list.release(); | |
622 } | |
623 | |
624 static PassRefPtrWillBeRawPtr<CSSValue> valueForGridPosition(const GridPosition&
position) | |
625 { | |
626 if (position.isAuto()) | |
627 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
628 | |
629 if (position.isNamedGridArea()) | |
630 return cssValuePool().createValue(position.namedGridLine(), CSSPrimitive
Value::CSS_CUSTOM_IDENT); | |
631 | |
632 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
633 if (position.isSpan()) { | |
634 list->append(cssValuePool().createIdentifierValue(CSSValueSpan)); | |
635 list->append(cssValuePool().createValue(position.spanPosition(), CSSPrim
itiveValue::CSS_NUMBER)); | |
636 } else { | |
637 list->append(cssValuePool().createValue(position.integerPosition(), CSSP
rimitiveValue::CSS_NUMBER)); | |
638 } | |
639 | |
640 if (!position.namedGridLine().isNull()) | |
641 list->append(cssValuePool().createValue(position.namedGridLine(), CSSPri
mitiveValue::CSS_CUSTOM_IDENT)); | |
642 return list; | |
643 } | |
644 | |
645 static LayoutRect sizingBox(const LayoutObject* renderer) | |
646 { | |
647 if (!renderer->isBox()) | |
648 return LayoutRect(); | |
649 | |
650 const LayoutBox* box = toLayoutBox(renderer); | |
651 return box->style()->boxSizing() == BORDER_BOX ? box->borderBoxRect() : box-
>computedCSSContentBoxRect(); | |
652 } | |
653 | |
654 static PassRefPtrWillBeRawPtr<CSSValue> scrollBlocksOnFlagsToCSSValue(WebScrollB
locksOn scrollBlocksOn) | |
655 { | |
656 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
657 | |
658 if (scrollBlocksOn == WebScrollBlocksOnNone) | |
659 return cssValuePool().createIdentifierValue(CSSValueNone); | |
660 | |
661 if (scrollBlocksOn & WebScrollBlocksOnStartTouch) | |
662 list->append(cssValuePool().createIdentifierValue(CSSValueStartTouch)); | |
663 if (scrollBlocksOn & WebScrollBlocksOnWheelEvent) | |
664 list->append(cssValuePool().createIdentifierValue(CSSValueWheelEvent)); | |
665 if (scrollBlocksOn & WebScrollBlocksOnScrollEvent) | |
666 list->append(cssValuePool().createIdentifierValue(CSSValueScrollEvent)); | |
667 ASSERT(list->length()); | |
668 return list.release(); | |
669 } | |
670 | |
671 static PassRefPtrWillBeRawPtr<CSSValue> renderTextDecorationFlagsToCSSValue(int
textDecoration) | |
672 { | |
673 // Blink value is ignored. | |
674 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
675 if (textDecoration & TextDecorationUnderline) | |
676 list->append(cssValuePool().createIdentifierValue(CSSValueUnderline)); | |
677 if (textDecoration & TextDecorationOverline) | |
678 list->append(cssValuePool().createIdentifierValue(CSSValueOverline)); | |
679 if (textDecoration & TextDecorationLineThrough) | |
680 list->append(cssValuePool().createIdentifierValue(CSSValueLineThrough)); | |
681 | |
682 if (!list->length()) | |
683 return cssValuePool().createIdentifierValue(CSSValueNone); | |
684 return list.release(); | |
685 } | |
686 | |
687 static PassRefPtrWillBeRawPtr<CSSValue> valueForTextDecorationStyle(TextDecorati
onStyle textDecorationStyle) | |
688 { | |
689 switch (textDecorationStyle) { | |
690 case TextDecorationStyleSolid: | |
691 return cssValuePool().createIdentifierValue(CSSValueSolid); | |
692 case TextDecorationStyleDouble: | |
693 return cssValuePool().createIdentifierValue(CSSValueDouble); | |
694 case TextDecorationStyleDotted: | |
695 return cssValuePool().createIdentifierValue(CSSValueDotted); | |
696 case TextDecorationStyleDashed: | |
697 return cssValuePool().createIdentifierValue(CSSValueDashed); | |
698 case TextDecorationStyleWavy: | |
699 return cssValuePool().createIdentifierValue(CSSValueWavy); | |
700 } | |
701 | |
702 ASSERT_NOT_REACHED(); | |
703 return cssValuePool().createExplicitInitialValue(); | |
704 } | |
705 | |
706 static PassRefPtrWillBeRawPtr<CSSValue> touchActionFlagsToCSSValue(TouchAction t
ouchAction) | |
707 { | |
708 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
709 if (touchAction == TouchActionAuto) | |
710 list->append(cssValuePool().createIdentifierValue(CSSValueAuto)); | |
711 if (touchAction & TouchActionNone) { | |
712 ASSERT(touchAction == TouchActionNone); | |
713 list->append(cssValuePool().createIdentifierValue(CSSValueNone)); | |
714 } | |
715 if (touchAction == (TouchActionPanX | TouchActionPanY | TouchActionPinchZoom
)) { | |
716 list->append(cssValuePool().createIdentifierValue(CSSValueManipulation))
; | |
717 } else { | |
718 if (touchAction & TouchActionPanX) | |
719 list->append(cssValuePool().createIdentifierValue(CSSValuePanX)); | |
720 if (touchAction & TouchActionPanY) | |
721 list->append(cssValuePool().createIdentifierValue(CSSValuePanY)); | |
722 } | |
723 ASSERT(list->length()); | |
724 return list.release(); | |
725 } | |
726 | |
727 static PassRefPtrWillBeRawPtr<CSSValue> valueForWillChange(const Vector<CSSPrope
rtyID>& willChangeProperties, bool willChangeContents, bool willChangeScrollPosi
tion) | |
728 { | |
729 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated()
; | |
730 if (willChangeContents) | |
731 list->append(cssValuePool().createIdentifierValue(CSSValueContents)); | |
732 if (willChangeScrollPosition) | |
733 list->append(cssValuePool().createIdentifierValue(CSSValueScrollPosition
)); | |
734 for (size_t i = 0; i < willChangeProperties.size(); ++i) | |
735 list->append(cssValuePool().createIdentifierValue(willChangeProperties[i
])); | |
736 if (!list->length()) | |
737 list->append(cssValuePool().createIdentifierValue(CSSValueAuto)); | |
738 return list.release(); | |
739 } | |
740 | |
741 static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationDelay(const CSSTimingDa
ta* timingData) | |
742 { | |
743 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated()
; | |
744 if (timingData) { | |
745 for (size_t i = 0; i < timingData->delayList().size(); ++i) | |
746 list->append(cssValuePool().createValue(timingData->delayList()[i],
CSSPrimitiveValue::CSS_S)); | |
747 } else { | |
748 list->append(cssValuePool().createValue(CSSTimingData::initialDelay(), C
SSPrimitiveValue::CSS_S)); | |
749 } | |
750 return list.release(); | |
751 } | |
752 | |
753 static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationDirection(Timing::Playb
ackDirection direction) | |
754 { | |
755 switch (direction) { | |
756 case Timing::PlaybackDirectionNormal: | |
757 return cssValuePool().createIdentifierValue(CSSValueNormal); | |
758 case Timing::PlaybackDirectionAlternate: | |
759 return cssValuePool().createIdentifierValue(CSSValueAlternate); | |
760 case Timing::PlaybackDirectionReverse: | |
761 return cssValuePool().createIdentifierValue(CSSValueReverse); | |
762 case Timing::PlaybackDirectionAlternateReverse: | |
763 return cssValuePool().createIdentifierValue(CSSValueAlternateReverse); | |
764 default: | |
765 ASSERT_NOT_REACHED(); | |
766 return nullptr; | |
767 } | |
768 } | |
769 | |
770 static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationDuration(const CSSTimin
gData* timingData) | |
771 { | |
772 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated()
; | |
773 if (timingData) { | |
774 for (size_t i = 0; i < timingData->durationList().size(); ++i) | |
775 list->append(cssValuePool().createValue(timingData->durationList()[i
], CSSPrimitiveValue::CSS_S)); | |
776 } else { | |
777 list->append(cssValuePool().createValue(CSSTimingData::initialDuration()
, CSSPrimitiveValue::CSS_S)); | |
778 } | |
779 return list.release(); | |
780 } | |
781 | |
782 static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationFillMode(Timing::FillMo
de fillMode) | |
783 { | |
784 switch (fillMode) { | |
785 case Timing::FillModeNone: | |
786 return cssValuePool().createIdentifierValue(CSSValueNone); | |
787 case Timing::FillModeForwards: | |
788 return cssValuePool().createIdentifierValue(CSSValueForwards); | |
789 case Timing::FillModeBackwards: | |
790 return cssValuePool().createIdentifierValue(CSSValueBackwards); | |
791 case Timing::FillModeBoth: | |
792 return cssValuePool().createIdentifierValue(CSSValueBoth); | |
793 default: | |
794 ASSERT_NOT_REACHED(); | |
795 return nullptr; | |
796 } | |
797 } | |
798 | |
799 static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationIterationCount(double i
terationCount) | |
800 { | |
801 if (iterationCount == std::numeric_limits<double>::infinity()) | |
802 return cssValuePool().createIdentifierValue(CSSValueInfinite); | |
803 return cssValuePool().createValue(iterationCount, CSSPrimitiveValue::CSS_NUM
BER); | |
804 } | |
805 | |
806 static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationPlayState(EAnimPlayStat
e playState) | |
807 { | |
808 if (playState == AnimPlayStatePlaying) | |
809 return cssValuePool().createIdentifierValue(CSSValueRunning); | |
810 ASSERT(playState == AnimPlayStatePaused); | |
811 return cssValuePool().createIdentifierValue(CSSValuePaused); | |
812 } | |
813 | |
814 static PassRefPtrWillBeRawPtr<CSSValue> createTimingFunctionValue(const TimingFu
nction* timingFunction) | |
815 { | |
816 switch (timingFunction->type()) { | |
817 case TimingFunction::CubicBezierFunction: | |
818 { | |
819 const CubicBezierTimingFunction* bezierTimingFunction = toCubicBezie
rTimingFunction(timingFunction); | |
820 if (bezierTimingFunction->subType() != CubicBezierTimingFunction::Cu
stom) { | |
821 CSSValueID valueId = CSSValueInvalid; | |
822 switch (bezierTimingFunction->subType()) { | |
823 case CubicBezierTimingFunction::Ease: | |
824 valueId = CSSValueEase; | |
825 break; | |
826 case CubicBezierTimingFunction::EaseIn: | |
827 valueId = CSSValueEaseIn; | |
828 break; | |
829 case CubicBezierTimingFunction::EaseOut: | |
830 valueId = CSSValueEaseOut; | |
831 break; | |
832 case CubicBezierTimingFunction::EaseInOut: | |
833 valueId = CSSValueEaseInOut; | |
834 break; | |
835 default: | |
836 ASSERT_NOT_REACHED(); | |
837 return nullptr; | |
838 } | |
839 return cssValuePool().createIdentifierValue(valueId); | |
840 } | |
841 return CSSCubicBezierTimingFunctionValue::create(bezierTimingFunctio
n->x1(), bezierTimingFunction->y1(), bezierTimingFunction->x2(), bezierTimingFun
ction->y2()); | |
842 } | |
843 | |
844 case TimingFunction::StepsFunction: | |
845 { | |
846 const StepsTimingFunction* stepsTimingFunction = toStepsTimingFuncti
on(timingFunction); | |
847 StepsTimingFunction::StepAtPosition position = stepsTimingFunction->
stepAtPosition(); | |
848 int steps = stepsTimingFunction->numberOfSteps(); | |
849 ASSERT(position == StepsTimingFunction::Start || position == StepsTi
mingFunction::End); | |
850 | |
851 if (steps > 1) | |
852 return CSSStepsTimingFunctionValue::create(steps, position); | |
853 CSSValueID valueId = position == StepsTimingFunction::Start ? CSSVal
ueStepStart : CSSValueStepEnd; | |
854 return cssValuePool().createIdentifierValue(valueId); | |
855 } | |
856 | |
857 default: | |
858 return cssValuePool().createIdentifierValue(CSSValueLinear); | |
859 } | |
860 } | |
861 | |
862 static PassRefPtrWillBeRawPtr<CSSValue> valueForAnimationTimingFunction(const CS
STimingData* timingData) | |
863 { | |
864 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated()
; | |
865 if (timingData) { | |
866 for (size_t i = 0; i < timingData->timingFunctionList().size(); ++i) | |
867 list->append(createTimingFunctionValue(timingData->timingFunctionLis
t()[i].get())); | |
868 } else { | |
869 list->append(createTimingFunctionValue(CSSTimingData::initialTimingFunct
ion().get())); | |
870 } | |
871 return list.release(); | |
872 } | |
873 | |
874 static PassRefPtrWillBeRawPtr<CSSValueList> valuesForBorderRadiusCorner(LengthSi
ze radius, const LayoutStyle& style) | |
875 { | |
876 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
877 if (radius.width().type() == Percent) | |
878 list->append(cssValuePool().createValue(radius.width().percent(), CSSPri
mitiveValue::CSS_PERCENTAGE)); | |
879 else | |
880 list->append(zoomAdjustedPixelValueForLength(radius.width(), style)); | |
881 if (radius.height().type() == Percent) | |
882 list->append(cssValuePool().createValue(radius.height().percent(), CSSPr
imitiveValue::CSS_PERCENTAGE)); | |
883 else | |
884 list->append(zoomAdjustedPixelValueForLength(radius.height(), style)); | |
885 return list.release(); | |
886 } | |
887 | |
888 static PassRefPtrWillBeRawPtr<CSSValue> valueForBorderRadiusCorner(LengthSize ra
dius, const LayoutStyle& style) | |
889 { | |
890 RefPtrWillBeRawPtr<CSSValueList> list = valuesForBorderRadiusCorner(radius,
style); | |
891 if (list->item(0)->equals(*list->item(1))) | |
892 return list->item(0); | |
893 return list.release(); | |
894 } | |
895 | |
896 static PassRefPtrWillBeRawPtr<CSSFunctionValue> valueForMatrixTransform(const Tr
ansformationMatrix& transform, const LayoutStyle& style) | |
897 { | |
898 RefPtrWillBeRawPtr<CSSFunctionValue> transformValue = nullptr; | |
899 if (transform.isAffine()) { | |
900 transformValue = CSSFunctionValue::create(CSSValueMatrix); | |
901 | |
902 transformValue->append(cssValuePool().createValue(transform.a(), CSSPrim
itiveValue::CSS_NUMBER)); | |
903 transformValue->append(cssValuePool().createValue(transform.b(), CSSPrim
itiveValue::CSS_NUMBER)); | |
904 transformValue->append(cssValuePool().createValue(transform.c(), CSSPrim
itiveValue::CSS_NUMBER)); | |
905 transformValue->append(cssValuePool().createValue(transform.d(), CSSPrim
itiveValue::CSS_NUMBER)); | |
906 transformValue->append(zoomAdjustedNumberValue(transform.e(), style)); | |
907 transformValue->append(zoomAdjustedNumberValue(transform.f(), style)); | |
908 } else { | |
909 transformValue = CSSFunctionValue::create(CSSValueMatrix3d); | |
910 | |
911 transformValue->append(cssValuePool().createValue(transform.m11(), CSSPr
imitiveValue::CSS_NUMBER)); | |
912 transformValue->append(cssValuePool().createValue(transform.m12(), CSSPr
imitiveValue::CSS_NUMBER)); | |
913 transformValue->append(cssValuePool().createValue(transform.m13(), CSSPr
imitiveValue::CSS_NUMBER)); | |
914 transformValue->append(cssValuePool().createValue(transform.m14(), CSSPr
imitiveValue::CSS_NUMBER)); | |
915 | |
916 transformValue->append(cssValuePool().createValue(transform.m21(), CSSPr
imitiveValue::CSS_NUMBER)); | |
917 transformValue->append(cssValuePool().createValue(transform.m22(), CSSPr
imitiveValue::CSS_NUMBER)); | |
918 transformValue->append(cssValuePool().createValue(transform.m23(), CSSPr
imitiveValue::CSS_NUMBER)); | |
919 transformValue->append(cssValuePool().createValue(transform.m24(), CSSPr
imitiveValue::CSS_NUMBER)); | |
920 | |
921 transformValue->append(cssValuePool().createValue(transform.m31(), CSSPr
imitiveValue::CSS_NUMBER)); | |
922 transformValue->append(cssValuePool().createValue(transform.m32(), CSSPr
imitiveValue::CSS_NUMBER)); | |
923 transformValue->append(cssValuePool().createValue(transform.m33(), CSSPr
imitiveValue::CSS_NUMBER)); | |
924 transformValue->append(cssValuePool().createValue(transform.m34(), CSSPr
imitiveValue::CSS_NUMBER)); | |
925 | |
926 transformValue->append(zoomAdjustedNumberValue(transform.m41(), style)); | |
927 transformValue->append(zoomAdjustedNumberValue(transform.m42(), style)); | |
928 transformValue->append(zoomAdjustedNumberValue(transform.m43(), style)); | |
929 transformValue->append(cssValuePool().createValue(transform.m44(), CSSPr
imitiveValue::CSS_NUMBER)); | |
930 } | |
931 | |
932 return transformValue.release(); | |
933 } | |
934 | |
935 static PassRefPtrWillBeRawPtr<CSSValue> computedTransform(const LayoutObject* re
nderer, const LayoutStyle& style) | |
936 { | |
937 if (!renderer || !renderer->hasTransformRelatedProperty() || !style.hasTrans
form()) | |
938 return cssValuePool().createIdentifierValue(CSSValueNone); | |
939 | |
940 IntRect box; | |
941 if (renderer->isBox()) | |
942 box = pixelSnappedIntRect(toLayoutBox(renderer)->borderBoxRect()); | |
943 | |
944 TransformationMatrix transform; | |
945 style.applyTransform(transform, LayoutSize(box.size()), LayoutStyle::Exclude
TransformOrigin, LayoutStyle::ExcludeMotionPath); | |
946 | |
947 // FIXME: Need to print out individual functions (https://bugs.webkit.org/sh
ow_bug.cgi?id=23924) | |
948 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
949 list->append(valueForMatrixTransform(transform, style)); | |
950 | |
951 return list.release(); | |
952 } | |
953 | |
954 static PassRefPtrWillBeRawPtr<CSSValue> createTransitionPropertyValue(const CSST
ransitionData::TransitionProperty& property) | |
955 { | |
956 if (property.propertyType == CSSTransitionData::TransitionNone) | |
957 return cssValuePool().createIdentifierValue(CSSValueNone); | |
958 if (property.propertyType == CSSTransitionData::TransitionAll) | |
959 return cssValuePool().createIdentifierValue(CSSValueAll); | |
960 if (property.propertyType == CSSTransitionData::TransitionUnknown) | |
961 return cssValuePool().createValue(property.propertyString, CSSPrimitiveV
alue::CSS_CUSTOM_IDENT); | |
962 ASSERT(property.propertyType == CSSTransitionData::TransitionSingleProperty)
; | |
963 return cssValuePool().createValue(getPropertyNameString(property.propertyId)
, CSSPrimitiveValue::CSS_CUSTOM_IDENT); | |
964 } | |
965 | |
966 static PassRefPtrWillBeRawPtr<CSSValue> valueForTransitionProperty(const CSSTran
sitionData* transitionData) | |
967 { | |
968 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated()
; | |
969 if (transitionData) { | |
970 for (size_t i = 0; i < transitionData->propertyList().size(); ++i) | |
971 list->append(createTransitionPropertyValue(transitionData->propertyL
ist()[i])); | |
972 } else { | |
973 list->append(cssValuePool().createIdentifierValue(CSSValueAll)); | |
974 } | |
975 return list.release(); | |
976 } | |
977 | |
978 static PassRefPtrWillBeRawPtr<CSSValue> createLineBoxContainValue(unsigned lineB
oxContain) | |
979 { | |
980 if (!lineBoxContain) | |
981 return cssValuePool().createIdentifierValue(CSSValueNone); | |
982 return CSSLineBoxContainValue::create(lineBoxContain); | |
983 } | |
984 | |
985 static PassRefPtrWillBeRawPtr<CSSValue> valueForContentData(const LayoutStyle& s
tyle) | |
986 { | |
987 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
988 for (const ContentData* contentData = style.contentData(); contentData; cont
entData = contentData->next()) { | |
989 if (contentData->isCounter()) { | |
990 const CounterContent* counter = toCounterContentData(contentData)->c
ounter(); | |
991 ASSERT(counter); | |
992 list->append(cssValuePool().createValue(counter->identifier(), CSSPr
imitiveValue::CSS_COUNTER_NAME)); | |
993 } else if (contentData->isImage()) { | |
994 const StyleImage* image = toImageContentData(contentData)->image(); | |
995 ASSERT(image); | |
996 list->append(image->cssValue()); | |
997 } else if (contentData->isText()) { | |
998 list->append(cssValuePool().createValue(toTextContentData(contentDat
a)->text(), CSSPrimitiveValue::CSS_STRING)); | |
999 } | |
1000 } | |
1001 return list.release(); | |
1002 } | |
1003 | |
1004 static PassRefPtrWillBeRawPtr<CSSValue> valueForCounterDirectives(const LayoutSt
yle& style, CSSPropertyID propertyID) | |
1005 { | |
1006 const CounterDirectiveMap* map = style.counterDirectives(); | |
1007 if (!map) | |
1008 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1009 | |
1010 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
1011 for (const auto& item : *map) { | |
1012 bool isValidCounterValue = propertyID == CSSPropertyCounterIncrement ? i
tem.value.isIncrement() : item.value.isReset(); | |
1013 if (!isValidCounterValue) | |
1014 continue; | |
1015 | |
1016 list->append(cssValuePool().createValue(item.key, CSSPrimitiveValue::CSS
_CUSTOM_IDENT)); | |
1017 short number = propertyID == CSSPropertyCounterIncrement ? item.value.in
crementValue() : item.value.resetValue(); | |
1018 list->append(cssValuePool().createValue((double)number, CSSPrimitiveValu
e::CSS_NUMBER)); | |
1019 } | |
1020 | |
1021 if (!list->length()) | |
1022 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1023 | |
1024 return list.release(); | |
1025 } | |
1026 | |
1027 static PassRefPtrWillBeRawPtr<CSSValue> valueForShape(const LayoutStyle& style,
ShapeValue* shapeValue) | |
1028 { | |
1029 if (!shapeValue) | |
1030 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1031 if (shapeValue->type() == ShapeValue::Box) | |
1032 return cssValuePool().createValue(shapeValue->cssBox()); | |
1033 if (shapeValue->type() == ShapeValue::Image) { | |
1034 if (shapeValue->image()) | |
1035 return shapeValue->image()->cssValue(); | |
1036 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1037 } | |
1038 | |
1039 ASSERT(shapeValue->type() == ShapeValue::Shape); | |
1040 | |
1041 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
1042 list->append(valueForBasicShape(style, shapeValue->shape())); | |
1043 if (shapeValue->cssBox() != BoxMissing) | |
1044 list->append(cssValuePool().createValue(shapeValue->cssBox())); | |
1045 return list.release(); | |
1046 } | |
1047 | |
1048 static PassRefPtrWillBeRawPtr<CSSValueList> valuesForSidesShorthand(const StyleP
ropertyShorthand& shorthand, const LayoutStyle& style, const LayoutObject* rende
rer, Node* styledNode, bool allowVisitedStyle) | |
1049 { | |
1050 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
1051 // Assume the properties are in the usual order top, right, bottom, left. | |
1052 RefPtrWillBeRawPtr<CSSValue> topValue = LayoutStyleCSSValueMapping::get(shor
thand.properties()[0], style, renderer, styledNode, allowVisitedStyle); | |
1053 RefPtrWillBeRawPtr<CSSValue> rightValue = LayoutStyleCSSValueMapping::get(sh
orthand.properties()[1], style, renderer, styledNode, allowVisitedStyle); | |
1054 RefPtrWillBeRawPtr<CSSValue> bottomValue = LayoutStyleCSSValueMapping::get(s
horthand.properties()[2], style, renderer, styledNode, allowVisitedStyle); | |
1055 RefPtrWillBeRawPtr<CSSValue> leftValue = LayoutStyleCSSValueMapping::get(sho
rthand.properties()[3], style, renderer, styledNode, allowVisitedStyle); | |
1056 | |
1057 // All 4 properties must be specified. | |
1058 if (!topValue || !rightValue || !bottomValue || !leftValue) | |
1059 return nullptr; | |
1060 | |
1061 bool showLeft = !compareCSSValuePtr(rightValue, leftValue); | |
1062 bool showBottom = !compareCSSValuePtr(topValue, bottomValue) || showLeft; | |
1063 bool showRight = !compareCSSValuePtr(topValue, rightValue) || showBottom; | |
1064 | |
1065 list->append(topValue.release()); | |
1066 if (showRight) | |
1067 list->append(rightValue.release()); | |
1068 if (showBottom) | |
1069 list->append(bottomValue.release()); | |
1070 if (showLeft) | |
1071 list->append(leftValue.release()); | |
1072 | |
1073 return list.release(); | |
1074 } | |
1075 | |
1076 static PassRefPtrWillBeRawPtr<CSSValueList> valueForBorderRadiusShorthand(const
LayoutStyle& style) | |
1077 { | |
1078 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSlashSeparated()
; | |
1079 | |
1080 bool showHorizontalBottomLeft = style.borderTopRightRadius().width() != styl
e.borderBottomLeftRadius().width(); | |
1081 bool showHorizontalBottomRight = showHorizontalBottomLeft || (style.borderBo
ttomRightRadius().width() != style.borderTopLeftRadius().width()); | |
1082 bool showHorizontalTopRight = showHorizontalBottomRight || (style.borderTopR
ightRadius().width() != style.borderTopLeftRadius().width()); | |
1083 | |
1084 bool showVerticalBottomLeft = style.borderTopRightRadius().height() != style
.borderBottomLeftRadius().height(); | |
1085 bool showVerticalBottomRight = showVerticalBottomLeft || (style.borderBottom
RightRadius().height() != style.borderTopLeftRadius().height()); | |
1086 bool showVerticalTopRight = showVerticalBottomRight || (style.borderTopRight
Radius().height() != style.borderTopLeftRadius().height()); | |
1087 | |
1088 RefPtrWillBeRawPtr<CSSValueList> topLeftRadius = valuesForBorderRadiusCorner
(style.borderTopLeftRadius(), style); | |
1089 RefPtrWillBeRawPtr<CSSValueList> topRightRadius = valuesForBorderRadiusCorne
r(style.borderTopRightRadius(), style); | |
1090 RefPtrWillBeRawPtr<CSSValueList> bottomRightRadius = valuesForBorderRadiusCo
rner(style.borderBottomRightRadius(), style); | |
1091 RefPtrWillBeRawPtr<CSSValueList> bottomLeftRadius = valuesForBorderRadiusCor
ner(style.borderBottomLeftRadius(), style); | |
1092 | |
1093 RefPtrWillBeRawPtr<CSSValueList> horizontalRadii = CSSValueList::createSpace
Separated(); | |
1094 horizontalRadii->append(topLeftRadius->item(0)); | |
1095 if (showHorizontalTopRight) | |
1096 horizontalRadii->append(topRightRadius->item(0)); | |
1097 if (showHorizontalBottomRight) | |
1098 horizontalRadii->append(bottomRightRadius->item(0)); | |
1099 if (showHorizontalBottomLeft) | |
1100 horizontalRadii->append(bottomLeftRadius->item(0)); | |
1101 | |
1102 list->append(horizontalRadii.release()); | |
1103 | |
1104 RefPtrWillBeRawPtr<CSSValueList> verticalRadii = CSSValueList::createSpaceSe
parated(); | |
1105 verticalRadii->append(topLeftRadius->item(1)); | |
1106 if (showVerticalTopRight) | |
1107 verticalRadii->append(topRightRadius->item(1)); | |
1108 if (showVerticalBottomRight) | |
1109 verticalRadii->append(bottomRightRadius->item(1)); | |
1110 if (showVerticalBottomLeft) | |
1111 verticalRadii->append(bottomLeftRadius->item(1)); | |
1112 | |
1113 if (!verticalRadii->equals(*toCSSValueList(list->item(0)))) | |
1114 list->append(verticalRadii.release()); | |
1115 | |
1116 return list.release(); | |
1117 } | |
1118 | |
1119 static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> glyphOrientationToCSSPrimitiveV
alue(EGlyphOrientation orientation) | |
1120 { | |
1121 switch (orientation) { | |
1122 case GO_0DEG: | |
1123 return CSSPrimitiveValue::create(0.0f, CSSPrimitiveValue::CSS_DEG); | |
1124 case GO_90DEG: | |
1125 return CSSPrimitiveValue::create(90.0f, CSSPrimitiveValue::CSS_DEG); | |
1126 case GO_180DEG: | |
1127 return CSSPrimitiveValue::create(180.0f, CSSPrimitiveValue::CSS_DEG); | |
1128 case GO_270DEG: | |
1129 return CSSPrimitiveValue::create(270.0f, CSSPrimitiveValue::CSS_DEG); | |
1130 default: | |
1131 return nullptr; | |
1132 } | |
1133 } | |
1134 | |
1135 static PassRefPtrWillBeRawPtr<CSSValue> strokeDashArrayToCSSValueList(const SVGD
ashArray& dashes, const LayoutStyle& style) | |
1136 { | |
1137 if (dashes.isEmpty()) | |
1138 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | |
1139 | |
1140 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated()
; | |
1141 for (const Length& dashLength : dashes.vector()) | |
1142 list->append(zoomAdjustedPixelValueForLength(dashLength, style)); | |
1143 | |
1144 return list.release(); | |
1145 } | |
1146 | |
1147 static PassRefPtrWillBeRawPtr<CSSValue> paintOrderToCSSValueList(EPaintOrder pai
ntorder) | |
1148 { | |
1149 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
1150 do { | |
1151 EPaintOrderType paintOrderType = (EPaintOrderType)(paintorder & ((1 << k
PaintOrderBitwidth) - 1)); | |
1152 switch (paintOrderType) { | |
1153 case PT_FILL: | |
1154 case PT_STROKE: | |
1155 case PT_MARKERS: | |
1156 list->append(CSSPrimitiveValue::create(paintOrderType)); | |
1157 break; | |
1158 case PT_NONE: | |
1159 default: | |
1160 ASSERT_NOT_REACHED(); | |
1161 break; | |
1162 } | |
1163 } while (paintorder >>= kPaintOrderBitwidth); | |
1164 | |
1165 return list.release(); | |
1166 } | |
1167 | |
1168 static PassRefPtrWillBeRawPtr<CSSValue> adjustSVGPaintForCurrentColor(SVGPaintTy
pe paintType, const String& url, const Color& color, const Color& currentColor) | |
1169 { | |
1170 if (paintType >= SVG_PAINTTYPE_URI_NONE) { | |
1171 RefPtrWillBeRawPtr<CSSValueList> values = CSSValueList::createSpaceSepar
ated(); | |
1172 values->append(CSSPrimitiveValue::create(url, CSSPrimitiveValue::CSS_URI
)); | |
1173 if (paintType == SVG_PAINTTYPE_URI_NONE) | |
1174 values->append(CSSPrimitiveValue::create(CSSValueNone)); | |
1175 else if (paintType == SVG_PAINTTYPE_URI_CURRENTCOLOR) | |
1176 values->append(CSSPrimitiveValue::createColor(currentColor.rgb())); | |
1177 else if (paintType == SVG_PAINTTYPE_URI_RGBCOLOR) | |
1178 values->append(CSSPrimitiveValue::createColor(color.rgb())); | |
1179 return values.release(); | |
1180 } | |
1181 if (paintType == SVG_PAINTTYPE_NONE) | |
1182 return CSSPrimitiveValue::create(CSSValueNone); | |
1183 if (paintType == SVG_PAINTTYPE_CURRENTCOLOR) | |
1184 return CSSPrimitiveValue::createColor(currentColor.rgb()); | |
1185 | |
1186 return CSSPrimitiveValue::createColor(color.rgb()); | |
1187 } | |
1188 | |
1189 static inline String serializeAsFragmentIdentifier(const AtomicString& resource) | |
1190 { | |
1191 return "#" + resource; | |
1192 } | |
1193 | |
1194 PassRefPtrWillBeRawPtr<CSSValue> LayoutStyleCSSValueMapping::valueForShadowData(
const ShadowData& shadow, const LayoutStyle& style, bool useSpread) | |
1195 { | |
1196 RefPtrWillBeRawPtr<CSSPrimitiveValue> x = zoomAdjustedPixelValue(shadow.x(),
style); | |
1197 RefPtrWillBeRawPtr<CSSPrimitiveValue> y = zoomAdjustedPixelValue(shadow.y(),
style); | |
1198 RefPtrWillBeRawPtr<CSSPrimitiveValue> blur = zoomAdjustedPixelValue(shadow.b
lur(), style); | |
1199 RefPtrWillBeRawPtr<CSSPrimitiveValue> spread = useSpread ? zoomAdjustedPixel
Value(shadow.spread(), style) : PassRefPtrWillBeRawPtr<CSSPrimitiveValue>(nullpt
r); | |
1200 RefPtrWillBeRawPtr<CSSPrimitiveValue> shadowStyle = shadow.style() == Normal
? PassRefPtrWillBeRawPtr<CSSPrimitiveValue>(nullptr) : cssValuePool().createIde
ntifierValue(CSSValueInset); | |
1201 RefPtrWillBeRawPtr<CSSPrimitiveValue> color = currentColorOrValidColor(style
, shadow.color()); | |
1202 return CSSShadowValue::create(x.release(), y.release(), blur.release(), spre
ad.release(), shadowStyle.release(), color.release()); | |
1203 } | |
1204 | |
1205 PassRefPtrWillBeRawPtr<CSSValue> LayoutStyleCSSValueMapping::valueForShadowList(
const ShadowList* shadowList, const LayoutStyle& style, bool useSpread) | |
1206 { | |
1207 if (!shadowList) | |
1208 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1209 | |
1210 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated()
; | |
1211 size_t shadowCount = shadowList->shadows().size(); | |
1212 for (size_t i = 0; i < shadowCount; ++i) | |
1213 list->append(valueForShadowData(shadowList->shadows()[i], style, useSpre
ad)); | |
1214 return list.release(); | |
1215 } | |
1216 | |
1217 PassRefPtrWillBeRawPtr<CSSValue> LayoutStyleCSSValueMapping::valueForFilter(cons
t LayoutStyle& style) | |
1218 { | |
1219 if (style.filter().operations().isEmpty()) | |
1220 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1221 | |
1222 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated()
; | |
1223 | |
1224 RefPtrWillBeRawPtr<CSSFunctionValue> filterValue = nullptr; | |
1225 | |
1226 for (const auto& operation : style.filter().operations()) { | |
1227 FilterOperation* filterOperation = operation.get(); | |
1228 switch (filterOperation->type()) { | |
1229 case FilterOperation::REFERENCE: | |
1230 filterValue = CSSFunctionValue::create(CSSValueUrl); | |
1231 filterValue->append(cssValuePool().createValue(toReferenceFilterOper
ation(filterOperation)->url(), CSSPrimitiveValue::CSS_CUSTOM_IDENT)); | |
1232 break; | |
1233 case FilterOperation::GRAYSCALE: | |
1234 filterValue = CSSFunctionValue::create(CSSValueGrayscale); | |
1235 filterValue->append(cssValuePool().createValue(toBasicColorMatrixFil
terOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); | |
1236 break; | |
1237 case FilterOperation::SEPIA: | |
1238 filterValue = CSSFunctionValue::create(CSSValueSepia); | |
1239 filterValue->append(cssValuePool().createValue(toBasicColorMatrixFil
terOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); | |
1240 break; | |
1241 case FilterOperation::SATURATE: | |
1242 filterValue = CSSFunctionValue::create(CSSValueSaturate); | |
1243 filterValue->append(cssValuePool().createValue(toBasicColorMatrixFil
terOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); | |
1244 break; | |
1245 case FilterOperation::HUE_ROTATE: | |
1246 filterValue = CSSFunctionValue::create(CSSValueHueRotate); | |
1247 filterValue->append(cssValuePool().createValue(toBasicColorMatrixFil
terOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_DEG)); | |
1248 break; | |
1249 case FilterOperation::INVERT: | |
1250 filterValue = CSSFunctionValue::create(CSSValueInvert); | |
1251 filterValue->append(cssValuePool().createValue(toBasicComponentTrans
ferFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); | |
1252 break; | |
1253 case FilterOperation::OPACITY: | |
1254 filterValue = CSSFunctionValue::create(CSSValueOpacity); | |
1255 filterValue->append(cssValuePool().createValue(toBasicComponentTrans
ferFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); | |
1256 break; | |
1257 case FilterOperation::BRIGHTNESS: | |
1258 filterValue = CSSFunctionValue::create(CSSValueBrightness); | |
1259 filterValue->append(cssValuePool().createValue(toBasicComponentTrans
ferFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); | |
1260 break; | |
1261 case FilterOperation::CONTRAST: | |
1262 filterValue = CSSFunctionValue::create(CSSValueContrast); | |
1263 filterValue->append(cssValuePool().createValue(toBasicComponentTrans
ferFilterOperation(filterOperation)->amount(), CSSPrimitiveValue::CSS_NUMBER)); | |
1264 break; | |
1265 case FilterOperation::BLUR: | |
1266 filterValue = CSSFunctionValue::create(CSSValueBlur); | |
1267 filterValue->append(zoomAdjustedPixelValue(toBlurFilterOperation(fil
terOperation)->stdDeviation().value(), style)); | |
1268 break; | |
1269 case FilterOperation::DROP_SHADOW: { | |
1270 DropShadowFilterOperation* dropShadowOperation = toDropShadowFilterO
peration(filterOperation); | |
1271 filterValue = CSSFunctionValue::create(CSSValueDropShadow); | |
1272 // We want our computed style to look like that of a text shadow (ha
s neither spread nor inset style). | |
1273 ShadowData shadow(dropShadowOperation->location(), dropShadowOperati
on->stdDeviation(), 0, Normal, dropShadowOperation->color()); | |
1274 filterValue->append(valueForShadowData(shadow, style, false)); | |
1275 break; | |
1276 } | |
1277 default: | |
1278 ASSERT_NOT_REACHED(); | |
1279 break; | |
1280 } | |
1281 list->append(filterValue.release()); | |
1282 } | |
1283 | |
1284 return list.release(); | |
1285 } | |
1286 | |
1287 PassRefPtrWillBeRawPtr<CSSValue> LayoutStyleCSSValueMapping::get(CSSPropertyID p
ropertyID, const LayoutStyle& style, const LayoutObject* renderer, Node* styledN
ode, bool allowVisitedStyle) | |
1288 { | |
1289 const SVGLayoutStyle& svgStyle = style.svgStyle(); | |
1290 propertyID = CSSProperty::resolveDirectionAwareProperty(propertyID, style.di
rection(), style.writingMode()); | |
1291 switch (propertyID) { | |
1292 case CSSPropertyInvalid: | |
1293 return nullptr; | |
1294 | |
1295 case CSSPropertyBackgroundColor: | |
1296 return allowVisitedStyle ? cssValuePool().createColorValue(style.visited
DependentColor(CSSPropertyBackgroundColor).rgb()) : currentColorOrValidColor(sty
le, style.backgroundColor()); | |
1297 case CSSPropertyBackgroundImage: | |
1298 case CSSPropertyWebkitMaskImage: { | |
1299 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1300 const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskImage ?
&style.maskLayers() : &style.backgroundLayers(); | |
1301 for (; currLayer; currLayer = currLayer->next()) { | |
1302 if (currLayer->image()) | |
1303 list->append(currLayer->image()->cssValue()); | |
1304 else | |
1305 list->append(cssValuePool().createIdentifierValue(CSSValueNone))
; | |
1306 } | |
1307 return list.release(); | |
1308 } | |
1309 case CSSPropertyBackgroundSize: | |
1310 case CSSPropertyWebkitBackgroundSize: | |
1311 case CSSPropertyWebkitMaskSize: { | |
1312 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1313 const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskSize ? &
style.maskLayers() : &style.backgroundLayers(); | |
1314 for (; currLayer; currLayer = currLayer->next()) | |
1315 list->append(valueForFillSize(currLayer->size(), style)); | |
1316 return list.release(); | |
1317 } | |
1318 case CSSPropertyBackgroundRepeat: | |
1319 case CSSPropertyWebkitMaskRepeat: { | |
1320 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1321 const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskRepeat ?
&style.maskLayers() : &style.backgroundLayers(); | |
1322 for (; currLayer; currLayer = currLayer->next()) | |
1323 list->append(valueForFillRepeat(currLayer->repeatX(), currLayer->rep
eatY())); | |
1324 return list.release(); | |
1325 } | |
1326 case CSSPropertyMaskSourceType: { | |
1327 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1328 for (const FillLayer* currLayer = &style.maskLayers(); currLayer; currLa
yer = currLayer->next()) | |
1329 list->append(valueForFillSourceType(currLayer->maskSourceType())); | |
1330 return list.release(); | |
1331 } | |
1332 case CSSPropertyWebkitBackgroundComposite: | |
1333 case CSSPropertyWebkitMaskComposite: { | |
1334 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1335 const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskComposit
e ? &style.maskLayers() : &style.backgroundLayers(); | |
1336 for (; currLayer; currLayer = currLayer->next()) | |
1337 list->append(cssValuePool().createValue(currLayer->composite())); | |
1338 return list.release(); | |
1339 } | |
1340 case CSSPropertyBackgroundAttachment: { | |
1341 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1342 for (const FillLayer* currLayer = &style.backgroundLayers(); currLayer;
currLayer = currLayer->next()) | |
1343 list->append(cssValuePool().createValue(currLayer->attachment())); | |
1344 return list.release(); | |
1345 } | |
1346 case CSSPropertyBackgroundClip: | |
1347 case CSSPropertyBackgroundOrigin: | |
1348 case CSSPropertyWebkitBackgroundClip: | |
1349 case CSSPropertyWebkitBackgroundOrigin: | |
1350 case CSSPropertyWebkitMaskClip: | |
1351 case CSSPropertyWebkitMaskOrigin: { | |
1352 bool isClip = propertyID == CSSPropertyBackgroundClip || propertyID == C
SSPropertyWebkitBackgroundClip || propertyID == CSSPropertyWebkitMaskClip; | |
1353 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1354 const FillLayer* currLayer = (propertyID == CSSPropertyWebkitMaskClip ||
propertyID == CSSPropertyWebkitMaskOrigin) ? &style.maskLayers() : &style.backg
roundLayers(); | |
1355 for (; currLayer; currLayer = currLayer->next()) { | |
1356 EFillBox box = isClip ? currLayer->clip() : currLayer->origin(); | |
1357 list->append(cssValuePool().createValue(box)); | |
1358 } | |
1359 return list.release(); | |
1360 } | |
1361 case CSSPropertyBackgroundPosition: | |
1362 case CSSPropertyWebkitMaskPosition: { | |
1363 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1364 const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskPosition
? &style.maskLayers() : &style.backgroundLayers(); | |
1365 for (; currLayer; currLayer = currLayer->next()) | |
1366 list->append(createPositionListForLayer(propertyID, *currLayer, styl
e)); | |
1367 return list.release(); | |
1368 } | |
1369 case CSSPropertyBackgroundPositionX: | |
1370 case CSSPropertyWebkitMaskPositionX: { | |
1371 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1372 const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskPosition
X ? &style.maskLayers() : &style.backgroundLayers(); | |
1373 for (; currLayer; currLayer = currLayer->next()) | |
1374 list->append(zoomAdjustedPixelValueForLength(currLayer->xPosition(),
style)); | |
1375 return list.release(); | |
1376 } | |
1377 case CSSPropertyBackgroundPositionY: | |
1378 case CSSPropertyWebkitMaskPositionY: { | |
1379 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1380 const FillLayer* currLayer = propertyID == CSSPropertyWebkitMaskPosition
Y ? &style.maskLayers() : &style.backgroundLayers(); | |
1381 for (; currLayer; currLayer = currLayer->next()) | |
1382 list->append(zoomAdjustedPixelValueForLength(currLayer->yPosition(),
style)); | |
1383 return list.release(); | |
1384 } | |
1385 case CSSPropertyBorderCollapse: | |
1386 if (style.borderCollapse()) | |
1387 return cssValuePool().createIdentifierValue(CSSValueCollapse); | |
1388 return cssValuePool().createIdentifierValue(CSSValueSeparate); | |
1389 case CSSPropertyBorderSpacing: { | |
1390 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparat
ed(); | |
1391 list->append(zoomAdjustedPixelValue(style.horizontalBorderSpacing(), sty
le)); | |
1392 list->append(zoomAdjustedPixelValue(style.verticalBorderSpacing(), style
)); | |
1393 return list.release(); | |
1394 } | |
1395 case CSSPropertyWebkitBorderHorizontalSpacing: | |
1396 return zoomAdjustedPixelValue(style.horizontalBorderSpacing(), style); | |
1397 case CSSPropertyWebkitBorderVerticalSpacing: | |
1398 return zoomAdjustedPixelValue(style.verticalBorderSpacing(), style); | |
1399 case CSSPropertyBorderImageSource: | |
1400 if (style.borderImageSource()) | |
1401 return style.borderImageSource()->cssValue(); | |
1402 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1403 case CSSPropertyBorderTopColor: | |
1404 return allowVisitedStyle ? cssValuePool().createColorValue(style.visited
DependentColor(CSSPropertyBorderTopColor).rgb()) : currentColorOrValidColor(styl
e, style.borderTopColor()); | |
1405 case CSSPropertyBorderRightColor: | |
1406 return allowVisitedStyle ? cssValuePool().createColorValue(style.visited
DependentColor(CSSPropertyBorderRightColor).rgb()) : currentColorOrValidColor(st
yle, style.borderRightColor()); | |
1407 case CSSPropertyBorderBottomColor: | |
1408 return allowVisitedStyle ? cssValuePool().createColorValue(style.visited
DependentColor(CSSPropertyBorderBottomColor).rgb()) : currentColorOrValidColor(s
tyle, style.borderBottomColor()); | |
1409 case CSSPropertyBorderLeftColor: | |
1410 return allowVisitedStyle ? cssValuePool().createColorValue(style.visited
DependentColor(CSSPropertyBorderLeftColor).rgb()) : currentColorOrValidColor(sty
le, style.borderLeftColor()); | |
1411 case CSSPropertyBorderTopStyle: | |
1412 return cssValuePool().createValue(style.borderTopStyle()); | |
1413 case CSSPropertyBorderRightStyle: | |
1414 return cssValuePool().createValue(style.borderRightStyle()); | |
1415 case CSSPropertyBorderBottomStyle: | |
1416 return cssValuePool().createValue(style.borderBottomStyle()); | |
1417 case CSSPropertyBorderLeftStyle: | |
1418 return cssValuePool().createValue(style.borderLeftStyle()); | |
1419 case CSSPropertyBorderTopWidth: | |
1420 return zoomAdjustedPixelValue(style.borderTopWidth(), style); | |
1421 case CSSPropertyBorderRightWidth: | |
1422 return zoomAdjustedPixelValue(style.borderRightWidth(), style); | |
1423 case CSSPropertyBorderBottomWidth: | |
1424 return zoomAdjustedPixelValue(style.borderBottomWidth(), style); | |
1425 case CSSPropertyBorderLeftWidth: | |
1426 return zoomAdjustedPixelValue(style.borderLeftWidth(), style); | |
1427 case CSSPropertyBottom: | |
1428 return valueForPositionOffset(style, CSSPropertyBottom, renderer); | |
1429 case CSSPropertyWebkitBoxAlign: | |
1430 return cssValuePool().createValue(style.boxAlign()); | |
1431 case CSSPropertyWebkitBoxDecorationBreak: | |
1432 if (style.boxDecorationBreak() == DSLICE) | |
1433 return cssValuePool().createIdentifierValue(CSSValueSlice); | |
1434 return cssValuePool().createIdentifierValue(CSSValueClone); | |
1435 case CSSPropertyWebkitBoxDirection: | |
1436 return cssValuePool().createValue(style.boxDirection()); | |
1437 case CSSPropertyWebkitBoxFlex: | |
1438 return cssValuePool().createValue(style.boxFlex(), CSSPrimitiveValue::CS
S_NUMBER); | |
1439 case CSSPropertyWebkitBoxFlexGroup: | |
1440 return cssValuePool().createValue(style.boxFlexGroup(), CSSPrimitiveValu
e::CSS_NUMBER); | |
1441 case CSSPropertyWebkitBoxLines: | |
1442 return cssValuePool().createValue(style.boxLines()); | |
1443 case CSSPropertyWebkitBoxOrdinalGroup: | |
1444 return cssValuePool().createValue(style.boxOrdinalGroup(), CSSPrimitiveV
alue::CSS_NUMBER); | |
1445 case CSSPropertyWebkitBoxOrient: | |
1446 return cssValuePool().createValue(style.boxOrient()); | |
1447 case CSSPropertyWebkitBoxPack: | |
1448 return cssValuePool().createValue(style.boxPack()); | |
1449 case CSSPropertyWebkitBoxReflect: | |
1450 return valueForReflection(style.boxReflect(), style); | |
1451 case CSSPropertyBoxShadow: | |
1452 case CSSPropertyWebkitBoxShadow: | |
1453 return valueForShadowList(style.boxShadow(), style, true); | |
1454 case CSSPropertyCaptionSide: | |
1455 return cssValuePool().createValue(style.captionSide()); | |
1456 case CSSPropertyClear: | |
1457 return cssValuePool().createValue(style.clear()); | |
1458 case CSSPropertyColor: | |
1459 return cssValuePool().createColorValue(allowVisitedStyle ? style.visited
DependentColor(CSSPropertyColor).rgb() : style.color().rgb()); | |
1460 case CSSPropertyWebkitPrintColorAdjust: | |
1461 return cssValuePool().createValue(style.printColorAdjust()); | |
1462 case CSSPropertyWebkitColumnCount: | |
1463 if (style.hasAutoColumnCount()) | |
1464 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
1465 return cssValuePool().createValue(style.columnCount(), CSSPrimitiveValue
::CSS_NUMBER); | |
1466 case CSSPropertyColumnFill: | |
1467 ASSERT(RuntimeEnabledFeatures::regionBasedColumnsEnabled()); | |
1468 return cssValuePool().createValue(style.columnFill()); | |
1469 case CSSPropertyWebkitColumnGap: | |
1470 if (style.hasNormalColumnGap()) | |
1471 return cssValuePool().createIdentifierValue(CSSValueNormal); | |
1472 return zoomAdjustedPixelValue(style.columnGap(), style); | |
1473 case CSSPropertyWebkitColumnRuleColor: | |
1474 return allowVisitedStyle ? cssValuePool().createColorValue(style.visited
DependentColor(CSSPropertyOutlineColor).rgb()) : currentColorOrValidColor(style,
style.columnRuleColor()); | |
1475 case CSSPropertyWebkitColumnRuleStyle: | |
1476 return cssValuePool().createValue(style.columnRuleStyle()); | |
1477 case CSSPropertyWebkitColumnRuleWidth: | |
1478 return zoomAdjustedPixelValue(style.columnRuleWidth(), style); | |
1479 case CSSPropertyWebkitColumnSpan: | |
1480 return cssValuePool().createIdentifierValue(style.columnSpan() ? CSSValu
eAll : CSSValueNone); | |
1481 case CSSPropertyWebkitColumnBreakAfter: | |
1482 return cssValuePool().createValue(style.columnBreakAfter()); | |
1483 case CSSPropertyWebkitColumnBreakBefore: | |
1484 return cssValuePool().createValue(style.columnBreakBefore()); | |
1485 case CSSPropertyWebkitColumnBreakInside: | |
1486 return cssValuePool().createValue(style.columnBreakInside()); | |
1487 case CSSPropertyWebkitColumnWidth: | |
1488 if (style.hasAutoColumnWidth()) | |
1489 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
1490 return zoomAdjustedPixelValue(style.columnWidth(), style); | |
1491 case CSSPropertyTabSize: | |
1492 return cssValuePool().createValue( | |
1493 style.tabSize().getPixelSize(1.0), style.tabSize().isSpaces() ? CSSP
rimitiveValue::CSS_NUMBER : CSSPrimitiveValue::CSS_PX); | |
1494 case CSSPropertyCursor: { | |
1495 RefPtrWillBeRawPtr<CSSValueList> list = nullptr; | |
1496 CursorList* cursors = style.cursors(); | |
1497 if (cursors && cursors->size() > 0) { | |
1498 list = CSSValueList::createCommaSeparated(); | |
1499 for (unsigned i = 0; i < cursors->size(); ++i) { | |
1500 if (StyleImage* image = cursors->at(i).image()) | |
1501 list->append(image->cssValue()); | |
1502 } | |
1503 } | |
1504 RefPtrWillBeRawPtr<CSSValue> value = cssValuePool().createValue(style.cu
rsor()); | |
1505 if (list) { | |
1506 list->append(value.release()); | |
1507 return list.release(); | |
1508 } | |
1509 return value.release(); | |
1510 } | |
1511 case CSSPropertyDirection: | |
1512 return cssValuePool().createValue(style.direction()); | |
1513 case CSSPropertyDisplay: | |
1514 return cssValuePool().createValue(style.display()); | |
1515 case CSSPropertyEmptyCells: | |
1516 return cssValuePool().createValue(style.emptyCells()); | |
1517 case CSSPropertyAlignContent: | |
1518 return valueForContentPositionAndDistributionWithOverflowAlignment(resol
veContentAlignmentAuto(style.alignContent(), style.alignContentDistribution(), s
tyledNode), style.alignContentOverflowAlignment(), style.alignContentDistributio
n()); | |
1519 case CSSPropertyAlignItems: | |
1520 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(st
yle.alignItems(), styledNode), style.alignItemsOverflowAlignment(), NonLegacyPos
ition); | |
1521 case CSSPropertyAlignSelf: | |
1522 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(st
yle.alignSelf(), styledNode->parentNode()), style.alignSelfOverflowAlignment(),
NonLegacyPosition); | |
1523 case CSSPropertyFlex: | |
1524 return valuesForShorthandProperty(flexShorthand(), style, renderer, styl
edNode, allowVisitedStyle); | |
1525 case CSSPropertyFlexBasis: | |
1526 return zoomAdjustedPixelValueForLength(style.flexBasis(), style); | |
1527 case CSSPropertyFlexDirection: | |
1528 return cssValuePool().createValue(style.flexDirection()); | |
1529 case CSSPropertyFlexFlow: | |
1530 return valuesForShorthandProperty(flexFlowShorthand(), style, renderer,
styledNode, allowVisitedStyle); | |
1531 case CSSPropertyFlexGrow: | |
1532 return cssValuePool().createValue(style.flexGrow()); | |
1533 case CSSPropertyFlexShrink: | |
1534 return cssValuePool().createValue(style.flexShrink()); | |
1535 case CSSPropertyFlexWrap: | |
1536 return cssValuePool().createValue(style.flexWrap()); | |
1537 case CSSPropertyJustifyContent: | |
1538 return valueForContentPositionAndDistributionWithOverflowAlignment(resol
veContentAlignmentAuto(style.justifyContent(), style.justifyContentDistribution(
), styledNode), style.justifyContentOverflowAlignment(), style.justifyContentDis
tribution()); | |
1539 case CSSPropertyOrder: | |
1540 return cssValuePool().createValue(style.order(), CSSPrimitiveValue::CSS_
NUMBER); | |
1541 case CSSPropertyFloat: | |
1542 if (style.display() != NONE && style.hasOutOfFlowPosition()) | |
1543 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1544 return cssValuePool().createValue(style.floating()); | |
1545 case CSSPropertyFont: { | |
1546 RefPtrWillBeRawPtr<CSSFontValue> computedFont = CSSFontValue::create(); | |
1547 computedFont->style = valueForFontStyle(style); | |
1548 computedFont->variant = valueForFontVariant(style); | |
1549 computedFont->weight = valueForFontWeight(style); | |
1550 computedFont->stretch = valueForFontStretch(style); | |
1551 computedFont->size = valueForFontSize(style); | |
1552 computedFont->lineHeight = valueForLineHeight(style); | |
1553 computedFont->family = valueForFontFamily(style); | |
1554 return computedFont.release(); | |
1555 } | |
1556 case CSSPropertyFontFamily: | |
1557 return valueForFontFamily(style); | |
1558 case CSSPropertyFontSize: | |
1559 return valueForFontSize(style); | |
1560 case CSSPropertyFontSizeAdjust: | |
1561 if (style.hasFontSizeAdjust()) | |
1562 return cssValuePool().createValue(style.fontSizeAdjust(), CSSPrimiti
veValue::CSS_NUMBER); | |
1563 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1564 case CSSPropertyFontStretch: | |
1565 return valueForFontStretch(style); | |
1566 case CSSPropertyFontStyle: | |
1567 return valueForFontStyle(style); | |
1568 case CSSPropertyFontVariant: | |
1569 return valueForFontVariant(style); | |
1570 case CSSPropertyFontWeight: | |
1571 return valueForFontWeight(style); | |
1572 case CSSPropertyWebkitFontFeatureSettings: { | |
1573 const FontFeatureSettings* featureSettings = style.fontDescription().fea
tureSettings(); | |
1574 if (!featureSettings || !featureSettings->size()) | |
1575 return cssValuePool().createIdentifierValue(CSSValueNormal); | |
1576 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
1577 for (unsigned i = 0; i < featureSettings->size(); ++i) { | |
1578 const FontFeature& feature = featureSettings->at(i); | |
1579 RefPtrWillBeRawPtr<CSSFontFeatureValue> featureValue = CSSFontFeatur
eValue::create(feature.tag(), feature.value()); | |
1580 list->append(featureValue.release()); | |
1581 } | |
1582 return list.release(); | |
1583 } | |
1584 case CSSPropertyGridAutoFlow: { | |
1585 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparat
ed(); | |
1586 switch (style.gridAutoFlow()) { | |
1587 case AutoFlowRow: | |
1588 case AutoFlowRowDense: | |
1589 list->append(cssValuePool().createIdentifierValue(CSSValueRow)); | |
1590 break; | |
1591 case AutoFlowColumn: | |
1592 case AutoFlowColumnDense: | |
1593 list->append(cssValuePool().createIdentifierValue(CSSValueColumn)); | |
1594 break; | |
1595 default: | |
1596 ASSERT_NOT_REACHED(); | |
1597 } | |
1598 | |
1599 switch (style.gridAutoFlow()) { | |
1600 case AutoFlowRowDense: | |
1601 case AutoFlowColumnDense: | |
1602 list->append(cssValuePool().createIdentifierValue(CSSValueDense)); | |
1603 break; | |
1604 default: | |
1605 // Do nothing. | |
1606 break; | |
1607 } | |
1608 | |
1609 return list.release(); | |
1610 } | |
1611 // Specs mention that getComputedStyle() should return the used value of the
property instead of the computed | |
1612 // one for grid-definition-{rows|columns} but not for the grid-auto-{rows|co
lumns} as things like | |
1613 // grid-auto-columns: 2fr; cannot be resolved to a value in pixels as the '2
fr' means very different things | |
1614 // depending on the size of the explicit grid or the number of implicit trac
ks added to the grid. See | |
1615 // http://lists.w3.org/Archives/Public/www-style/2013Nov/0014.html | |
1616 case CSSPropertyGridAutoColumns: | |
1617 return specifiedValueForGridTrackSize(style.gridAutoColumns(), style); | |
1618 case CSSPropertyGridAutoRows: | |
1619 return specifiedValueForGridTrackSize(style.gridAutoRows(), style); | |
1620 | |
1621 case CSSPropertyGridTemplateColumns: | |
1622 return valueForGridTrackList(ForColumns, renderer, style); | |
1623 case CSSPropertyGridTemplateRows: | |
1624 return valueForGridTrackList(ForRows, renderer, style); | |
1625 | |
1626 case CSSPropertyGridColumnStart: | |
1627 return valueForGridPosition(style.gridColumnStart()); | |
1628 case CSSPropertyGridColumnEnd: | |
1629 return valueForGridPosition(style.gridColumnEnd()); | |
1630 case CSSPropertyGridRowStart: | |
1631 return valueForGridPosition(style.gridRowStart()); | |
1632 case CSSPropertyGridRowEnd: | |
1633 return valueForGridPosition(style.gridRowEnd()); | |
1634 case CSSPropertyGridColumn: | |
1635 return valuesForGridShorthand(gridColumnShorthand(), style, renderer, st
yledNode, allowVisitedStyle); | |
1636 case CSSPropertyGridRow: | |
1637 return valuesForGridShorthand(gridRowShorthand(), style, renderer, style
dNode, allowVisitedStyle); | |
1638 case CSSPropertyGridArea: | |
1639 return valuesForGridShorthand(gridAreaShorthand(), style, renderer, styl
edNode, allowVisitedStyle); | |
1640 case CSSPropertyGridTemplate: | |
1641 return valuesForGridShorthand(gridTemplateShorthand(), style, renderer,
styledNode, allowVisitedStyle); | |
1642 case CSSPropertyGrid: | |
1643 return valuesForGridShorthand(gridShorthand(), style, renderer, styledNo
de, allowVisitedStyle); | |
1644 case CSSPropertyGridTemplateAreas: | |
1645 if (!style.namedGridAreaRowCount()) { | |
1646 ASSERT(!style.namedGridAreaColumnCount()); | |
1647 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1648 } | |
1649 | |
1650 return CSSGridTemplateAreasValue::create(style.namedGridArea(), style.na
medGridAreaRowCount(), style.namedGridAreaColumnCount()); | |
1651 | |
1652 case CSSPropertyHeight: | |
1653 if (renderer) { | |
1654 // According to http://www.w3.org/TR/CSS2/visudet.html#the-height-pr
operty, | |
1655 // the "height" property does not apply for non-replaced inline elem
ents. | |
1656 if (!renderer->isReplaced() && renderer->isInline()) | |
1657 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
1658 return zoomAdjustedPixelValue(sizingBox(renderer).height(), style); | |
1659 } | |
1660 return zoomAdjustedPixelValueForLength(style.height(), style); | |
1661 case CSSPropertyWebkitHighlight: | |
1662 if (style.highlight() == nullAtom) | |
1663 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1664 return cssValuePool().createValue(style.highlight(), CSSPrimitiveValue::
CSS_STRING); | |
1665 case CSSPropertyWebkitHyphenateCharacter: | |
1666 if (style.hyphenationString().isNull()) | |
1667 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
1668 return cssValuePool().createValue(style.hyphenationString(), CSSPrimitiv
eValue::CSS_STRING); | |
1669 case CSSPropertyImageRendering: | |
1670 return CSSPrimitiveValue::create(style.imageRendering()); | |
1671 case CSSPropertyIsolation: | |
1672 return cssValuePool().createValue(style.isolation()); | |
1673 case CSSPropertyJustifyItems: | |
1674 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(st
yle.justifyItems(), styledNode), style.justifyItemsOverflowAlignment(), style.ju
stifyItemsPositionType()); | |
1675 case CSSPropertyJustifySelf: | |
1676 return valueForItemPositionWithOverflowAlignment(resolveAlignmentAuto(st
yle.justifySelf(), styledNode->parentNode()), style.justifySelfOverflowAlignment
(), NonLegacyPosition); | |
1677 case CSSPropertyLeft: | |
1678 return valueForPositionOffset(style, CSSPropertyLeft, renderer); | |
1679 case CSSPropertyLetterSpacing: | |
1680 if (!style.letterSpacing()) | |
1681 return cssValuePool().createIdentifierValue(CSSValueNormal); | |
1682 return zoomAdjustedPixelValue(style.letterSpacing(), style); | |
1683 case CSSPropertyWebkitLineClamp: | |
1684 if (style.lineClamp().isNone()) | |
1685 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1686 return cssValuePool().createValue(style.lineClamp().value(), style.lineC
lamp().isPercentage() ? CSSPrimitiveValue::CSS_PERCENTAGE : CSSPrimitiveValue::C
SS_NUMBER); | |
1687 case CSSPropertyLineHeight: | |
1688 return valueForLineHeight(style); | |
1689 case CSSPropertyListStyleImage: | |
1690 if (style.listStyleImage()) | |
1691 return style.listStyleImage()->cssValue(); | |
1692 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1693 case CSSPropertyListStylePosition: | |
1694 return cssValuePool().createValue(style.listStylePosition()); | |
1695 case CSSPropertyListStyleType: | |
1696 return cssValuePool().createValue(style.listStyleType()); | |
1697 case CSSPropertyWebkitLocale: | |
1698 if (style.locale().isNull()) | |
1699 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
1700 return cssValuePool().createValue(style.locale(), CSSPrimitiveValue::CSS
_STRING); | |
1701 case CSSPropertyMarginTop: { | |
1702 Length marginTop = style.marginTop(); | |
1703 if (marginTop.isFixed() || !renderer || !renderer->isBox()) | |
1704 return zoomAdjustedPixelValueForLength(marginTop, style); | |
1705 return zoomAdjustedPixelValue(toLayoutBox(renderer)->marginTop(), style)
; | |
1706 } | |
1707 case CSSPropertyMarginRight: { | |
1708 Length marginRight = style.marginRight(); | |
1709 if (marginRight.isFixed() || !renderer || !renderer->isBox()) | |
1710 return zoomAdjustedPixelValueForLength(marginRight, style); | |
1711 float value; | |
1712 if (marginRight.isPercent()) { | |
1713 // LayoutBox gives a marginRight() that is the distance between the
right-edge of the child box | |
1714 // and the right-edge of the containing box, when display == BLOCK.
Let's calculate the absolute | |
1715 // value of the specified margin-right % instead of relying on Layou
tBox's marginRight() value. | |
1716 value = minimumValueForLength(marginRight, toLayoutBox(renderer)->co
ntainingBlockLogicalWidthForContent()).toFloat(); | |
1717 } else { | |
1718 value = toLayoutBox(renderer)->marginRight().toFloat(); | |
1719 } | |
1720 return zoomAdjustedPixelValue(value, style); | |
1721 } | |
1722 case CSSPropertyMarginBottom: { | |
1723 Length marginBottom = style.marginBottom(); | |
1724 if (marginBottom.isFixed() || !renderer || !renderer->isBox()) | |
1725 return zoomAdjustedPixelValueForLength(marginBottom, style); | |
1726 return zoomAdjustedPixelValue(toLayoutBox(renderer)->marginBottom(), sty
le); | |
1727 } | |
1728 case CSSPropertyMarginLeft: { | |
1729 Length marginLeft = style.marginLeft(); | |
1730 if (marginLeft.isFixed() || !renderer || !renderer->isBox()) | |
1731 return zoomAdjustedPixelValueForLength(marginLeft, style); | |
1732 return zoomAdjustedPixelValue(toLayoutBox(renderer)->marginLeft(), style
); | |
1733 } | |
1734 case CSSPropertyWebkitUserModify: | |
1735 return cssValuePool().createValue(style.userModify()); | |
1736 case CSSPropertyMaxHeight: { | |
1737 const Length& maxHeight = style.maxHeight(); | |
1738 if (maxHeight.isMaxSizeNone()) | |
1739 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1740 return zoomAdjustedPixelValueForLength(maxHeight, style); | |
1741 } | |
1742 case CSSPropertyMaxWidth: { | |
1743 const Length& maxWidth = style.maxWidth(); | |
1744 if (maxWidth.isMaxSizeNone()) | |
1745 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1746 return zoomAdjustedPixelValueForLength(maxWidth, style); | |
1747 } | |
1748 case CSSPropertyMinHeight: | |
1749 // FIXME: For flex-items, min-height:auto should compute to min-content. | |
1750 if (style.minHeight().isAuto()) | |
1751 return zoomAdjustedPixelValue(0, style); | |
1752 return zoomAdjustedPixelValueForLength(style.minHeight(), style); | |
1753 case CSSPropertyMinWidth: | |
1754 // FIXME: For flex-items, min-width:auto should compute to min-content. | |
1755 if (style.minWidth().isAuto()) | |
1756 return zoomAdjustedPixelValue(0, style); | |
1757 return zoomAdjustedPixelValueForLength(style.minWidth(), style); | |
1758 case CSSPropertyObjectFit: | |
1759 return cssValuePool().createValue(style.objectFit()); | |
1760 case CSSPropertyObjectPosition: | |
1761 return cssValuePool().createValue( | |
1762 Pair::create( | |
1763 zoomAdjustedPixelValueForLength(style.objectPosition().x(), styl
e), | |
1764 zoomAdjustedPixelValueForLength(style.objectPosition().y(), styl
e), | |
1765 Pair::KeepIdenticalValues)); | |
1766 case CSSPropertyOpacity: | |
1767 return cssValuePool().createValue(style.opacity(), CSSPrimitiveValue::CS
S_NUMBER); | |
1768 case CSSPropertyOrphans: | |
1769 if (style.hasAutoOrphans()) | |
1770 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
1771 return cssValuePool().createValue(style.orphans(), CSSPrimitiveValue::CS
S_NUMBER); | |
1772 case CSSPropertyOutlineColor: | |
1773 return allowVisitedStyle ? cssValuePool().createColorValue(style.visited
DependentColor(CSSPropertyOutlineColor).rgb()) : currentColorOrValidColor(style,
style.outlineColor()); | |
1774 case CSSPropertyOutlineOffset: | |
1775 return zoomAdjustedPixelValue(style.outlineOffset(), style); | |
1776 case CSSPropertyOutlineStyle: | |
1777 if (style.outlineStyleIsAuto()) | |
1778 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
1779 return cssValuePool().createValue(style.outlineStyle()); | |
1780 case CSSPropertyOutlineWidth: | |
1781 return zoomAdjustedPixelValue(style.outlineWidth(), style); | |
1782 case CSSPropertyOverflow: | |
1783 return cssValuePool().createValue(max(style.overflowX(), style.overflowY
())); | |
1784 case CSSPropertyOverflowWrap: | |
1785 return cssValuePool().createValue(style.overflowWrap()); | |
1786 case CSSPropertyOverflowX: | |
1787 return cssValuePool().createValue(style.overflowX()); | |
1788 case CSSPropertyOverflowY: | |
1789 return cssValuePool().createValue(style.overflowY()); | |
1790 case CSSPropertyPaddingTop: { | |
1791 Length paddingTop = style.paddingTop(); | |
1792 if (paddingTop.isFixed() || !renderer || !renderer->isBox()) | |
1793 return zoomAdjustedPixelValueForLength(paddingTop, style); | |
1794 return zoomAdjustedPixelValue(toLayoutBox(renderer)->computedCSSPaddingT
op(), style); | |
1795 } | |
1796 case CSSPropertyPaddingRight: { | |
1797 Length paddingRight = style.paddingRight(); | |
1798 if (paddingRight.isFixed() || !renderer || !renderer->isBox()) | |
1799 return zoomAdjustedPixelValueForLength(paddingRight, style); | |
1800 return zoomAdjustedPixelValue(toLayoutBox(renderer)->computedCSSPaddingR
ight(), style); | |
1801 } | |
1802 case CSSPropertyPaddingBottom: { | |
1803 Length paddingBottom = style.paddingBottom(); | |
1804 if (paddingBottom.isFixed() || !renderer || !renderer->isBox()) | |
1805 return zoomAdjustedPixelValueForLength(paddingBottom, style); | |
1806 return zoomAdjustedPixelValue(toLayoutBox(renderer)->computedCSSPaddingB
ottom(), style); | |
1807 } | |
1808 case CSSPropertyPaddingLeft: { | |
1809 Length paddingLeft = style.paddingLeft(); | |
1810 if (paddingLeft.isFixed() || !renderer || !renderer->isBox()) | |
1811 return zoomAdjustedPixelValueForLength(paddingLeft, style); | |
1812 return zoomAdjustedPixelValue(toLayoutBox(renderer)->computedCSSPaddingL
eft(), style); | |
1813 } | |
1814 case CSSPropertyPageBreakAfter: | |
1815 return cssValuePool().createValue(style.pageBreakAfter()); | |
1816 case CSSPropertyPageBreakBefore: | |
1817 return cssValuePool().createValue(style.pageBreakBefore()); | |
1818 case CSSPropertyPageBreakInside: { | |
1819 EPageBreak pageBreak = style.pageBreakInside(); | |
1820 ASSERT(pageBreak != PBALWAYS); | |
1821 if (pageBreak == PBALWAYS) | |
1822 return nullptr; | |
1823 return cssValuePool().createValue(style.pageBreakInside()); | |
1824 } | |
1825 case CSSPropertyPosition: | |
1826 return cssValuePool().createValue(style.position()); | |
1827 case CSSPropertyRight: | |
1828 return valueForPositionOffset(style, CSSPropertyRight, renderer); | |
1829 case CSSPropertyWebkitRubyPosition: | |
1830 return cssValuePool().createValue(style.rubyPosition()); | |
1831 case CSSPropertyScrollBehavior: | |
1832 return cssValuePool().createValue(style.scrollBehavior()); | |
1833 case CSSPropertyScrollBlocksOn: | |
1834 return scrollBlocksOnFlagsToCSSValue(style.scrollBlocksOn()); | |
1835 case CSSPropertyTableLayout: | |
1836 return cssValuePool().createValue(style.tableLayout()); | |
1837 case CSSPropertyTextAlign: | |
1838 return cssValuePool().createValue(style.textAlign()); | |
1839 case CSSPropertyTextAlignLast: | |
1840 return cssValuePool().createValue(style.textAlignLast()); | |
1841 case CSSPropertyTextDecoration: | |
1842 if (RuntimeEnabledFeatures::css3TextDecorationsEnabled()) | |
1843 return valuesForShorthandProperty(textDecorationShorthand(), style,
renderer, styledNode, allowVisitedStyle); | |
1844 // Fall through. | |
1845 case CSSPropertyTextDecorationLine: | |
1846 return renderTextDecorationFlagsToCSSValue(style.textDecoration()); | |
1847 case CSSPropertyTextDecorationStyle: | |
1848 return valueForTextDecorationStyle(style.textDecorationStyle()); | |
1849 case CSSPropertyTextDecorationColor: | |
1850 return currentColorOrValidColor(style, style.textDecorationColor()); | |
1851 case CSSPropertyTextJustify: | |
1852 return cssValuePool().createValue(style.textJustify()); | |
1853 case CSSPropertyTextUnderlinePosition: | |
1854 return cssValuePool().createValue(style.textUnderlinePosition()); | |
1855 case CSSPropertyWebkitTextDecorationsInEffect: | |
1856 return renderTextDecorationFlagsToCSSValue(style.textDecorationsInEffect
()); | |
1857 case CSSPropertyWebkitTextFillColor: | |
1858 return currentColorOrValidColor(style, style.textFillColor()); | |
1859 case CSSPropertyWebkitTextEmphasisColor: | |
1860 return currentColorOrValidColor(style, style.textEmphasisColor()); | |
1861 case CSSPropertyWebkitTextEmphasisPosition: | |
1862 return cssValuePool().createValue(style.textEmphasisPosition()); | |
1863 case CSSPropertyWebkitTextEmphasisStyle: | |
1864 switch (style.textEmphasisMark()) { | |
1865 case TextEmphasisMarkNone: | |
1866 return cssValuePool().createIdentifierValue(CSSValueNone); | |
1867 case TextEmphasisMarkCustom: | |
1868 return cssValuePool().createValue(style.textEmphasisCustomMark(), CS
SPrimitiveValue::CSS_STRING); | |
1869 case TextEmphasisMarkAuto: | |
1870 ASSERT_NOT_REACHED(); | |
1871 // Fall through | |
1872 case TextEmphasisMarkDot: | |
1873 case TextEmphasisMarkCircle: | |
1874 case TextEmphasisMarkDoubleCircle: | |
1875 case TextEmphasisMarkTriangle: | |
1876 case TextEmphasisMarkSesame: { | |
1877 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSep
arated(); | |
1878 list->append(cssValuePool().createValue(style.textEmphasisFill())); | |
1879 list->append(cssValuePool().createValue(style.textEmphasisMark())); | |
1880 return list.release(); | |
1881 } | |
1882 } | |
1883 case CSSPropertyTextIndent: { | |
1884 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparat
ed(); | |
1885 list->append(zoomAdjustedPixelValueForLength(style.textIndent(), style))
; | |
1886 if (RuntimeEnabledFeatures::css3TextEnabled() && (style.textIndentLine()
== TextIndentEachLine || style.textIndentType() == TextIndentHanging)) { | |
1887 if (style.textIndentLine() == TextIndentEachLine) | |
1888 list->append(cssValuePool().createIdentifierValue(CSSValueEachLi
ne)); | |
1889 if (style.textIndentType() == TextIndentHanging) | |
1890 list->append(cssValuePool().createIdentifierValue(CSSValueHangin
g)); | |
1891 } | |
1892 return list.release(); | |
1893 } | |
1894 case CSSPropertyTextShadow: | |
1895 return valueForShadowList(style.textShadow(), style, false); | |
1896 case CSSPropertyTextRendering: | |
1897 return cssValuePool().createValue(style.fontDescription().textRendering(
)); | |
1898 case CSSPropertyTextOverflow: | |
1899 if (style.textOverflow()) | |
1900 return cssValuePool().createIdentifierValue(CSSValueEllipsis); | |
1901 return cssValuePool().createIdentifierValue(CSSValueClip); | |
1902 case CSSPropertyWebkitTextSecurity: | |
1903 return cssValuePool().createValue(style.textSecurity()); | |
1904 case CSSPropertyWebkitTextStrokeColor: | |
1905 return currentColorOrValidColor(style, style.textStrokeColor()); | |
1906 case CSSPropertyWebkitTextStrokeWidth: | |
1907 return zoomAdjustedPixelValue(style.textStrokeWidth(), style); | |
1908 case CSSPropertyTextTransform: | |
1909 return cssValuePool().createValue(style.textTransform()); | |
1910 case CSSPropertyTop: | |
1911 return valueForPositionOffset(style, CSSPropertyTop, renderer); | |
1912 case CSSPropertyTouchAction: | |
1913 return touchActionFlagsToCSSValue(style.touchAction()); | |
1914 case CSSPropertyUnicodeBidi: | |
1915 return cssValuePool().createValue(style.unicodeBidi()); | |
1916 case CSSPropertyVerticalAlign: | |
1917 switch (style.verticalAlign()) { | |
1918 case BASELINE: | |
1919 return cssValuePool().createIdentifierValue(CSSValueBaseline); | |
1920 case MIDDLE: | |
1921 return cssValuePool().createIdentifierValue(CSSValueMiddle); | |
1922 case SUB: | |
1923 return cssValuePool().createIdentifierValue(CSSValueSub); | |
1924 case SUPER: | |
1925 return cssValuePool().createIdentifierValue(CSSValueSuper); | |
1926 case TEXT_TOP: | |
1927 return cssValuePool().createIdentifierValue(CSSValueTextTop); | |
1928 case TEXT_BOTTOM: | |
1929 return cssValuePool().createIdentifierValue(CSSValueTextBottom); | |
1930 case TOP: | |
1931 return cssValuePool().createIdentifierValue(CSSValueTop); | |
1932 case BOTTOM: | |
1933 return cssValuePool().createIdentifierValue(CSSValueBottom); | |
1934 case BASELINE_MIDDLE: | |
1935 return cssValuePool().createIdentifierValue(CSSValueWebkitBaselineMi
ddle); | |
1936 case LENGTH: | |
1937 return zoomAdjustedPixelValueForLength(style.verticalAlignLength(),
style); | |
1938 } | |
1939 ASSERT_NOT_REACHED(); | |
1940 return nullptr; | |
1941 case CSSPropertyVisibility: | |
1942 return cssValuePool().createValue(style.visibility()); | |
1943 case CSSPropertyWhiteSpace: | |
1944 return cssValuePool().createValue(style.whiteSpace()); | |
1945 case CSSPropertyWidows: | |
1946 return cssValuePool().createValue(style.widows(), CSSPrimitiveValue::CSS
_NUMBER); | |
1947 case CSSPropertyWidth: | |
1948 if (renderer) { | |
1949 // According to http://www.w3.org/TR/CSS2/visudet.html#the-width-pro
perty, | |
1950 // the "width" property does not apply for non-replaced inline eleme
nts. | |
1951 if (!renderer->isReplaced() && renderer->isInline()) | |
1952 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
1953 return zoomAdjustedPixelValue(sizingBox(renderer).width(), style); | |
1954 } | |
1955 return zoomAdjustedPixelValueForLength(style.width(), style); | |
1956 case CSSPropertyWillChange: | |
1957 return valueForWillChange(style.willChangeProperties(), style.willChange
Contents(), style.willChangeScrollPosition()); | |
1958 case CSSPropertyWordBreak: | |
1959 return cssValuePool().createValue(style.wordBreak()); | |
1960 case CSSPropertyWordSpacing: | |
1961 return zoomAdjustedPixelValue(style.wordSpacing(), style); | |
1962 case CSSPropertyWordWrap: | |
1963 return cssValuePool().createValue(style.overflowWrap()); | |
1964 case CSSPropertyWebkitLineBreak: | |
1965 return cssValuePool().createValue(style.lineBreak()); | |
1966 case CSSPropertyResize: | |
1967 return cssValuePool().createValue(style.resize()); | |
1968 case CSSPropertyFontKerning: | |
1969 return cssValuePool().createValue(style.fontDescription().kerning()); | |
1970 case CSSPropertyWebkitFontSmoothing: | |
1971 return cssValuePool().createValue(style.fontDescription().fontSmoothing(
)); | |
1972 case CSSPropertyFontVariantLigatures: { | |
1973 FontDescription::LigaturesState commonLigaturesState = style.fontDescrip
tion().commonLigaturesState(); | |
1974 FontDescription::LigaturesState discretionaryLigaturesState = style.font
Description().discretionaryLigaturesState(); | |
1975 FontDescription::LigaturesState historicalLigaturesState = style.fontDes
cription().historicalLigaturesState(); | |
1976 FontDescription::LigaturesState contextualLigaturesState = style.fontDes
cription().contextualLigaturesState(); | |
1977 if (commonLigaturesState == FontDescription::NormalLigaturesState && dis
cretionaryLigaturesState == FontDescription::NormalLigaturesState | |
1978 && historicalLigaturesState == FontDescription::NormalLigaturesState
&& contextualLigaturesState == FontDescription::NormalLigaturesState) | |
1979 return cssValuePool().createIdentifierValue(CSSValueNormal); | |
1980 | |
1981 RefPtrWillBeRawPtr<CSSValueList> valueList = CSSValueList::createSpaceSe
parated(); | |
1982 if (commonLigaturesState != FontDescription::NormalLigaturesState) | |
1983 valueList->append(cssValuePool().createIdentifierValue(commonLigatur
esState == FontDescription::DisabledLigaturesState ? CSSValueNoCommonLigatures :
CSSValueCommonLigatures)); | |
1984 if (discretionaryLigaturesState != FontDescription::NormalLigaturesState
) | |
1985 valueList->append(cssValuePool().createIdentifierValue(discretionary
LigaturesState == FontDescription::DisabledLigaturesState ? CSSValueNoDiscretion
aryLigatures : CSSValueDiscretionaryLigatures)); | |
1986 if (historicalLigaturesState != FontDescription::NormalLigaturesState) | |
1987 valueList->append(cssValuePool().createIdentifierValue(historicalLig
aturesState == FontDescription::DisabledLigaturesState ? CSSValueNoHistoricalLig
atures : CSSValueHistoricalLigatures)); | |
1988 if (contextualLigaturesState != FontDescription::NormalLigaturesState) | |
1989 valueList->append(cssValuePool().createIdentifierValue(contextualLig
aturesState == FontDescription::DisabledLigaturesState ? CSSValueNoContextual :
CSSValueContextual)); | |
1990 return valueList; | |
1991 } | |
1992 case CSSPropertyZIndex: | |
1993 if (style.hasAutoZIndex()) | |
1994 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
1995 return cssValuePool().createValue(style.zIndex(), CSSPrimitiveValue::CSS
_NUMBER); | |
1996 case CSSPropertyZoom: | |
1997 return cssValuePool().createValue(style.zoom(), CSSPrimitiveValue::CSS_N
UMBER); | |
1998 case CSSPropertyBoxSizing: | |
1999 if (style.boxSizing() == CONTENT_BOX) | |
2000 return cssValuePool().createIdentifierValue(CSSValueContentBox); | |
2001 return cssValuePool().createIdentifierValue(CSSValueBorderBox); | |
2002 case CSSPropertyWebkitAppRegion: | |
2003 return cssValuePool().createIdentifierValue(style.getDraggableRegionMode
() == DraggableRegionDrag ? CSSValueDrag : CSSValueNoDrag); | |
2004 case CSSPropertyAnimationDelay: | |
2005 ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); | |
2006 case CSSPropertyWebkitAnimationDelay: | |
2007 return valueForAnimationDelay(style.animations()); | |
2008 case CSSPropertyAnimationDirection: | |
2009 ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); | |
2010 case CSSPropertyWebkitAnimationDirection: { | |
2011 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
2012 const CSSAnimationData* animationData = style.animations(); | |
2013 if (animationData) { | |
2014 for (size_t i = 0; i < animationData->directionList().size(); ++i) | |
2015 list->append(valueForAnimationDirection(animationData->direction
List()[i])); | |
2016 } else { | |
2017 list->append(cssValuePool().createIdentifierValue(CSSValueNormal)); | |
2018 } | |
2019 return list.release(); | |
2020 } | |
2021 case CSSPropertyAnimationDuration: | |
2022 ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); | |
2023 case CSSPropertyWebkitAnimationDuration: | |
2024 return valueForAnimationDuration(style.animations()); | |
2025 case CSSPropertyAnimationFillMode: | |
2026 ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); | |
2027 case CSSPropertyWebkitAnimationFillMode: { | |
2028 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
2029 const CSSAnimationData* animationData = style.animations(); | |
2030 if (animationData) { | |
2031 for (size_t i = 0; i < animationData->fillModeList().size(); ++i) | |
2032 list->append(valueForAnimationFillMode(animationData->fillModeLi
st()[i])); | |
2033 } else { | |
2034 list->append(cssValuePool().createIdentifierValue(CSSValueNone)); | |
2035 } | |
2036 return list.release(); | |
2037 } | |
2038 case CSSPropertyAnimationIterationCount: | |
2039 ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); | |
2040 case CSSPropertyWebkitAnimationIterationCount: { | |
2041 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
2042 const CSSAnimationData* animationData = style.animations(); | |
2043 if (animationData) { | |
2044 for (size_t i = 0; i < animationData->iterationCountList().size(); +
+i) | |
2045 list->append(valueForAnimationIterationCount(animationData->iter
ationCountList()[i])); | |
2046 } else { | |
2047 list->append(cssValuePool().createValue(CSSAnimationData::initialIte
rationCount(), CSSPrimitiveValue::CSS_NUMBER)); | |
2048 } | |
2049 return list.release(); | |
2050 } | |
2051 case CSSPropertyAnimationName: | |
2052 ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); | |
2053 case CSSPropertyWebkitAnimationName: { | |
2054 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
2055 const CSSAnimationData* animationData = style.animations(); | |
2056 if (animationData) { | |
2057 for (size_t i = 0; i < animationData->nameList().size(); ++i) | |
2058 list->append(cssValuePool().createValue(animationData->nameList(
)[i], CSSPrimitiveValue::CSS_CUSTOM_IDENT)); | |
2059 } else { | |
2060 list->append(cssValuePool().createIdentifierValue(CSSValueNone)); | |
2061 } | |
2062 return list.release(); | |
2063 } | |
2064 case CSSPropertyAnimationPlayState: | |
2065 ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); | |
2066 case CSSPropertyWebkitAnimationPlayState: { | |
2067 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
2068 const CSSAnimationData* animationData = style.animations(); | |
2069 if (animationData) { | |
2070 for (size_t i = 0; i < animationData->playStateList().size(); ++i) | |
2071 list->append(valueForAnimationPlayState(animationData->playState
List()[i])); | |
2072 } else { | |
2073 list->append(cssValuePool().createIdentifierValue(CSSValueRunning)); | |
2074 } | |
2075 return list.release(); | |
2076 } | |
2077 case CSSPropertyAnimationTimingFunction: | |
2078 ASSERT(RuntimeEnabledFeatures::cssAnimationUnprefixedEnabled()); | |
2079 case CSSPropertyWebkitAnimationTimingFunction: | |
2080 return valueForAnimationTimingFunction(style.animations()); | |
2081 case CSSPropertyAnimation: | |
2082 case CSSPropertyWebkitAnimation: { | |
2083 const CSSAnimationData* animationData = style.animations(); | |
2084 if (animationData) { | |
2085 RefPtrWillBeRawPtr<CSSValueList> animationsList = CSSValueList::crea
teCommaSeparated(); | |
2086 for (size_t i = 0; i < animationData->nameList().size(); ++i) { | |
2087 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpac
eSeparated(); | |
2088 list->append(cssValuePool().createValue(animationData->nameList(
)[i], CSSPrimitiveValue::CSS_CUSTOM_IDENT)); | |
2089 list->append(cssValuePool().createValue(CSSTimingData::getRepeat
ed(animationData->durationList(), i), CSSPrimitiveValue::CSS_S)); | |
2090 list->append(createTimingFunctionValue(CSSTimingData::getRepeate
d(animationData->timingFunctionList(), i).get())); | |
2091 list->append(cssValuePool().createValue(CSSTimingData::getRepeat
ed(animationData->delayList(), i), CSSPrimitiveValue::CSS_S)); | |
2092 list->append(valueForAnimationIterationCount(CSSTimingData::getR
epeated(animationData->iterationCountList(), i))); | |
2093 list->append(valueForAnimationDirection(CSSTimingData::getRepeat
ed(animationData->directionList(), i))); | |
2094 list->append(valueForAnimationFillMode(CSSTimingData::getRepeate
d(animationData->fillModeList(), i))); | |
2095 list->append(valueForAnimationPlayState(CSSTimingData::getRepeat
ed(animationData->playStateList(), i))); | |
2096 animationsList->append(list); | |
2097 } | |
2098 return animationsList.release(); | |
2099 } | |
2100 | |
2101 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparat
ed(); | |
2102 // animation-name default value. | |
2103 list->append(cssValuePool().createIdentifierValue(CSSValueNone)); | |
2104 list->append(cssValuePool().createValue(CSSAnimationData::initialDuratio
n(), CSSPrimitiveValue::CSS_S)); | |
2105 list->append(createTimingFunctionValue(CSSAnimationData::initialTimingFu
nction().get())); | |
2106 list->append(cssValuePool().createValue(CSSAnimationData::initialDelay()
, CSSPrimitiveValue::CSS_S)); | |
2107 list->append(cssValuePool().createValue(CSSAnimationData::initialIterati
onCount(), CSSPrimitiveValue::CSS_NUMBER)); | |
2108 list->append(valueForAnimationDirection(CSSAnimationData::initialDirecti
on())); | |
2109 list->append(valueForAnimationFillMode(CSSAnimationData::initialFillMode
())); | |
2110 // Initial animation-play-state. | |
2111 list->append(cssValuePool().createIdentifierValue(CSSValueRunning)); | |
2112 return list.release(); | |
2113 } | |
2114 case CSSPropertyWebkitAppearance: | |
2115 return cssValuePool().createValue(style.appearance()); | |
2116 case CSSPropertyBackfaceVisibility: | |
2117 case CSSPropertyWebkitBackfaceVisibility: | |
2118 return cssValuePool().createIdentifierValue((style.backfaceVisibility()
== BackfaceVisibilityHidden) ? CSSValueHidden : CSSValueVisible); | |
2119 case CSSPropertyWebkitBorderImage: | |
2120 return valueForNinePieceImage(style.borderImage(), style); | |
2121 case CSSPropertyBorderImageOutset: | |
2122 return valueForNinePieceImageQuad(style.borderImage().outset(), style); | |
2123 case CSSPropertyBorderImageRepeat: | |
2124 return valueForNinePieceImageRepeat(style.borderImage()); | |
2125 case CSSPropertyBorderImageSlice: | |
2126 return valueForNinePieceImageSlice(style.borderImage()); | |
2127 case CSSPropertyBorderImageWidth: | |
2128 return valueForNinePieceImageQuad(style.borderImage().borderSlices(), st
yle); | |
2129 case CSSPropertyWebkitMaskBoxImage: | |
2130 return valueForNinePieceImage(style.maskBoxImage(), style); | |
2131 case CSSPropertyWebkitMaskBoxImageOutset: | |
2132 return valueForNinePieceImageQuad(style.maskBoxImage().outset(), style); | |
2133 case CSSPropertyWebkitMaskBoxImageRepeat: | |
2134 return valueForNinePieceImageRepeat(style.maskBoxImage()); | |
2135 case CSSPropertyWebkitMaskBoxImageSlice: | |
2136 return valueForNinePieceImageSlice(style.maskBoxImage()); | |
2137 case CSSPropertyWebkitMaskBoxImageWidth: | |
2138 return valueForNinePieceImageQuad(style.maskBoxImage().borderSlices(), s
tyle); | |
2139 case CSSPropertyWebkitMaskBoxImageSource: | |
2140 if (style.maskBoxImageSource()) | |
2141 return style.maskBoxImageSource()->cssValue(); | |
2142 return cssValuePool().createIdentifierValue(CSSValueNone); | |
2143 case CSSPropertyWebkitFontSizeDelta: | |
2144 // Not a real style property -- used by the editing engine -- so has no
computed value. | |
2145 return nullptr; | |
2146 case CSSPropertyWebkitMarginBottomCollapse: | |
2147 case CSSPropertyWebkitMarginAfterCollapse: | |
2148 return cssValuePool().createValue(style.marginAfterCollapse()); | |
2149 case CSSPropertyWebkitMarginTopCollapse: | |
2150 case CSSPropertyWebkitMarginBeforeCollapse: | |
2151 return cssValuePool().createValue(style.marginBeforeCollapse()); | |
2152 case CSSPropertyPerspective: | |
2153 case CSSPropertyWebkitPerspective: | |
2154 if (!style.hasPerspective()) | |
2155 return cssValuePool().createIdentifierValue(CSSValueNone); | |
2156 return zoomAdjustedPixelValue(style.perspective(), style); | |
2157 case CSSPropertyPerspectiveOrigin: | |
2158 case CSSPropertyWebkitPerspectiveOrigin: { | |
2159 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparat
ed(); | |
2160 if (renderer) { | |
2161 LayoutRect box; | |
2162 if (renderer->isBox()) | |
2163 box = toLayoutBox(renderer)->borderBoxRect(); | |
2164 | |
2165 list->append(zoomAdjustedPixelValue(minimumValueForLength(style.pers
pectiveOriginX(), box.width()), style)); | |
2166 list->append(zoomAdjustedPixelValue(minimumValueForLength(style.pers
pectiveOriginY(), box.height()), style)); | |
2167 } else { | |
2168 list->append(zoomAdjustedPixelValueForLength(style.perspectiveOrigin
X(), style)); | |
2169 list->append(zoomAdjustedPixelValueForLength(style.perspectiveOrigin
Y(), style)); | |
2170 } | |
2171 return list.release(); | |
2172 } | |
2173 case CSSPropertyWebkitRtlOrdering: | |
2174 return cssValuePool().createIdentifierValue(style.rtlOrdering() ? CSSVal
ueVisual : CSSValueLogical); | |
2175 case CSSPropertyWebkitTapHighlightColor: | |
2176 return currentColorOrValidColor(style, style.tapHighlightColor()); | |
2177 case CSSPropertyWebkitUserDrag: | |
2178 return cssValuePool().createValue(style.userDrag()); | |
2179 case CSSPropertyWebkitUserSelect: | |
2180 return cssValuePool().createValue(style.userSelect()); | |
2181 case CSSPropertyBorderBottomLeftRadius: | |
2182 return valueForBorderRadiusCorner(style.borderBottomLeftRadius(), style)
; | |
2183 case CSSPropertyBorderBottomRightRadius: | |
2184 return valueForBorderRadiusCorner(style.borderBottomRightRadius(), style
); | |
2185 case CSSPropertyBorderTopLeftRadius: | |
2186 return valueForBorderRadiusCorner(style.borderTopLeftRadius(), style); | |
2187 case CSSPropertyBorderTopRightRadius: | |
2188 return valueForBorderRadiusCorner(style.borderTopRightRadius(), style); | |
2189 case CSSPropertyClip: { | |
2190 if (style.hasAutoClip()) | |
2191 return cssValuePool().createIdentifierValue(CSSValueAuto); | |
2192 RefPtrWillBeRawPtr<Rect> rect = Rect::create(); | |
2193 rect->setTop(zoomAdjustedPixelValue(style.clip().top().value(), style)); | |
2194 rect->setRight(zoomAdjustedPixelValue(style.clip().right().value(), styl
e)); | |
2195 rect->setBottom(zoomAdjustedPixelValue(style.clip().bottom().value(), st
yle)); | |
2196 rect->setLeft(zoomAdjustedPixelValue(style.clip().left().value(), style)
); | |
2197 return cssValuePool().createValue(rect.release()); | |
2198 } | |
2199 case CSSPropertySpeak: | |
2200 return cssValuePool().createValue(style.speak()); | |
2201 case CSSPropertyTransform: | |
2202 case CSSPropertyWebkitTransform: | |
2203 return computedTransform(renderer, style); | |
2204 case CSSPropertyTransformOrigin: | |
2205 case CSSPropertyWebkitTransformOrigin: { | |
2206 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparat
ed(); | |
2207 if (renderer) { | |
2208 LayoutRect box; | |
2209 if (renderer->isBox()) | |
2210 box = toLayoutBox(renderer)->borderBoxRect(); | |
2211 | |
2212 list->append(zoomAdjustedPixelValue(minimumValueForLength(style.tran
sformOriginX(), box.width()), style)); | |
2213 list->append(zoomAdjustedPixelValue(minimumValueForLength(style.tran
sformOriginY(), box.height()), style)); | |
2214 if (style.transformOriginZ() != 0) | |
2215 list->append(zoomAdjustedPixelValue(style.transformOriginZ(), st
yle)); | |
2216 } else { | |
2217 list->append(zoomAdjustedPixelValueForLength(style.transformOriginX(
), style)); | |
2218 list->append(zoomAdjustedPixelValueForLength(style.transformOriginY(
), style)); | |
2219 if (style.transformOriginZ() != 0) | |
2220 list->append(zoomAdjustedPixelValue(style.transformOriginZ(), st
yle)); | |
2221 } | |
2222 return list.release(); | |
2223 } | |
2224 case CSSPropertyTransformStyle: | |
2225 case CSSPropertyWebkitTransformStyle: | |
2226 return cssValuePool().createIdentifierValue((style.transformStyle3D() ==
TransformStyle3DPreserve3D) ? CSSValuePreserve3d : CSSValueFlat); | |
2227 case CSSPropertyTransitionDelay: | |
2228 case CSSPropertyWebkitTransitionDelay: | |
2229 return valueForAnimationDelay(style.transitions()); | |
2230 case CSSPropertyTransitionDuration: | |
2231 case CSSPropertyWebkitTransitionDuration: | |
2232 return valueForAnimationDuration(style.transitions()); | |
2233 case CSSPropertyTransitionProperty: | |
2234 case CSSPropertyWebkitTransitionProperty: | |
2235 return valueForTransitionProperty(style.transitions()); | |
2236 case CSSPropertyTransitionTimingFunction: | |
2237 case CSSPropertyWebkitTransitionTimingFunction: | |
2238 return valueForAnimationTimingFunction(style.transitions()); | |
2239 case CSSPropertyTransition: | |
2240 case CSSPropertyWebkitTransition: { | |
2241 const CSSTransitionData* transitionData = style.transitions(); | |
2242 if (transitionData) { | |
2243 RefPtrWillBeRawPtr<CSSValueList> transitionsList = CSSValueList::cre
ateCommaSeparated(); | |
2244 for (size_t i = 0; i < transitionData->propertyList().size(); ++i) { | |
2245 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpac
eSeparated(); | |
2246 list->append(createTransitionPropertyValue(transitionData->prope
rtyList()[i])); | |
2247 list->append(cssValuePool().createValue(CSSTimingData::getRepeat
ed(transitionData->durationList(), i), CSSPrimitiveValue::CSS_S)); | |
2248 list->append(createTimingFunctionValue(CSSTimingData::getRepeate
d(transitionData->timingFunctionList(), i).get())); | |
2249 list->append(cssValuePool().createValue(CSSTimingData::getRepeat
ed(transitionData->delayList(), i), CSSPrimitiveValue::CSS_S)); | |
2250 transitionsList->append(list); | |
2251 } | |
2252 return transitionsList.release(); | |
2253 } | |
2254 | |
2255 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparat
ed(); | |
2256 // transition-property default value. | |
2257 list->append(cssValuePool().createIdentifierValue(CSSValueAll)); | |
2258 list->append(cssValuePool().createValue(CSSTransitionData::initialDurati
on(), CSSPrimitiveValue::CSS_S)); | |
2259 list->append(createTimingFunctionValue(CSSTransitionData::initialTimingF
unction().get())); | |
2260 list->append(cssValuePool().createValue(CSSTransitionData::initialDelay(
), CSSPrimitiveValue::CSS_S)); | |
2261 return list.release(); | |
2262 } | |
2263 case CSSPropertyPointerEvents: | |
2264 return cssValuePool().createValue(style.pointerEvents()); | |
2265 case CSSPropertyWebkitWritingMode: | |
2266 return cssValuePool().createValue(style.writingMode()); | |
2267 case CSSPropertyWebkitTextCombine: | |
2268 return cssValuePool().createValue(style.textCombine()); | |
2269 case CSSPropertyWebkitTextOrientation: | |
2270 return CSSPrimitiveValue::create(style.textOrientation()); | |
2271 case CSSPropertyWebkitLineBoxContain: | |
2272 return createLineBoxContainValue(style.lineBoxContain()); | |
2273 case CSSPropertyContent: | |
2274 return valueForContentData(style); | |
2275 case CSSPropertyCounterIncrement: | |
2276 return valueForCounterDirectives(style, propertyID); | |
2277 case CSSPropertyCounterReset: | |
2278 return valueForCounterDirectives(style, propertyID); | |
2279 case CSSPropertyWebkitClipPath: | |
2280 if (ClipPathOperation* operation = style.clipPath()) { | |
2281 if (operation->type() == ClipPathOperation::SHAPE) | |
2282 return valueForBasicShape(style, toShapeClipPathOperation(operat
ion)->basicShape()); | |
2283 if (operation->type() == ClipPathOperation::REFERENCE) | |
2284 return CSSPrimitiveValue::create(toReferenceClipPathOperation(op
eration)->url(), CSSPrimitiveValue::CSS_URI); | |
2285 } | |
2286 return cssValuePool().createIdentifierValue(CSSValueNone); | |
2287 case CSSPropertyShapeMargin: | |
2288 return cssValuePool().createValue(style.shapeMargin(), style); | |
2289 case CSSPropertyShapeImageThreshold: | |
2290 return cssValuePool().createValue(style.shapeImageThreshold(), CSSPrimit
iveValue::CSS_NUMBER); | |
2291 case CSSPropertyShapeOutside: | |
2292 return valueForShape(style, style.shapeOutside()); | |
2293 case CSSPropertyWebkitFilter: | |
2294 return valueForFilter(style); | |
2295 case CSSPropertyMixBlendMode: | |
2296 return cssValuePool().createValue(style.blendMode()); | |
2297 | |
2298 case CSSPropertyBackgroundBlendMode: { | |
2299 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparat
ed(); | |
2300 for (const FillLayer* currLayer = &style.backgroundLayers(); currLayer;
currLayer = currLayer->next()) | |
2301 list->append(cssValuePool().createValue(currLayer->blendMode())); | |
2302 return list.release(); | |
2303 } | |
2304 case CSSPropertyBackground: | |
2305 return valuesForBackgroundShorthand(style, renderer, styledNode, allowVi
sitedStyle); | |
2306 case CSSPropertyBorder: { | |
2307 RefPtrWillBeRawPtr<CSSValue> value = get(CSSPropertyBorderTop, style, re
nderer, styledNode, allowVisitedStyle); | |
2308 const CSSPropertyID properties[] = { | |
2309 CSSPropertyBorderRight, | |
2310 CSSPropertyBorderBottom, | |
2311 CSSPropertyBorderLeft | |
2312 }; | |
2313 for (size_t i = 0; i < WTF_ARRAY_LENGTH(properties); ++i) { | |
2314 if (!compareCSSValuePtr<CSSValue>(value, get(properties[i], style, r
enderer, styledNode, allowVisitedStyle))) | |
2315 return nullptr; | |
2316 } | |
2317 return value.release(); | |
2318 } | |
2319 case CSSPropertyBorderBottom: | |
2320 return valuesForShorthandProperty(borderBottomShorthand(), style, render
er, styledNode, allowVisitedStyle); | |
2321 case CSSPropertyBorderColor: | |
2322 return valuesForSidesShorthand(borderColorShorthand(), style, renderer,
styledNode, allowVisitedStyle); | |
2323 case CSSPropertyBorderLeft: | |
2324 return valuesForShorthandProperty(borderLeftShorthand(), style, renderer
, styledNode, allowVisitedStyle); | |
2325 case CSSPropertyBorderImage: | |
2326 return valueForNinePieceImage(style.borderImage(), style); | |
2327 case CSSPropertyBorderRadius: | |
2328 return valueForBorderRadiusShorthand(style); | |
2329 case CSSPropertyBorderRight: | |
2330 return valuesForShorthandProperty(borderRightShorthand(), style, rendere
r, styledNode, allowVisitedStyle); | |
2331 case CSSPropertyBorderStyle: | |
2332 return valuesForSidesShorthand(borderStyleShorthand(), style, renderer,
styledNode, allowVisitedStyle); | |
2333 case CSSPropertyBorderTop: | |
2334 return valuesForShorthandProperty(borderTopShorthand(), style, renderer,
styledNode, allowVisitedStyle); | |
2335 case CSSPropertyBorderWidth: | |
2336 return valuesForSidesShorthand(borderWidthShorthand(), style, renderer,
styledNode, allowVisitedStyle); | |
2337 case CSSPropertyWebkitColumnRule: | |
2338 return valuesForShorthandProperty(webkitColumnRuleShorthand(), style, re
nderer, styledNode, allowVisitedStyle); | |
2339 case CSSPropertyWebkitColumns: | |
2340 return valuesForShorthandProperty(webkitColumnsShorthand(), style, rende
rer, styledNode, allowVisitedStyle); | |
2341 case CSSPropertyListStyle: | |
2342 return valuesForShorthandProperty(listStyleShorthand(), style, renderer,
styledNode, allowVisitedStyle); | |
2343 case CSSPropertyMargin: | |
2344 return valuesForSidesShorthand(marginShorthand(), style, renderer, style
dNode, allowVisitedStyle); | |
2345 case CSSPropertyOutline: | |
2346 return valuesForShorthandProperty(outlineShorthand(), style, renderer, s
tyledNode, allowVisitedStyle); | |
2347 case CSSPropertyPadding: | |
2348 return valuesForSidesShorthand(paddingShorthand(), style, renderer, styl
edNode, allowVisitedStyle); | |
2349 // Individual properties not part of the spec. | |
2350 case CSSPropertyBackgroundRepeatX: | |
2351 case CSSPropertyBackgroundRepeatY: | |
2352 return nullptr; | |
2353 | |
2354 case CSSPropertyMotion: | |
2355 ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); | |
2356 return valuesForShorthandProperty(motionShorthand(), style, renderer, st
yledNode, allowVisitedStyle); | |
2357 | |
2358 case CSSPropertyMotionPath: { | |
2359 ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); | |
2360 const StyleMotionPath* styleMotionPath = style.motionPath(); | |
2361 if (!styleMotionPath) | |
2362 return cssValuePool().createIdentifierValue(CSSValueNone); | |
2363 | |
2364 ASSERT(styleMotionPath->isPathStyleMotionPath()); | |
2365 return CSSPathValue::create(toPathStyleMotionPath(styleMotionPath)->path
String()); | |
2366 } | |
2367 | |
2368 case CSSPropertyMotionOffset: | |
2369 ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); | |
2370 return zoomAdjustedPixelValueForLength(style.motionOffset(), style); | |
2371 | |
2372 case CSSPropertyMotionRotation: { | |
2373 ASSERT(RuntimeEnabledFeatures::cssMotionPathEnabled()); | |
2374 RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparat
ed(); | |
2375 if (style.motionRotationType() == MotionRotationAuto) | |
2376 list->append(cssValuePool().createIdentifierValue(CSSValueAuto)); | |
2377 list->append(cssValuePool().createValue(style.motionRotation(), CSSPrimi
tiveValue::CSS_DEG)); | |
2378 return list.release(); | |
2379 } | |
2380 | |
2381 // Unimplemented CSS 3 properties (including CSS3 shorthand properties). | |
2382 case CSSPropertyWebkitTextEmphasis: | |
2383 return nullptr; | |
2384 | |
2385 // Directional properties are resolved by resolveDirectionAwareProperty() be
fore the switch. | |
2386 case CSSPropertyWebkitBorderEnd: | |
2387 case CSSPropertyWebkitBorderEndColor: | |
2388 case CSSPropertyWebkitBorderEndStyle: | |
2389 case CSSPropertyWebkitBorderEndWidth: | |
2390 case CSSPropertyWebkitBorderStart: | |
2391 case CSSPropertyWebkitBorderStartColor: | |
2392 case CSSPropertyWebkitBorderStartStyle: | |
2393 case CSSPropertyWebkitBorderStartWidth: | |
2394 case CSSPropertyWebkitBorderAfter: | |
2395 case CSSPropertyWebkitBorderAfterColor: | |
2396 case CSSPropertyWebkitBorderAfterStyle: | |
2397 case CSSPropertyWebkitBorderAfterWidth: | |
2398 case CSSPropertyWebkitBorderBefore: | |
2399 case CSSPropertyWebkitBorderBeforeColor: | |
2400 case CSSPropertyWebkitBorderBeforeStyle: | |
2401 case CSSPropertyWebkitBorderBeforeWidth: | |
2402 case CSSPropertyWebkitMarginEnd: | |
2403 case CSSPropertyWebkitMarginStart: | |
2404 case CSSPropertyWebkitMarginAfter: | |
2405 case CSSPropertyWebkitMarginBefore: | |
2406 case CSSPropertyWebkitPaddingEnd: | |
2407 case CSSPropertyWebkitPaddingStart: | |
2408 case CSSPropertyWebkitPaddingAfter: | |
2409 case CSSPropertyWebkitPaddingBefore: | |
2410 case CSSPropertyWebkitLogicalWidth: | |
2411 case CSSPropertyWebkitLogicalHeight: | |
2412 case CSSPropertyWebkitMinLogicalWidth: | |
2413 case CSSPropertyWebkitMinLogicalHeight: | |
2414 case CSSPropertyWebkitMaxLogicalWidth: | |
2415 case CSSPropertyWebkitMaxLogicalHeight: | |
2416 ASSERT_NOT_REACHED(); | |
2417 return nullptr; | |
2418 | |
2419 // Unimplemented @font-face properties. | |
2420 case CSSPropertySrc: | |
2421 case CSSPropertyUnicodeRange: | |
2422 return nullptr; | |
2423 | |
2424 // Other unimplemented properties. | |
2425 case CSSPropertyPage: // for @page | |
2426 case CSSPropertyQuotes: // FIXME: needs implementation | |
2427 case CSSPropertySize: // for @page | |
2428 return nullptr; | |
2429 | |
2430 // Unimplemented -webkit- properties. | |
2431 case CSSPropertyWebkitBorderRadius: | |
2432 case CSSPropertyWebkitMarginCollapse: | |
2433 case CSSPropertyWebkitMask: | |
2434 case CSSPropertyWebkitMaskRepeatX: | |
2435 case CSSPropertyWebkitMaskRepeatY: | |
2436 case CSSPropertyWebkitPerspectiveOriginX: | |
2437 case CSSPropertyWebkitPerspectiveOriginY: | |
2438 case CSSPropertyWebkitTextStroke: | |
2439 case CSSPropertyWebkitTransformOriginX: | |
2440 case CSSPropertyWebkitTransformOriginY: | |
2441 case CSSPropertyWebkitTransformOriginZ: | |
2442 return nullptr; | |
2443 | |
2444 // @viewport rule properties. | |
2445 case CSSPropertyMaxZoom: | |
2446 case CSSPropertyMinZoom: | |
2447 case CSSPropertyOrientation: | |
2448 case CSSPropertyUserZoom: | |
2449 return nullptr; | |
2450 | |
2451 // SVG properties. | |
2452 case CSSPropertyClipRule: | |
2453 return CSSPrimitiveValue::create(svgStyle.clipRule()); | |
2454 case CSSPropertyFloodOpacity: | |
2455 return CSSPrimitiveValue::create(svgStyle.floodOpacity(), CSSPrimitiveVa
lue::CSS_NUMBER); | |
2456 case CSSPropertyStopOpacity: | |
2457 return CSSPrimitiveValue::create(svgStyle.stopOpacity(), CSSPrimitiveVal
ue::CSS_NUMBER); | |
2458 case CSSPropertyColorInterpolation: | |
2459 return CSSPrimitiveValue::create(svgStyle.colorInterpolation()); | |
2460 case CSSPropertyColorInterpolationFilters: | |
2461 return CSSPrimitiveValue::create(svgStyle.colorInterpolationFilters()); | |
2462 case CSSPropertyFillOpacity: | |
2463 return CSSPrimitiveValue::create(svgStyle.fillOpacity(), CSSPrimitiveVal
ue::CSS_NUMBER); | |
2464 case CSSPropertyFillRule: | |
2465 return CSSPrimitiveValue::create(svgStyle.fillRule()); | |
2466 case CSSPropertyColorRendering: | |
2467 return CSSPrimitiveValue::create(svgStyle.colorRendering()); | |
2468 case CSSPropertyShapeRendering: | |
2469 return CSSPrimitiveValue::create(svgStyle.shapeRendering()); | |
2470 case CSSPropertyStrokeLinecap: | |
2471 return CSSPrimitiveValue::create(svgStyle.capStyle()); | |
2472 case CSSPropertyStrokeLinejoin: | |
2473 return CSSPrimitiveValue::create(svgStyle.joinStyle()); | |
2474 case CSSPropertyStrokeMiterlimit: | |
2475 return CSSPrimitiveValue::create(svgStyle.strokeMiterLimit(), CSSPrimiti
veValue::CSS_NUMBER); | |
2476 case CSSPropertyStrokeOpacity: | |
2477 return CSSPrimitiveValue::create(svgStyle.strokeOpacity(), CSSPrimitiveV
alue::CSS_NUMBER); | |
2478 case CSSPropertyAlignmentBaseline: | |
2479 return CSSPrimitiveValue::create(svgStyle.alignmentBaseline()); | |
2480 case CSSPropertyDominantBaseline: | |
2481 return CSSPrimitiveValue::create(svgStyle.dominantBaseline()); | |
2482 case CSSPropertyTextAnchor: | |
2483 return CSSPrimitiveValue::create(svgStyle.textAnchor()); | |
2484 case CSSPropertyWritingMode: | |
2485 return CSSPrimitiveValue::create(svgStyle.writingMode()); | |
2486 case CSSPropertyClipPath: | |
2487 if (!svgStyle.clipperResource().isEmpty()) | |
2488 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.clipperResource()), CSSPrimitiveValue::CSS_URI); | |
2489 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | |
2490 case CSSPropertyMask: | |
2491 if (!svgStyle.maskerResource().isEmpty()) | |
2492 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.maskerResource()), CSSPrimitiveValue::CSS_URI); | |
2493 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | |
2494 case CSSPropertyFilter: | |
2495 if (!svgStyle.filterResource().isEmpty()) | |
2496 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.filterResource()), CSSPrimitiveValue::CSS_URI); | |
2497 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | |
2498 case CSSPropertyFloodColor: | |
2499 return currentColorOrValidColor(style, svgStyle.floodColor()); | |
2500 case CSSPropertyLightingColor: | |
2501 return currentColorOrValidColor(style, svgStyle.lightingColor()); | |
2502 case CSSPropertyStopColor: | |
2503 return currentColorOrValidColor(style, svgStyle.stopColor()); | |
2504 case CSSPropertyFill: | |
2505 return adjustSVGPaintForCurrentColor(svgStyle.fillPaintType(), svgStyle.
fillPaintUri(), svgStyle.fillPaintColor(), style.color()); | |
2506 case CSSPropertyMarkerEnd: | |
2507 if (!svgStyle.markerEndResource().isEmpty()) | |
2508 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.markerEndResource()), CSSPrimitiveValue::CSS_URI); | |
2509 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | |
2510 case CSSPropertyMarkerMid: | |
2511 if (!svgStyle.markerMidResource().isEmpty()) | |
2512 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.markerMidResource()), CSSPrimitiveValue::CSS_URI); | |
2513 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | |
2514 case CSSPropertyMarkerStart: | |
2515 if (!svgStyle.markerStartResource().isEmpty()) | |
2516 return CSSPrimitiveValue::create(serializeAsFragmentIdentifier(svgSt
yle.markerStartResource()), CSSPrimitiveValue::CSS_URI); | |
2517 return CSSPrimitiveValue::createIdentifier(CSSValueNone); | |
2518 case CSSPropertyStroke: | |
2519 return adjustSVGPaintForCurrentColor(svgStyle.strokePaintType(), svgStyl
e.strokePaintUri(), svgStyle.strokePaintColor(), style.color()); | |
2520 case CSSPropertyStrokeDasharray: | |
2521 return strokeDashArrayToCSSValueList(*svgStyle.strokeDashArray(), style)
; | |
2522 case CSSPropertyStrokeDashoffset: | |
2523 return zoomAdjustedPixelValueForLength(svgStyle.strokeDashOffset(), styl
e); | |
2524 case CSSPropertyStrokeWidth: | |
2525 return pixelValueForUnzoomedLength(svgStyle.strokeWidth(), style); | |
2526 case CSSPropertyBaselineShift: { | |
2527 switch (svgStyle.baselineShift()) { | |
2528 case BS_SUPER: | |
2529 return CSSPrimitiveValue::createIdentifier(CSSValueSuper); | |
2530 case BS_SUB: | |
2531 return CSSPrimitiveValue::createIdentifier(CSSValueSub); | |
2532 case BS_LENGTH: | |
2533 return zoomAdjustedPixelValueForLength(svgStyle.baselineShiftValue()
, style); | |
2534 } | |
2535 ASSERT_NOT_REACHED(); | |
2536 return nullptr; | |
2537 } | |
2538 case CSSPropertyBufferedRendering: | |
2539 return CSSPrimitiveValue::create(svgStyle.bufferedRendering()); | |
2540 case CSSPropertyGlyphOrientationHorizontal: | |
2541 return glyphOrientationToCSSPrimitiveValue(svgStyle.glyphOrientationHori
zontal()); | |
2542 case CSSPropertyGlyphOrientationVertical: { | |
2543 if (RefPtrWillBeRawPtr<CSSPrimitiveValue> value = glyphOrientationToCSSP
rimitiveValue(svgStyle.glyphOrientationVertical())) | |
2544 return value.release(); | |
2545 if (svgStyle.glyphOrientationVertical() == GO_AUTO) | |
2546 return CSSPrimitiveValue::createIdentifier(CSSValueAuto); | |
2547 return nullptr; | |
2548 } | |
2549 case CSSPropertyPaintOrder: | |
2550 return paintOrderToCSSValueList(svgStyle.paintOrder()); | |
2551 case CSSPropertyVectorEffect: | |
2552 return CSSPrimitiveValue::create(svgStyle.vectorEffect()); | |
2553 case CSSPropertyMaskType: | |
2554 return CSSPrimitiveValue::create(svgStyle.maskType()); | |
2555 case CSSPropertyMarker: | |
2556 case CSSPropertyEnableBackground: | |
2557 // the above properties are not yet implemented in the engine | |
2558 return nullptr; | |
2559 case CSSPropertyCx: | |
2560 return zoomAdjustedPixelValueForLength(svgStyle.cx(), style); | |
2561 case CSSPropertyCy: | |
2562 return zoomAdjustedPixelValueForLength(svgStyle.cy(), style); | |
2563 case CSSPropertyX: | |
2564 return zoomAdjustedPixelValueForLength(svgStyle.x(), style); | |
2565 case CSSPropertyY: | |
2566 return zoomAdjustedPixelValueForLength(svgStyle.y(), style); | |
2567 case CSSPropertyR: | |
2568 return zoomAdjustedPixelValueForLength(svgStyle.r(), style); | |
2569 case CSSPropertyRx: | |
2570 return zoomAdjustedPixelValueForLength(svgStyle.rx(), style); | |
2571 case CSSPropertyRy: | |
2572 return zoomAdjustedPixelValueForLength(svgStyle.ry(), style); | |
2573 | |
2574 case CSSPropertyAll: | |
2575 return nullptr; | |
2576 } | |
2577 ASSERT_NOT_REACHED(); | |
2578 return nullptr; | |
2579 } | |
2580 | |
2581 } | |
OLD | NEW |