Skip to content

Commit

Permalink
Make container and media query parsers static
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=268822
rdar://122384606

Reviewed by Alan Baradlay.

Simplify the code by avoiding unnecessary instantiation of the generic query parser.

* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/css/parser/CSSParserImpl.cpp:
(WebCore::CSSParserImpl::consumeContainerRule):
* Source/WebCore/css/query/ContainerQuery.cpp: Renamed from Source/WebCore/css/ContainerQuery.cpp.
* Source/WebCore/css/query/ContainerQuery.h: Renamed from Source/WebCore/css/ContainerQuery.h.

Also move this to css/query directory.

* Source/WebCore/css/query/ContainerQueryParser.cpp: Renamed from Source/WebCore/css/ContainerQueryParser.cpp.
(WebCore::CQ::ContainerQueryParser::consumeContainerQuery):
* Source/WebCore/css/query/ContainerQueryParser.h: Renamed from Source/WebCore/css/ContainerQueryParser.h.

Also move ContainerQueryParser to css/query directory.
Also move ContainerQueryParser to CQ namespace.

* Source/WebCore/css/query/GenericMediaQueryParser.cpp:
(WebCore::MQ::FeatureParser::consumeFeature):
(WebCore::MQ::FeatureParser::consumeBooleanOrPlainFeature):
(WebCore::MQ::FeatureParser::consumeRangeFeature):
(WebCore::MQ::FeatureParser::consumeValue):
(WebCore::MQ::FeatureParser::validateFeatureAgainstSchema):
(WebCore::MQ::GenericMediaQueryParserBase::consumeFeature): Deleted.
(WebCore::MQ::GenericMediaQueryParserBase::consumeBooleanOrPlainFeature): Deleted.
(WebCore::MQ::GenericMediaQueryParserBase::consumeRangeFeature): Deleted.
(WebCore::MQ::GenericMediaQueryParserBase::consumeValue): Deleted.
(WebCore::MQ::GenericMediaQueryParserBase::validateFeatureAgainstSchema): Deleted.
* Source/WebCore/css/query/GenericMediaQueryParser.h:
(WebCore::MQ::GenericMediaQueryParser<ConcreteParser>::consumeCondition):
(WebCore::MQ::GenericMediaQueryParser<ConcreteParser>::consumeQueryInParens):
(WebCore::MQ::GenericMediaQueryParser<ConcreteParser>::consumeAndValidateFeature):
(WebCore::MQ::GenericMediaQueryParser<ConcreteParser>::validateFeature):
(WebCore::MQ::GenericMediaQueryParser<ConcreteParser>::schemaForFeatureName):
(WebCore::MQ::GenericMediaQueryParserBase::GenericMediaQueryParserBase): Deleted.
(WebCore::MQ::GenericMediaQueryParser::GenericMediaQueryParser): Deleted.
(WebCore::MQ::GenericMediaQueryParser::concreteParser): Deleted.
(WebCore::MQ::GenericMediaQueryParser<ConcreteParser>::consumeFeature): Deleted.
(WebCore::MQ::GenericMediaQueryParser<ConcreteParser>::schemaForFeatureName const): Deleted.
* Source/WebCore/css/query/MediaQueryParser.cpp:
(WebCore::MQ::MediaQueryParser::parse):
(WebCore::MQ::MediaQueryParser::parseCondition):
(WebCore::MQ::MediaQueryParser::consumeMediaQueryList):
(WebCore::MQ::MediaQueryParser::consumeMediaQuery):
(WebCore::MQ::MediaQueryParser::schemaForFeatureName):
(WebCore::MQ::MediaQueryParser::MediaQueryParser): Deleted.
(WebCore::MQ::MediaQueryParser::schemaForFeatureName const): Deleted.
* Source/WebCore/css/query/MediaQueryParser.h:

Canonical link: https://commits.webkit.org/274145@main
  • Loading branch information
