Changeset 165331 in webkit


Ignore:
Timestamp:
Mar 8, 2014 4:56:11 AM (10 years ago)
Author:
timothy@apple.com
Message:

Load source maps and their resources asynchronously.

https://bugs.webkit.org/show_bug.cgi?id=112071

Reviewed by Joseph Pecoraro.

Source/WebCore:

  • inspector/InspectorPageAgent.cpp:

(WebCore::InspectorPageAgent::buildObjectForFrameTree):
Honor the hiddenFromInspector flag.

  • inspector/InspectorResourceAgent.cpp:

(WebCore::InspectorResourceAgent::willSendRequest):
(WebCore::InspectorResourceAgent::markResourceAsCached):
(WebCore::InspectorResourceAgent::didReceiveResponse):
(WebCore::InspectorResourceAgent::didReceiveData):
(WebCore::InspectorResourceAgent::didFinishLoading):
(WebCore::InspectorResourceAgent::didFailLoading):
(WebCore::InspectorResourceAgent::replayXHR):
(WebCore::InspectorResourceAgent::loadResource):

  • inspector/InspectorResourceAgent.h:

Honor the hiddenFromInspector flag by keeping track of
hidden identifiers in a HashSet.

  • inspector/protocol/Network.json:

(Network.loadResource): Added.

  • platform/network/ResourceRequestBase.h:

(WebCore::ResourceRequestBase::hiddenFromInspector): Added.
(WebCore::ResourceRequestBase::setHiddenFromInspector): Added.
(WebCore::ResourceRequestBase::ResourceRequestBase):
Add a flag to hide the request from the Inspector.

  • xml/XMLHttpRequest.cpp:

(WebCore::XMLHttpRequest::XMLHttpRequest):
(WebCore::XMLHttpRequest::sendForInspector): Added.
(WebCore::XMLHttpRequest::sendForInspectorXHRReplay): Renamed.
(WebCore::XMLHttpRequest::createRequest):

  • xml/XMLHttpRequest.h:

Make Inspector loads allow cross-origins and hide their request
from the Inspector itself.

Source/WebInspectorUI:

  • UserInterface/Controllers/SourceMapManager.js:

(WebInspector.SourceMapManager.prototype.loadAndParseSourceMap):
(WebInspector.SourceMapManager.prototype.downloadSourceMap):
(WebInspector.SourceMapManager.prototype.sourceMapLoaded):
(WebInspector.SourceMapManager.prototype._loadAndParseSourceMap):
Use NetworkAgent.loadResource.

  • UserInterface/Models/SourceMapResource.js:

(WebInspector.SourceMapResource.prototype.requestContentFromBackend.sourceMapResourceLoaded):
(WebInspector.SourceMapResource.prototype.createSourceCodeTextRange):
Use NetworkAgent.loadResource.

  • UserInterface/Protocol/InspectorWebBackendCommands.js: Updated.
