SourceSizeList.cpp [plain text]
#include "config.h"
#include "SourceSizeList.h"
#include "CSSParser.h"
#include "CSSToLengthConversionData.h"
#include "MediaList.h"
#include "MediaQueryEvaluator.h"
#include "RenderStyle.h"
#include "RenderView.h"
namespace WebCore {
static bool match(const MediaQueryExpression& expression, const RenderStyle& style, Document& document)
{
return expression.mediaFeature().isEmpty() || MediaQueryEvaluator { "screen", document, &style }.evaluate(expression);
}
static float defaultLength(const RenderStyle& style, RenderView& renderer)
{
return clampTo<float>(CSSPrimitiveValue::computeNonCalcLengthDouble({ &style, &style, &renderer }, CSSPrimitiveValue::CSS_VW, 100.0));
}
static float computeLength(CSSValue& value, const RenderStyle& style, RenderView& renderer)
{
CSSToLengthConversionData conversionData(&style, &style, &renderer);
if (is<CSSPrimitiveValue>(value)) {
CSSPrimitiveValue& primitiveValue = downcast<CSSPrimitiveValue>(value);
if (!primitiveValue.isLength())
return defaultLength(style, renderer);
if (!primitiveValue.isCalculated() && (primitiveValue.primitiveType() == CSSPrimitiveValue::CSS_EXS || primitiveValue.primitiveType() == CSSPrimitiveValue::CSS_CHS)) {
RefPtr<FontSelector> fontSelector = style.fontCascade().fontSelector();
style.fontCascade().update(nullptr);
float result = primitiveValue.computeLength<float>(conversionData);
style.fontCascade().update(fontSelector.get());
return result;
}
return primitiveValue.computeLength<float>(conversionData);
}
if (is<CSSCalcValue>(value))
return downcast<CSSCalcValue>(value).computeLengthPx(conversionData);
return defaultLength(style, renderer);
}
float parseSizesAttribute(Document& document, StringView sizesAttribute)
{
auto* renderer = document.renderView();
if (!renderer)
return 0;
auto& style = renderer->style();
for (auto& sourceSize : CSSParser(CSSStrictMode).parseSizesAttribute(sizesAttribute)) {
if (match(sourceSize.expression, style, document))
return computeLength(sourceSize.length.get(), style, *renderer);
}
return defaultLength(style, *renderer);
}
}