Changeset 191135 in webkit


Ignore:
Timestamp:
Oct 15, 2015, 1:50:02 PM (10 years ago)
Author:
[email protected]
Message:

Web Inspector: JavaScriptCore should parse sourceURL and sourceMappingURL directives
https://bugs.webkit.org/show_bug.cgi?id=150096

Patch by Joseph Pecoraro <Joseph Pecoraro> on 2015-10-15
Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

  • inspector/ContentSearchUtilities.cpp:

(Inspector::ContentSearchUtilities::scriptCommentPattern): Deleted.
(Inspector::ContentSearchUtilities::findScriptSourceURL): Deleted.
(Inspector::ContentSearchUtilities::findScriptSourceMapURL): Deleted.

  • inspector/ContentSearchUtilities.h:

No longer need to search script content.

  • inspector/ScriptDebugServer.cpp:

(Inspector::ScriptDebugServer::dispatchDidParseSource):
Carry over the sourceURL and sourceMappingURL from the SourceProvider.

  • inspector/agents/InspectorDebuggerAgent.cpp:

(Inspector::InspectorDebuggerAgent::sourceMapURLForScript):
(Inspector::InspectorDebuggerAgent::didParseSource):
No longer do content searching.

  • parser/Lexer.cpp:

(JSC::Lexer<T>::setCode):
(JSC::Lexer<T>::skipWhitespace):
(JSC::Lexer<T>::parseCommentDirective):
(JSC::Lexer<T>::parseCommentDirectiveValue):
(JSC::Lexer<T>::consume):
(JSC::Lexer<T>::lex):

  • parser/Lexer.h:

(JSC::Lexer::sourceURL):
(JSC::Lexer::sourceMappingURL):
(JSC::Lexer::sourceProvider): Deleted.
Give lexer the ability to detect script comment directives.
This just consumes characters in single line comments and
ultimately sets the sourceURL or sourceMappingURL found.

  • parser/Parser.h:

(JSC::Parser<LexerType>::parse):

  • parser/SourceProvider.h:

(JSC::SourceProvider::url):
(JSC::SourceProvider::sourceURL):
(JSC::SourceProvider::sourceMappingURL):
(JSC::SourceProvider::setSourceURL):
(JSC::SourceProvider::setSourceMappingURL):
After parsing a script, update the Source Provider with the
value of directives that may have been found in the script.

Source/WebInspectorUI:

  • UserInterface/Test/InspectorProtocol.js:

(InspectorProtocol._sendMessage):
(InspectorProtocol.dispatchMessageFromBackend):
This is only used for tests, so avoid console.log
and just dump directly to the system console.

LayoutTests:

  • inspector/debugger/sourceURLs-expected.txt: Added.
  • inspector/debugger/sourceURLs.html: Added.

sourceURL and sourceMappingURL detection.