Location:
trunk/Source
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r165327 r165331  
     12014-03-07  Timothy Hatcher  <timothy@apple.com>
     2
     3        Load source maps and their resources asynchronously.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=112071
     6
     7        Reviewed by Joseph Pecoraro.
     8
     9        * inspector/InspectorPageAgent.cpp:
     10        (WebCore::InspectorPageAgent::buildObjectForFrameTree):
     11        Honor the hiddenFromInspector flag.
     12
     13        * inspector/InspectorResourceAgent.cpp:
     14        (WebCore::InspectorResourceAgent::willSendRequest):
     15        (WebCore::InspectorResourceAgent::markResourceAsCached):
     16        (WebCore::InspectorResourceAgent::didReceiveResponse):
     17        (WebCore::InspectorResourceAgent::didReceiveData):
     18        (WebCore::InspectorResourceAgent::didFinishLoading):
     19        (WebCore::InspectorResourceAgent::didFailLoading):
     20        (WebCore::InspectorResourceAgent::replayXHR):
     21        (WebCore::InspectorResourceAgent::loadResource):
     22        * inspector/InspectorResourceAgent.h:
     23        Honor the hiddenFromInspector flag by keeping track of
     24        hidden identifiers in a HashSet.
     25
     26        * inspector/protocol/Network.json:
     27        (Network.loadResource): Added.
     28
     29        * platform/network/ResourceRequestBase.h:
     30        (WebCore::ResourceRequestBase::hiddenFromInspector): Added.
     31        (WebCore::ResourceRequestBase::setHiddenFromInspector): Added.
     32        (WebCore::ResourceRequestBase::ResourceRequestBase):
     33        Add a flag to hide the request from the Inspector.
     34
     35        * xml/XMLHttpRequest.cpp:
     36        (WebCore::XMLHttpRequest::XMLHttpRequest):
     37        (WebCore::XMLHttpRequest::sendForInspector): Added.
     38        (WebCore::XMLHttpRequest::sendForInspectorXHRReplay): Renamed.
     39        (WebCore::XMLHttpRequest::createRequest):
     40        * xml/XMLHttpRequest.h:
     41        Make Inspector loads allow cross-origins and hide their request
     42        from the Inspector itself.
     43
    1442014-03-07  Tim Horton  <timothy_horton@apple.com>
    245
  • trunk/Source/WebCore/inspector/InspectorPageAgent.cpp

    r165117 r165331  
    980980        CachedResource* cachedResource = *it;
    981981
     982        if (cachedResource->resourceRequest().hiddenFromInspector())
     983            continue;
     984
    982985        RefPtr<Inspector::TypeBuilder::Page::FrameResourceTree::Resources> resourceObject = Inspector::TypeBuilder::Page::FrameResourceTree::Resources::create()
    983986            .setUrl(cachedResource->url())
  • trunk/Source/WebCore/inspector/InspectorResourceAgent.cpp

    r165117 r165331  
    7676using namespace Inspector;
    7777
     78typedef Inspector::InspectorNetworkBackendDispatcherHandler::LoadResourceCallback LoadResourceCallback;
     79
    7880namespace WebCore {
    7981
     
    184186void InspectorResourceAgent::willSendRequest(unsigned long identifier, DocumentLoader* loader, ResourceRequest& request, const ResourceResponse& redirectResponse)
    185187{
     188    if (request.hiddenFromInspector()) {
     189        m_hiddenRequestIdentifiers.add(identifier);
     190        return;
     191    }
     192
    186193    String requestId = IdentifiersFactory::requestId(identifier);
    187194    m_resourcesData->resourceCreated(requestId, m_pageAgent->loaderId(loader));
     
    226233void InspectorResourceAgent::markResourceAsCached(unsigned long identifier)
    227234{
     235    if (m_hiddenRequestIdentifiers.contains(identifier))
     236        return;
     237
    228238    m_frontendDispatcher->requestServedFromCache(IdentifiersFactory::requestId(identifier));
    229239}
     
    231241void InspectorResourceAgent::didReceiveResponse(unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response, ResourceLoader* resourceLoader)
    232242{
     243    if (m_hiddenRequestIdentifiers.contains(identifier))
     244        return;
     245
    233246    String requestId = IdentifiersFactory::requestId(identifier);
    234247    RefPtr<Inspector::TypeBuilder::Network::Response> resourceResponse = buildObjectForResourceResponse(response, loader);
     
    275288void InspectorResourceAgent::didReceiveData(unsigned long identifier, const char* data, int dataLength, int encodedDataLength)
    276289{
     290    if (m_hiddenRequestIdentifiers.contains(identifier))
     291        return;
     292
    277293    String requestId = IdentifiersFactory::requestId(identifier);
    278294
     
    288304void InspectorResourceAgent::didFinishLoading(unsigned long identifier, DocumentLoader* loader, double finishTime)
    289305{
     306    if (m_hiddenRequestIdentifiers.remove(identifier))
     307        return;
     308
    290309    String requestId = IdentifiersFactory::requestId(identifier);
    291310    if (m_resourcesData->resourceType(requestId) == InspectorPageAgent::DocumentResource) {
     
    312331void InspectorResourceAgent::didFailLoading(unsigned long identifier, DocumentLoader* loader, const ResourceError& error)
    313332{
     333    if (m_hiddenRequestIdentifiers.remove(identifier))
     334        return;
     335
    314336    String requestId = IdentifiersFactory::requestId(identifier);
    315337
     
    595617    request.setCachePartition(m_pageAgent->mainFrame()->document()->topOrigin()->cachePartition());
    596618#endif
     619
    597620    CachedResource* cachedResource = memoryCache()->resourceForRequest(request, m_pageAgent->page()->sessionID());
    598621    if (cachedResource)
     
    602625    for (const auto& header : xhrReplayData->headers())
    603626        xhr->setRequestHeader(header.key, header.value, IGNORE_EXCEPTION);
    604     xhr->sendFromInspector(xhrReplayData->formData(), IGNORE_EXCEPTION);
     627    xhr->sendForInspectorXHRReplay(xhrReplayData->formData(), IGNORE_EXCEPTION);
     628}
     629
     630namespace {
     631
     632class LoadResourceListener final : public EventListener {
     633    WTF_MAKE_NONCOPYABLE(LoadResourceListener);
     634public:
     635    static PassRefPtr<LoadResourceListener> create(PassRefPtr<LoadResourceCallback> callback)
     636    {
     637        return adoptRef(new LoadResourceListener(callback));
     638    }
     639
     640    virtual ~LoadResourceListener() { }
     641
     642    virtual bool operator==(const EventListener& other) override
     643    {
     644        return this == &other;
     645    }
     646
     647    virtual void handleEvent(ScriptExecutionContext*, Event* event) override
     648    {
     649        if (!m_callback->isActive())
     650            return;
     651
     652        if (event->type() == eventNames().errorEvent) {
     653            m_callback->sendFailure(ASCIILiteral("Error loading resource"));
     654            return;
     655        }
     656
     657        if (event->type() != eventNames().readystatechangeEvent) {
     658            m_callback->sendFailure(ASCIILiteral("Unexpected event type"));
     659            return;
     660        }
     661
     662        XMLHttpRequest* xhr = static_cast<XMLHttpRequest*>(event->target());
     663        if (xhr->readyState() != XMLHttpRequest::DONE)
     664            return;
     665
     666        m_callback->sendSuccess(xhr->responseTextIgnoringResponseType(), xhr->responseMIMEType());
     667    }
     668
     669private:
     670    LoadResourceListener(PassRefPtr<LoadResourceCallback> callback)
     671        : EventListener(EventListener::CPPEventListenerType)
     672        , m_callback(callback) { }
     673
     674    RefPtr<LoadResourceCallback> m_callback;
     675};
     676
     677} // namespace
     678
     679void InspectorResourceAgent::loadResource(ErrorString* errorString, const String& frameId, const String& urlString, PassRefPtr<LoadResourceCallback> callback)
     680{
     681    Frame* frame = m_pageAgent->assertFrame(errorString, frameId);
     682    if (!frame)
     683        return;
     684
     685    Document* document = frame->document();
     686    if (!document) {
     687        *errorString = ASCIILiteral("No Document instance for the specified frame");
     688        return;
     689    }
     690
     691    RefPtr<XMLHttpRequest> xhr = XMLHttpRequest::create(*document);
     692
     693    ExceptionCode ec = 0;
     694    xhr->open(ASCIILiteral("GET"), document->completeURL(urlString), ec);
     695    if (ec) {
     696        *errorString = ASCIILiteral("Error creating request");
     697        return;
     698    }
     699
     700    RefPtr<LoadResourceListener> loadResourceListener = LoadResourceListener::create(callback);
     701    xhr->addEventListener(eventNames().abortEvent, loadResourceListener, false);
     702    xhr->addEventListener(eventNames().errorEvent, loadResourceListener, false);
     703    xhr->addEventListener(eventNames().readystatechangeEvent, loadResourceListener, false);
     704    xhr->sendForInspector(ec);
     705
     706    if (ec) {
     707        *errorString = ASCIILiteral("Error sending request");
     708        return;
     709    }
    605710}
    606711
  • trunk/Source/WebCore/inspector/InspectorResourceAgent.h

    r164245 r165331  
    3535#include "InspectorWebBackendDispatchers.h"
    3636#include "InspectorWebFrontendDispatchers.h"
     37#include <wtf/HashSet.h>
    3738#include <wtf/RefCounted.h>
    3839#include <wtf/Vector.h>
     
    138139    virtual void setCacheDisabled(ErrorString*, bool cacheDisabled) override;
    139140
     141    virtual void loadResource(ErrorString*, const String& frameId, const String& url, PassRefPtr<LoadResourceCallback>) override;
     142
    140143private:
    141144    void enable();
     
    151154    RefPtr<Inspector::InspectorObject> m_extraRequestHeaders;
    152155
     156    HashSet<unsigned long> m_hiddenRequestIdentifiers;
     157
    153158    typedef HashMap<ThreadableLoaderClient*, RefPtr<XHRReplayData>> PendingXHRReplayDataMap;
    154159    PendingXHRReplayDataMap m_pendingXHRReplayData;
  • trunk/Source/WebCore/inspector/protocol/Network.json

    r161556 r165331  
    191191            ],
    192192            "description": "Toggles ignoring cache for each request. If <code>true</code>, cache will not be used."
     193        },
     194        {
     195            "name": "loadResource",
     196            "async": true,
     197            "parameters": [
     198                { "name": "frameId", "$ref": "FrameId", "description": "Frame to load the resource from." },
     199                { "name": "url", "type": "string", "description": "URL of the resource to load." }
     200            ],
     201            "returns": [
     202                { "name": "content", "type": "string", "description": "Resource content." },
     203                { "name": "mimeType", "type": "string", "description": "Resource mimeType." }
     204            ],
     205            "description": "Loads a resource in the context of a frame on the inspected page without cross origin checks."
    193206        }
    194207    ],
  • trunk/Source/WebCore/platform/network/ResourceRequestBase.h

    r162200 r165331  
    140140        void setReportRawHeaders(bool reportRawHeaders) { m_reportRawHeaders = reportRawHeaders; }
    141141
     142#if ENABLE(INSPECTOR)
     143        // Whether this request should be hidden from the Inspector.
     144        bool hiddenFromInspector() const { return m_hiddenFromInspector; }
     145        void setHiddenFromInspector(bool hiddenFromInspector) { m_hiddenFromInspector = hiddenFromInspector; }
     146#endif
     147
    142148        static double defaultTimeoutInterval(); // May return 0 when using platform default.
    143149        static void setDefaultTimeoutInterval(double);
     
    160166            , m_reportLoadTiming(false)
    161167            , m_reportRawHeaders(false)
     168#if ENABLE(INSPECTOR)
     169            , m_hiddenFromInspector(false)
     170#endif
    162171            , m_priority(ResourceLoadPriorityLow)
    163172        {
     
    181190            , m_reportLoadTiming(false)
    182191            , m_reportRawHeaders(false)
     192#if ENABLE(INSPECTOR)
     193            , m_hiddenFromInspector(false)
     194#endif
    183195            , m_priority(ResourceLoadPriorityLow)
    184196        {
     
    207219        bool m_reportLoadTiming : 1;
    208220        bool m_reportRawHeaders : 1;
     221#if ENABLE(INSPECTOR)
     222        bool m_hiddenFromInspector : 1;
     223#endif
    209224        ResourceLoadPriority m_priority : 4;
    210225
  • trunk/Source/WebCore/xml/XMLHttpRequest.cpp

    r165229 r165331  
    185185    , m_uploadComplete(false)
    186186    , m_sameOriginRequest(true)
     187    , m_sendingForInspector(false)
    187188    , m_receivedLength(0)
    188189    , m_lastSendLineNumber(0)
     
    738739}
    739740
    740 void XMLHttpRequest::sendFromInspector(PassRefPtr<FormData> formData, ExceptionCode& ec)
     741void XMLHttpRequest::sendForInspector(ExceptionCode& ec)
     742{
     743    m_sendingForInspector = true;
     744    send(ec);
     745}
     746
     747void XMLHttpRequest::sendForInspectorXHRReplay(PassRefPtr<FormData> formData, ExceptionCode& ec)
    741748{
    742749    m_requestEntityBody = formData ? formData->deepCopy() : 0;
     
    775782    ResourceRequest request(m_url);
    776783    request.setHTTPMethod(m_method);
     784    request.setHiddenFromInspector(m_sendingForInspector);
    777785
    778786    InspectorInstrumentation::willLoadXHR(scriptExecutionContext(), this, m_method, m_url, m_async, m_requestEntityBody ? m_requestEntityBody->deepCopy() : 0, m_requestHeaders, m_includeCredentials);
     
    792800    options.preflightPolicy = uploadEvents ? ForcePreflight : ConsiderPreflight;
    793801    options.allowCredentials = (m_sameOriginRequest || m_includeCredentials) ? AllowStoredCredentials : DoNotAllowStoredCredentials;
    794     options.crossOriginRequestPolicy = UseAccessControl;
     802    options.crossOriginRequestPolicy = m_sendingForInspector ? AllowCrossOriginRequests : UseAccessControl;
    795803    options.securityOrigin = securityOrigin();
    796804#if ENABLE(RESOURCE_TIMING)
  • trunk/Source/WebCore/xml/XMLHttpRequest.h

    r165229 r165331  
    110110    String responseText(ExceptionCode&);
    111111    String responseTextIgnoringResponseType() const { return m_responseBuilder.toStringPreserveCapacity(); }
     112    String responseMIMEType() const;
    112113    Document* responseXML(ExceptionCode&);
    113114    Document* optionalResponseXML() const { return m_responseDocument.get(); }
     
    122123    void didCacheResponseJSON();
    123124
    124     void sendFromInspector(PassRefPtr<FormData>, ExceptionCode&);
     125    void sendForInspector(ExceptionCode&);
     126    void sendForInspectorXHRReplay(PassRefPtr<FormData>, ExceptionCode&);
    125127
    126128    // Expose HTTP validation methods for other untrusted requests.
     
    184186    virtual void didFailRedirectCheck() override;
    185187
    186     String responseMIMEType() const;
    187188    bool responseIsXML() const;
    188189
     
    246247
    247248    bool m_sameOriginRequest;
     249    bool m_sendingForInspector;
    248250
    249251    // Used for onprogress tracking
  • trunk/Source/WebInspectorUI/ChangeLog

    r165093 r165331  
     12014-03-07  Timothy Hatcher  <timothy@apple.com>
     2
     3        Load source maps and their resources asynchronously.
     4
     5        https://bugs.webkit.org/show_bug.cgi?id=112071
     6
     7        Reviewed by Joseph Pecoraro.
     8
     9        * UserInterface/Controllers/SourceMapManager.js:
     10        (WebInspector.SourceMapManager.prototype.loadAndParseSourceMap):
     11        (WebInspector.SourceMapManager.prototype.downloadSourceMap):
     12        (WebInspector.SourceMapManager.prototype.sourceMapLoaded):
     13        (WebInspector.SourceMapManager.prototype._loadAndParseSourceMap):
     14        Use NetworkAgent.loadResource.
     15
     16        * UserInterface/Models/SourceMapResource.js:
     17        (WebInspector.SourceMapResource.prototype.requestContentFromBackend.sourceMapResourceLoaded):
     18        (WebInspector.SourceMapResource.prototype.createSourceCodeTextRange):
     19        Use NetworkAgent.loadResource.
     20
     21        * UserInterface/Protocol/InspectorWebBackendCommands.js: Updated.
     22
    1232014-03-04  Brian Burg  <bburg@apple.com>
    224
  • trunk/Source/WebInspectorUI/UserInterface/Controllers/SourceMapManager.js

    r164543 r165331  
    6262            return;
    6363
    64         this._loadAndParseSourceMap(sourceMapURL, baseURL, originalSourceCode);
     64        function loadAndParseSourceMap()
     65        {
     66            this._loadAndParseSourceMap(sourceMapURL, baseURL, originalSourceCode);
     67        }
     68
     69        if (!WebInspector.frameResourceManager.mainFrame) {
     70            // If we don't have a main frame, then we are likely in the middle of building the resource tree.
     71            // Delaying until the next runloop is enough in this case to then start loading the source map.
     72            setTimeout(loadAndParseSourceMap.bind(this), 0);
     73            return;
     74        }
     75
     76        loadAndParseSourceMap.call(this);
    6577    },
    6678
     
    7183        this._downloadingSourceMaps[sourceMapURL] = true;
    7284
    73         // FIXME: <rdar://problem/13238886> Source Maps: Frontend needs asynchronous resource loading of content + mime type
    74         var response = InspectorFrontendHost.loadResourceSynchronously(sourceMapURL);
    75         if (response === undefined) {
    76             this._loadAndParseFailed(sourceMapURL);
    77             return;
    78         }
    79 
    80         if (response.slice(0, 3) === ")]}") {
    81             var firstNewlineIndex = response.indexOf("\n");
    82             if (firstNewlineIndex === -1) {
     85        function sourceMapLoaded(error, content, mimeType)
     86        {
     87            if (error) {
    8388                this._loadAndParseFailed(sourceMapURL);
    8489                return;
    8590            }
    86             response = response.substring(firstNewlineIndex);
     91
     92            if (content.slice(0, 3) === ")]}") {
     93                var firstNewlineIndex = content.indexOf("\n");
     94                if (firstNewlineIndex === -1) {
     95                    this._loadAndParseFailed(sourceMapURL);
     96                    return;
     97                }
     98
     99                content = content.substring(firstNewlineIndex);
     100            }
     101
     102            try {
     103                var payload = JSON.parse(content);
     104                var baseURL = sourceMapURL.startsWith("data:") ? originalSourceCode.url : sourceMapURL;
     105                var sourceMap = new WebInspector.SourceMap(baseURL, payload, originalSourceCode);
     106                this._loadAndParseSucceeded(sourceMapURL, sourceMap);
     107            } catch(e) {
     108                this._loadAndParseFailed(sourceMapURL);
     109            }
    87110        }
    88111
    89         try {
    90             var payload = JSON.parse(response);
    91             var baseURL = sourceMapURL.startsWith("data:") ? originalSourceCode.url : sourceMapURL;
    92             var sourceMap = new WebInspector.SourceMap(baseURL, payload, originalSourceCode);
    93             this._loadAndParseSucceeded(sourceMapURL, sourceMap);
    94         } catch(e) {
    95             console.error(e.message);
    96             this._loadAndParseFailed(sourceMapURL);
    97         }
     112        var frameIdentifier = null;
     113        if (originalSourceCode instanceof WebInspector.Resource && originalSourceCode.parentFrame)
     114            frameIdentifier = originalSourceCode.parentFrame.id;
     115
     116        if (!frameIdentifier)
     117            frameIdentifier = WebInspector.frameResourceManager.mainFrame.id;
     118
     119        NetworkAgent.loadResource(frameIdentifier, sourceMapURL, sourceMapLoaded.bind(this));
    98120    },
    99121
  • trunk/Source/WebInspectorUI/UserInterface/Models/SourceMapResource.js

    r164543 r165331  
    6868    requestContentFromBackend: function(callback)
    6969    {
    70         function requestAsyncCallback(body, base64encoded, mimeType)
     70        var inlineContent = this._sourceMap.sourceContent(this.url);
     71        if (inlineContent) {
     72            // Force inline content to be asynchronous to match the expected load pattern.
     73            setTimeout(function() {
     74                // FIXME: We don't know the MIME-type for inline content. Guess by analyzing the content?
     75                // Guess by using the type of the original resource?
     76                sourceMapResourceLoaded.call(this, null, inlineContent, "text/javascript");
     77            }.bind(this));
     78
     79            return true;
     80        }
     81
     82        function sourceMapResourceLoaded(error, body, mimeType)
    7183        {
    72             if (body === null) {
     84            const base64encoded = false;
     85
     86            if (error) {
    7387                this.markAsFailed();
    74                 callback("Failed to load resource", body, base64encoded);
     88                callback(error, body, base64encoded);
    7589                return;
    7690            }
     91
     92            var fileExtension = WebInspector.fileExtensionForURL(this.url);
     93            var fileExtensionMIMEType = WebInspector.mimeTypeForFileExtension(fileExtension, true) || "text/javascript";
     94
     95            // FIXME: Add support for picking the best MIME-type. Right now the file extension is the best bet.
     96            mimeType = fileExtensionMIMEType;
    7797
    7898            var oldType = this._type;
    7999            var oldMIMEType = this._mimeType;
    80100
     101            // FIXME: This is a layering violation. It should use a helper function on the Resource base-class.
    81102            this._mimeType = mimeType;
    82103            this._type = WebInspector.Resource.Type.fromMIMEType(this._mimeType);
     
    97118        }
    98119
    99         this._requestResourceAsynchronously(requestAsyncCallback.bind(this));
     120        var frameIdentifier = null;
     121        if (this._sourceMap.originalSourceCode instanceof WebInspector.Resource && this._sourceMap.originalSourceCode.parentFrame)
     122            frameIdentifier = this._sourceMap.originalSourceCode.parentFrame.id;
     123
     124        if (!frameIdentifier)
     125            frameIdentifier = WebInspector.frameResourceManager.mainFrame.id;
     126
     127        NetworkAgent.loadResource(frameIdentifier, this.url, sourceMapResourceLoaded.bind(this));
     128
    100129        return true;
    101130    },
     
    129158        var endSourceCodeLocation = this.createSourceCodeLocation(textRange.endLine, textRange.endColumn);
    130159        return new WebInspector.SourceCodeTextRange(this._sourceMap.originalSourceCode, startSourceCodeLocation, endSourceCodeLocation);
    131     },
    132 
    133     // Private
    134 
    135     _requestResourceAsynchronously: function(callback)
    136     {
    137         // FIXME: <rdar://problem/13238886> Source Maps: Frontend needs asynchronous resource loading of content + mime type
    138 
    139         function async()
    140         {
    141             var body = this._sourceMap.sourceContent(this.url) || InspectorFrontendHost.loadResourceSynchronously(this.url);
    142             if (body === undefined)
    143                 body = null;
    144             var fileExtension = WebInspector.fileExtensionForURL(this.url);
    145             var mimeType = WebInspector.mimeTypeForFileExtension(fileExtension, true) || "text/javascript";
    146             callback(body, false, mimeType);
    147         }
    148 
    149         setTimeout(async.bind(this), 0);
    150160    }
    151161};
  • trunk/Source/WebInspectorUI/UserInterface/Protocol/InspectorWebBackendCommands.js

    r164637 r165331  
    211211InspectorBackend.registerCommand("Network.clearBrowserCookies", [], []);
    212212InspectorBackend.registerCommand("Network.setCacheDisabled", [{"name": "cacheDisabled", "type": "boolean", "optional": false}], []);
     213InspectorBackend.registerCommand("Network.loadResource", [{"name": "frameId", "type": "string", "optional": false}, {"name": "url", "type": "string", "optional": false}], ["content", "mimeType"]);
    213214
    214215// Page.
     
    287288InspectorBackend.registerEnum("Timeline.EventType", {EventDispatch: "EventDispatch", BeginFrame: "BeginFrame", ScheduleStyleRecalculation: "ScheduleStyleRecalculation", RecalculateStyles: "RecalculateStyles", InvalidateLayout: "InvalidateLayout", Layout: "Layout", Paint: "Paint", ScrollLayer: "ScrollLayer", ResizeImage: "ResizeImage", CompositeLayers: "CompositeLayers", ParseHTML: "ParseHTML", TimerInstall: "TimerInstall", TimerRemove: "TimerRemove", TimerFire: "TimerFire", EvaluateScript: "EvaluateScript", MarkLoad: "MarkLoad", MarkDOMContent: "MarkDOMContent", TimeStamp: "TimeStamp", Time: "Time", TimeEnd: "TimeEnd", ScheduleResourceRequest: "ScheduleResourceRequest", ResourceSendRequest: "ResourceSendRequest", ResourceReceiveResponse: "ResourceReceiveResponse", ResourceReceivedData: "ResourceReceivedData", ResourceFinish: "ResourceFinish", XHRReadyStateChange: "XHRReadyStateChange", XHRLoad: "XHRLoad", FunctionCall: "FunctionCall", GCEvent: "GCEvent", RequestAnimationFrame: "RequestAnimationFrame", CancelAnimationFrame: "CancelAnimationFrame", FireAnimationFrame: "FireAnimationFrame", WebSocketCreate: "WebSocketCreate", WebSocketSendHandshakeRequest: "WebSocketSendHandshakeRequest", WebSocketReceiveHandshakeResponse: "WebSocketReceiveHandshakeResponse", WebSocketDestroy: "WebSocketDestroy"});
    288289InspectorBackend.registerEvent("Timeline.eventRecorded", ["record"]);
    289 InspectorBackend.registerCommand("Timeline.start", [{"name": "maxCallStackDepth", "type": "number", "optional": true}, {"name": "includeDomCounters", "type": "boolean", "optional": true}], []);
     290InspectorBackend.registerCommand("Timeline.start", [{"name": "maxCallStackDepth", "type": "number", "optional": true}], []);
    290291InspectorBackend.registerCommand("Timeline.stop", [], []);
    291292InspectorBackend.registerCommand("Timeline.supportsFrameInstrumentation", [], ["result"]);
Note: See TracChangeset for help on using the changeset viewer.