| 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;
|
| -}
|
| -
|
| }
|
|
|