Location:
trunk
Files:
2 added
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r191132 r191135  
     12015-10-15  Joseph Pecoraro  <[email protected]>
     2
     3        Web Inspector: JavaScriptCore should parse sourceURL and sourceMappingURL directives
     4        https://bugs.webkit.org/show_bug.cgi?id=150096
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        * inspector/debugger/sourceURLs-expected.txt: Added.
     9        * inspector/debugger/sourceURLs.html: Added.
     10        sourceURL and sourceMappingURL detection.
     11
    1122015-10-15  Dean Jackson  <[email protected]>
    213
  • trunk/Source/JavaScriptCore/ChangeLog

    r191134 r191135  
     12015-10-15  Joseph Pecoraro  <[email protected]>
     2
     3        Web Inspector: JavaScriptCore should parse sourceURL and sourceMappingURL directives
     4        https://bugs.webkit.org/show_bug.cgi?id=150096
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        * inspector/ContentSearchUtilities.cpp:
     9        (Inspector::ContentSearchUtilities::scriptCommentPattern): Deleted.
     10        (Inspector::ContentSearchUtilities::findScriptSourceURL): Deleted.
     11        (Inspector::ContentSearchUtilities::findScriptSourceMapURL): Deleted.
     12        * inspector/ContentSearchUtilities.h:
     13        No longer need to search script content.
     14
     15        * inspector/ScriptDebugServer.cpp:
     16        (Inspector::ScriptDebugServer::dispatchDidParseSource):
     17        Carry over the sourceURL and sourceMappingURL from the SourceProvider.
     18
     19        * inspector/agents/InspectorDebuggerAgent.cpp:
     20        (Inspector::InspectorDebuggerAgent::sourceMapURLForScript):
     21        (Inspector::InspectorDebuggerAgent::didParseSource):
     22        No longer do content searching.
     23
     24        * parser/Lexer.cpp:
     25        (JSC::Lexer<T>::setCode):
     26        (JSC::Lexer<T>::skipWhitespace):
     27        (JSC::Lexer<T>::parseCommentDirective):
     28        (JSC::Lexer<T>::parseCommentDirectiveValue):
     29        (JSC::Lexer<T>::consume):
     30        (JSC::Lexer<T>::lex):
     31        * parser/Lexer.h:
     32        (JSC::Lexer::sourceURL):
     33        (JSC::Lexer::sourceMappingURL):
     34        (JSC::Lexer::sourceProvider): Deleted.
     35        Give lexer the ability to detect script comment directives.
     36        This just consumes characters in single line comments and
     37        ultimately sets the sourceURL or sourceMappingURL found.
     38
     39        * parser/Parser.h:
     40        (JSC::Parser<LexerType>::parse):
     41        * parser/SourceProvider.h:
     42        (JSC::SourceProvider::url):
     43        (JSC::SourceProvider::sourceURL):
     44        (JSC::SourceProvider::sourceMappingURL):
     45        (JSC::SourceProvider::setSourceURL):
     46        (JSC::SourceProvider::setSourceMappingURL):
     47        After parsing a script, update the Source Provider with the
     48        value of directives that may have been found in the script.
     49
    1502015-10-15  Filip Pizlo  <[email protected]>
    251
  • trunk/Source/JavaScriptCore/inspector/ContentSearchUtilities.cpp

    r182829 r191135  
    167167}
    168168
    169 static String scriptCommentPattern(const String& name)
    170 {
    171     // "//# <name>=<value>" and deprecated "//@"
    172     return "//[#@][\040\t]" + name + "=[\040\t]*([^\\s\'\"]*)[\040\t]*$";
    173 }
    174 
    175169static String stylesheetCommentPattern(const String& name)
    176170{
     
    200194}
    201195
    202 String findScriptSourceURL(const String& content)
    203 {
    204     return findMagicComment(content, scriptCommentPattern(ASCIILiteral("sourceURL")));
    205 }
    206 
    207 String findScriptSourceMapURL(const String& content)
    208 {
    209     return findMagicComment(content, scriptCommentPattern(ASCIILiteral("sourceMappingURL")));
    210 }
    211 
    212196String findStylesheetSourceMapURL(const String& content)
    213197{
  • trunk/Source/JavaScriptCore/inspector/ContentSearchUtilities.h

    r178820 r191135  
    4949JS_EXPORT_PRIVATE std::unique_ptr<Vector<size_t>> lineEndings(const String&);
    5050
    51 JS_EXPORT_PRIVATE String findScriptSourceURL(const String& content);
    52 JS_EXPORT_PRIVATE String findScriptSourceMapURL(const String& content);
    5351JS_EXPORT_PRIVATE String findStylesheetSourceMapURL(const String& content);
    5452
  • trunk/Source/JavaScriptCore/inspector/ScriptDebugServer.cpp

    r190542 r191135  
    208208    script.startColumn = sourceProvider->startPosition().m_column.zeroBasedInt();
    209209    script.isContentScript = isContentScript;
     210    script.sourceURL = sourceProvider->sourceURL();
     211    script.sourceMappingURL = sourceProvider->sourceMappingURL();
    210212
    211213    int sourceLength = script.source.length();
  • trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp

    r190542 r191135  
    605605String InspectorDebuggerAgent::sourceMapURLForScript(const Script& script)
    606606{
    607     return ContentSearchUtilities::findScriptSourceMapURL(script.source);
    608 }
    609 
    610 void InspectorDebuggerAgent::didParseSource(JSC::SourceID sourceID, const Script& inScript)
    611 {
    612     Script script = inScript;
    613     if (script.startLine <= 0 && !script.startColumn)
    614         script.sourceURL = ContentSearchUtilities::findScriptSourceURL(script.source);
    615     script.sourceMappingURL = sourceMapURLForScript(script);
    616 
     607    return script.sourceMappingURL;
     608}
     609
     610void InspectorDebuggerAgent::didParseSource(JSC::SourceID sourceID, const Script& script)
     611{
    617612    bool hasSourceURL = !script.sourceURL.isEmpty();
    618613    String scriptURL = hasSourceURL ? script.sourceURL : script.url;
    619614    bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr;
    620     String* sourceMapURLParam = script.sourceMappingURL.isNull() ? nullptr : &script.sourceMappingURL;
     615    String sourceMappingURL = sourceMapURLForScript(script);
     616    String* sourceMapURLParam = sourceMappingURL.isNull() ? nullptr : &sourceMappingURL;
    621617    const bool* isContentScript = script.isContentScript ? &script.isContentScript : nullptr;
    622618    String scriptIDStr = String::number(sourceID);
  • trunk/Source/JavaScriptCore/parser/Lexer.cpp

    r189371 r191135  
    2626#include "Lexer.h"
    2727
     28#include "BuiltinNames.h"
     29#include "Identifier.h"
     30#include "JSCInlines.h"
    2831#include "JSFunctionInlines.h"
    29 
    30 #include "BuiltinNames.h"
    3132#include "JSGlobalObjectFunctions.h"
    32 #include "Identifier.h"
     33#include "KeywordLookup.h"
     34#include "Lexer.lut.h"
    3335#include "Nodes.h"
    34 #include "JSCInlines.h"
    35 #include <wtf/dtoa.h>
     36#include "Parser.h"
    3637#include <ctype.h>
    3738#include <limits.h>
    3839#include <string.h>
    3940#include <wtf/Assertions.h>
    40 
    41 #include "KeywordLookup.h"
    42 #include "Lexer.lut.h"
    43 #include "Parser.h"
     41#include <wtf/dtoa.h>
    4442
    4543namespace JSC {
     
    566564    m_lineStart = m_code;
    567565    m_lexErrorMessage = String();
     566    m_sourceURL = String();
     567    m_sourceMappingURL = String();
    568568   
    569569    m_buffer8.reserveInitialCapacity(initialReadBufferCapacity);
     
    687687{
    688688    return m_lastToken == CONTINUE || m_lastToken == BREAK || m_lastToken == RETURN || m_lastToken == THROW;
     689}
     690
     691template <typename T>
     692ALWAYS_INLINE void Lexer<T>::skipWhitespace()
     693{
     694    while (isWhiteSpace(m_current))
     695        shift();
    689696}
    690697
     
    17061713
    17071714template <typename T>
     1715ALWAYS_INLINE void Lexer<T>::parseCommentDirective()
     1716{
     1717    // sourceURL and sourceMappingURL directives.
     1718    if (!consume("source"))
     1719        return;
     1720
     1721    if (consume("URL=")) {
     1722        if (!m_sourceURL.isEmpty())
     1723            return;
     1724        m_sourceURL = parseCommentDirectiveValue();
     1725        return;
     1726    }
     1727
     1728    if (consume("MappingURL=")) {
     1729        if (!m_sourceMappingURL.isEmpty())
     1730            return;
     1731        m_sourceMappingURL = parseCommentDirectiveValue();
     1732        return;
     1733    }
     1734}
     1735
     1736template <typename T>
     1737ALWAYS_INLINE String Lexer<T>::parseCommentDirectiveValue()
     1738{
     1739    skipWhitespace();
     1740    const T* stringStart = currentSourcePtr();
     1741    while (!isWhiteSpace(m_current) && !isLineTerminator(m_current) && m_current != '"' && m_current != '\'' && !atEnd())
     1742        shift();
     1743    const T* stringEnd = currentSourcePtr();
     1744    skipWhitespace();
     1745
     1746    if (!isLineTerminator(m_current) && !atEnd())
     1747        return String();
     1748
     1749    append8(stringStart, stringEnd - stringStart);
     1750    return String(m_buffer8.data(), m_buffer8.size());
     1751}
     1752
     1753template <typename T>
     1754template <unsigned length>
     1755ALWAYS_INLINE bool Lexer<T>::consume(const char (&input)[length])
     1756{
     1757    unsigned lengthToCheck = length - 1; // Ignore the ending NUL byte in the string literal.
     1758
     1759    unsigned i = 0;
     1760    for (; i < lengthToCheck && m_current == input[i]; i++)
     1761        shift();
     1762
     1763    return i == lengthToCheck;
     1764}
     1765
     1766template <typename T>
    17081767bool Lexer<T>::nextTokenIsColon()
    17091768{
     
    17401799
    17411800start:
    1742     while (isWhiteSpace(m_current))
    1743         shift();
     1801    skipWhitespace();
    17441802
    17451803    if (atEnd())
     
    18991957        if (m_current == '/') {
    19001958            shift();
    1901             goto inSingleLineComment;
     1959            goto inSingleLineCommentCheckForDirectives;
    19021960        }
    19031961        if (m_current == '*') {
     
    22042262    goto returnToken;
    22052263
     2264inSingleLineCommentCheckForDirectives:
     2265    // Script comment directives like "//# sourceURL=test.js".
     2266    if (UNLIKELY((m_current == '#' || m_current == '@') && isWhiteSpace(peek(1)))) {
     2267        shift();
     2268        shift();
     2269        parseCommentDirective();
     2270    }
     2271    // Fall through to complete single line comment parsing.
     2272
    22062273inSingleLineComment:
    22072274    while (!isLineTerminator(m_current)) {
  • trunk/Source/JavaScriptCore/parser/Lexer.h

    r188824 r191135  
    8989    bool sawError() const { return m_error; }
    9090    String getErrorMessage() const { return m_lexErrorMessage; }
     91    String sourceURL() const { return m_sourceURL; }
     92    String sourceMappingURL() const { return m_sourceMappingURL; }
    9193    void clear();
    9294    void setOffset(int offset, int lineStartOffset)
     
    114116        m_terminator = terminator;
    115117    }
    116 
    117     SourceProvider* sourceProvider() const { return m_source->provider(); }
    118118
    119119    JSTokenType lexExpectIdentifier(JSToken*, unsigned, bool strictMode);
     
    153153
    154154    ALWAYS_INLINE bool lastTokenWasRestrKeyword() const;
     155   
     156    ALWAYS_INLINE void skipWhitespace();
    155157
    156158    template <int shiftAmount> void internalShift();
     
    178180    ALWAYS_INLINE bool parseNumberAfterExponentIndicator();
    179181    ALWAYS_INLINE bool parseMultilineComment();
     182
     183    ALWAYS_INLINE void parseCommentDirective();
     184    ALWAYS_INLINE String parseCommentDirectiveValue();
     185
     186    template <unsigned length>
     187    ALWAYS_INLINE bool consume(const char (&input)[length]);
    180188
    181189    static const size_t initialReadBufferCapacity = 32;
     
    204212    String m_lexErrorMessage;
    205213
     214    String m_sourceURL;
     215    String m_sourceMappingURL;
     216
    206217    T m_current;
    207218
  • trunk/Source/JavaScriptCore/parser/Parser.h

    r190188 r191135  
    13301330        result->setLoc(m_source->firstLine(), m_lexer->lineNumber(), m_lexer->currentOffset(), m_lexer->currentLineStartOffset());
    13311331        result->setEndOffset(m_lexer->currentOffset());
     1332
     1333        m_source->provider()->setSourceURL(m_lexer->sourceURL());
     1334        m_source->provider()->setSourceMappingURL(m_lexer->sourceMappingURL());
    13321335    } else {
    13331336        // We can never see a syntax error when reparsing a function, since we should have
  • trunk/Source/JavaScriptCore/parser/SourceProvider.h

    r187677 r191135  
    5050        }
    5151
    52         const String& url() { return m_url; }
     52        const String& url() const { return m_url; }
     53        const String& sourceURL() const { return m_sourceURL; }
     54        const String& sourceMappingURL() const { return m_sourceMappingURL; }
     55
    5356        TextPosition startPosition() const { return m_startPosition; }
    5457        intptr_t asID()
     
    6366
    6467    private:
     68        template <typename T> friend class Parser;
     69
     70        void setSourceURL(const String& sourceURL) { m_sourceURL = sourceURL; }
     71        void setSourceMappingURL(const String& sourceMappingURL) { m_sourceMappingURL = sourceMappingURL; }
    6572
    6673        JS_EXPORT_PRIVATE void getID();
     
    6875
    6976        String m_url;
     77        String m_sourceURL;
     78        String m_sourceMappingURL;
    7079        TextPosition m_startPosition;
    7180        bool m_validated : 1;
  • trunk/Source/WebInspectorUI/ChangeLog

    r191071 r191135  
     12015-10-15  Joseph Pecoraro  <[email protected]>
     2
     3        Web Inspector: JavaScriptCore should parse sourceURL and sourceMappingURL directives
     4        https://bugs.webkit.org/show_bug.cgi?id=150096
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        * UserInterface/Test/InspectorProtocol.js:
     9        (InspectorProtocol._sendMessage):
     10        (InspectorProtocol.dispatchMessageFromBackend):
     11        This is only used for tests, so avoid console.log
     12        and just dump directly to the system console.
     13
    1142015-10-13  João Oliveira  <[email protected]>
    215
  • trunk/Source/WebInspectorUI/UserInterface/Test/InspectorProtocol.js

    r190191 r191135  
    9090
    9191    if (ProtocolTest.dumpInspectorProtocolMessages)
    92         console.log(`frontend: ${messageString}`);
     92        InspectorFrontendHost.unbufferedLog(`frontend: ${messageString}`);
    9393
    9494    InspectorFrontendHost.sendMessageToBackend(messageString);
     
    135135    // by InspectorProtocol. Return messages should be dumped by InspectorBackend.
    136136    if (ProtocolTest.dumpInspectorProtocolMessages)
    137         console.log("backend: " + JSON.stringify(messageObject));
     137        InspectorFrontendHost.unbufferedLog("backend: " + JSON.stringify(messageObject));
    138138
    139139    // If the message has an id, then it is a reply to a command.
Note: See TracChangeset for help on using the changeset viewer.