Title: [174379] trunk/Source/WebCore
Revision
174379
Author
[email protected]
Date
2014-10-06 18:55:17 -0700 (Mon, 06 Oct 2014)

Log Message

Web Inspector: Highlighted selectors in Rules sidebar break with selectors that contain nested selector lists
https://bugs.webkit.org/show_bug.cgi?id=137378

Patch by Benjamin Poulain <[email protected]> on 2014-10-06
Reviewed by Joseph Pecoraro.

We should not update the parser's selectorRange when matching a nested selector list.

To implement this with low risk of unbalanced start+end and good error recovery,
I have wrapped the parsing of selector_list between a start/end function at the grammar
level. Whenever the parser enter a nested selector list, m_nestedSelectorLevel goes up
by one. Any time the parsing is currently in a nested selector list, we never update
the selector ranges.

* css/CSSGrammar.y.in:
* css/CSSParser.cpp:
(WebCore::CSSParser::CSSParser):
(WebCore::CSSParser::markSelectorStart):
(WebCore::CSSParser::markSelectorEnd):
* css/CSSParser.h:
(WebCore::CSSParser::startNestedSelectorList):
(WebCore::CSSParser::endNestedSelectorList):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (174378 => 174379)


--- trunk/Source/WebCore/ChangeLog	2014-10-07 01:16:47 UTC (rev 174378)
+++ trunk/Source/WebCore/ChangeLog	2014-10-07 01:55:17 UTC (rev 174379)
@@ -1,3 +1,27 @@
+2014-10-06  Benjamin Poulain  <[email protected]>
+
+        Web Inspector: Highlighted selectors in Rules sidebar break with selectors that contain nested selector lists
+        https://bugs.webkit.org/show_bug.cgi?id=137378
+
+        Reviewed by Joseph Pecoraro.
+
+        We should not update the parser's selectorRange when matching a nested selector list.
+
+        To implement this with low risk of unbalanced start+end and good error recovery,
+        I have wrapped the parsing of selector_list between a start/end function at the grammar
+        level. Whenever the parser enter a nested selector list, m_nestedSelectorLevel goes up
+        by one. Any time the parsing is currently in a nested selector list, we never update
+        the selector ranges.
+
+        * css/CSSGrammar.y.in:
+        * css/CSSParser.cpp:
+        (WebCore::CSSParser::CSSParser):
+        (WebCore::CSSParser::markSelectorStart):
+        (WebCore::CSSParser::markSelectorEnd):
+        * css/CSSParser.h:
+        (WebCore::CSSParser::startNestedSelectorList):
+        (WebCore::CSSParser::endNestedSelectorList):
+
 2014-10-06  Roger Fong  <[email protected]>
 
         [Windows] Build fix for EWS bots.

Modified: trunk/Source/WebCore/css/CSSGrammar.y.in (174378 => 174379)


--- trunk/Source/WebCore/css/CSSGrammar.y.in	2014-10-07 01:16:47 UTC (rev 174378)
+++ trunk/Source/WebCore/css/CSSGrammar.y.in	2014-10-07 01:55:17 UTC (rev 174379)
@@ -309,8 +309,8 @@
 %destructor { delete $$; } attrib class page_selector pseudo pseudo_page complex_selector complex_selector_with_trailing_whitespace compound_selector specifier specifier_list
 
 %union { Vector<std::unique_ptr<CSSParserSelector>>* selectorList; }
-%type <selectorList> selector_list simple_selector_list nth_selector_ending
-%destructor { delete $$; } selector_list simple_selector_list nth_selector_ending
+%type <selectorList> selector_list nested_selector_list simple_selector_list nth_selector_ending
+%destructor { delete $$; } selector_list nested_selector_list simple_selector_list nth_selector_ending
 
 %union { bool boolean; }
 %type <boolean> declaration declaration_list decl_list priority
@@ -1091,6 +1091,15 @@
     }
    ;
 
+before_nested_selector_list: { parser->startNestedSelectorList(); } ;
+after_nested_selector_list: { parser->endNestedSelectorList(); } ;
+
+nested_selector_list:
+    before_nested_selector_list selector_list after_nested_selector_list {
+        $$ = $2;
+    }
+    ;
+
 complex_selector_with_trailing_whitespace:
     complex_selector WHITESPACE;
 
@@ -1300,7 +1309,7 @@
     | space ')' {
         $$ = nullptr;
     }
-    | space NTHCHILDSELECTORSEPARATOR space selector_list maybe_space ')' {
+    | space NTHCHILDSELECTORSEPARATOR space nested_selector_list maybe_space ')' {
         if ($4)
             $$ = $4;
         else
@@ -1339,7 +1348,7 @@
     }
 
 #if ENABLE_CSS_SELECTORS_LEVEL4
-    | ':' MATCHESFUNCTION maybe_space selector_list maybe_space ')' {
+    | ':' MATCHESFUNCTION maybe_space nested_selector_list maybe_space ')' {
         $$ = nullptr;
         if ($4) {
             auto selector = std::make_unique<CSSParserSelector>();

Modified: trunk/Source/WebCore/css/CSSParser.cpp (174378 => 174379)


--- trunk/Source/WebCore/css/CSSParser.cpp	2014-10-07 01:16:47 UTC (rev 174378)
+++ trunk/Source/WebCore/css/CSSParser.cpp	2014-10-07 01:55:17 UTC (rev 174379)
@@ -317,6 +317,7 @@
     , m_ignoreErrorsInDeclaration(false)
     , m_defaultNamespace(starAtom)
     , m_parsedTextPrefixLength(0)
+    , m_nestedSelectorLevel(0)
     , m_propertyRange(UINT_MAX, UINT_MAX)
     , m_ruleSourceDataResult(0)
     , m_parsingMode(NormalMode)
@@ -12052,7 +12053,7 @@
 
 void CSSParser::markSelectorStart()
 {
-    if (!isExtractingSourceData())
+    if (!isExtractingSourceData() || m_nestedSelectorLevel)
         return;
     ASSERT(!m_selectorRange.end);
 
@@ -12061,7 +12062,7 @@
 
 void CSSParser::markSelectorEnd()
 {
-    if (!isExtractingSourceData())
+    if (!isExtractingSourceData() || m_nestedSelectorLevel)
         return;
     ASSERT(!m_selectorRange.end);
     ASSERT(m_currentRuleDataStack->size());

Modified: trunk/Source/WebCore/css/CSSParser.h (174378 => 174379)


--- trunk/Source/WebCore/css/CSSParser.h	2014-10-07 01:16:47 UTC (rev 174378)
+++ trunk/Source/WebCore/css/CSSParser.h	2014-10-07 01:55:17 UTC (rev 174379)
@@ -375,6 +375,7 @@
 
     // tokenizer methods and data
     size_t m_parsedTextPrefixLength;
+    unsigned m_nestedSelectorLevel;
     SourceRange m_selectorRange;
     SourceRange m_propertyRange;
     std::unique_ptr<RuleSourceDataList> m_currentRuleDataStack;
@@ -384,8 +385,12 @@
     void fixUnparsedPropertyRanges(CSSRuleSourceData*);
     void markRuleHeaderStart(CSSRuleSourceData::Type);
     void markRuleHeaderEnd();
+
+    void startNestedSelectorList() { ++m_nestedSelectorLevel; }
+    void endNestedSelectorList() { --m_nestedSelectorLevel; }
     void markSelectorStart();
     void markSelectorEnd();
+
     void markRuleBodyStart();
     void markRuleBodyEnd();
     void markPropertyStart();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to