Title: [207783] trunk/Source/WebCore
- Revision
- 207783
- Author
- hy...@apple.com
- Date
- 2016-10-24 14:51:44 -0700 (Mon, 24 Oct 2016)
Log Message
[CSS Parser] Fix :lang argument parsing
https://bugs.webkit.org/show_bug.cgi?id=163913
Reviewed by Zalan Bujtas.
* css/SelectorPseudoClassAndCompatibilityElementMap.in:
Modify the map to support versions of the function pseudos
without the left paren included.
* css/parser/CSSParserValues.cpp:
(WebCore::CSSParserSelector::setLangArgumentList):
* css/parser/CSSParserValues.h:
Add a helper to just directly pass an AtomicString Vector through.
* css/parser/CSSSelectorParser.cpp:
(WebCore::consumeLangArgumentList):
(WebCore::CSSSelectorParser::consumePseudo):
Add a new consumeLangArgumentList to collect the languages into
an AtomicString Vector.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (207782 => 207783)
--- trunk/Source/WebCore/ChangeLog 2016-10-24 21:48:13 UTC (rev 207782)
+++ trunk/Source/WebCore/ChangeLog 2016-10-24 21:51:44 UTC (rev 207783)
@@ -1,3 +1,25 @@
+2016-10-24 Dave Hyatt <hy...@apple.com>
+
+ [CSS Parser] Fix :lang argument parsing
+ https://bugs.webkit.org/show_bug.cgi?id=163913
+
+ Reviewed by Zalan Bujtas.
+
+ * css/SelectorPseudoClassAndCompatibilityElementMap.in:
+ Modify the map to support versions of the function pseudos
+ without the left paren included.
+
+ * css/parser/CSSParserValues.cpp:
+ (WebCore::CSSParserSelector::setLangArgumentList):
+ * css/parser/CSSParserValues.h:
+ Add a helper to just directly pass an AtomicString Vector through.
+
+ * css/parser/CSSSelectorParser.cpp:
+ (WebCore::consumeLangArgumentList):
+ (WebCore::CSSSelectorParser::consumePseudo):
+ Add a new consumeLangArgumentList to collect the languages into
+ an AtomicString Vector.
+
2016-10-24 Alex Christensen <achristen...@webkit.org>
Fix AppleWin build after r207720.
Modified: trunk/Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in (207782 => 207783)
--- trunk/Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in 2016-10-24 21:48:13 UTC (rev 207782)
+++ trunk/Source/WebCore/css/SelectorPseudoClassAndCompatibilityElementMap.in 2016-10-24 21:51:44 UTC (rev 207783)
@@ -1,4 +1,5 @@
-khtml-drag
+-webkit-any
-webkit-any(
-webkit-any-link, PseudoClassAnyLinkDeprecated, PseudoElementUnknown
-webkit-autofill
@@ -13,6 +14,7 @@
decrement
default
#if ENABLE(CSS_SELECTORS_LEVEL4)
+dir
dir(
#endif
disabled
@@ -33,16 +35,23 @@
increment
indeterminate
invalid
+lang
lang(
last-child
last-of-type
link
+matches
matches(
no-button
+not
not(
+nth-child
nth-child(
+nth-last-child
nth-last-child(
+nth-last-of-type
nth-last-of-type(
+nth-of-type
nth-of-type(
only-child
only-of-type
@@ -53,6 +62,7 @@
read-write
required
#if ENABLE(CSS_SELECTORS_LEVEL4)
+role
role(
#endif
root
Modified: trunk/Source/WebCore/css/parser/CSSParserValues.cpp (207782 => 207783)
--- trunk/Source/WebCore/css/parser/CSSParserValues.cpp 2016-10-24 21:48:13 UTC (rev 207782)
+++ trunk/Source/WebCore/css/parser/CSSParserValues.cpp 2016-10-24 21:51:44 UTC (rev 207783)
@@ -410,7 +410,13 @@
argumentList->append(languageArgument);
m_selector->setLangArgumentList(WTFMove(argumentList));
}
-
+
+void CSSParserSelector::setLangArgumentList(std::unique_ptr<Vector<AtomicString>> argumentList)
+{
+ ASSERT_WITH_MESSAGE(!argumentList->isEmpty(), "No CSS Selector takes an empty argument list.");
+ m_selector->setLangArgumentList(WTFMove(argumentList));
+}
+
void CSSParserSelector::setSelectorList(std::unique_ptr<CSSSelectorList> selectorList)
{
m_selector->setSelectorList(WTFMove(selectorList));
Modified: trunk/Source/WebCore/css/parser/CSSParserValues.h (207782 => 207783)
--- trunk/Source/WebCore/css/parser/CSSParserValues.h 2016-10-24 21:48:13 UTC (rev 207782)
+++ trunk/Source/WebCore/css/parser/CSSParserValues.h 2016-10-24 21:51:44 UTC (rev 207783)
@@ -235,6 +235,7 @@
void adoptSelectorVector(Vector<std::unique_ptr<CSSParserSelector>>& selectorVector);
void setLangArgumentList(const Vector<CSSParserString>& stringVector);
+ void setLangArgumentList(std::unique_ptr<Vector<AtomicString>>);
void setSelectorList(std::unique_ptr<CSSSelectorList>);
void setPseudoClassValue(const CSSParserString& pseudoClassString);
Modified: trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp (207782 => 207783)
--- trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp 2016-10-24 21:48:13 UTC (rev 207782)
+++ trunk/Source/WebCore/css/parser/CSSSelectorParser.cpp 2016-10-24 21:51:44 UTC (rev 207783)
@@ -100,6 +100,23 @@
return list;
}
+static void consumeLangArgumentList(std::unique_ptr<Vector<AtomicString>>& argumentList, CSSParserTokenRange& range)
+{
+ const CSSParserToken& ident = range.consumeIncludingWhitespace();
+ if (ident.type() != IdentToken)
+ return;
+ argumentList->append(ident.value().toAtomicString());
+ while (!range.atEnd() && range.peek().type() == CommaToken) {
+ range.consumeIncludingWhitespace();
+ const CSSParserToken& ident = range.consumeIncludingWhitespace();
+ if (ident.type() != IdentToken) {
+ argumentList->clear();
+ return;
+ }
+ argumentList->append(ident.value().toAtomicString());
+ }
+}
+
namespace {
enum CompoundSelectorFlags {
@@ -469,79 +486,84 @@
if (token.type() != FunctionToken)
return nullptr;
- switch (selector->pseudoClassType()) {
- case CSSSelector::PseudoClassNot: {
- std::unique_ptr<CSSParserSelector> innerSelector = consumeCompoundSelector(block);
- block.consumeWhitespace();
- if (!innerSelector || !block.atEnd())
- return nullptr;
- Vector<std::unique_ptr<CSSParserSelector>> selectorVector;
- selectorVector.append(WTFMove(innerSelector));
- selector->adoptSelectorVector(selectorVector);
- return selector;
+ if (selector->match() == CSSSelector::PseudoClass) {
+ switch (selector->pseudoClassType()) {
+ case CSSSelector::PseudoClassNot: {
+ std::unique_ptr<CSSParserSelector> innerSelector = consumeCompoundSelector(block);
+ block.consumeWhitespace();
+ if (!innerSelector || !block.atEnd())
+ return nullptr;
+ Vector<std::unique_ptr<CSSParserSelector>> selectorVector;
+ selectorVector.append(WTFMove(innerSelector));
+ selector->adoptSelectorVector(selectorVector);
+ return selector;
+ }
+ case CSSSelector::PseudoClassNthChild:
+ case CSSSelector::PseudoClassNthLastChild:
+ case CSSSelector::PseudoClassNthOfType:
+ case CSSSelector::PseudoClassNthLastOfType: {
+ std::pair<int, int> ab;
+ if (!consumeANPlusB(block, ab))
+ return nullptr;
+ block.consumeWhitespace();
+ if (!block.atEnd())
+ return nullptr;
+ selector->setArgument(AtomicString::number(ab.first * ab.second));
+ return selector;
+ }
+ case CSSSelector::PseudoClassLang: {
+ // FIXME: CSS Selectors Level 4 allows :lang(*-foo)
+ auto argumentList = std::make_unique<Vector<AtomicString>>();
+ consumeLangArgumentList(argumentList, block);
+ if (argumentList->isEmpty())
+ return nullptr;
+ selector->setLangArgumentList(WTFMove(argumentList));
+ return selector;
+ }
+ // FIXME-NEWPARSER: Support :host-context
+ case CSSSelector::PseudoClassAny:
+ case CSSSelector::PseudoClassHost: {
+ DisallowPseudoElementsScope scope(this);
+ std::unique_ptr<CSSSelectorList> selectorList = std::unique_ptr<CSSSelectorList>(new CSSSelectorList());
+ *selectorList = consumeCompoundSelectorList(block);
+ if (!selectorList->isValid() || !block.atEnd())
+ return nullptr;
+ selector->setSelectorList(WTFMove(selectorList));
+ return selector;
+ }
+ default:
+ break;
+ }
}
- case CSSSelector::PseudoClassNthChild:
- case CSSSelector::PseudoClassNthLastChild:
- case CSSSelector::PseudoClassNthOfType:
- case CSSSelector::PseudoClassNthLastOfType: {
- std::pair<int, int> ab;
- if (!consumeANPlusB(block, ab))
- return nullptr;
- block.consumeWhitespace();
- if (!block.atEnd())
- return nullptr;
- selector->setArgument(AtomicString::number(ab.first * ab.second));
- return selector;
- }
- case CSSSelector::PseudoClassLang: {
- // FIXME: CSS Selectors Level 4 allows :lang(*-foo)
- const CSSParserToken& ident = block.consumeIncludingWhitespace();
- if (ident.type() != IdentToken || !block.atEnd())
- return nullptr;
- selector->setArgument(ident.value().toAtomicString());
- return selector;
- }
- // FIXME-NEWPARSER: Support :host-context
- case CSSSelector::PseudoClassAny:
- case CSSSelector::PseudoClassHost: {
- DisallowPseudoElementsScope scope(this);
- std::unique_ptr<CSSSelectorList> selectorList = std::unique_ptr<CSSSelectorList>(new CSSSelectorList());
- *selectorList = consumeCompoundSelectorList(block);
- if (!selectorList->isValid() || !block.atEnd())
- return nullptr;
- selector->setSelectorList(WTFMove(selectorList));
- return selector;
- }
- default:
- break;
- }
+
+ if (selector->match() == CSSSelector::PseudoElement) {
+ switch (selector->pseudoElementType()) {
+ case CSSSelector::PseudoElementCue: {
+ DisallowPseudoElementsScope scope(this);
+ std::unique_ptr<CSSSelectorList> selectorList = std::unique_ptr<CSSSelectorList>(new CSSSelectorList());
+ *selectorList = consumeCompoundSelectorList(block);
+ if (!selectorList->isValid() || !block.atEnd())
+ return nullptr;
+ selector->setSelectorList(WTFMove(selectorList));
+ return selector;
+ }
+ case CSSSelector::PseudoElementSlotted: {
+ DisallowPseudoElementsScope scope(this);
- switch (selector->pseudoElementType()) {
- case CSSSelector::PseudoElementCue: {
- DisallowPseudoElementsScope scope(this);
- std::unique_ptr<CSSSelectorList> selectorList = std::unique_ptr<CSSSelectorList>(new CSSSelectorList());
- *selectorList = consumeCompoundSelectorList(block);
- if (!selectorList->isValid() || !block.atEnd())
- return nullptr;
- selector->setSelectorList(WTFMove(selectorList));
- return selector;
+ std::unique_ptr<CSSParserSelector> innerSelector = consumeCompoundSelector(block);
+ block.consumeWhitespace();
+ if (!innerSelector || !block.atEnd())
+ return nullptr;
+ Vector<std::unique_ptr<CSSParserSelector>> selectorVector;
+ selectorVector.append(WTFMove(innerSelector));
+ selector->adoptSelectorVector(selectorVector);
+ return selector;
+ }
+ default:
+ break;
+ }
}
- case CSSSelector::PseudoElementSlotted: {
- DisallowPseudoElementsScope scope(this);
- std::unique_ptr<CSSParserSelector> innerSelector = consumeCompoundSelector(block);
- block.consumeWhitespace();
- if (!innerSelector || !block.atEnd())
- return nullptr;
- Vector<std::unique_ptr<CSSParserSelector>> selectorVector;
- selectorVector.append(WTFMove(innerSelector));
- selector->adoptSelectorVector(selectorVector);
- return selector;
- }
- default:
- break;
- }
-
return nullptr;
}
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes