Diff
Modified: trunk/LayoutTests/imported/w3c/ChangeLog (281927 => 281928)
--- trunk/LayoutTests/imported/w3c/ChangeLog 2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/LayoutTests/imported/w3c/ChangeLog 2021-09-02 16:33:06 UTC (rev 281928)
@@ -1,3 +1,12 @@
+2021-09-02 Antti Koivisto <an...@apple.com>
+
+ [CSS Cascade Layers] Support layer argument in @import rules
+ https://bugs.webkit.org/show_bug.cgi?id=229795
+
+ Reviewed by Simon Fraser.
+
+ * web-platform-tests/css/css-cascade/layer-import-expected.txt:
+
2021-09-02 Youenn Fablet <you...@apple.com>
Migrate LibWebRTCMediaEndpoint from OnRenegotiationNeeded to OnRenegotiationNeededEvent
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import-expected.txt (281927 => 281928)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import-expected.txt 2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/layer-import-expected.txt 2021-09-02 16:33:06 UTC (rev 281928)
@@ -3,23 +3,23 @@
PASS A2 Layer rules with import
PASS A3 Layer rules with import
PASS A4 Layer rules with import
-FAIL B1 Anonymous imports assert_equals: B1 Anonymous imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL B2 Anonymous imports assert_equals: B2 Anonymous imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS B1 Anonymous imports
+PASS B2 Anonymous imports
PASS B3 Anonymous imports
-FAIL B4 Anonymous imports assert_equals: B4 Anonymous imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL C1 Named imports assert_equals: C1 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL C2 Named imports assert_equals: C2 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS B4 Anonymous imports
+PASS C1 Named imports
+PASS C2 Named imports
PASS C3 Named imports
-FAIL C4 Named imports assert_equals: C4 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS C4 Named imports
PASS C5 Named imports
PASS C6 Named imports
-FAIL C7 Named imports assert_equals: C7 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL C8 Named imports assert_equals: C8 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL C9 Named imports assert_equals: C9 Named imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL D1 Layer statement with imports assert_equals: D1 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS C7 Named imports
+PASS C8 Named imports
+PASS C9 Named imports
+PASS D1 Layer statement with imports
FAIL D2 Layer statement with imports assert_equals: D2 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
FAIL D3 Layer statement with imports assert_equals: D3 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
FAIL D4 Layer statement with imports assert_equals: D4 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
FAIL D5 Layer statement with imports assert_equals: D5 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
-FAIL D6 Layer statement with imports assert_equals: D6 Layer statement with imports, target 'first' expected "rgb(0, 128, 0)" but got "rgb(255, 0, 0)"
+PASS D6 Layer statement with imports
Modified: trunk/Source/WebCore/ChangeLog (281927 => 281928)
--- trunk/Source/WebCore/ChangeLog 2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/Source/WebCore/ChangeLog 2021-09-02 16:33:06 UTC (rev 281928)
@@ -1,3 +1,37 @@
+2021-09-02 Antti Koivisto <an...@apple.com>
+
+ [CSS Cascade Layers] Support layer argument in @import rules
+ https://bugs.webkit.org/show_bug.cgi?id=229795
+
+ Reviewed by Simon Fraser.
+
+ Add support for
+
+ @import "style.css" layer;
+ @import "style.css" layer(foo);
+
+ * css/StyleRuleImport.cpp:
+ (WebCore::StyleRuleImport::create):
+ (WebCore::StyleRuleImport::StyleRuleImport):
+
+ Add layer name member.
+
+ * css/StyleRuleImport.h:
+ * css/parser/CSSParserImpl.cpp:
+ (WebCore::consumeCascadeLayerName):
+
+ Factor into a standalone function.
+
+ (WebCore::CSSParserImpl::consumeImportRule):
+
+ Parse layer and layer() arguments for @import.
+
+ (WebCore::CSSParserImpl::consumeLayerRule):
+ * style/RuleSet.cpp:
+ (WebCore::Style::RuleSet::Builder::addRulesFromSheet):
+
+ Register the layers specified in import rules.
+
2021-09-02 Youenn Fablet <you...@apple.com>
Migrate LibWebRTCMediaEndpoint from OnRenegotiationNeeded to OnRenegotiationNeededEvent
Modified: trunk/Source/WebCore/css/StyleRuleImport.cpp (281927 => 281928)
--- trunk/Source/WebCore/css/StyleRuleImport.cpp 2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/Source/WebCore/css/StyleRuleImport.cpp 2021-09-02 16:33:06 UTC (rev 281928)
@@ -36,16 +36,17 @@
namespace WebCore {
-Ref<StyleRuleImport> StyleRuleImport::create(const String& href, Ref<MediaQuerySet>&& media)
+Ref<StyleRuleImport> StyleRuleImport::create(const String& href, Ref<MediaQuerySet>&& media, std::optional<CascadeLayerName>&& cascadeLayerName)
{
- return adoptRef(*new StyleRuleImport(href, WTFMove(media)));
+ return adoptRef(*new StyleRuleImport(href, WTFMove(media), WTFMove(cascadeLayerName)));
}
-StyleRuleImport::StyleRuleImport(const String& href, Ref<MediaQuerySet>&& media)
+StyleRuleImport::StyleRuleImport(const String& href, Ref<MediaQuerySet>&& media, std::optional<CascadeLayerName>&& cascadeLayerName)
: StyleRuleBase(StyleRuleType::Import)
, m_styleSheetClient(this)
, m_strHref(href)
, m_mediaQueries(WTFMove(media))
+ , m_cascadeLayerName(WTFMove(cascadeLayerName))
{
if (!m_mediaQueries)
m_mediaQueries = MediaQuerySet::create(String(), MediaQueryParserContext());
Modified: trunk/Source/WebCore/css/StyleRuleImport.h (281927 => 281928)
--- trunk/Source/WebCore/css/StyleRuleImport.h 2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/Source/WebCore/css/StyleRuleImport.h 2021-09-02 16:33:06 UTC (rev 281928)
@@ -35,7 +35,7 @@
class StyleRuleImport final : public StyleRuleBase {
WTF_MAKE_FAST_ALLOCATED;
public:
- static Ref<StyleRuleImport> create(const String& href, Ref<MediaQuerySet>&&);
+ static Ref<StyleRuleImport> create(const String& href, Ref<MediaQuerySet>&&, std::optional<CascadeLayerName>&&);
~StyleRuleImport();
@@ -52,10 +52,12 @@
void requestStyleSheet();
const CachedCSSStyleSheet* cachedCSSStyleSheet() const { return m_cachedSheet.get(); }
+ const std::optional<CascadeLayerName>& cascadeLayerName() const { return m_cascadeLayerName; }
+
private:
// NOTE: We put the CachedStyleSheetClient in a member instead of inheriting from it
// to avoid adding a vptr to StyleRuleImport.
-class ImportedStyleSheetClient final : public CachedStyleSheetClient {
+ class ImportedStyleSheetClient final : public CachedStyleSheetClient {
public:
ImportedStyleSheetClient(StyleRuleImport* ownerRule) : m_ownerRule(ownerRule) { }
virtual ~ImportedStyleSheetClient() = default;
@@ -70,7 +72,7 @@
void setCSSStyleSheet(const String& href, const URL& baseURL, const String& charset, const CachedCSSStyleSheet*);
friend class ImportedStyleSheetClient;
- StyleRuleImport(const String& href, Ref<MediaQuerySet>&&);
+ StyleRuleImport(const String& href, Ref<MediaQuerySet>&&, std::optional<CascadeLayerName>&&);
StyleSheetContents* m_parentStyleSheet { nullptr };
@@ -78,6 +80,7 @@
String m_strHref;
RefPtr<MediaQuerySet> m_mediaQueries;
RefPtr<StyleSheetContents> m_styleSheet;
+ std::optional<CascadeLayerName> m_cascadeLayerName;
CachedResourceHandle<CachedCSSStyleSheet> m_cachedSheet;
bool m_loading { false };
};
Modified: trunk/Source/WebCore/css/parser/CSSParserImpl.cpp (281927 => 281928)
--- trunk/Source/WebCore/css/parser/CSSParserImpl.cpp 2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/Source/WebCore/css/parser/CSSParserImpl.cpp 2021-09-02 16:33:06 UTC (rev 281928)
@@ -507,6 +507,32 @@
return StyleRuleCharset::create();
}
+enum class AllowAnonymous { Yes, No };
+static std::optional<CascadeLayerName> consumeCascadeLayerName(CSSParserTokenRange& range, AllowAnonymous allowAnonymous)
+{
+ CascadeLayerName name;
+ if (range.atEnd()) {
+ if (allowAnonymous == AllowAnonymous::Yes)
+ return name;
+ return { };
+ }
+
+ while (true) {
+ auto nameToken = range.consume();
+ if (nameToken.type() != IdentToken)
+ return { };
+
+ name.append(nameToken.value().toAtomString());
+
+ if (range.peek().type() != DelimiterToken || range.peek().delimiter() != '.')
+ break;
+ range.consume();
+ }
+
+ range.consumeWhitespace();
+ return name;
+}
+
RefPtr<StyleRuleImport> CSSParserImpl::consumeImportRule(CSSParserTokenRange prelude)
{
AtomString uri(consumeStringOrURI(prelude));
@@ -520,8 +546,29 @@
m_observerWrapper->observer().startRuleBody(endOffset);
m_observerWrapper->observer().endRuleBody(endOffset);
}
+
+ prelude.consumeWhitespace();
+
+ auto consumeCascadeLayer = [&]() -> std::optional<CascadeLayerName> {
+ if (!m_context.cascadeLayersEnabled)
+ return { };
+
+ auto& token = prelude.peek();
+ if (token.type() == FunctionToken && equalIgnoringASCIICase(token.value(), "layer")) {
+ auto contents = CSSPropertyParserHelpers::consumeFunction(prelude);
+ return consumeCascadeLayerName(contents, AllowAnonymous::No);
+ }
+ if (token.type() == IdentToken && equalIgnoringASCIICase(token.value(), "layer")) {
+ prelude.consumeIncludingWhitespace();
+ return CascadeLayerName { };
+ }
+ return { };
+ };
+
+ auto cascadeLayerName = consumeCascadeLayer();
+ auto mediaQuerySet = MediaQueryParser::parseMediaQuerySet(prelude, MediaQueryParserContext(m_context));
- return StyleRuleImport::create(uri, MediaQueryParser::parseMediaQuerySet(prelude, MediaQueryParserContext(m_context)).releaseNonNull());
+ return StyleRuleImport::create(uri, mediaQuerySet.releaseNonNull(), WTFMove(cascadeLayerName));
}
RefPtr<StyleRuleNamespace> CSSParserImpl::consumeNamespaceRule(CSSParserTokenRange prelude)
@@ -687,33 +734,11 @@
auto preludeCopy = prelude;
- auto consumeName = [&]() -> std::optional<CascadeLayerName> {
- CascadeLayerName name;
- // Anonymous case.
- if (prelude.atEnd())
- return name;
-
- while (true) {
- auto nameToken = prelude.consume();
- if (nameToken.type() != IdentToken)
- return { };
-
- name.append(nameToken.value().toAtomString());
-
- if (prelude.peek().type() != DelimiterToken || prelude.peek().delimiter() != '.')
- break;
- prelude.consume();
- }
-
- prelude.consumeWhitespace();
- return name;
- };
-
if (!block) {
// List syntax.
Vector<CascadeLayerName> nameList;
while (true) {
- auto name = consumeName();
+ auto name = consumeCascadeLayerName(prelude, AllowAnonymous::No);
if (!name)
return nullptr;
nameList.append(*name);
@@ -737,7 +762,7 @@
return StyleRuleLayer::create(WTFMove(nameList));
}
- auto name = consumeName();
+ auto name = consumeCascadeLayerName(prelude, AllowAnonymous::Yes);
if (!name)
return nullptr;
Modified: trunk/Source/WebCore/style/RuleSet.cpp (281927 => 281928)
--- trunk/Source/WebCore/style/RuleSet.cpp 2021-09-02 16:22:16 UTC (rev 281927)
+++ trunk/Source/WebCore/style/RuleSet.cpp 2021-09-02 16:33:06 UTC (rev 281928)
@@ -376,9 +376,17 @@
for (auto& rule : sheet.importRules()) {
if (!rule->styleSheet())
continue;
+
+ if (mediaQueryCollector.pushAndEvaluate(rule->mediaQueries())) {
+ auto& cascadeLayerName = rule->cascadeLayerName();
+ if (cascadeLayerName)
+ pushCascadeLayer(*cascadeLayerName);
- if (mediaQueryCollector.pushAndEvaluate(rule->mediaQueries()))
addRulesFromSheet(*rule->styleSheet());
+
+ if (cascadeLayerName)
+ popCascadeLayer(*cascadeLayerName);
+ }
mediaQueryCollector.pop(rule->mediaQueries());
}