Changeset 64104 in webkit


Ignore:
Timestamp:
Jul 26, 2010 9:51:38 PM (14 years ago)
Author:
commit-queue@webkit.org
Message:

2010-07-26 Yuta Kitamura <yutak@chromium.org>

Reviewed by Pavel Feldman.

Add WebSocket resource type to Web Inspector.

When a new WebSocket connection is established, a line for that connection
will appear in Web Inspector's Resources tab. If the resource name is
clicked, the details of handshake request and response will be shown.

Web Inspector: WebSocket in Resources tab
https://bugs.webkit.org/show_bug.cgi?id=40768

  • inspector/InspectorController.cpp: (WebCore::InspectorController::addResource): WebSocket resource does not have an associated loader, thus frame might be null. Need to check it. (WebCore::InspectorController::removeResource): Ditto. (WebCore::InspectorController::didCreateWebSocket): (WebCore::InspectorController::willSendWebSocketHandshakeRequest): (WebCore::InspectorController::didReceiveWebSocketHandshakeResponse): (WebCore::InspectorController::didCloseWebSocket):
  • inspector/InspectorController.h:
  • inspector/InspectorResource.cpp: Add null checks of m_loader and m_frame, because WebSocket does not have a loader and we need to allow null for these variables. (WebCore::createReadableStringFromBinary): (WebCore::InspectorResource::InspectorResource): (WebCore::InspectorResource::create): Factory function of regular (non-WebSocket) resources. (WebCore::InspectorResource::createWebSocket): Factory function of WebSocket resources. (WebCore::InspectorResource::updateWebSocketRequest): (WebCore::InspectorResource::updateWebSocketResponse): (WebCore::InspectorResource::updateScriptObject): m_frame->document() becomes available when Frame::setDocument() is called. We cannot obtain documentURL during the constructor or updateRequest() function, because m_frame->document() is not available yet at that point and documentURL will contain a wrong URL. As far as I know, updateScriptObject() is the only place where we can safely obtain documentURL. (WebCore::InspectorResource::cachedResource): (WebCore::InspectorResource::type): (WebCore::InspectorResource::resourceData):
  • inspector/InspectorResource.h: (WebCore::InspectorResource::): (WebCore::InspectorResource::markWebSocket):
  • inspector/front-end/Resource.js: (WebInspector.Resource.Type.toString): (WebInspector.Resource.prototype.set type): (WebInspector.Resource.prototype._mimeTypeIsConsistentWithType):
  • inspector/front-end/ResourceView.js: (WebInspector.ResourceView.prototype._refreshRequestHeaders): (WebInspector.ResourceView.prototype._refreshResponseHeaders): (WebInspector.ResourceView.prototype._refreshHeaders):
  • inspector/front-end/inspector.css: (.resources-category-websockets, .resources-category-other): (.resources-category-websockets .resources-graph-bar): (.resources-category-websockets.resource-cached .resources-graph-bar):
  • inspector/front-end/inspector.js: (WebInspector.loaded): (WebInspector.updateResource):
  • websockets/WebSocketChannel.cpp: (WebCore::WebSocketChannel::WebSocketChannel): (WebCore::WebSocketChannel::disconnect): (WebCore::WebSocketChannel::didOpen): (WebCore::WebSocketChannel::didClose): (WebCore::WebSocketChannel::processBuffer): (WebCore::WebSocketChannel::identifier):
  • websockets/WebSocketChannel.h:
Location:
trunk/WebCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r64103 r64104  
     12010-07-26  Yuta Kitamura  <yutak@chromium.org>
     2
     3        Reviewed by Pavel Feldman.
     4
     5        Add WebSocket resource type to Web Inspector.
     6
     7        When a new WebSocket connection is established, a line for that connection
     8        will appear in Web Inspector's Resources tab. If the resource name is
     9        clicked, the details of handshake request and response will be shown.
     10
     11        Web Inspector: WebSocket in Resources tab
     12        https://bugs.webkit.org/show_bug.cgi?id=40768
     13
     14        * inspector/InspectorController.cpp:
     15        (WebCore::InspectorController::addResource): WebSocket resource does not
     16        have an associated loader, thus frame might be null. Need to check it.
     17        (WebCore::InspectorController::removeResource): Ditto.
     18        (WebCore::InspectorController::didCreateWebSocket):
     19        (WebCore::InspectorController::willSendWebSocketHandshakeRequest):
     20        (WebCore::InspectorController::didReceiveWebSocketHandshakeResponse):
     21        (WebCore::InspectorController::didCloseWebSocket):
     22        * inspector/InspectorController.h:
     23        * inspector/InspectorResource.cpp: Add null checks of m_loader and m_frame,
     24        because WebSocket does not have a loader and we need to allow null for
     25        these variables.
     26        (WebCore::createReadableStringFromBinary):
     27        (WebCore::InspectorResource::InspectorResource):
     28        (WebCore::InspectorResource::create): Factory function of
     29        regular (non-WebSocket) resources.
     30        (WebCore::InspectorResource::createWebSocket): Factory function of
     31        WebSocket resources.
     32        (WebCore::InspectorResource::updateWebSocketRequest):
     33        (WebCore::InspectorResource::updateWebSocketResponse):
     34        (WebCore::InspectorResource::updateScriptObject): m_frame->document() becomes
     35        available when Frame::setDocument() is called. We cannot obtain documentURL
     36        during the constructor or updateRequest() function, because m_frame->document()
     37        is not available yet at that point and documentURL will contain a wrong URL.
     38        As far as I know, updateScriptObject() is the only place where we can safely
     39        obtain documentURL.
     40        (WebCore::InspectorResource::cachedResource):
     41        (WebCore::InspectorResource::type):
     42        (WebCore::InspectorResource::resourceData):
     43        * inspector/InspectorResource.h:
     44        (WebCore::InspectorResource::):
     45        (WebCore::InspectorResource::markWebSocket):
     46        * inspector/front-end/Resource.js:
     47        (WebInspector.Resource.Type.toString):
     48        (WebInspector.Resource.prototype.set type):
     49        (WebInspector.Resource.prototype._mimeTypeIsConsistentWithType):
     50        * inspector/front-end/ResourceView.js:
     51        (WebInspector.ResourceView.prototype._refreshRequestHeaders):
     52        (WebInspector.ResourceView.prototype._refreshResponseHeaders):
     53        (WebInspector.ResourceView.prototype._refreshHeaders):
     54        * inspector/front-end/inspector.css:
     55        (.resources-category-websockets, .resources-category-other):
     56        (.resources-category-websockets .resources-graph-bar):
     57        (.resources-category-websockets.resource-cached .resources-graph-bar):
     58        * inspector/front-end/inspector.js:
     59        (WebInspector.loaded):
     60        (WebInspector.updateResource):
     61        * websockets/WebSocketChannel.cpp:
     62        (WebCore::WebSocketChannel::WebSocketChannel):
     63        (WebCore::WebSocketChannel::disconnect):
     64        (WebCore::WebSocketChannel::didOpen):
     65        (WebCore::WebSocketChannel::didClose):
     66        (WebCore::WebSocketChannel::processBuffer):
     67        (WebCore::WebSocketChannel::identifier):
     68        * websockets/WebSocketChannel.h:
     69
    1702010-07-26  Cosmin Truta  <ctruta@chromium.org>
    271
  • trunk/WebCore/inspector/InspectorController.cpp

    r63965 r64104  
    827827
    828828    Frame* frame = resource->frame();
     829    if (!frame)
     830        return;
    829831    ResourcesMap* resourceMap = m_frameResources.get(frame);
    830832    if (resourceMap)
     
    845847
    846848    Frame* frame = resource->frame();
     849    if (!frame)
     850        return;
    847851    ResourcesMap* resourceMap = m_frameResources.get(frame);
    848852    if (!resourceMap) {
     
    14871491}
    14881492#endif
     1493
     1494#if ENABLE(WEB_SOCKETS)
     1495void InspectorController::didCreateWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL)
     1496{
     1497    if (!enabled())
     1498        return;
     1499    ASSERT(m_inspectedPage);
     1500
     1501    RefPtr<InspectorResource> resource = InspectorResource::createWebSocket(identifier, requestURL, documentURL);
     1502    addResource(resource.get());
     1503
     1504    if (m_frontend)
     1505        resource->updateScriptObject(m_frontend.get());
     1506}
     1507
     1508void InspectorController::willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest& request)
     1509{
     1510    RefPtr<InspectorResource> resource = getTrackedResource(identifier);
     1511    if (!resource)
     1512        return;
     1513    resource->startTiming();
     1514    resource->updateWebSocketRequest(request);
     1515    if (m_frontend)
     1516        resource->updateScriptObject(m_frontend.get());
     1517}
     1518
     1519void InspectorController::didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse& response)
     1520{
     1521    RefPtr<InspectorResource> resource = getTrackedResource(identifier);
     1522    if (!resource)
     1523        return;
     1524    // Calling resource->markResponseReceivedTime() here makes resources bar chart confusing, because
     1525    // we cannot apply the "latency + download" model of regular resources to WebSocket connections.
     1526    // FIXME: Design a new UI for bar charts of WebSocket resources, and record timing here.
     1527    resource->updateWebSocketResponse(response);
     1528    if (m_frontend)
     1529        resource->updateScriptObject(m_frontend.get());
     1530}
     1531
     1532void InspectorController::didCloseWebSocket(unsigned long identifier)
     1533{
     1534    RefPtr<InspectorResource> resource = getTrackedResource(identifier);
     1535    if (!resource)
     1536        return;
     1537
     1538    resource->endTiming();
     1539    if (m_frontend)
     1540        resource->updateScriptObject(m_frontend.get());
     1541}
     1542#endif // ENABLE(WEB_SOCKETS)
    14891543
    14901544#if ENABLE(JAVASCRIPT_DEBUGGER)
  • trunk/WebCore/inspector/InspectorController.h

    r63952 r64104  
    9393#endif
    9494
     95#if ENABLE(WEB_SOCKETS)
     96class WebSocketHandshakeRequest;
     97class WebSocketHandshakeResponse;
     98#endif
     99
    95100class InspectorController
    96101#if ENABLE(JAVASCRIPT_DEBUGGER)
     
    224229    void removeDOMStorageItem(long callId, long storageId, const String& key);
    225230#endif
     231#if ENABLE(WEB_SOCKETS)
     232    void didCreateWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL);
     233    void willSendWebSocketHandshakeRequest(unsigned long identifier, const WebSocketHandshakeRequest&);
     234    void didReceiveWebSocketHandshakeResponse(unsigned long identifier, const WebSocketHandshakeResponse&);
     235    void didCloseWebSocket(unsigned long identifier);
     236#endif
    226237
    227238    const ResourcesMap& resources() const { return m_resources; }
  • trunk/WebCore/inspector/InspectorResource.cpp

    r63554 r64104  
    4343#include "ResourceRequest.h"
    4444#include "ResourceResponse.h"
     45#include "StringBuffer.h"
    4546#include "TextEncoding.h"
    4647#include "ScriptObject.h"
     48#include "WebSocketHandshakeRequest.h"
     49#include "WebSocketHandshakeResponse.h"
     50
     51#include <wtf/Assertions.h>
    4752
    4853namespace WebCore {
     54
     55// Create human-readable binary representation, like "01:23:45:67:89:AB:CD:EF".
     56static String createReadableStringFromBinary(const unsigned char* value, size_t length)
     57{
     58    ASSERT(length > 0);
     59    static const char hexDigits[17] = "0123456789ABCDEF";
     60    size_t bufferSize = length * 3 - 1;
     61    StringBuffer buffer(bufferSize);
     62    size_t index = 0;
     63    for (size_t i = 0; i < length; ++i) {
     64        if (i > 0)
     65            buffer[index++] = ':';
     66        buffer[index++] = hexDigits[value[i] >> 4];
     67        buffer[index++] = hexDigits[value[i] & 0xF];
     68    }
     69    ASSERT(index == bufferSize);
     70    return String::adopt(buffer);
     71}
    4972
    5073InspectorResource::InspectorResource(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL)
    5174    : m_identifier(identifier)
    5275    , m_loader(loader)
    53     , m_frame(loader->frame())
     76    , m_frame(loader ? loader->frame() : 0)
    5477    , m_requestURL(requestURL)
    5578    , m_expectedContentLength(0)
     
    6790    , m_connectionReused(false)
    6891    , m_isMainResource(false)
     92#if ENABLE(WEB_SOCKETS)
     93    , m_isWebSocket(false)
     94#endif
    6995{
    7096}
     
    89115}
    90116
     117PassRefPtr<InspectorResource> InspectorResource::create(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL)
     118{
     119    ASSERT(loader);
     120    return adoptRef(new InspectorResource(identifier, loader, requestURL));
     121}
     122
    91123PassRefPtr<InspectorResource> InspectorResource::createCached(unsigned long identifier, DocumentLoader* loader, const CachedResource* cachedResource)
    92124{
     
    107139    return resource;
    108140}
     141
     142#if ENABLE(WEB_SOCKETS)
     143PassRefPtr<InspectorResource> InspectorResource::createWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL)
     144{
     145    RefPtr<InspectorResource> resource = adoptRef(new InspectorResource(identifier, 0, requestURL));
     146    resource->markWebSocket();
     147    resource->m_documentURL = documentURL;
     148    return resource.release();
     149}
     150#endif
    109151
    110152void InspectorResource::updateRequest(const ResourceRequest& request)
     
    147189}
    148190
     191#if ENABLE(WEB_SOCKETS)
     192void InspectorResource::updateWebSocketRequest(const WebSocketHandshakeRequest& request)
     193{
     194    m_requestHeaderFields = request.headerFields();
     195    m_requestMethod = "GET"; // Currently we always use "GET" to request handshake.
     196    m_webSocketRequestKey3.set(new WebSocketHandshakeRequest::Key3(request.key3()));
     197    m_changes.set(RequestChange);
     198    m_changes.set(TypeChange);
     199}
     200
     201void InspectorResource::updateWebSocketResponse(const WebSocketHandshakeResponse& response)
     202{
     203    m_responseStatusCode = response.statusCode();
     204    m_responseStatusText = response.statusText();
     205    m_responseHeaderFields = response.headerFields();
     206    m_webSocketChallengeResponse.set(new WebSocketHandshakeResponse::ChallengeResponse(response.challengeResponse()));
     207    m_changes.set(ResponseChange);
     208    m_changes.set(TypeChange);
     209}
     210#endif // ENABLE(WEB_SOCKETS)
     211
    149212static void populateHeadersObject(ScriptObject* object, const HTTPHeaderMap& headers)
    150213{
     
    162225    ScriptObject jsonObject = frontend->newScriptObject();
    163226    if (m_changes.hasChange(RequestChange)) {
     227        if (m_frame)
     228            m_documentURL = m_frame->document()->url();
     229
    164230        jsonObject.set("url", m_requestURL.string());
    165         jsonObject.set("documentURL", m_frame->document()->url().string());
     231        jsonObject.set("documentURL", m_documentURL.string());
    166232        jsonObject.set("host", m_requestURL.host());
    167233        jsonObject.set("path", m_requestURL.path());
     
    174240        jsonObject.set("requestFormData", m_requestFormData);
    175241        jsonObject.set("didRequestChange", true);
     242#if ENABLE(WEB_SOCKETS)
     243        if (m_webSocketRequestKey3)
     244            jsonObject.set("webSocketRequestKey3", createReadableStringFromBinary(m_webSocketRequestKey3->value, sizeof(m_webSocketRequestKey3->value)));
     245#endif
    176246    }
    177247
     
    190260        if (m_loadTiming && !m_cached)
    191261            jsonObject.set("timing", buildObjectForTiming(frontend, m_loadTiming.get()));
     262#if ENABLE(WEB_SOCKETS)
     263        if (m_webSocketChallengeResponse)
     264            jsonObject.set("webSocketChallengeResponse", createReadableStringFromBinary(m_webSocketChallengeResponse->value, sizeof(m_webSocketChallengeResponse->value)));
     265#endif
    192266        jsonObject.set("didResponseChange", true);
    193267    }
     
    248322    // but Inspector will already try to fetch data that is only available via CachedResource (and it won't update once the resource is added,
    249323    // because m_changes will not have the appropriate bits set).
     324    if (!m_frame)
     325        return 0;
    250326    const String& url = m_requestURL.string();
    251327    CachedResource* cachedResource = m_frame->document()->docLoader()->cachedResource(url);
     
    284360        return m_overrideContentType;
    285361
     362#if ENABLE(WEB_SOCKETS)
     363    if (m_isWebSocket)
     364        return WebSocket;
     365#endif
     366
     367    ASSERT(m_loader);
    286368    if (m_requestURL == m_loader->requestURL()) {
    287369        InspectorResource::Type resourceType = cachedResourceType();
     
    323405PassRefPtr<SharedBuffer> InspectorResource::resourceData(String* textEncodingName) const
    324406{
    325     if (m_requestURL == m_loader->requestURL()) {
     407    if (m_loader && m_requestURL == m_loader->requestURL()) {
    326408        *textEncodingName = m_frame->document()->inputEncoding();
    327409        return m_loader->mainResourceData();
  • trunk/WebCore/inspector/InspectorResource.h

    r63425 r64104  
    3737#include "ScriptState.h"
    3838#include "ScriptString.h"
     39#include "WebSocketHandshakeRequest.h"
     40#include "WebSocketHandshakeResponse.h"
    3941
    4042#include <wtf/CurrentTime.h>
     
    5355    class ResourceRequest;
    5456    class ResourceResponse;
     57
     58#if ENABLE(WEB_SOCKETS)
     59    class WebSocketHandshakeRequest;
     60    class WebSocketHandshakeResponse;
     61#endif
    5562
    5663    class InspectorResource : public RefCounted<InspectorResource> {
     
    6673            XHR,
    6774            Media,
     75            WebSocket,
    6876            Other
    6977        };
    7078
    71         static PassRefPtr<InspectorResource> create(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL)
    72         {
    73             return adoptRef(new InspectorResource(identifier, loader, requestURL));
    74         }
     79        static PassRefPtr<InspectorResource> create(unsigned long identifier, DocumentLoader* loader, const KURL& requestURL);
    7580
    7681        static PassRefPtr<InspectorResource> createCached(unsigned long identifier, DocumentLoader*, const CachedResource*);
     82
     83#if ENABLE(WEB_SOCKETS)
     84        // WebSocket resource doesn't have its loader. For WebSocket resources, m_loader and m_frame will become null.
     85        static PassRefPtr<InspectorResource> createWebSocket(unsigned long identifier, const KURL& requestURL, const KURL& documentURL);
     86#endif
    7787
    7888        ~InspectorResource();
     
    8494        void updateRequest(const ResourceRequest&);
    8595        void updateResponse(const ResourceResponse&);
     96
     97#if ENABLE(WEB_SOCKETS)
     98        void updateWebSocketRequest(const WebSocketHandshakeRequest&);
     99        void updateWebSocketResponse(const WebSocketHandshakeResponse&);
     100#endif
    86101
    87102        void setOverrideContent(const ScriptString& data, Type);
     
    154169        ScriptObject buildObjectForTiming(InspectorFrontend*, ResourceLoadTiming*);
    155170
     171#if ENABLE(WEB_SOCKETS)
     172        void markWebSocket() { m_isWebSocket = true; }
     173#endif
     174
    156175        unsigned long m_identifier;
    157176        RefPtr<DocumentLoader> m_loader;
    158177        RefPtr<Frame> m_frame;
    159178        KURL m_requestURL;
     179        KURL m_documentURL;
    160180        HTTPHeaderMap m_requestHeaderFields;
    161181        HTTPHeaderMap m_responseHeaderFields;
     
    184204        String m_requestFormData;
    185205        Vector<RefPtr<InspectorResource> > m_redirects;
     206
     207#if ENABLE(WEB_SOCKETS)
     208        bool m_isWebSocket;
     209
     210        // The following fields are not used for resources other than WebSocket.
     211        // We allocate them dynamically to reduce memory consumption for regular resources.
     212        OwnPtr<WebSocketHandshakeRequest::Key3> m_webSocketRequestKey3;
     213        OwnPtr<WebSocketHandshakeResponse::ChallengeResponse> m_webSocketChallengeResponse;
     214#endif
    186215    };
    187216
  • trunk/WebCore/inspector/front-end/Resource.js

    r63427 r64104  
    4646    XHR:        5,
    4747    Media:      6,
    48     Other:      7,
     48    WebSocket:  7,
     49    Other:      8,
    4950
    5051    isTextType: function(type)
     
    6869            case this.XHR:
    6970                return WebInspector.UIString("XHR");
     71            case this.WebSocket:
     72                return WebInspector.UIString("WebSocket");
    7073            case this.Other:
    7174            default:
     
    364367                this.category = WebInspector.resourceCategories.xhr;
    365368                break;
     369            case WebInspector.Resource.Type.WebSocket:
     370                this.category = WebInspector.resourceCategories.websocket;
     371                break;
    366372            case WebInspector.Resource.Type.Other:
    367373            default:
     
    576582        if (typeof this.type === "undefined"
    577583         || this.type === WebInspector.Resource.Type.Other
    578          || this.type === WebInspector.Resource.Type.XHR)
     584         || this.type === WebInspector.Resource.Type.XHR
     585         || this.type === WebInspector.Resource.Type.WebSocket)
    579586            return true;
    580587
  • trunk/WebCore/inspector/front-end/ResourceView.js

    r62535 r64104  
    279279    _refreshRequestHeaders: function()
    280280    {
    281         this._refreshHeaders(WebInspector.UIString("Request Headers"), this.resource.sortedRequestHeaders, this.requestHeadersTreeElement);
     281        var additionalRow = null;
     282        if (typeof this.resource.webSocketRequestKey3 !== "undefined")
     283            additionalRow = {header: "(Key3)", value: this.resource.webSocketRequestKey3};
     284        this._refreshHeaders(WebInspector.UIString("Request Headers"), this.resource.sortedRequestHeaders, additionalRow, this.requestHeadersTreeElement);
    282285        this._refreshFormData();
    283286    },
     
    285288    _refreshResponseHeaders: function()
    286289    {
    287         this._refreshHeaders(WebInspector.UIString("Response Headers"), this.resource.sortedResponseHeaders, this.responseHeadersTreeElement);
     290        var additionalRow = null;
     291        if (typeof this.resource.webSocketChallengeResponse !== "undefined")
     292            additionalRow = {header: "(Challenge Response)", value: this.resource.webSocketChallengeResponse};
     293        this._refreshHeaders(WebInspector.UIString("Response Headers"), this.resource.sortedResponseHeaders, additionalRow, this.responseHeadersTreeElement);
    288294    },
    289295
     
    316322    },
    317323   
    318     _refreshHeaders: function(title, headers, headersTreeElement)
     324    _refreshHeaders: function(title, headers, additionalRow, headersTreeElement)
    319325    {
    320326        headersTreeElement.removeChildren();
     
    333339            headersTreeElement.appendChild(headerTreeElement);
    334340        }
     341
     342        if (additionalRow) {
     343            var title = "<div class=\"header-name\">" + additionalRow.header.escapeHTML() + ":</div>";
     344            title += "<div class=\"header-value source-code\">" + additionalRow.value.escapeHTML() + "</div>"
     345
     346            var headerTreeElement = new TreeElement(title, null, false);
     347            headerTreeElement.selectable = false;
     348            headersTreeElement.appendChild(headerTreeElement);
     349        }
    335350    }
    336351}
  • trunk/WebCore/inspector/front-end/inspector.css

    r63757 r64104  
    28202820
    28212821.resources-category-documents, .resources-category-stylesheets, .resources-category-images,
    2822 .resources-category-scripts, .resources-category-xhr, .resources-category-fonts, .resources-category-other {
     2822.resources-category-scripts, .resources-category-xhr, .resources-category-fonts,
     2823.resources-category-websockets, .resources-category-other {
    28232824    display: none;
    28242825}
     
    28302831.filter-all .resources-category-xhr, .filter-xhr .resources-category-xhr,
    28312832.filter-all .resources-category-fonts, .filter-fonts .resources-category-fonts,
     2833.filter-all .resources-category-websockets, .filter-websockets .resources-category-websockets,
    28322834.filter-all .resources-category-other, .filter-other .resources-category-other,
    28332835.resource-sidebar-tree-item.selected {
     
    29032905.resources-category-xhr.resource-cached .resources-graph-bar {
    29042906    -webkit-border-image: url(Images/timelineHollowPillYellow.png) 6 7 6 7;
     2907}
     2908
     2909/* FIXME: Create bar images for WebSocket. */
     2910.resources-category-websockets .resources-graph-bar {
     2911    -webkit-border-image: url(Images/timelinePillGray.png) 6 7 6 7;
     2912}
     2913
     2914.resources-category-websockets.resource-cached .resources-graph-bar {
     2915   -webkit-border-image: url(Images/timelineHollowPillGray.png) 6 7 6 7;
    29052916}
    29062917
  • trunk/WebCore/inspector/front-end/inspector.js

    r63891 r64104  
    465465        xhr: new WebInspector.ResourceCategory("xhr", WebInspector.UIString("XHR"), "rgb(231,231,10)"),
    466466        fonts: new WebInspector.ResourceCategory("fonts", WebInspector.UIString("Fonts"), "rgb(255,82,62)"),
     467        websocket: new WebInspector.ResourceCategory("websockets", WebInspector.UIString("WebSocket"), "rgb(186,186,186)"), // FIXME: Decide the color.
    467468        other: new WebInspector.ResourceCategory("other", WebInspector.UIString("Other"), "rgb(186,186,186)")
    468469    };
     
    11641165        resource.requestFormData = payload.requestFormData;
    11651166        resource.documentURL = payload.documentURL;
     1167        if (typeof payload.webSocketRequestKey3 !== "undefined")
     1168            resource.webSocketRequestKey3 = payload.webSocketRequestKey3;
    11661169
    11671170        if (resource.mainResource)
     
    11881191        resource.timing = payload.timing;
    11891192        resource.cached = payload.cached;
     1193        if (typeof payload.webSocketChallengeResponse !== "undefined")
     1194            resource.webSocketChallengeResponse = payload.webSocketChallengeResponse;
    11901195    }
    11911196
  • trunk/WebCore/websockets/WebSocketChannel.cpp

    r62535 r64104  
    3737#include "CookieJar.h"
    3838#include "Document.h"
     39#include "InspectorController.h"
    3940#include "Logging.h"
     41#include "Page.h"
    4042#include "PlatformString.h"
     43#include "ProgressTracker.h"
    4144#include "ScriptExecutionContext.h"
    4245#include "SocketStreamError.h"
     
    6366    , m_closed(false)
    6467    , m_unhandledBufferedAmount(0)
    65 {
     68#if ENABLE(INSPECTOR)
     69    , m_identifier(0)
     70#endif
     71{
     72#if ENABLE(INSPECTOR)
     73    if (InspectorController* controller = m_context->inspectorController())
     74        controller->didCreateWebSocket(identifier(), url, m_context->url());
     75#endif
    6676}
    6777
     
    112122{
    113123    LOG(Network, "WebSocketChannel %p disconnect", this);
     124#if ENABLE(INSPECTOR)
     125    if (m_context)
     126        if (InspectorController* controller = m_context->inspectorController())
     127            controller->didCloseWebSocket(identifier());
     128#endif
    114129    m_handshake.clearScriptExecutionContext();
    115130    m_client = 0;
     
    137152    if (!m_context)
    138153        return;
     154#if ENABLE(INSPECTOR)
     155    if (InspectorController* controller = m_context->inspectorController())
     156        controller->willSendWebSocketHandshakeRequest(identifier(), m_handshake.clientHandshakeRequest());
     157#endif
    139158    const CString& handshakeMessage = m_handshake.clientHandshakeMessage();
    140159    if (!handle->send(handshakeMessage.data(), handshakeMessage.length())) {
     
    147166{
    148167    LOG(Network, "WebSocketChannel %p didClose", this);
     168#if ENABLE(INSPECTOR)
     169    if (m_context)
     170        if (InspectorController* controller = m_context->inspectorController())
     171            controller->didCloseWebSocket(identifier());
     172#endif
    149173    ASSERT_UNUSED(handle, handle == m_handle || !m_handle);
    150174    m_closed = true;
     
    238262            return false;
    239263        if (m_handshake.mode() == WebSocketHandshake::Connected) {
     264#if ENABLE(INSPECTOR)
     265            if (InspectorController* controller = m_context->inspectorController())
     266                controller->didReceiveWebSocketHandshakeResponse(identifier(), m_handshake.serverHandshakeResponse());
     267#endif
    240268            if (!m_handshake.serverSetCookie().isEmpty()) {
    241269                if (m_context->isDocument()) {
     
    329357}
    330358
     359#if ENABLE(INSPECTOR)
     360unsigned long WebSocketChannel::identifier()
     361{
     362    if (m_identifier)
     363        return m_identifier;
     364
     365    if (InspectorController* controller = m_context->inspectorController())
     366        if (Page* page = controller->inspectedPage())
     367            m_identifier = page->progress()->createUniqueIdentifier();
     368
     369    ASSERT(m_identifier);
     370    return m_identifier;
     371}
     372#endif // ENABLE(INSPECTOR)
     373
    331374}  // namespace WebCore
    332375
  • trunk/WebCore/websockets/WebSocketChannel.h

    r62535 r64104  
    8585        void resumeTimerFired(Timer<WebSocketChannel>* timer);
    8686
     87#if ENABLE(INSPECTOR)
     88        unsigned long identifier();
     89#endif
     90
    8791        ScriptExecutionContext* m_context;
    8892        WebSocketChannelClient* m_client;
     
    96100        bool m_closed;
    97101        unsigned long m_unhandledBufferedAmount;
     102
     103#if ENABLE(INSPECTOR)
     104        unsigned long m_identifier;
     105#endif
    98106    };
    99107
Note: See TracChangeset for help on using the changeset viewer.