Changeset 181426 in webkit


Ignore:
Timestamp:
Mar 11, 2015, 9:49:05 PM (11 years ago)
Author:
Joseph Pecoraro
Message:

Web Inspector: CSS parser errors in the console should include column numbers
https://bugs.webkit.org/show_bug.cgi?id=114313

Reviewed by Darin Adler.

Source/WebCore:

Test: inspector-protocol/console/warnings-errors.html

  • css/CSSParser.h:

(WebCore::CSSParser::currentCharacterOffset):
Get the current character offset depending on the source type.
Add instance variables to track column position and start
line / column for inline stylesheets.

  • css/CSSParser.cpp:

(WebCore::CSSParser::CSSParser):
(WebCore::CSSParser::parseSheet):
Initialize new instance variables.

(WebCore::CSSParser::currentLocation):
Update to include column information for the token. Also, if we are on the
first line we may need to take into account a start column offset as well.

(WebCore::CSSParser::realLex):
Set the token's start column.
When bumping the line number, reset the column offset for the next
line with the next character.

(WebCore::CSSParser::syntaxError):
(WebCore::CSSParser::logError):
Include column information.

  • css/StyleSheetContents.cpp:

(WebCore::StyleSheetContents::parseAuthorStyleSheet):
(WebCore::StyleSheetContents::parseString):
(WebCore::StyleSheetContents::parseStringAtPosition):
Include column information.

  • css/StyleSheetContents.h:
  • dom/InlineStyleSheetOwner.cpp:

(WebCore::InlineStyleSheetOwner::InlineStyleSheetOwner):
(WebCore::InlineStyleSheetOwner::createSheet):
Save and use column information later on.

  • dom/InlineStyleSheetOwner.h:
  • inspector/InspectorStyleSheet.cpp:

(WebCore::InspectorStyleSheet::ensureSourceData):
Updated parser signature needs starting column and no longer has optional parameters.

Source/WebInspectorUI:

  • UserInterface/Views/ConsoleMessageImpl.js:

(WebInspector.ConsoleMessageImpl.prototype._linkifyLocation):
Column numbers in console messages are also 1 based and should be adjusted.

LayoutTests:

Test errors in both external and inline CSS and Scripts to ensure they have
expected line:column information.

  • inspector-protocol/console/warnings-errors-expected.txt: Added.
  • inspector-protocol/console/warnings-errors.html: Added.
  • inspector-protocol/resources/errors.css: Added.
  • inspector-protocol/resources/errors.js: Added.