anttijk committed Feb 6, 2024
1 parent cafc9b1 commit b4b81de
Show file tree
Hide file tree
Showing 12 changed files with 82 additions and 123 deletions.
2 changes: 1 addition & 1 deletion Source/WebCore/Headers.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -847,7 +847,6 @@ set(WebCore_PRIVATE_FRAMEWORK_HEADERS
css/CSSValueList.h
css/CSSVariableData.h
css/CSSVariableReferenceValue.h
css/ContainerQuery.h
css/Counter.h
css/DeprecatedCSSOMCounter.h
css/DeprecatedCSSOMPrimitiveValue.h
Expand Down Expand Up @@ -885,6 +884,7 @@ set(WebCore_PRIVATE_FRAMEWORK_HEADERS
css/parser/CSSSelectorParserContext.h
css/parser/MutableCSSSelector.h

css/query/ContainerQuery.h
css/query/GenericMediaQueryTypes.h
css/query/MediaQuery.h

Expand Down
4 changes: 2 additions & 2 deletions Source/WebCore/Sources.txt
Original file line number Diff line number Diff line change
Expand Up @@ -908,8 +908,6 @@ css/CSSVariableData.cpp
css/CSSVariableReferenceValue.cpp
css/CSSViewValue.cpp
css/ComputedStyleExtractor.cpp
css/ContainerQuery.cpp
css/ContainerQueryParser.cpp
css/DOMCSSNamespace.cpp
css/DOMCSSPaintWorklet.cpp
css/DOMCSSRegisterCustomProperty.cpp
Expand Down Expand Up @@ -979,7 +977,9 @@ css/parser/MediaQueryBlockWatcher.cpp
css/parser/MutableCSSSelector.cpp
css/parser/SizesAttributeParser.cpp
css/parser/SizesCalcParser.cpp
css/query/ContainerQuery.cpp
css/query/ContainerQueryFeatures.cpp
css/query/ContainerQueryParser.cpp
css/query/GenericMediaQueryEvaluator.cpp
css/query/GenericMediaQueryParser.cpp
css/query/GenericMediaQuerySerialization.cpp
Expand Down
8 changes: 4 additions & 4 deletions Source/WebCore/WebCore.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -35516,8 +35516,12 @@
E4DA5E3E28A2867300849BCF /* query */ = {
isa = PBXGroup;
children = (
E4F1574927BB93BE00B330D8 /* ContainerQuery.cpp */,
E4F1573227B6991F00B330D8 /* ContainerQuery.h */,
E455A5912902877800B6EA76 /* ContainerQueryFeatures.cpp */,
E455A5932902878800B6EA76 /* ContainerQueryFeatures.h */,
E4F1573F27B93B5800B330D8 /* ContainerQueryParser.cpp */,
E4F1573D27B93B4C00B330D8 /* ContainerQueryParser.h */,
E4DA5E5528A5005E00849BCF /* GenericMediaQueryEvaluator.cpp */,
E4DA5E3F28A288F800849BCF /* GenericMediaQueryEvaluator.h */,
E4DA5E4528A3AF5400849BCF /* GenericMediaQueryParser.cpp */,
Expand Down Expand Up @@ -35690,10 +35694,6 @@
FBD6AF8515EF21D4008B7110 /* BasicShapeFunctions.h */,
713785EE28D9F4C50092D9F2 /* ComputedStyleExtractor.cpp */,
713785EF28D9F4C50092D9F2 /* ComputedStyleExtractor.h */,
E4F1574927BB93BE00B330D8 /* ContainerQuery.cpp */,
E4F1573227B6991F00B330D8 /* ContainerQuery.h */,
E4F1573F27B93B5800B330D8 /* ContainerQueryParser.cpp */,
E4F1573D27B93B4C00B330D8 /* ContainerQueryParser.h */,
A80E6CDA0A1989CA007FB8C5 /* Counter.h */,
4CA012DB29A7D56700C260C6 /* counterStyles.css */,
CAE9F90D146441F000C245B0 /* CSSAspectRatioValue.cpp */,
Expand Down
2 changes: 1 addition & 1 deletion Source/WebCore/css/parser/CSSParserImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1180,7 +1180,7 @@ RefPtr<StyleRuleContainer> CSSParserImpl::consumeContainerRule(CSSParserTokenRan

auto originalPreludeRange = prelude;

auto query = ContainerQueryParser::consumeContainerQuery(prelude, m_context);
auto query = CQ::ContainerQueryParser::consumeContainerQuery(prelude, m_context);
if (!query)
return nullptr;

Expand Down
File renamed without changes.
File renamed without changes.
Original file line number Diff line number Diff line change
Expand Up @@ -30,28 +30,9 @@
#include "ContainerQueryFeatures.h"

namespace WebCore {
namespace CQ {

using namespace MQ;

Vector<const FeatureSchema*> ContainerQueryParser::featureSchemas()
{
return {
&CQ::Features::width(),
&CQ::Features::height(),
&CQ::Features::inlineSize(),
&CQ::Features::blockSize(),
&CQ::Features::aspectRatio(),
&CQ::Features::orientation(),
};
}

std::optional<CQ::ContainerQuery> ContainerQueryParser::consumeContainerQuery(CSSParserTokenRange& range, const MediaQueryParserContext& context)
{
ContainerQueryParser parser({ context });
return parser.consumeContainerQuery(range);
}

std::optional<CQ::ContainerQuery> ContainerQueryParser::consumeContainerQuery(CSSParserTokenRange& range)
std::optional<ContainerQuery> ContainerQueryParser::consumeContainerQuery(CSSParserTokenRange& range, const MediaQueryParserContext& context)
{
auto consumeName = [&] {
if (range.peek().type() == LeftParenthesisToken || range.peek().type() == FunctionToken)
Expand All @@ -64,20 +45,33 @@ std::optional<CQ::ContainerQuery> ContainerQueryParser::consumeContainerQuery(CS

auto name = consumeName();

auto condition = consumeCondition(range);
auto condition = consumeCondition(range, context);
if (!condition)
return { };

auto requiredAxes = OptionSet<CQ::Axis> { };
auto containsUnknownFeature = CQ::ContainsUnknownFeature::No;
OptionSet<Axis> requiredAxes;
auto containsUnknownFeature = ContainsUnknownFeature::No;

traverseFeatures(*condition, [&](auto& feature) {
requiredAxes.add(CQ::requiredAxesForFeature(feature));
requiredAxes.add(requiredAxesForFeature(feature));
if (!feature.schema)
containsUnknownFeature = CQ::ContainsUnknownFeature::Yes;
containsUnknownFeature = ContainsUnknownFeature::Yes;
});

return CQ::ContainerQuery { name, *condition, requiredAxes, containsUnknownFeature };
return ContainerQuery { name, *condition, requiredAxes, containsUnknownFeature };
}

Vector<const MQ::FeatureSchema*> ContainerQueryParser::featureSchemas()
{
return {
&Features::width(),
&Features::height(),
&Features::inlineSize(),
&Features::blockSize(),
&Features::aspectRatio(),
&Features::orientation(),
};
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,20 +30,13 @@
#include "GenericMediaQueryParser.h"

namespace WebCore {
namespace CQ {

class ContainerQueryParser;

class ContainerQueryParser : public MQ::GenericMediaQueryParser<ContainerQueryParser> {
public:
struct ContainerQueryParser : MQ::GenericMediaQueryParser<ContainerQueryParser> {
static std::optional<CQ::ContainerQuery> consumeContainerQuery(CSSParserTokenRange&, const MediaQueryParserContext&);

static Vector<const MQ::FeatureSchema*> featureSchemas();

std::optional<CQ::ContainerQuery> consumeContainerQuery(CSSParserTokenRange&);

private:
ContainerQueryParser(const MediaQueryParserContext& context)
: GenericMediaQueryParser(context) { }
};

}
}
20 changes: 10 additions & 10 deletions Source/WebCore/css/query/GenericMediaQueryParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,17 @@ static AtomString consumeFeatureName(CSSParserTokenRange& range)
return range.consumeIncludingWhitespace().value().convertToASCIILowercaseAtom();
}

std::optional<Feature> GenericMediaQueryParserBase::consumeFeature(CSSParserTokenRange& range)
std::optional<Feature> FeatureParser::consumeFeature(CSSParserTokenRange& range, const MediaQueryParserContext& context)
{
auto rangeCopy = range;
if (auto feature = consumeBooleanOrPlainFeature(range))
if (auto feature = consumeBooleanOrPlainFeature(range, context))
return feature;

range = rangeCopy;
return consumeRangeFeature(range);
return consumeRangeFeature(range, context);
};

std::optional<Feature> GenericMediaQueryParserBase::consumeBooleanOrPlainFeature(CSSParserTokenRange& range)
std::optional<Feature> FeatureParser::consumeBooleanOrPlainFeature(CSSParserTokenRange& range, const MediaQueryParserContext& context)
{
auto consumePlainFeatureName = [&]() -> std::pair<AtomString, ComparisonOperator> {
auto name = consumeFeatureName(range);
Expand Down Expand Up @@ -88,7 +88,7 @@ std::optional<Feature> GenericMediaQueryParserBase::consumeBooleanOrPlainFeature
if (range.atEnd())
return { };

RefPtr value = consumeValue(range);
RefPtr value = consumeValue(range, context);
if (!value)
return { };

Expand All @@ -98,7 +98,7 @@ std::optional<Feature> GenericMediaQueryParserBase::consumeBooleanOrPlainFeature
return Feature { featureName, Syntax::Plain, { }, Comparison { op, WTFMove(value) } };
}

std::optional<Feature> GenericMediaQueryParserBase::consumeRangeFeature(CSSParserTokenRange& range)
std::optional<Feature> FeatureParser::consumeRangeFeature(CSSParserTokenRange& range, const MediaQueryParserContext& context)
{
auto consumeRangeOperator = [&]() -> std::optional<ComparisonOperator> {
if (range.atEnd())
Expand Down Expand Up @@ -135,7 +135,7 @@ std::optional<Feature> GenericMediaQueryParserBase::consumeRangeFeature(CSSParse
auto consumeLeftComparison = [&]() -> std::optional<Comparison> {
if (range.peek().type() == IdentToken)
return { };
RefPtr value = consumeValue(range);
RefPtr value = consumeValue(range, context);
if (!value)
return { };
auto op = consumeRangeOperator();
Expand All @@ -151,7 +151,7 @@ std::optional<Feature> GenericMediaQueryParserBase::consumeRangeFeature(CSSParse
auto op = consumeRangeOperator();
if (!op)
return { };
RefPtr value = consumeValue(range);
RefPtr value = consumeValue(range, context);
if (!value) {
didFailParsing = true;
return { };
Expand Down Expand Up @@ -206,7 +206,7 @@ static RefPtr<CSSValue> consumeRatioWithSlash(CSSParserTokenRange& range)
return CSSAspectRatioValue::create(leftValue->floatValue(), rightValue->floatValue());
}

RefPtr<CSSValue> GenericMediaQueryParserBase::consumeValue(CSSParserTokenRange& range)
RefPtr<CSSValue> FeatureParser::consumeValue(CSSParserTokenRange& range, const MediaQueryParserContext&)
{
if (range.atEnd())
return nullptr;
Expand All @@ -231,7 +231,7 @@ RefPtr<CSSValue> GenericMediaQueryParserBase::consumeValue(CSSParserTokenRange&
return nullptr;
}

bool GenericMediaQueryParserBase::validateFeatureAgainstSchema(Feature& feature, const FeatureSchema& schema)
bool FeatureParser::validateFeatureAgainstSchema(Feature& feature, const FeatureSchema& schema)
{
auto validateValue = [&](auto& value) {
RefPtr primitiveValue = dynamicDowncast<CSSPrimitiveValue>(value);
Expand Down
69 changes: 26 additions & 43 deletions Source/WebCore/css/query/GenericMediaQueryParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,49 +36,32 @@ struct MediaQueryParserContext;

namespace MQ {

class GenericMediaQueryParserBase {
public:
GenericMediaQueryParserBase(const MediaQueryParserContext& context)
: m_context(context)
{ }
struct FeatureParser {
static std::optional<Feature> consumeFeature(CSSParserTokenRange&, const MediaQueryParserContext&);
static std::optional<Feature> consumeBooleanOrPlainFeature(CSSParserTokenRange&, const MediaQueryParserContext&);
static std::optional<Feature> consumeRangeFeature(CSSParserTokenRange&, const MediaQueryParserContext&);
static RefPtr<CSSValue> consumeValue(CSSParserTokenRange&, const MediaQueryParserContext&);

protected:
std::optional<Feature> consumeFeature(CSSParserTokenRange&);
std::optional<Feature> consumeBooleanOrPlainFeature(CSSParserTokenRange&);
std::optional<Feature> consumeRangeFeature(CSSParserTokenRange&);
RefPtr<CSSValue> consumeValue(CSSParserTokenRange&);

bool validateFeatureAgainstSchema(Feature&, const FeatureSchema&);

const MediaQueryParserContext& m_context;
static bool validateFeatureAgainstSchema(Feature&, const FeatureSchema&);
};

template<typename ConcreteParser>
class GenericMediaQueryParser : public GenericMediaQueryParserBase {
public:
GenericMediaQueryParser(const MediaQueryParserContext& context)
: GenericMediaQueryParserBase(context)
{ }

std::optional<Condition> consumeCondition(CSSParserTokenRange&);
std::optional<QueryInParens> consumeQueryInParens(CSSParserTokenRange&);
std::optional<Feature> consumeFeature(CSSParserTokenRange&);

const FeatureSchema* schemaForFeatureName(const AtomString&) const;

private:
bool validateFeature(Feature&);
struct GenericMediaQueryParser {
static std::optional<Condition> consumeCondition(CSSParserTokenRange&, const MediaQueryParserContext&);
static std::optional<QueryInParens> consumeQueryInParens(CSSParserTokenRange&, const MediaQueryParserContext&);
static std::optional<Feature> consumeAndValidateFeature(CSSParserTokenRange&, const MediaQueryParserContext&);

ConcreteParser& concreteParser() { return static_cast<ConcreteParser&>(*this); }
static const FeatureSchema* schemaForFeatureName(const AtomString&, const MediaQueryParserContext&);
static bool validateFeature(Feature&, const MediaQueryParserContext&);
};

template<typename ConcreteParser>
std::optional<Condition> GenericMediaQueryParser<ConcreteParser>::consumeCondition(CSSParserTokenRange& range)
std::optional<Condition> GenericMediaQueryParser<ConcreteParser>::consumeCondition(CSSParserTokenRange& range, const MediaQueryParserContext& context)
{
if (range.peek().type() == IdentToken) {
if (range.peek().id() == CSSValueNot) {
range.consumeIncludingWhitespace();
auto query = concreteParser().consumeQueryInParens(range);
auto query = ConcreteParser::consumeQueryInParens(range, context);
if (!query || !range.atEnd())
return { };

Expand All @@ -88,7 +71,7 @@ std::optional<Condition> GenericMediaQueryParser<ConcreteParser>::consumeConditi

Condition condition;

auto query = concreteParser().consumeQueryInParens(range);
auto query = ConcreteParser::consumeQueryInParens(range, context);
if (!query)
return { };

Expand All @@ -115,7 +98,7 @@ std::optional<Condition> GenericMediaQueryParser<ConcreteParser>::consumeConditi

condition.logicalOperator = *op;

auto query = concreteParser().consumeQueryInParens(range);
auto query = ConcreteParser::consumeQueryInParens(range, context);
if (!query)
return { };

Expand All @@ -127,7 +110,7 @@ std::optional<Condition> GenericMediaQueryParser<ConcreteParser>::consumeConditi
}

template<typename ConcreteParser>
std::optional<QueryInParens> GenericMediaQueryParser<ConcreteParser>::consumeQueryInParens(CSSParserTokenRange& range)
std::optional<QueryInParens> GenericMediaQueryParser<ConcreteParser>::consumeQueryInParens(CSSParserTokenRange& range, const MediaQueryParserContext& context)
{
if (range.peek().type() == FunctionToken) {
auto name = range.peek().value();
Expand All @@ -143,11 +126,11 @@ std::optional<QueryInParens> GenericMediaQueryParser<ConcreteParser>::consumeQue
blockRange.consumeWhitespace();

auto conditionRange = blockRange;
if (auto condition = consumeCondition(conditionRange))
if (auto condition = ConcreteParser::consumeCondition(conditionRange, context))
return { condition };

auto featureRange = blockRange;
if (auto feature = concreteParser().consumeFeature(featureRange))
if (auto feature = ConcreteParser::consumeAndValidateFeature(featureRange, context))
return { *feature };

return GeneralEnclosed { { }, blockRange.serialize() };
Expand All @@ -157,29 +140,29 @@ std::optional<QueryInParens> GenericMediaQueryParser<ConcreteParser>::consumeQue
}

template<typename ConcreteParser>
std::optional<Feature> GenericMediaQueryParser<ConcreteParser>::consumeFeature(CSSParserTokenRange& range)
std::optional<Feature> GenericMediaQueryParser<ConcreteParser>::consumeAndValidateFeature(CSSParserTokenRange& range, const MediaQueryParserContext& context)
{
auto feature = GenericMediaQueryParserBase::consumeFeature(range);
auto feature = FeatureParser::consumeFeature(range, context);
if (!feature)
return { };

if (!validateFeature(*feature))
if (!validateFeature(*feature, context))
return { };

return feature;
}

template<typename ConcreteParser>
bool GenericMediaQueryParser<ConcreteParser>::validateFeature(Feature& feature)
bool GenericMediaQueryParser<ConcreteParser>::validateFeature(Feature& feature, const MediaQueryParserContext& context)
{
auto* schema = concreteParser().schemaForFeatureName(feature.name);
auto* schema = ConcreteParser::schemaForFeatureName(feature.name, context);
if (!schema)
return false;
return validateFeatureAgainstSchema(feature, *schema);
return FeatureParser::validateFeatureAgainstSchema(feature, *schema);
}

template<typename ConcreteParser>
const FeatureSchema* GenericMediaQueryParser<ConcreteParser>::schemaForFeatureName(const AtomString& name) const
const FeatureSchema* GenericMediaQueryParser<ConcreteParser>::schemaForFeatureName(const AtomString& name, const MediaQueryParserContext&)
{
using SchemaMap = MemoryCompactLookupOnlyRobinHoodHashMap<AtomString, const FeatureSchema*>;

Expand Down
Loading

0 comments on commit b4b81de

Please sign in to comment.