source: webkit/trunk/Source/WebCore/css/CSSLayerBlockRule.cpp

Last change on this file was 286668, checked in by Antti Koivisto, 3 years ago

[CSS Cascade Layers] CSSImportRule.cssText doesn't include layer parameter
https://bugs.webkit.org/show_bug.cgi?id=234010

Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

  • web-platform-tests/css/css-cascade/parsing/layer-import-parsing-expected.txt:

Source/WebCore:

Fix serialization of import rules than include layer, like

@import url(foo.css) layer(A);

Also make the parsing of the layer() argument stricter.

  • css/CSSImportRule.cpp:

(WebCore::CSSImportRule::cssText const):

Serialize the layer.

  • css/CSSLayerBlockRule.cpp:

(WebCore::stringFromCascadeLayerName):

Serialize layer name segments as identifiers.

  • css/parser/CSSParserImpl.cpp:

(WebCore::CSSParserImpl::consumeImportRule):

Fail parsing if there is anything left in the function argument after consuming the layer name.
If the parsing fails, revert and try the full string as media query.

File size: 2.6 KB
Line 
1/*
2 * Copyright (C) 2021 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 *
8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer.
11 * 2. Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following
13 * disclaimer in the documentation and/or other materials
14 * provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
21 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
25 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
26 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include "config.h"
31#include "CSSLayerBlockRule.h"
32
33#include "CSSMarkup.h"
34#include "CSSStyleSheet.h"
35#include "StyleRule.h"
36#include <wtf/text/StringBuilder.h>
37
38namespace WebCore {
39
40CSSLayerBlockRule::CSSLayerBlockRule(StyleRuleLayer& rule, CSSStyleSheet* parent)
41 : CSSGroupingRule(rule, parent)
42{
43 ASSERT(!rule.isStatement());
44}
45
46Ref<CSSLayerBlockRule> CSSLayerBlockRule::create(StyleRuleLayer& rule, CSSStyleSheet* parent)
47{
48 return adoptRef(*new CSSLayerBlockRule(rule, parent));
49}
50
51String CSSLayerBlockRule::cssText() const
52{
53 StringBuilder result;
54
55 result.append("@layer ");
56 if (auto name = this->name(); !name.isEmpty())
57 result.append(name, " ");
58 result.append("{\n");
59 appendCSSTextForItems(result);
60 result.append('}');
61
62 return result.toString();
63}
64
65String CSSLayerBlockRule::name() const
66{
67 auto& layer = downcast<StyleRuleLayer>(groupRule());
68
69 if (layer.name().isEmpty())
70 return emptyString();
71
72 return stringFromCascadeLayerName(layer.name());
73}
74
75String stringFromCascadeLayerName(const CascadeLayerName& name)
76{
77 StringBuilder result;
78 for (auto& segment : name) {
79 serializeIdentifier(segment, result);
80 if (&segment != &name.last())
81 result.append('.');
82 }
83 return result.toString();
84}
85
86} // namespace WebCore
87
Note: See TracBrowser for help on using the repository browser.