Location:
trunk
Files:
4 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r181425 r181426  
     12015-03-11  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Web Inspector: CSS parser errors in the console should include column numbers
     4        https://bugs.webkit.org/show_bug.cgi?id=114313
     5
     6        Reviewed by Darin Adler.
     7
     8        Test errors in both external and inline CSS and Scripts to ensure they have
     9        expected line:column information.
     10
     11        * inspector-protocol/console/warnings-errors-expected.txt: Added.
     12        * inspector-protocol/console/warnings-errors.html: Added.
     13        * inspector-protocol/resources/errors.css: Added.
     14        * inspector-protocol/resources/errors.js: Added.
     15
    1162015-03-11  Simon Fraser  <simon.fraser@apple.com>
    217
  • trunk/Source/WebCore/ChangeLog

    r181423 r181426  
     12015-03-11  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Web Inspector: CSS parser errors in the console should include column numbers
     4        https://bugs.webkit.org/show_bug.cgi?id=114313
     5
     6        Reviewed by Darin Adler.
     7
     8        Test: inspector-protocol/console/warnings-errors.html
     9
     10        * css/CSSParser.h:
     11        (WebCore::CSSParser::currentCharacterOffset):
     12        Get the current character offset depending on the source type.
     13        Add instance variables to track column position and start
     14        line / column for inline stylesheets.
     15
     16        * css/CSSParser.cpp:
     17        (WebCore::CSSParser::CSSParser):
     18        (WebCore::CSSParser::parseSheet):
     19        Initialize new instance variables.
     20
     21        (WebCore::CSSParser::currentLocation):
     22        Update to include column information for the token. Also, if we are on the
     23        first line we may need to take into account a start column offset as well.
     24
     25        (WebCore::CSSParser::realLex):
     26        Set the token's start column.
     27        When bumping the line number, reset the column offset for the next
     28        line with the next character.
     29
     30        (WebCore::CSSParser::syntaxError):
     31        (WebCore::CSSParser::logError):
     32        Include column information.
     33
     34        * css/StyleSheetContents.cpp:
     35        (WebCore::StyleSheetContents::parseAuthorStyleSheet):
     36        (WebCore::StyleSheetContents::parseString):
     37        (WebCore::StyleSheetContents::parseStringAtPosition):
     38        Include column information.
     39
     40        * css/StyleSheetContents.h:
     41        * dom/InlineStyleSheetOwner.cpp:
     42        (WebCore::InlineStyleSheetOwner::InlineStyleSheetOwner):
     43        (WebCore::InlineStyleSheetOwner::createSheet):
     44        Save and use column information later on.
     45
     46        * dom/InlineStyleSheetOwner.h:
     47        * inspector/InspectorStyleSheet.cpp:
     48        (WebCore::InspectorStyleSheet::ensureSourceData):
     49        Updated parser signature needs starting column and no longer has optional parameters.
     50
    1512015-03-11  Eric Carlson  <eric.carlson@apple.com>
    252
  • trunk/Source/WebCore/css/CSSParser.cpp

    r181389 r181426  
    331331    , m_lineNumber(0)
    332332    , m_tokenStartLineNumber(0)
     333    , m_tokenStartColumnNumber(0)
    333334    , m_lastSelectorLineNumber(0)
     335    , m_columnOffsetForLine(0)
     336    , m_sheetStartLineNumber(0)
     337    , m_sheetStartColumnNumber(0)
    334338    , m_allowImportRules(true)
    335339    , m_allowNamespaceDeclarations(true)
     
    430434}
    431435
    432 void CSSParser::parseSheet(StyleSheetContents* sheet, const String& string, int startLineNumber, RuleSourceDataList* ruleSourceDataResult, bool logErrors)
     436void CSSParser::parseSheet(StyleSheetContents* sheet, const String& string, const TextPosition& textPosition, RuleSourceDataList* ruleSourceDataResult, bool logErrors)
    433437{
    434438    setStyleSheet(sheet);
     
    440444    m_logErrors = logErrors && sheet->singleOwnerDocument() && !sheet->baseURL().isEmpty() && sheet->singleOwnerDocument()->page();
    441445    m_ignoreErrorsInDeclaration = false;
    442     m_lineNumber = startLineNumber;
     446    m_sheetStartLineNumber = textPosition.m_line.zeroBasedInt();
     447    m_sheetStartColumnNumber = textPosition.m_column.zeroBasedInt();
     448    m_lineNumber = m_sheetStartLineNumber;
     449    m_columnOffsetForLine = 0;
    443450    setupParser("", string, "");
    444451    cssyyparse(this);
     
    1048410491    Location location;
    1048510492    location.lineNumber = m_tokenStartLineNumber;
     10493    location.columnNumber = m_tokenStartColumnNumber;
     10494
     10495    ASSERT(location.lineNumber >= 0);
     10496    ASSERT(location.columnNumber >= 0);
     10497
     10498    if (location.lineNumber == m_sheetStartLineNumber)
     10499        location.columnNumber += m_sheetStartColumnNumber;
     10500
    1048610501    if (is8BitSource())
    1048710502        location.token.init(tokenStart<LChar>(), currentCharacter<LChar>() - tokenStart<LChar>());
    1048810503    else
    1048910504        location.token.init(tokenStart<UChar>(), currentCharacter<UChar>() - tokenStart<UChar>());
     10505
    1049010506    return location;
    1049110507}
     
    1135911375    setTokenStart(result);
    1136011376    m_tokenStartLineNumber = m_lineNumber;
     11377    m_tokenStartColumnNumber = tokenStartOffset() - m_columnOffsetForLine;
    1136111378    m_token = *currentCharacter<SrcCharacterType>();
    1136211379    ++currentCharacter<SrcCharacterType>();
     
    1158111598        --currentCharacter<SrcCharacterType>();
    1158211599        do {
    11583             if (*currentCharacter<SrcCharacterType>() == '\n')
     11600            if (*currentCharacter<SrcCharacterType>() == '\n') {
    1158411601                ++m_lineNumber;
     11602                m_columnOffsetForLine = currentCharacterOffset() + 1;
     11603            }
    1158511604            ++currentCharacter<SrcCharacterType>();
    1158611605        } while (*currentCharacter<SrcCharacterType>() <= ' ' && (typesOfASCIICharacters[*currentCharacter<SrcCharacterType>()] == CharacterWhiteSpace));
     
    1165111670            ++currentCharacter<SrcCharacterType>();
    1165211671            while (currentCharacter<SrcCharacterType>()[0] != '*' || currentCharacter<SrcCharacterType>()[1] != '/') {
    11653                 if (*currentCharacter<SrcCharacterType>() == '\n')
     11672                if (*currentCharacter<SrcCharacterType>() == '\n') {
    1165411673                    ++m_lineNumber;
    11655                 if (*currentCharacter<SrcCharacterType>() == '\0') {
     11674                    m_columnOffsetForLine = currentCharacterOffset() + 1;
     11675                } else if (*currentCharacter<SrcCharacterType>() == '\0') {
    1165611676                    // Unterminated comments are simply ignored.
    1165711677                    currentCharacter<SrcCharacterType>() -= 2;
     
    1187011890    if (!isLoggingErrors())
    1187111891        return;
     11892
    1187211893    StringBuilder builder;
    1187311894    switch (error) {
     
    1187511896        builder.appendLiteral("Invalid CSS property declaration at: ");
    1187611897        break;
    11877 
    1187811898    default:
    1187911899        builder.appendLiteral("Unexpected CSS token: ");
     11900        break;
    1188011901    }
    1188111902
     
    1188511906        builder.append(location.token.characters16(), location.token.length());
    1188611907
    11887     logError(builder.toString(), location.lineNumber);
     11908    logError(builder.toString(), location.lineNumber, location.columnNumber);
    1188811909
    1188911910    m_ignoreErrorsInDeclaration = true;
     
    1189511916}
    1189611917
    11897 void CSSParser::logError(const String& message, int lineNumber)
    11898 {
    11899     // FIXME: <http://webkit.org/b/114313> CSS parser console message errors should include column numbers.
     11918void CSSParser::logError(const String& message, int lineNumber, int columnNumber)
     11919{
    1190011920    PageConsoleClient& console = m_styleSheet->singleOwnerDocument()->page()->console();
    11901     console.addMessage(MessageSource::CSS, MessageLevel::Warning, message, m_styleSheet->baseURL().string(), lineNumber + 1, 0);
     11921    console.addMessage(MessageSource::CSS, MessageLevel::Warning, message, m_styleSheet->baseURL().string(), lineNumber + 1, columnNumber + 1);
    1190211922}
    1190311923
  • trunk/Source/WebCore/css/CSSParser.h

    r181389 r181426  
    4141#include <wtf/Vector.h>
    4242#include <wtf/text/AtomicString.h>
     43#include <wtf/text/TextPosition.h>
    4344
    4445#if ENABLE(CSS_GRID_LAYOUT)
     
    106107    WEBCORE_EXPORT ~CSSParser();
    107108
    108     void parseSheet(StyleSheetContents*, const String&, int startLineNumber = 0, RuleSourceDataList* = nullptr, bool = false);
     109    void parseSheet(StyleSheetContents*, const String&, const TextPosition&, RuleSourceDataList*, bool logErrors);
    109110    PassRefPtr<StyleRuleBase> parseRule(StyleSheetContents*, const String&);
    110111    PassRefPtr<StyleKeyframe> parseKeyframeRule(StyleSheetContents*, const String&);
     
    465466    inline UChar tokenStartChar();
    466467
     468    inline unsigned currentCharacterOffset();
     469
    467470    template <typename CharacterType>
    468471    inline bool isIdentifierStart();
     
    593596    int m_lineNumber;
    594597    int m_tokenStartLineNumber;
     598    int m_tokenStartColumnNumber;
    595599    int m_lastSelectorLineNumber;
     600    int m_columnOffsetForLine;
     601
     602    int m_sheetStartLineNumber;
     603    int m_sheetStartColumnNumber;
    596604
    597605    bool m_allowImportRules;
     
    643651
    644652    bool isLoggingErrors();
    645     void logError(const String& message, int lineNumber);
     653    void logError(const String& message, int lineNumber, int columnNumber);
    646654
    647655    bool validateCalculationUnit(ValueWithCalculation&, Units);
     
    687695struct CSSParser::Location {
    688696    int lineNumber;
     697    int columnNumber;
    689698    CSSParserString token;
    690699};
     
    715724}
    716725
     726unsigned CSSParser::currentCharacterOffset()
     727{
     728    if (is8BitSource())
     729        return m_currentCharacter8 - m_dataStart8.get();
     730    return m_currentCharacter16 - m_dataStart16.get();
     731}
     732
    717733inline UChar CSSParser::tokenStartChar()
    718734{
  • trunk/Source/WebCore/css/StyleSheetContents.cpp

    r181389 r181426  
    292292
    293293    CSSParser p(parserContext());
    294     p.parseSheet(this, sheetText, 0, 0, true);
     294    p.parseSheet(this, sheetText, TextPosition(), nullptr, true);
    295295
    296296    // If we're loading a stylesheet cross-origin, and the MIME type is not standard, require the CSS
     
    317317bool StyleSheetContents::parseString(const String& sheetText)
    318318{
    319     return parseStringAtLine(sheetText, 0, false);
    320 }
    321 
    322 bool StyleSheetContents::parseStringAtLine(const String& sheetText, int startLineNumber, bool createdByParser)
     319    return parseStringAtPosition(sheetText, TextPosition(), false);
     320}
     321
     322bool StyleSheetContents::parseStringAtPosition(const String& sheetText, const TextPosition& textPosition, bool createdByParser)
    323323{
    324324    CSSParser p(parserContext());
    325     p.parseSheet(this, sheetText, startLineNumber, 0, createdByParser);
    326 
     325    p.parseSheet(this, sheetText, textPosition, nullptr, createdByParser);
    327326    return true;
    328327}
  • trunk/Source/WebCore/css/StyleSheetContents.h

    r181389 r181426  
    2929#include <wtf/Vector.h>
    3030#include <wtf/text/AtomicStringHash.h>
     31#include <wtf/text/TextPosition.h>
    3132
    3233namespace WebCore {
     
    6364    void parseAuthorStyleSheet(const CachedCSSStyleSheet*, const SecurityOrigin*);
    6465    WEBCORE_EXPORT bool parseString(const String&);
    65     bool parseStringAtLine(const String&, int startLineNumber, bool);
     66    bool parseStringAtPosition(const String&, const TextPosition&, bool createdByParser);
    6667
    6768    bool isCacheable() const;
  • trunk/Source/WebCore/dom/InlineStyleSheetOwner.cpp

    r181389 r181426  
    3636    : m_isParsingChildren(createdByParser)
    3737    , m_loading(false)
    38     , m_startLineNumber(WTF::OrdinalNumber::beforeFirst())
     38    , m_startTextPosition(WTF::OrdinalNumber::beforeFirst(), WTF::OrdinalNumber::beforeFirst())
    3939{
    4040    if (createdByParser && document.scriptableDocumentParser() && !document.isInDocumentWrite())
    41         m_startLineNumber = document.scriptableDocumentParser()->textPosition().m_line;
     41        m_startTextPosition = document.scriptableDocumentParser()->textPosition();
    4242}
    4343
     
    124124    if (!isValidCSSContentType(element, m_contentType))
    125125        return;
    126     if (!document.contentSecurityPolicy()->allowInlineStyle(document.url(), m_startLineNumber))
     126    if (!document.contentSecurityPolicy()->allowInlineStyle(document.url(), m_startTextPosition.m_line))
    127127        return;
    128128
     
    145145    m_sheet->setMediaQueries(mediaQueries.release());
    146146    m_sheet->setTitle(element.title());
    147     m_sheet->contents().parseStringAtLine(text, m_startLineNumber.zeroBasedInt(), m_isParsingChildren);
     147    m_sheet->contents().parseStringAtPosition(text, m_startTextPosition, m_isParsingChildren);
    148148
    149149    m_loading = false;
  • trunk/Source/WebCore/dom/InlineStyleSheetOwner.h

    r181389 r181426  
    5858    bool m_isParsingChildren;
    5959    bool m_loading;
    60     WTF::OrdinalNumber m_startLineNumber;
     60    WTF::TextPosition m_startTextPosition;
    6161    AtomicString m_contentType;
    6262    AtomicString m_media;
  • trunk/Source/WebCore/inspector/InspectorStyleSheet.cpp

    r181389 r181426  
    11071107    RefPtr<StyleSheetContents> newStyleSheet = StyleSheetContents::create();
    11081108    auto ruleSourceDataResult = std::make_unique<RuleSourceDataList>();
    1109     createCSSParser(m_pageStyleSheet->ownerDocument())->parseSheet(newStyleSheet.get(), m_parsedStyleSheet->text(), 0, ruleSourceDataResult.get());
     1109    createCSSParser(m_pageStyleSheet->ownerDocument())->parseSheet(newStyleSheet.get(), m_parsedStyleSheet->text(), TextPosition(), ruleSourceDataResult.get(), false);
    11101110    m_parsedStyleSheet->setSourceData(WTF::move(ruleSourceDataResult));
    11111111    return m_parsedStyleSheet->hasSourceData();
  • trunk/Source/WebInspectorUI/ChangeLog

    r181389 r181426  
     12015-03-11  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Web Inspector: CSS parser errors in the console should include column numbers
     4        https://bugs.webkit.org/show_bug.cgi?id=114313
     5
     6        Reviewed by Darin Adler.
     7
     8        * UserInterface/Views/ConsoleMessageImpl.js:
     9        (WebInspector.ConsoleMessageImpl.prototype._linkifyLocation):
     10        Column numbers in console messages are also 1 based and should be adjusted.
     11
    1122015-03-11  Commit Queue  <commit-queue@webkit.org>
    213
  • trunk/Source/WebInspectorUI/UserInterface/Views/ConsoleMessageImpl.js

    r181389 r181426  
    200200        // ConsoleMessage stack trace line numbers are one-based.
    201201        lineNumber = lineNumber ? lineNumber - 1 : 0;
     202        columnNumber = columnNumber ? columnNumber - 1 : 0;
    202203
    203204        return WebInspector.linkifyLocation(url, lineNumber, columnNumber, "console-message-url");
Note: See TracChangeset for help on using the changeset viewer.