Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(542)

Unified Diff: Source/core/css/CSSParser.cpp

Issue 15660004: Reporing invalid CSS selectors. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/css/CSSParser.cpp
diff --git a/Source/core/css/CSSParser.cpp b/Source/core/css/CSSParser.cpp
index 83246da05126621579ab9bff0dbbc369bd42c317..613461fa0ab2c05bf0106d43cb525ee0e847c850 100644
--- a/Source/core/css/CSSParser.cpp
+++ b/Source/core/css/CSSParser.cpp
@@ -253,7 +253,7 @@ CSSParser::CSSParser(const CSSParserContext& context, UseCounter* counter)
, m_hasFontFaceOnlyValues(false)
, m_hadSyntacticallyValidCSSRule(false)
, m_logErrors(false)
- , m_ignoreErrorsInDeclaration(false)
+ , m_ignoreErrors(false)
, m_inFilterRule(false)
, m_defaultNamespace(starAtom)
, m_parsedTextPrefixLength(0)
@@ -269,6 +269,7 @@ CSSParser::CSSParser(const CSSParserContext& context, UseCounter* counter)
, m_lineNumber(0)
, m_tokenStartLineNumber(0)
, m_lastSelectorLineNumber(0)
+ , m_ruleHeaderType(CSSRuleSourceData::UNKNOWN_RULE)
, m_allowImportRules(true)
, m_allowNamespaceDeclarations(true)
#if ENABLE(CSS_DEVICE_ADAPTATION)
@@ -302,6 +303,17 @@ AtomicString CSSParserString::atomicSubstring(unsigned position, unsigned length
return AtomicString(characters16() + position, length);
}
+void CSSParserString::trimTrailingWhitespace()
+{
+ if (is8Bit()) {
+ while (m_length > 0 && isHTMLSpace(m_data.characters8[m_length - 1]))
+ --m_length;
+ } else {
+ while (m_length > 0 && isHTMLSpace(m_data.characters16[m_length - 1]))
+ --m_length;
+ }
+}
+
void CSSParser::setupParser(const char* prefix, unsigned prefixLength, const String& string, const char* suffix, unsigned suffixLength)
{
m_parsedTextPrefixLength = prefixLength;
@@ -359,7 +371,7 @@ void CSSParser::parseSheet(StyleSheetContents* sheet, const String& string, int
m_defaultNamespace = starAtom; // Reset the default namespace.
m_sourceDataHandler = sourceDataHandler;
m_logErrors = logErrors && sheet->singleOwnerDocument() && !sheet->baseURL().isEmpty() && sheet->singleOwnerDocument()->page();
- m_ignoreErrorsInDeclaration = false;
+ m_ignoreErrors = false;
m_lineNumber = startLineNumber;
m_source = &string;
setupParser("", string, "");
@@ -368,7 +380,7 @@ void CSSParser::parseSheet(StyleSheetContents* sheet, const String& string, int
m_source = 0;
m_sourceDataHandler = 0;
m_rule = 0;
- m_ignoreErrorsInDeclaration = false;
+ m_ignoreErrors = false;
m_logErrors = false;
}
@@ -10935,12 +10947,30 @@ void CSSParser::tokenToLowerCase(const CSSParserString& token)
}
}
+void CSSParser::endInvalidRuleHeader()
+{
+ if (m_ruleHeaderType == CSSRuleSourceData::UNKNOWN_RULE)
+ return;
+
+ if (m_source) {
+ size_t length = safeUserStringTokenOffset() - m_ruleHeaderStartOffset;
+ CSSParserLocation location;
+ location.lineNumber = m_ruleHeaderStartLineNumber;
+ location.content.init(*m_source, m_ruleHeaderStartOffset, length);
+ location.content.trimTrailingWhitespace();
+
+ reportError(location, m_ruleHeaderType == CSSRuleSourceData::STYLE_RULE ? InvalidSelectorError : InvalidRuleError);
+ }
+
+ endRuleHeader();
+}
+
void CSSParser::reportError(const CSSParserLocation& location, ErrorType error)
{
if (!isLoggingErrors())
return;
- m_ignoreErrorsInDeclaration = true;
+ m_ignoreErrors = true;
if (!InspectorInstrumentation::cssErrorFilter(location, m_id, error))
return;
@@ -10958,6 +10988,14 @@ void CSSParser::reportError(const CSSParserLocation& location, ErrorType error)
builder.appendLiteral("Invalid CSS property name: ");
break;
+ case InvalidSelectorError:
+ builder.appendLiteral("Invalid CSS selector: ");
+ break;
+
+ case InvalidRuleError:
+ builder.appendLiteral("Invalid CSS rule: ");
+ break;
+
default:
builder.appendLiteral("Unexpected CSS token: ");
}
@@ -10972,7 +11010,7 @@ void CSSParser::reportError(const CSSParserLocation& location, ErrorType error)
bool CSSParser::isLoggingErrors()
{
- return m_logErrors && !m_ignoreErrorsInDeclaration;
+ return m_logErrors && !m_ignoreErrors;
}
void CSSParser::logError(const String& message, int lineNumber)
@@ -11296,12 +11334,16 @@ void CSSParser::updateLastMediaLine(MediaQuerySet* media)
void CSSParser::startRuleHeader(CSSRuleSourceData::Type ruleType)
{
+ m_ruleHeaderType = ruleType;
+ m_ruleHeaderStartOffset = safeUserStringTokenOffset();
+ m_ruleHeaderStartLineNumber = m_tokenStartLineNumber;
if (m_sourceDataHandler)
- m_sourceDataHandler->startRuleHeader(ruleType, safeUserStringTokenOffset());
+ m_sourceDataHandler->startRuleHeader(ruleType, m_ruleHeaderStartOffset);
}
void CSSParser::endRuleHeader()
{
+ m_ruleHeaderType = CSSRuleSourceData::UNKNOWN_RULE;
if (m_sourceDataHandler)
m_sourceDataHandler->endRuleHeader(safeUserStringTokenOffset());
}
@@ -11332,7 +11374,7 @@ void CSSParser::endRuleBody(bool discard)
void CSSParser::startProperty()
{
- m_ignoreErrorsInDeclaration = false;
+ resumeErrorLogging();
if (m_sourceDataHandler)
m_sourceDataHandler->startProperty(safeUserStringTokenOffset());
}
@@ -11705,16 +11747,4 @@ bool isValidNthToken(const CSSParserString& token)
|| equalIgnoringCase(token, "n") || equalIgnoringCase(token, "-n");
}
-CSSParserLocation CSSParserLocation::trimTrailingWhitespace() const
-{
- CSSParserLocation result;
- result.lineNumber = lineNumber;
- result.content = content;
- size_t newLength = content.length();
- while (newLength > 0 && isHTMLSpace(result.content[newLength - 1]))
- --newLength;
- result.content.setLength(newLength);
- return result;
-}
-
}

Powered by Google App Engine
This is Rietveld 408576698