Changeset 69948 in webkit


Ignore:
Timestamp:
Oct 18, 2010 3:14:56 AM (14 years ago)
Author:
pfeldman@chromium.org
Message:

2010-10-17 Pavel Feldman <pfeldman@chromium.org>

Reviewed by Yury Semikhatsky.

Web Inspector: Introduce InspectorResourceAgent.h/cpp and ResourceManager.js to
fill network panel with data.
https://bugs.webkit.org/show_bug.cgi?id=47779


InspectorResourceAgent instance / JS part are introduced in this patch. Agent's lifetime is equal
to the front-end's. This new resource agent does not have state, instead it covers two functions:

1) forwards loader client messages to the front-end 2) is capable of building a tree of cached resources.

(1) feeds network panel with data, (2) shows the resource tree in the new ResourcesPanel concept.
This bug is for extracting this new InspectorResourceAgent class and its javascript counterpart.
Once resources panel is refactored for the new concept, InspectorResource, InspectorController's
resource-related routines, inspector.js's code dealing with resources, they all will be gone.

  • WebCore.gypi:
  • WebCore.vcproj/WebCore.vcproj:
  • inspector/CodeGeneratorInspector.pm:
  • inspector/Inspector.idl:
  • inspector/InspectorApplicationCacheAgent.cpp: (WebCore::InspectorApplicationCacheAgent::didReceiveManifestResponse):
  • inspector/InspectorController.cpp: (WebCore::InspectorController::connectFrontend): (WebCore::InspectorController::releaseFrontendLifetimeAgents): (WebCore::InspectorController::didCommitLoad): (WebCore::InspectorController::frameDetachedFromParent): (WebCore::InspectorController::didLoadResourceFromMemoryCache): (WebCore::InspectorController::identifierForInitialRequest): (WebCore::InspectorController::willSendRequest): (WebCore::InspectorController::markResourceAsCached): (WebCore::InspectorController::didReceiveResponse): (WebCore::InspectorController::didReceiveContentLength): (WebCore::InspectorController::didFinishLoading): (WebCore::InspectorController::didFailLoading): (WebCore::InspectorController::resourceRetrievedByXMLHttpRequest): (WebCore::InspectorController::scriptImported): (WebCore::InspectorController::didCreateWebSocket): (WebCore::InspectorController::willSendWebSocketHandshakeRequest): (WebCore::InspectorController::didReceiveWebSocketHandshakeResponse): (WebCore::InspectorController::didCloseWebSocket):
  • inspector/InspectorController.h:
  • inspector/InspectorResource.cpp: (WebCore::InspectorResource::updateResponse): (WebCore::cachedResourceType): (WebCore::InspectorResource::type): (WebCore::InspectorResource::sourceString): (WebCore::InspectorResource::sourceBytes): (WebCore::InspectorResource::endTiming):
  • inspector/InspectorResourceAgent.cpp: (WebCore::InspectorResourceAgent::resourceContent): (WebCore::InspectorResourceAgent::resourceContentBase64): (WebCore::InspectorResourceAgent::resourceData): (WebCore::InspectorResourceAgent::cachedResource): (WebCore::buildObjectForHeaders): (WebCore::buildObjectForTiming): (WebCore::buildObjectForResourceRequest): (WebCore::buildObjectForResourceResponse): (WebCore::buildObjectForMainResource): (WebCore::cachedResourceTypeString): (WebCore::buildObjectForCachedResource): (WebCore::buildObjectForFrameResources): (WebCore::InspectorResourceAgent::~InspectorResourceAgent): (WebCore::InspectorResourceAgent::identifierForInitialRequest): (WebCore::InspectorResourceAgent::willSendRequest): (WebCore::InspectorResourceAgent::markResourceAsCached): (WebCore::InspectorResourceAgent::didReceiveResponse): (WebCore::InspectorResourceAgent::didReceiveContentLength): (WebCore::InspectorResourceAgent::didFinishLoading): (WebCore::InspectorResourceAgent::didFailLoading): (WebCore::InspectorResourceAgent::didLoadResourceFromMemoryCache): (WebCore::InspectorResourceAgent::setOverrideContent): (WebCore::InspectorResourceAgent::didCommitLoad): (WebCore::InspectorResourceAgent::frameDetachedFromParent): (WebCore::createReadableStringFromBinary): (WebCore::InspectorResourceAgent::didCreateWebSocket): (WebCore::InspectorResourceAgent::willSendWebSocketHandshakeRequest): (WebCore::InspectorResourceAgent::didReceiveWebSocketHandshakeResponse): (WebCore::InspectorResourceAgent::didCloseWebSocket): (WebCore::InspectorResourceAgent::cachedResources): (WebCore::InspectorResourceAgent::InspectorResourceAgent):
  • inspector/InspectorResourceAgent.h: (WebCore::InspectorResourceAgent::create):
  • inspector/InspectorStyleSheet.cpp: (WebCore::InspectorStyleSheet::resourceStyleSheetText):
  • inspector/front-end/ExtensionServer.js: (WebInspector.ExtensionServer.prototype._onRevealAndSelectResource): (WebInspector.ExtensionServer.prototype._onGetResourceContent):
  • inspector/front-end/Resource.js: (WebInspector.Resource.prototype.get responseReceivedTime): (WebInspector.Resource.prototype.set endTime):
  • inspector/front-end/Settings.js:
  • inspector/front-end/SourceView.js: (WebInspector.SourceView.prototype.setupSourceFrameIfNeeded):
  • inspector/front-end/WebKit.qrc:
  • inspector/front-end/inspector.css: (.tabbed-pane-header li):
  • inspector/front-end/inspector.html:
  • inspector/front-end/inspector.js: (WebInspector.updateResource):
  • loader/ResourceLoadNotifier.cpp: (WebCore::ResourceLoadNotifier::dispatchDidReceiveResponse):
  • loader/appcache/ApplicationCacheGroup.cpp: (WebCore::ApplicationCacheGroup::didReceiveResponse):

2010-10-17 Pavel Feldman <pfeldman@chromium.org>

Reviewed by Yury Semikhatsky.

Web Inspector: Introduce InspectorResourceAgent.h/cpp and ResourceManager.js to
fill network panel with data.
https://bugs.webkit.org/show_bug.cgi?id=47779

  • src/WebDevToolsAgentImpl.cpp: (WebKit::WebDevToolsAgentImpl::didReceiveResponse):
Location:
trunk
Files:
1 added
27 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r69947 r69948  
     12010-10-17  Pavel Feldman  <pfeldman@chromium.org>
     2
     3        Reviewed by Yury Semikhatsky.
     4
     5        Web Inspector: Introduce InspectorResourceAgent.h/cpp and ResourceManager.js to
     6        fill network panel with data.
     7        https://bugs.webkit.org/show_bug.cgi?id=47779
     8       
     9        InspectorResourceAgent instance / JS part are introduced in this patch. Agent's lifetime is equal
     10        to the front-end's. This new resource agent does not have state, instead it covers two functions:
     11         1) forwards loader client messages to the front-end 2) is capable of building a tree of cached resources.
     12        (1) feeds network panel with data, (2) shows the resource tree in the new ResourcesPanel concept.
     13        This bug is for extracting this new InspectorResourceAgent class and its javascript counterpart.
     14        Once resources panel is refactored for the new concept, InspectorResource, InspectorController's
     15        resource-related routines, inspector.js's code dealing with resources, they all will be gone.
     16
     17        * WebCore.gypi:
     18        * WebCore.vcproj/WebCore.vcproj:
     19        * inspector/CodeGeneratorInspector.pm:
     20        * inspector/Inspector.idl:
     21        * inspector/InspectorApplicationCacheAgent.cpp:
     22        (WebCore::InspectorApplicationCacheAgent::didReceiveManifestResponse):
     23        * inspector/InspectorController.cpp:
     24        (WebCore::InspectorController::connectFrontend):
     25        (WebCore::InspectorController::releaseFrontendLifetimeAgents):
     26        (WebCore::InspectorController::didCommitLoad):
     27        (WebCore::InspectorController::frameDetachedFromParent):
     28        (WebCore::InspectorController::didLoadResourceFromMemoryCache):
     29        (WebCore::InspectorController::identifierForInitialRequest):
     30        (WebCore::InspectorController::willSendRequest):
     31        (WebCore::InspectorController::markResourceAsCached):
     32        (WebCore::InspectorController::didReceiveResponse):
     33        (WebCore::InspectorController::didReceiveContentLength):
     34        (WebCore::InspectorController::didFinishLoading):
     35        (WebCore::InspectorController::didFailLoading):
     36        (WebCore::InspectorController::resourceRetrievedByXMLHttpRequest):
     37        (WebCore::InspectorController::scriptImported):
     38        (WebCore::InspectorController::didCreateWebSocket):
     39        (WebCore::InspectorController::willSendWebSocketHandshakeRequest):
     40        (WebCore::InspectorController::didReceiveWebSocketHandshakeResponse):
     41        (WebCore::InspectorController::didCloseWebSocket):
     42        * inspector/InspectorController.h:
     43        * inspector/InspectorResource.cpp:
     44        (WebCore::InspectorResource::updateResponse):
     45        (WebCore::cachedResourceType):
     46        (WebCore::InspectorResource::type):
     47        (WebCore::InspectorResource::sourceString):
     48        (WebCore::InspectorResource::sourceBytes):
     49        (WebCore::InspectorResource::endTiming):
     50        * inspector/InspectorResourceAgent.cpp:
     51        (WebCore::InspectorResourceAgent::resourceContent):
     52        (WebCore::InspectorResourceAgent::resourceContentBase64):
     53        (WebCore::InspectorResourceAgent::resourceData):
     54        (WebCore::InspectorResourceAgent::cachedResource):
     55        (WebCore::buildObjectForHeaders):
     56        (WebCore::buildObjectForTiming):
     57        (WebCore::buildObjectForResourceRequest):
     58        (WebCore::buildObjectForResourceResponse):
     59        (WebCore::buildObjectForMainResource):
     60        (WebCore::cachedResourceTypeString):
     61        (WebCore::buildObjectForCachedResource):
     62        (WebCore::buildObjectForFrameResources):
     63        (WebCore::InspectorResourceAgent::~InspectorResourceAgent):
     64        (WebCore::InspectorResourceAgent::identifierForInitialRequest):
     65        (WebCore::InspectorResourceAgent::willSendRequest):
     66        (WebCore::InspectorResourceAgent::markResourceAsCached):
     67        (WebCore::InspectorResourceAgent::didReceiveResponse):
     68        (WebCore::InspectorResourceAgent::didReceiveContentLength):
     69        (WebCore::InspectorResourceAgent::didFinishLoading):
     70        (WebCore::InspectorResourceAgent::didFailLoading):
     71        (WebCore::InspectorResourceAgent::didLoadResourceFromMemoryCache):
     72        (WebCore::InspectorResourceAgent::setOverrideContent):
     73        (WebCore::InspectorResourceAgent::didCommitLoad):
     74        (WebCore::InspectorResourceAgent::frameDetachedFromParent):
     75        (WebCore::createReadableStringFromBinary):
     76        (WebCore::InspectorResourceAgent::didCreateWebSocket):
     77        (WebCore::InspectorResourceAgent::willSendWebSocketHandshakeRequest):
     78        (WebCore::InspectorResourceAgent::didReceiveWebSocketHandshakeResponse):
     79        (WebCore::InspectorResourceAgent::didCloseWebSocket):
     80        (WebCore::InspectorResourceAgent::cachedResources):
     81        (WebCore::InspectorResourceAgent::InspectorResourceAgent):
     82        * inspector/InspectorResourceAgent.h:
     83        (WebCore::InspectorResourceAgent::create):
     84        * inspector/InspectorStyleSheet.cpp:
     85        (WebCore::InspectorStyleSheet::resourceStyleSheetText):
     86        * inspector/front-end/ExtensionServer.js:
     87        (WebInspector.ExtensionServer.prototype._onRevealAndSelectResource):
     88        (WebInspector.ExtensionServer.prototype._onGetResourceContent):
     89        * inspector/front-end/Resource.js:
     90        (WebInspector.Resource.prototype.get responseReceivedTime):
     91        (WebInspector.Resource.prototype.set endTime):
     92        * inspector/front-end/Settings.js:
     93        * inspector/front-end/SourceView.js:
     94        (WebInspector.SourceView.prototype.setupSourceFrameIfNeeded):
     95        * inspector/front-end/WebKit.qrc:
     96        * inspector/front-end/inspector.css:
     97        (.tabbed-pane-header li):
     98        * inspector/front-end/inspector.html:
     99        * inspector/front-end/inspector.js:
     100        (WebInspector.updateResource):
     101        * loader/ResourceLoadNotifier.cpp:
     102        (WebCore::ResourceLoadNotifier::dispatchDidReceiveResponse):
     103        * loader/appcache/ApplicationCacheGroup.cpp:
     104        (WebCore::ApplicationCacheGroup::didReceiveResponse):
     105
    11062010-10-16  Pavel Feldman  <pfeldman@chromium.org>
    2107
  • trunk/WebCore/WebCore.gypi

    r69942 r69948  
    44044404            'inspector/front-end/Resource.js',
    44054405            'inspector/front-end/ResourceCategory.js',
     4406            'inspector/front-end/ResourceManager.js',
    44064407            'inspector/front-end/ResourcesPanel.js',
    44074408            'inspector/front-end/ResourceView.js',
  • trunk/WebCore/WebCore.vcproj/WebCore.vcproj

    r69880 r69948  
    6365963659                                </File>
    6366063660                                <File
     63661                                        RelativePath="..\inspector\front-end\ResourceManager.js"
     63662                                        >
     63663                                </File>
     63664                                <File
    6366163665                                        RelativePath="..\inspector\front-end\ResourcesPanel.js"
    6366263666                                        >
  • trunk/WebCore/inspector/CodeGeneratorInspector.pm

    r69798 r69948  
    2828    "header" => "InspectorDebuggerAgent.h",
    2929    "domainAccessor" => "m_inspectorController->debuggerAgent()",
     30};
     31$typeTransform{"Resource"} = {
     32    "forward" => "InspectorResourceAgent",
     33    "header" => "InspectorResourceAgent.h",
     34    "domainAccessor" => "m_inspectorController->m_resourceAgent",
    3035};
    3136$typeTransform{"DOM"} = {
  • trunk/WebCore/inspector/Inspector.idl

    r69853 r69948  
    113113        [handler=Controller] void stopTimelineProfiler();
    114114
     115        [handler=Resource] void cachedResources(out Array resources);
     116        [handler=Resource] void resourceContent(in unsigned long frameID, in String url, out String content);
     117        [notify] void identifierForInitialRequest(out long identifier, out String url, out unsigned long frameID, out boolean isMainResource);
     118        [notify] void willSendRequest(out long identifier, out double time, out Object request, out Object redirectResponse);
     119        [notify] void markResourceAsCached(out long identifier);
     120        [notify] void didReceiveResponse(out long identifier, out double time, out String resourceType, out Object response);
     121        [notify] void didReceiveContentLength(out long identifier, out double time, out long lengthReceived);
     122        [notify] void didFinishLoading(out long identifier, out double finishTime);
     123        [notify] void didFailLoading(out long identifier, out double time, out String localizedDescription);
     124        [notify] void didLoadResourceFromMemoryCache(out double time, out unsigned long frameID, out Object resource);
     125        [notify] void setOverrideContent(out long identifier, out String sourceString, out String type);
     126        [notify] void didCommitLoad(out unsigned long frameID);
     127        [notify] void frameDetachedFromParent(out unsigned long frameID);
     128
     129        [notify] void didCreateWebSocket(out unsigned long identifier, out String requestURL);
     130        [notify] void willSendWebSocketHandshakeRequest(out unsigned long identifier, out double time, out Object request);
     131        [notify] void didReceiveWebSocketHandshakeResponse(out unsigned long identifier, out double time, out Object response);
     132        [notify] void didCloseWebSocket(out unsigned long identifier, out double time);
     133
    115134#if defined(ENABLE_JAVASCRIPT_DEBUGGER) && ENABLE_JAVASCRIPT_DEBUGGER
    116135        [handler=Backend] void enableDebugger(in boolean always);
  • trunk/WebCore/inspector/InspectorApplicationCacheAgent.cpp

    r65891 r69948  
    4949void InspectorApplicationCacheAgent::didReceiveManifestResponse(unsigned long identifier, const ResourceResponse& response)
    5050{
    51     m_inspectorController->didReceiveResponse(identifier, response);
     51    m_inspectorController->didReceiveResponse(identifier, 0, response);
    5252}
    5353
  • trunk/WebCore/inspector/InspectorController.cpp

    r69938 r69948  
    7070#include "InspectorProfilerAgent.h"
    7171#include "InspectorResource.h"
     72#include "InspectorResourceAgent.h"
    7273#include "InspectorState.h"
    7374#include "InspectorStorageAgent.h"
     
    500501    m_frontend = new InspectorFrontend(m_client);
    501502    m_domAgent = InspectorDOMAgent::create(m_cssStore.get(), m_frontend.get());
     503    // FIXME: enable resource agent once front-end is ready.
     504    // m_resourceAgent = InspectorResourceAgent::create(m_inspectedPage, m_frontend.get());
    502505
    503506#if ENABLE(DATABASE)
     
    609612void InspectorController::releaseFrontendLifetimeAgents()
    610613{
     614    m_resourceAgent.clear();
     615
    611616    // m_domAgent is RefPtr. Remove DOM listeners first to ensure that there are
    612617    // no references to the DOM agent from the DOM tree.
     
    748753    if (!enabled())
    749754        return;
     755
     756    if (m_resourceAgent)
     757        m_resourceAgent->didCommitLoad(loader);
    750758
    751759    ASSERT(m_inspectedPage);
     
    823831    if (!enabled())
    824832        return;
     833
     834    if (m_resourceAgent)
     835        m_resourceAgent->frameDetachedFromParent(frame);
     836
    825837    if (ResourcesMap* resourceMap = m_frameResources.get(frame))
    826838        removeAllResources(resourceMap);
     
    897909        return;
    898910
     911    if (m_resourceAgent)
     912        m_resourceAgent->didLoadResourceFromMemoryCache(loader, cachedResource);
     913
    899914    // If the resource URL is already known, we don't need to add it again since this is just a cached load.
    900915    if (m_knownResources.contains(cachedResource->url()))
     
    927942
    928943    bool isMainResource = isMainResourceLoader(loader, request.url());
     944
     945    if (m_resourceAgent)
     946        m_resourceAgent->identifierForInitialRequest(identifier, request.url(), loader, isMainResource);
     947
    929948    ensureSettingsLoaded();
    930949    if (!isMainResource && !resourceTrackingEnabled())
     
    977996    if (!enabled())
    978997        return;
     998
     999    if (m_resourceAgent)
     1000        m_resourceAgent->willSendRequest(identifier, request, redirectResponse);
    9791001
    9801002    bool isMainResource = (m_mainResource && m_mainResource->identifier() == identifier);
     
    10241046        return;
    10251047
     1048    if (m_resourceAgent)
     1049        m_resourceAgent->markResourceAsCached(identifier);
     1050
    10261051    if (RefPtr<InspectorResource> resource = getTrackedResource(identifier))
    10271052        resource->markAsCached();
    10281053}
    10291054
    1030 void InspectorController::didReceiveResponse(unsigned long identifier, const ResourceResponse& response)
    1031 {
    1032     if (!enabled())
    1033         return;
     1055void InspectorController::didReceiveResponse(unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response)
     1056{
     1057    if (!enabled())
     1058        return;
     1059
     1060    if (m_resourceAgent)
     1061        m_resourceAgent->didReceiveResponse(identifier, loader, response);
    10341062
    10351063    if (RefPtr<InspectorResource> resource = getTrackedResource(identifier)) {
     
    10501078        return;
    10511079
     1080    if (m_resourceAgent)
     1081        m_resourceAgent->didReceiveContentLength(identifier, lengthReceived);
     1082
    10521083    RefPtr<InspectorResource> resource = getTrackedResource(identifier);
    10531084    if (!resource)
     
    10641095    if (!enabled())
    10651096        return;
     1097
     1098    if (m_resourceAgent)
     1099        m_resourceAgent->didFinishLoading(identifier, finishTime);
    10661100
    10671101    if (m_timelineAgent)
     
    10831117    if (!enabled())
    10841118        return;
     1119
     1120    if (m_resourceAgent)
     1121        m_resourceAgent->didFailLoading(identifier, error);
    10851122
    10861123    if (m_timelineAgent)
     
    11091146        return;
    11101147
     1148    if (m_resourceAgent)
     1149        m_resourceAgent->setOverrideContent(identifier, sourceString, InspectorResource::XHR);
     1150
    11111151    if (m_state->getBoolean(InspectorState::monitoringXHR))
    11121152        addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, "XHR finished loading: \"" + url + "\".", sendLineNumber, sendURL);
     
    11271167void InspectorController::scriptImported(unsigned long identifier, const String& sourceString)
    11281168{
    1129     if (!enabled() || !resourceTrackingEnabled())
     1169    if (!enabled())
     1170        return;
     1171
     1172    if (m_resourceAgent)
     1173        m_resourceAgent->setOverrideContent(identifier, sourceString, InspectorResource::Script);
     1174
     1175    if (!resourceTrackingEnabled())
    11301176        return;
    11311177
     
    14831529    ASSERT(m_inspectedPage);
    14841530
     1531    if (m_resourceAgent)
     1532        m_resourceAgent->didCreateWebSocket(identifier, requestURL);
     1533
    14851534    RefPtr<InspectorResource> resource = InspectorResource::createWebSocket(identifier, requestURL, documentURL);
    14861535    addResource(resource.get());
     
    14921541void InspectorController::willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest& request)
    14931542{
     1543    if (m_resourceAgent)
     1544        m_resourceAgent->willSendWebSocketHandshakeRequest(identifier, request);
     1545
    14941546    RefPtr<InspectorResource> resource = getTrackedResource(identifier);
    14951547    if (!resource)
     
    15031555void InspectorController::didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse& response)
    15041556{
     1557    if (m_resourceAgent)
     1558        m_resourceAgent->didReceiveWebSocketHandshakeResponse(identifier, response);
     1559
    15051560    RefPtr<InspectorResource> resource = getTrackedResource(identifier);
    15061561    if (!resource)
     
    15161571void InspectorController::didCloseWebSocket(unsigned long identifier)
    15171572{
     1573    if (m_resourceAgent)
     1574        m_resourceAgent->didCloseWebSocket(identifier);
     1575
    15181576    RefPtr<InspectorResource> resource = getTrackedResource(identifier);
    15191577    if (!resource)
  • trunk/WebCore/inspector/InspectorController.h

    r69853 r69948  
    6969class InspectorProfilerAgent;
    7070class InspectorResource;
     71class InspectorResourceAgent;
    7172class InspectorState;
    7273class InspectorStorageAgent;
     
    166167    void willSendRequest(unsigned long identifier, ResourceRequest&, const ResourceResponse& redirectResponse);
    167168    void markResourceAsCached(unsigned long identifier);
    168     void didReceiveResponse(unsigned long identifier, const ResourceResponse&);
     169    void didReceiveResponse(unsigned long identifier, DocumentLoader*, const ResourceResponse&);
    169170    void didReceiveContentLength(unsigned long identifier, int lengthReceived);
    170171    void didFinishLoading(unsigned long identifier, double finishTime);
     
    345346    OwnPtr<InspectorFrontend> m_frontend;
    346347    RefPtr<InspectorDOMAgent> m_domAgent;
     348    RefPtr<InspectorResourceAgent> m_resourceAgent;
    347349    RefPtr<InspectorStorageAgent> m_storageAgent;
    348350    OwnPtr<InspectorCSSStore> m_cssStore;
  • trunk/WebCore/inspector/InspectorResource.cpp

    r69947 r69948  
    190190    m_loadTiming = response.resourceLoadTiming();
    191191    m_cached = m_cached || response.wasCached();
    192 
    193     if (!m_cached && m_loadTiming && m_loadTiming->requestTime)
    194         m_responseReceivedTime = m_loadTiming->requestTime + m_loadTiming->receiveHeadersEnd / 1000.0;
    195     else
    196         m_responseReceivedTime = currentTime();
    197 
     192    m_responseReceivedTime = currentTime();
    198193    m_changes.set(TimingChange);
    199194    m_changes.set(ResponseChange);
     
    341336}
    342337
     338static InspectorResource::Type cachedResourceType(CachedResource* cachedResource)
     339{
     340    if (!cachedResource)
     341        return InspectorResource::Other;
     342
     343    switch (cachedResource->type()) {
     344    case CachedResource::ImageResource:
     345        return InspectorResource::Image;
     346    case CachedResource::FontResource:
     347        return InspectorResource::Font;
     348    case CachedResource::CSSStyleSheet:
     349#if ENABLE(XSLT)
     350    case CachedResource::XSLStyleSheet:
     351#endif
     352        return InspectorResource::Stylesheet;
     353    case CachedResource::Script:
     354        return InspectorResource::Script;
     355    default:
     356        return InspectorResource::Other;
     357    }
     358}
     359
    343360InspectorResource::Type InspectorResource::type() const
    344361{
     
    359376        return Other;
    360377
    361     InspectorResource::Type resourceType = InspectorResourceAgent::cachedResourceType(m_frame->document(), m_requestURL);
     378    InspectorResource::Type resourceType = cachedResourceType(InspectorResourceAgent::cachedResource(m_frame.get(), m_requestURL));
    362379    if (equalIgnoringFragmentIdentifier(m_requestURL, m_loader->requestURL()) && resourceType == Other)
    363380        return Doc;
     
    379396
    380397    String result;
    381     if (!InspectorResourceAgent::resourceContent(m_frame->document(), m_requestURL, &result))
     398    if (!InspectorResourceAgent::resourceContent(m_frame.get(), m_requestURL, &result))
    382399        return String();
    383400    return result;
     
    396413
    397414    String result;
    398     if (!InspectorResourceAgent::resourceContentBase64(m_frame->document(), m_requestURL, &result))
     415    if (!InspectorResourceAgent::resourceContentBase64(m_frame.get(), m_requestURL, &result))
    399416        return String();
    400417    return result;
     
    409426void InspectorResource::endTiming(double actualEndTime)
    410427{
    411     if (actualEndTime) {
     428    if (actualEndTime)
    412429        m_endTime = actualEndTime;
    413         // In case of fast load (or in case of cached resources), endTime on network stack
    414         // can be less then m_responseReceivedTime measured in WebCore. Normalize it here,
    415         // prefer actualEndTime to m_responseReceivedTime.
    416         if (m_endTime < m_responseReceivedTime)
    417             m_responseReceivedTime = m_endTime;
    418     } else
     430    else
    419431        m_endTime = currentTime();
    420432
  • trunk/WebCore/inspector/InspectorResourceAgent.cpp

    r69761 r69948  
    4040#include "Frame.h"
    4141#include "FrameLoader.h"
     42#include "HTTPHeaderMap.h"
     43#include "InspectorFrontend.h"
     44#include "InspectorValues.h"
    4245#include "KURL.h"
     46#include "Page.h"
     47#include "ProgressTracker.h"
     48#include "ResourceError.h"
     49#include "ResourceRequest.h"
     50#include "ResourceResponse.h"
    4351#include "SharedBuffer.h"
    4452#include "TextEncoding.h"
    45 
     53#include "WebSocketHandshakeRequest.h"
     54#include "WebSocketHandshakeResponse.h"
     55
     56#include <wtf/ListHashSet.h>
    4657#include <wtf/RefPtr.h>
     58#include <wtf/text/StringBuffer.h>
    4759
    4860#if ENABLE(INSPECTOR)
     
    5062namespace WebCore {
    5163
    52 bool InspectorResourceAgent::resourceContent(Document* document, const KURL& url, String* result)
    53 {
    54     if (!document)
     64bool InspectorResourceAgent::resourceContent(Frame* frame, const KURL& url, String* result)
     65{
     66    if (!frame)
    5567        return false;
    5668
    5769    String textEncodingName;
    58     RefPtr<SharedBuffer> buffer = InspectorResourceAgent::resourceData(document, url, &textEncodingName);
     70    RefPtr<SharedBuffer> buffer = InspectorResourceAgent::resourceData(frame, url, &textEncodingName);
    5971
    6072    if (buffer) {
     
    6981}
    7082
    71 bool InspectorResourceAgent::resourceContentBase64(Document* document, const KURL& url, String* result)
     83bool InspectorResourceAgent::resourceContentBase64(Frame* frame, const KURL& url, String* result)
    7284{
    7385    Vector<char> out;
    7486    String textEncodingName;
    75     RefPtr<SharedBuffer> data = InspectorResourceAgent::resourceData(document, url, &textEncodingName);
     87    RefPtr<SharedBuffer> data = InspectorResourceAgent::resourceData(frame, url, &textEncodingName);
    7688    if (!data) {
    7789        *result = String();
     
    8496}
    8597
    86 PassRefPtr<SharedBuffer> InspectorResourceAgent::resourceData(Document* document, const KURL& url, String* textEncodingName)
    87 {
    88     FrameLoader* frameLoader = document->frame()->loader();
     98PassRefPtr<SharedBuffer> InspectorResourceAgent::resourceData(Frame* frame, const KURL& url, String* textEncodingName)
     99{
     100    FrameLoader* frameLoader = frame->loader();
    89101    DocumentLoader* loader = frameLoader->documentLoader();
    90102    if (equalIgnoringFragmentIdentifier(url, loader->url())) {
    91         *textEncodingName = document->inputEncoding();
     103        *textEncodingName = frame->document()->inputEncoding();
    92104        return frameLoader->documentLoader()->mainResourceData();
    93105    }
    94106
    95     CachedResource* cachedResource = InspectorResourceAgent::cachedResource(document, url);
     107    CachedResource* cachedResource = InspectorResourceAgent::cachedResource(frame, url);
    96108    if (!cachedResource)
    97109        return 0;
     
    112124}
    113125
    114 InspectorResource::Type InspectorResourceAgent::cachedResourceType(Document* document, const KURL& url)
    115 {
    116     CachedResource* cachedResource = InspectorResourceAgent::cachedResource(document, url);
     126CachedResource* InspectorResourceAgent::cachedResource(Frame* frame, const KURL& url)
     127{
     128    const String& urlString = url.string();
     129    CachedResource* cachedResource = frame->document()->cachedResourceLoader()->cachedResource(urlString);
    117130    if (!cachedResource)
    118         return InspectorResource::Other;
    119 
    120     switch (cachedResource->type()) {
     131        cachedResource = cache()->resourceForURL(urlString);
     132    return cachedResource;
     133}
     134
     135static PassRefPtr<InspectorObject> buildObjectForHeaders(const HTTPHeaderMap& headers)
     136{
     137    RefPtr<InspectorObject> headersObject = InspectorObject::create();
     138    HTTPHeaderMap::const_iterator end = headers.end();
     139    for (HTTPHeaderMap::const_iterator it = headers.begin(); it != end; ++it)
     140        headersObject->setString(it->first.string(), it->second);
     141    return headersObject;
     142}
     143
     144static PassRefPtr<InspectorObject> buildObjectForTiming(const ResourceLoadTiming& timing)
     145{
     146    RefPtr<InspectorObject> timingObject = InspectorObject::create();
     147    timingObject->setNumber("requestTime", timing.requestTime);
     148    timingObject->setNumber("proxyStart", timing.proxyStart);
     149    timingObject->setNumber("proxyEnd", timing.proxyEnd);
     150    timingObject->setNumber("dnsStart", timing.dnsStart);
     151    timingObject->setNumber("dnsEnd", timing.dnsEnd);
     152    timingObject->setNumber("connectStart", timing.connectStart);
     153    timingObject->setNumber("connectEnd", timing.connectEnd);
     154    timingObject->setNumber("sslStart", timing.sslStart);
     155    timingObject->setNumber("sslEnd", timing.sslEnd);
     156    timingObject->setNumber("sendStart", timing.sendStart);
     157    timingObject->setNumber("sendEnd", timing.sendEnd);
     158    timingObject->setNumber("receiveHeadersEnd", timing.receiveHeadersEnd);
     159    return timingObject;
     160}
     161
     162static PassRefPtr<InspectorObject> buildObjectForResourceRequest(const ResourceRequest& request)
     163{
     164    RefPtr<InspectorObject> requestObject = InspectorObject::create();
     165    requestObject->setString("url", request.url().string());
     166    requestObject->setString("httpMethod", request.httpMethod());
     167    requestObject->setObject("httpHeaderFields", buildObjectForHeaders(request.httpHeaderFields()));
     168    if (request.httpBody() && !request.httpBody()->isEmpty())
     169        requestObject->setString("requestFormData", request.httpBody()->flattenToString());
     170    return requestObject;
     171}
     172
     173static PassRefPtr<InspectorObject> buildObjectForResourceResponse(const ResourceResponse& response)
     174{
     175    RefPtr<InspectorObject> responseObject = InspectorObject::create();
     176    if (response.isNull()) {
     177        responseObject->setBoolean("isNull", true);
     178        return responseObject;
     179    }
     180    responseObject->setString("url", response.url().string());
     181    responseObject->setString("mimeType", response.mimeType());
     182    responseObject->setNumber("expectedContentLength", response.expectedContentLength());
     183    responseObject->setString("textEncodingName", response.textEncodingName());
     184    responseObject->setString("suggestedFilename", response.suggestedFilename());
     185    responseObject->setNumber("httpStatusCode", response.httpStatusCode());
     186    responseObject->setString("httpStatusText", response.httpStatusText());
     187    responseObject->setObject("httpHeaderFields", buildObjectForHeaders(response.httpHeaderFields()));
     188    responseObject->setBoolean("connectionReused", response.connectionReused());
     189    responseObject->setNumber("connectionID", response.connectionID());
     190    responseObject->setBoolean("wasCached", response.wasCached());
     191    if (response.resourceLoadTiming())
     192        responseObject->setObject("timing", buildObjectForTiming(*response.resourceLoadTiming()));
     193    if (response.resourceRawHeaders()) {
     194        RefPtr<InspectorObject> rawHeadersObject = InspectorObject::create();
     195        rawHeadersObject->setObject("requestHeaders", buildObjectForHeaders(response.resourceRawHeaders()->requestHeaders));
     196        rawHeadersObject->setObject("responseHeaders", buildObjectForHeaders(response.resourceRawHeaders()->responseHeaders));
     197        responseObject->setObject("rawHeaders", rawHeadersObject);
     198    }
     199    return responseObject;
     200}
     201
     202static PassRefPtr<InspectorObject> buildObjectForMainResource(Frame* frame)
     203{
     204    FrameLoader* frameLoader = frame->loader();
     205    DocumentLoader* loader = frameLoader->documentLoader();
     206
     207    RefPtr<InspectorObject> resourceObject = InspectorObject::create();
     208    resourceObject->setString("url", loader->url().string());
     209    resourceObject->setString("host", loader->url().host());
     210    resourceObject->setString("path", loader->url().path());
     211    resourceObject->setString("lastPathComponent", loader->url().lastPathComponent());
     212    resourceObject->setString("type", "Document");
     213    resourceObject->setObject("request", buildObjectForResourceRequest(loader->request()));
     214    resourceObject->setObject("response", buildObjectForResourceResponse(loader->response()));
     215    return resourceObject;
     216}
     217
     218static String cachedResourceTypeString(const CachedResource& cachedResource)
     219{
     220    switch (cachedResource.type()) {
    121221    case CachedResource::ImageResource:
    122         return InspectorResource::Image;
     222        return "Image";
     223        break;
    123224    case CachedResource::FontResource:
    124         return InspectorResource::Font;
     225        return "Font";
    125226    case CachedResource::CSSStyleSheet:
     227        // Fall through.
    126228#if ENABLE(XSLT)
    127229    case CachedResource::XSLStyleSheet:
    128230#endif
    129         return InspectorResource::Stylesheet;
     231        return "Stylesheet";
    130232    case CachedResource::Script:
    131         return InspectorResource::Script;
     233        return "Script";
    132234    default:
    133         return InspectorResource::Other;
    134     }
    135 }
    136 
    137 CachedResource* InspectorResourceAgent::cachedResource(Document* document, const KURL& url)
    138 {
    139     const String& urlString = url.string();
    140     CachedResource* cachedResource = document->cachedResourceLoader()->cachedResource(urlString);
    141     if (!cachedResource)
    142         cachedResource = cache()->resourceForURL(urlString);
    143     return cachedResource;
     235    }
     236    return "Other";
     237}
     238
     239static PassRefPtr<InspectorObject> buildObjectForCachedResource(const CachedResource& cachedResource)
     240{
     241    RefPtr<InspectorObject> resourceObject = InspectorObject::create();
     242    resourceObject->setString("url", cachedResource.url());
     243    resourceObject->setString("type", cachedResourceTypeString(cachedResource));
     244    resourceObject->setNumber("encodedSize", cachedResource.encodedSize());
     245    resourceObject->setObject("response", buildObjectForResourceResponse(cachedResource.response()));
     246    return resourceObject;
     247}
     248
     249static PassRefPtr<InspectorObject> buildObjectForFrameResources(Frame* frame)
     250{
     251    RefPtr<InspectorObject> frameResources = InspectorObject::create();
     252    frameResources->setNumber("frameID", reinterpret_cast<uintptr_t>(frame));
     253    frameResources->setObject("mainResource", buildObjectForMainResource(frame));
     254    RefPtr<InspectorArray> subresources = InspectorArray::create();
     255    frameResources->setArray("subresources", subresources);
     256
     257    const CachedResourceLoader::DocumentResourceMap& allResources = frame->document()->cachedResourceLoader()->allCachedResources();
     258    CachedResourceLoader::DocumentResourceMap::const_iterator end = allResources.end();
     259    for (CachedResourceLoader::DocumentResourceMap::const_iterator it = allResources.begin(); it != end; ++it) {
     260        CachedResource* cachedResource = it->second.get();
     261        if (cachedResource)
     262            subresources->pushValue(buildObjectForCachedResource(*cachedResource));
     263    }
     264    return frameResources;
     265}
     266
     267InspectorResourceAgent::~InspectorResourceAgent()
     268{
     269}
     270
     271void InspectorResourceAgent::identifierForInitialRequest(unsigned long identifier, const KURL& url, DocumentLoader* loader, bool isMainResource)
     272{
     273    m_frontend->identifierForInitialRequest(identifier, url.string(), reinterpret_cast<uintptr_t>(loader->frame()), isMainResource);
     274}
     275
     276void InspectorResourceAgent::willSendRequest(unsigned long identifier, ResourceRequest& request, const ResourceResponse& redirectResponse)
     277{
     278    m_frontend->willSendRequest(identifier, currentTime(), buildObjectForResourceRequest(request), buildObjectForResourceResponse(redirectResponse));
     279}
     280
     281void InspectorResourceAgent::markResourceAsCached(unsigned long identifier)
     282{
     283    m_frontend->markResourceAsCached(identifier);
     284}
     285
     286void InspectorResourceAgent::didReceiveResponse(unsigned long identifier, DocumentLoader* loader, const ResourceResponse& response)
     287{
     288    String type = "Other";
     289    if (loader) {
     290        if (equalIgnoringFragmentIdentifier(response.url(), loader->frameLoader()->iconURL()))
     291            type = "Image";
     292        else {
     293            CachedResource* cachedResource = InspectorResourceAgent::cachedResource(loader->frame(), response.url());
     294            if (cachedResource)
     295                type = cachedResourceTypeString(*cachedResource);
     296
     297            if (equalIgnoringFragmentIdentifier(response.url(), loader->url()) && type == "Other")
     298                type = "Document";
     299        }
     300    }
     301    m_frontend->didReceiveResponse(identifier, currentTime(), type, buildObjectForResourceResponse(response));
     302}
     303
     304void InspectorResourceAgent::didReceiveContentLength(unsigned long identifier, int lengthReceived)
     305{
     306    m_frontend->didReceiveContentLength(identifier, currentTime(), lengthReceived);
     307}
     308
     309void InspectorResourceAgent::didFinishLoading(unsigned long identifier, double finishTime)
     310{
     311    if (!finishTime)
     312        finishTime = currentTime();
     313
     314    m_frontend->didFinishLoading(identifier, finishTime);
     315}
     316
     317void InspectorResourceAgent::didFailLoading(unsigned long identifier, const ResourceError& error)
     318{
     319    m_frontend->didFailLoading(identifier, currentTime(), error.localizedDescription());
     320}
     321
     322void InspectorResourceAgent::didLoadResourceFromMemoryCache(DocumentLoader* loader, const CachedResource* resource)
     323{
     324    Frame* frame = loader->frame();
     325    m_frontend->didLoadResourceFromMemoryCache(currentTime(), reinterpret_cast<uintptr_t>(frame), buildObjectForCachedResource(*resource));
     326}
     327
     328void InspectorResourceAgent::setOverrideContent(unsigned long identifier, const String& sourceString, InspectorResource::Type type)
     329{
     330    String typeString;
     331    switch (type) {
     332    case InspectorResource::XHR:
     333        typeString = "XHR";
     334        break;
     335    case InspectorResource::Script:
     336        typeString = "Script";
     337        break;
     338    default:
     339        typeString = "Other";
     340    }
     341
     342    m_frontend->setOverrideContent(identifier, sourceString, typeString);
     343}
     344
     345void InspectorResourceAgent::didCommitLoad(DocumentLoader* loader)
     346{
     347    Frame* frame = loader->frame();
     348    m_frontend->didCommitLoad(reinterpret_cast<uintptr_t>(frame));
     349}
     350
     351void InspectorResourceAgent::frameDetachedFromParent(Frame* frame)
     352{
     353    m_frontend->frameDetachedFromParent(reinterpret_cast<uintptr_t>(frame));
     354}
     355
     356
     357#if ENABLE(WEB_SOCKETS)
     358
     359// FIXME: More this into the front-end?
     360// Create human-readable binary representation, like "01:23:45:67:89:AB:CD:EF".
     361static String createReadableStringFromBinary(const unsigned char* value, size_t length)
     362{
     363    ASSERT(length > 0);
     364    static const char hexDigits[17] = "0123456789ABCDEF";
     365    size_t bufferSize = length * 3 - 1;
     366    StringBuffer buffer(bufferSize);
     367    size_t index = 0;
     368    for (size_t i = 0; i < length; ++i) {
     369        if (i > 0)
     370            buffer[index++] = ':';
     371        buffer[index++] = hexDigits[value[i] >> 4];
     372        buffer[index++] = hexDigits[value[i] & 0xF];
     373    }
     374    ASSERT(index == bufferSize);
     375    return String::adopt(buffer);
     376}
     377
     378void InspectorResourceAgent::didCreateWebSocket(unsigned long identifier, const KURL& requestURL)
     379{
     380    m_frontend->didCreateWebSocket(identifier, requestURL.string());
     381}
     382
     383void InspectorResourceAgent::willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest& request)
     384{
     385    RefPtr<InspectorObject> requestObject = InspectorObject::create();
     386    requestObject->setObject("webSocketHeaderFields", buildObjectForHeaders(request.headerFields()));
     387    requestObject->setString("webSocketRequestKey3", createReadableStringFromBinary(request.key3().value, sizeof(request.key3().value)));
     388    m_frontend->willSendWebSocketHandshakeRequest(identifier, currentTime(), requestObject);
     389}
     390
     391void InspectorResourceAgent::didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse& response)
     392{
     393    RefPtr<InspectorObject> responseObject = InspectorObject::create();
     394    responseObject->setNumber("statusCode", response.statusCode());
     395    responseObject->setString("statusText", response.statusText());
     396    responseObject->setObject("webSocketHeaderFields", buildObjectForHeaders(response.headerFields()));
     397    responseObject->setString("webSocketChallengeResponse", createReadableStringFromBinary(response.challengeResponse().value, sizeof(response.challengeResponse().value)));
     398    m_frontend->didReceiveWebSocketHandshakeResponse(identifier, currentTime(), responseObject);
     399}
     400
     401void InspectorResourceAgent::didCloseWebSocket(unsigned long identifier)
     402{
     403    m_frontend->didCloseWebSocket(identifier, currentTime());
     404}
     405#endif // ENABLE(WEB_SOCKETS)
     406
     407void InspectorResourceAgent::cachedResources(RefPtr<InspectorArray>* resources)
     408{
     409    for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree()->traverseNext(m_page->mainFrame()))
     410        (*resources)->pushObject(buildObjectForFrameResources(frame));
     411}
     412
     413void InspectorResourceAgent::resourceContent(unsigned long frameID, const String& url, String* content)
     414{
     415    RefPtr<InspectorArray> frameResources = InspectorArray::create();
     416    for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree()->traverseNext(m_page->mainFrame())) {
     417        if (reinterpret_cast<uintptr_t>(frame) != frameID)
     418            continue;
     419        InspectorResourceAgent::resourceContent(frame, KURL(ParsedURLString, url), content);
     420        break;
     421    }
     422}
     423
     424InspectorResourceAgent::InspectorResourceAgent(Page* page, InspectorFrontend* frontend)
     425    : m_page(page)
     426    , m_frontend(frontend)
     427{
    144428}
    145429
  • trunk/WebCore/inspector/InspectorResourceAgent.h

    r69761 r69948  
    3333
    3434#include "InspectorResource.h"
     35#include "PlatformString.h"
    3536
    3637#include <wtf/PassRefPtr.h>
     38#include <wtf/Vector.h>
    3739
    3840#if ENABLE(INSPECTOR)
     
    4648class CachedResource;
    4749class Document;
     50class DocumentLoader;
     51class InspectorArray;
     52class InspectorObject;
     53class InspectorFrontend;
    4854class KURL;
     55class Page;
     56class ResourceError;
     57class ResourceRequest;
     58class ResourceResponse;
    4959class SharedBuffer;
    5060
    51 class InspectorResourceAgent {
     61#if ENABLE(WEB_SOCKETS)
     62class WebSocketHandshakeRequest;
     63class WebSocketHandshakeResponse;
     64#endif
     65
     66class InspectorResourceAgent : public RefCounted<InspectorResourceAgent> {
    5267public:
    53     static bool resourceContent(Document*, const KURL&, String* result);
    54     static bool resourceContentBase64(Document*, const KURL&, String* result);
    55     static PassRefPtr<SharedBuffer> resourceData(Document*, const KURL&, String* textEncodingName);
    56     static InspectorResource::Type cachedResourceType(Document*, const KURL&);
    57     static CachedResource* cachedResource(Document*, const KURL&);
     68    static PassRefPtr<InspectorResourceAgent> create(Page* page, InspectorFrontend* frontend)
     69    {
     70        return adoptRef(new InspectorResourceAgent(page, frontend));
     71    }
     72
     73    static bool resourceContent(Frame*, const KURL&, String* result);
     74    static bool resourceContentBase64(Frame*, const KURL&, String* result);
     75    static PassRefPtr<SharedBuffer> resourceData(Frame*, const KURL&, String* textEncodingName);
     76    static CachedResource* cachedResource(Frame*, const KURL&);
     77
     78    ~InspectorResourceAgent();
     79
     80    void identifierForInitialRequest(unsigned long identifier, const KURL&, DocumentLoader*, bool isMainResource);
     81    void willSendRequest(unsigned long identifier, ResourceRequest&, const ResourceResponse& redirectResponse);
     82    void markResourceAsCached(unsigned long identifier);
     83    void didReceiveResponse(unsigned long identifier, DocumentLoader* laoder, const ResourceResponse&);
     84    void didReceiveContentLength(unsigned long identifier, int lengthReceived);
     85    void didFinishLoading(unsigned long identifier, double finishTime);
     86    void didFailLoading(unsigned long identifier, const ResourceError&);
     87    void didLoadResourceFromMemoryCache(DocumentLoader*, const CachedResource*);
     88    void setOverrideContent(unsigned long identifier, const String& sourceString, InspectorResource::Type);
     89    void didCommitLoad(DocumentLoader*);
     90    void frameDetachedFromParent(Frame*);
     91
     92#if ENABLE(WEB_SOCKETS)
     93    void didCreateWebSocket(unsigned long identifier, const KURL& requestURL);
     94    void willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest&);
     95    void didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse&);
     96    void didCloseWebSocket(unsigned long identifier);
     97#endif
     98
     99    // Called from frontend
     100    void cachedResources(RefPtr<InspectorArray>*);
     101    void resourceContent(unsigned long frameID, const String& url, String* content);
     102
     103private:
     104    InspectorResourceAgent(Page* page, InspectorFrontend* frontend);
     105
     106    Page* m_page;
     107    InspectorFrontend* m_frontend;
    58108};
    59109
  • trunk/WebCore/inspector/InspectorStyleSheet.cpp

    r69761 r69948  
    469469        return false;
    470470
    471     return InspectorResourceAgent::resourceContent(ownerDocument(), m_pageStyleSheet->finalURL(), result);
     471    return InspectorResourceAgent::resourceContent(ownerDocument()->frame(), m_pageStyleSheet->finalURL(), result);
    472472}
    473473
  • trunk/WebCore/inspector/front-end/DataGrid.js

    r69400 r69948  
    662662
    663663        var sortedRows = Array.prototype.slice.call(childNodes, 0, childNodes.length - 1);
    664         sortedRows.sort(comparatorWrapper.bind(this));
     664        sortedRows.sort(comparatorWrapper);
    665665        var sortedRowsLength = sortedRows.length;
    666666
  • trunk/WebCore/inspector/front-end/ExtensionServer.js

    r69185 r69948  
    241241        var resource = null;
    242242
    243         resource = typeof id === "number" ? WebInspector.resources[id] : WebInspector.resourceForURL(id);
     243        resource = WebInspector.resources[id] || WebInspector.resourceForURL(id);
    244244        if (!resource)
    245245            return this._status.E_NOTFOUND(typeof id + ": " + id);
     
    285285        }
    286286
    287         if (typeof message.ids === "number") {
     287        if (typeof message.ids === "number")
    288288            ids = [ message.ids ];
    289         } else if (message.ids instanceof Array) {
     289        else if (message.ids instanceof Array)
    290290            ids = message.ids;
    291         } else {
     291        else
    292292            return this._status.E_BADARGTYPE("message.ids", "Array", typeof message.ids);
    293         }
    294293
    295294        for (var i = 0; i < ids.length; ++i) {
  • trunk/WebCore/inspector/front-end/NetworkPanel.js

    r69400 r69948  
    128128
    129129        if (this._summaryBarElement.parentElement !== this.element && offsetHeight > (this._dataGrid.children.length - 1) * rowHeight + summaryBarHeight) {
    130             this._dataGrid.removeChild(this._summaryBarRowNode);
     130            // Glue status to bottom.
     131            if (this._summaryBarRowNode) {
     132                this._dataGrid.removeChild(this._summaryBarRowNode);
     133                delete this._summaryBarRowNode;
     134            }
    131135            this._summaryBarElement.addStyleClass("network-summary-bar-bottom");
    132             delete this._summaryBarRowNode;
    133136            this.element.appendChild(this._summaryBarElement);
    134137            this._dataGrid.element.style.bottom = "20px";
     
    137140
    138141        if (!this._summaryBarRowNode && offsetHeight - summaryBarHeight < this._dataGrid.children.length * rowHeight) {
     142            // Glue status to table.
    139143            this._summaryBarRowNode = new WebInspector.NetworkTotalGridNode(this._summaryBarElement);
    140144            this._summaryBarElement.removeStyleClass("network-summary-bar-bottom");
     
    143147            this._sortItems();
    144148        }
     149    },
     150
     151    _resetSummaryBar: function()
     152    {
     153        delete this._summaryBarRowNode;
     154        this._summaryBarElement.parentElement.removeChild(this._summaryBarElement);
     155        this._updateSummaryBar();
    145156    },
    146157
     
    350361        this._positionSummaryBar(); // Grid is growing.
    351362        var numRequests = this._resources.length;
     363
     364        if (!numRequests) {
     365            if (this._summaryBarElement._isDisplayingWarning)
     366                return;
     367            this._summaryBarElement._isDisplayingWarning = true;
     368
     369            var img = document.createElement("img");
     370            img.src = "Images/warningIcon.png";
     371            this._summaryBarElement.removeChildren();
     372            this._summaryBarElement.appendChild(img);
     373            this._summaryBarElement.appendChild(document.createTextNode(" "));
     374            this._summaryBarElement.appendChild(document.createTextNode(
     375                WebInspector.UIString("No requests captured. Reload the page to see detailed information on the network activity.")));
     376            return;
     377        }
     378        delete this._summaryBarElement._isDisplayingWarning;
     379
    352380        var transferSize = 0;
    353381        var baseTime = -1;
     
    356384            var resource = this._resources[i];
    357385            transferSize += resource.cached ? 0 : resource.transferSize;
    358             if (resource === WebInspector.mainResource)
     386            if (resource.isMainResource)
    359387                baseTime = resource.startTime;
    360388            if (resource.endTime > maxTime)
     
    363391        var text = String.sprintf(WebInspector.UIString("%d requests"), numRequests);
    364392        text += "  \u2758  " + String.sprintf(WebInspector.UIString("%s transferred"), Number.bytesToString(transferSize));
    365         if (baseTime !== -1 && this._mainResourceLoadTime !== -1 && this._mainResourceDOMContentTime !== -1) {
     393        if (baseTime !== -1 && this._mainResourceLoadTime !== -1 && this._mainResourceDOMContentTime !== -1 && this._mainResourceDOMContentTime > baseTime) {
    366394            text += "  \u2758  " + String.sprintf(WebInspector.UIString("%s (onload: %s, DOMContentLoaded: %s)"),
    367395                        Number.secondsToString(maxTime - baseTime),
     
    579607    {
    580608        this._clearButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear"), "clear-status-bar-item");
    581         this._clearButton.addEventListener("click", this.reset.bind(this), false);
     609        this._clearButton.addEventListener("click", this._reset.bind(this), false);
    582610
    583611        this._largerResourcesButton = new WebInspector.StatusBarButton(WebInspector.UIString("Use small resource rows."), "network-larger-resources-status-bar-item");
     
    719747    },
    720748
    721     reset: function()
     749    _reset: function()
    722750    {
    723751        this._popoverHelper.hidePopup();
     
    725753
    726754        this._toggleGridMode();
    727 
    728         delete this.currentQuery;
    729         this.searchCanceled();
    730 
    731         if (this._resources) {
    732             var resourcesLength = this._resources.length;
    733             for (var i = 0; i < resourcesLength; ++i) {
    734                 var resource = this._resources[i];
    735 
    736                 resource.warnings = 0;
    737                 resource.errors = 0;
    738 
    739                 delete resource._resourcesView;
    740             }
    741         }
    742755
    743756        // Begin reset timeline
    744757        if (this._calculator)
    745758            this._calculator.reset();
    746 
    747         if (this._resources) {
    748             var itemsLength = this._resources.length;
    749             for (var i = 0; i < itemsLength; ++i) {
    750                 var item = this._resources[i];
    751             }
    752         }
    753759
    754760        this._resources = [];
     
    765771 
    766772        this._viewsContainerElement.removeChildren();
     773        this._resetSummaryBar();
    767774    },
    768775
     
    787794        if (newView.__proto__ === resource._resourcesView.__proto__)
    788795            return;
    789 
    790         if (!this.currentQuery && this._resourceGridNode(resource))
    791             this._resourceGridNode(resource).updateErrorsAndWarnings();
    792796
    793797        var oldView = resource._resourcesView;
     
    10981102WebInspector.NetworkPanel.prototype.__proto__ = WebInspector.Panel.prototype;
    10991103
    1100 WebInspector.getResourceContent = function(identifier, callback)
    1101 {
    1102     InspectorBackend.getResourceContent(identifier, false, callback);
    1103 }
    1104 
    11051104WebInspector.NetworkBaseCalculator = function()
    11061105{
     
    16121611    _refreshLabelPositions: function()
    16131612    {
     1613        if (!this._percentages)
     1614            return;
    16141615        this._labelLeftElement.style.removeProperty("left");
    16151616        this._labelLeftElement.style.removeProperty("right");
  • trunk/WebCore/inspector/front-end/Resource.js

    r69947 r69948  
    165165    get responseReceivedTime()
    166166    {
     167        if (this.timing && this.timing.requestTime) {
     168            // Calculate responseReceivedTime from timing data for better accuracy.
     169            // Timing's requestTime is a baseline in seconds, rest of the numbers there are ticks in millis.
     170            return this.timing.requestTime + this.timing.receiveHeadersEnd / 1000.0;
     171        }
    167172        return this._responseReceivedTime || -1;
    168173    },
     
    186191    set endTime(x)
    187192    {
     193        // In case of fast load (or in case of cached resources), endTime on network stack
     194        // can be less then m_responseReceivedTime measured in WebCore. Normalize it here,
     195        // prefer actualEndTime to m_responseReceivedTime.
     196        if (x < this.responseReceivedTime)
     197            this.responseReceivedTime = x;
     198
    188199        if (this._endTime === x)
    189200            return;
     
    610621        if (msg)
    611622            WebInspector.console.addMessage(msg);
     623    },
     624
     625    getContents: function(callback)
     626    {
     627        // FIXME: eventually, cached resources will have no identifiers.
     628        if (this.frameID)
     629            InspectorBackend.resourceContent(this.frameID, this.url, callback);
     630        else
     631            InspectorBackend.getResourceContent(this.identifier, false, callback);
    612632    }
    613633}
  • trunk/WebCore/inspector/front-end/ResourcesPanel.js

    r69203 r69948  
    12921292WebInspector.ResourcesPanel.prototype.__proto__ = WebInspector.Panel.prototype;
    12931293
    1294 WebInspector.getResourceContent = function(identifier, callback)
    1295 {
    1296     InspectorBackend.getResourceContent(identifier, false, callback);
    1297 }
    1298 
    12991294WebInspector.ResourceBaseCalculator = function()
    13001295{
  • trunk/WebCore/inspector/front-end/SourceView.js

    r69276 r69948  
    8484
    8585        delete this._frameNeedsSetup;
    86         WebInspector.getResourceContent(this.resource.identifier, this._contentLoaded.bind(this));
     86        this.resource.getContents(this._contentLoaded.bind(this));
    8787    },
    8888
  • trunk/WebCore/inspector/front-end/WebKit.qrc

    r68636 r69948  
    6969    <file>Resource.js</file>
    7070    <file>ResourceCategory.js</file>
     71    <file>ResourceManager.js</file>
    7172    <file>ResourcesPanel.js</file>
    7273    <file>ResourceView.js</file>
  • trunk/WebCore/inspector/front-end/inspector.html

    r68636 r69948  
    6262    <script type="text/javascript" src="TimelineGrid.js"></script>   
    6363    <script type="text/javascript" src="Resource.js"></script>
     64    <script type="text/javascript" src="ResourceManager.js"></script>
    6465    <script type="text/javascript" src="ResourceCategory.js"></script>
    6566    <script type="text/javascript" src="Database.js"></script>
  • trunk/WebCore/inspector/front-end/inspector.js

    r69947 r69948  
    508508    // TODO: Remove class="hidden" from inspector.html on button#changes-status-bar-item
    509509    this.drawer.visibleView = this.console;
     510    this.resourceManager = new WebInspector.ResourceManager();
    510511    this.domAgent = new WebInspector.DOMAgent();
    511512
     
    12211222        this.panels.resources.addResource(resource);
    12221223        this.panels.audits.resourceStarted(resource);
    1223         if (this.panels.network)
    1224             this.panels.network.addResource(resource);
    12251224    }
    12261225
     
    12821281            resource.endTime = payload.endTime;
    12831282    }
    1284 
    1285     if (this.panels.network)
    1286         this.panels.network.refreshResource(resource);
    1287 }
    1288 
     1283}
    12891284
    12901285WebInspector.domContentEventFired = function(time)
  • trunk/WebCore/inspector/front-end/networkPanel.css

    r69400 r69948  
    6161    font-weight: bold;
    6262}
     63
     64.network.panel .data-grid tr.filler {
     65    background-color: white;
     66}
     67
    6368.network.panel .data-grid td.name-column {
    6469    font-weight: bold;
  • trunk/WebCore/loader/ResourceLoadNotifier.cpp

    r67553 r69948  
    137137#if ENABLE(INSPECTOR)
    138138    if (Page* page = m_frame->page())
    139         page->inspectorController()->didReceiveResponse(identifier, r);
     139        page->inspectorController()->didReceiveResponse(identifier, loader, r);
    140140#endif
    141141}
  • trunk/WebCore/loader/appcache/ApplicationCacheGroup.cpp

    r69048 r69948  
    524524                applicationCacheAgent->didReceiveManifestResponse(m_currentResourceIdentifier, response);
    525525        } else
    526             page->inspectorController()->didReceiveResponse(m_currentResourceIdentifier, response);
     526            page->inspectorController()->didReceiveResponse(m_currentResourceIdentifier, m_frame->loader()->documentLoader(), response);
    527527    }
    528528#endif
  • trunk/WebKit/chromium/ChangeLog

    r69942 r69948  
     12010-10-17  Pavel Feldman  <pfeldman@chromium.org>
     2
     3        Reviewed by Yury Semikhatsky.
     4
     5        Web Inspector: Introduce InspectorResourceAgent.h/cpp and ResourceManager.js to
     6        fill network panel with data.
     7        https://bugs.webkit.org/show_bug.cgi?id=47779
     8
     9        * src/WebDevToolsAgentImpl.cpp:
     10        (WebKit::WebDevToolsAgentImpl::didReceiveResponse):
     11
    1122010-10-17  Pascal Massimino  <pascal.massimino@gmail.com>
    213
  • trunk/WebKit/chromium/src/WebDevToolsAgentImpl.cpp

    r68781 r69948  
    334334{
    335335    if (InspectorController* ic = inspectorController())
    336         ic->didReceiveResponse(resourceId, response.toResourceResponse());
     336        ic->didReceiveResponse(resourceId, 0, response.toResourceResponse());
    337337}
    338338
Note: See TracChangeset for help on using the changeset viewer.