Changeset 83950 in webkit


Ignore:
Timestamp:
Apr 14, 2011 10:55:33 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

2011-04-14 Vsevolod Vlasov <vsevik@chromium.org>

Reviewed by Pavel Feldman.

Web Inspector: Enable raw HTTP headers support
https://bugs.webkit.org/show_bug.cgi?id=58259

Added raw headers text support to inspector.

  • English.lproj/localizedStrings.js:
  • inspector/Inspector.json:
  • inspector/InspectorResourceAgent.cpp: (WebCore::buildObjectForResourceResponse):
  • inspector/front-end/NetworkManager.js: (WebInspector.NetworkDispatcher.prototype._updateResourceWithResponse):
  • inspector/front-end/Resource.js: (WebInspector.Resource): (WebInspector.Resource.prototype.get transferSize): (WebInspector.Resource.prototype.set requestHeaders): (WebInspector.Resource.prototype.get rawRequestHeadersText): (WebInspector.Resource.prototype.set rawRequestHeadersText): (WebInspector.Resource.prototype.get requestHeadersSize): (WebInspector.Resource.prototype.set responseHeaders): (WebInspector.Resource.prototype.get rawResponseHeadersText): (WebInspector.Resource.prototype.set rawResponseHeadersText): (WebInspector.Resource.prototype.get responseHeadersSize): (WebInspector.Resource.prototype._headersSize):
  • inspector/front-end/ResourceHeadersView.js: (WebInspector.ResourceHeadersView): (WebInspector.ResourceHeadersView.prototype._refreshParms): (WebInspector.ResourceHeadersView.prototype._refreshRequestHeaders): (WebInspector.ResourceHeadersView.prototype._refreshResponseHeaders): (WebInspector.ResourceHeadersView.prototype._refreshHeadersTitle): (WebInspector.ResourceHeadersView.prototype._refreshHeaders): (WebInspector.ResourceHeadersView.prototype._refreshRawHeadersText): (WebInspector.ResourceHeadersView.prototype._toggleRawRequestHeadersText): (WebInspector.ResourceHeadersView.prototype._toggleRawResponseHeadersText): (WebInspector.ResourceHeadersView.prototype._createToggleButton): (WebInspector.ResourceHeadersView.prototype._createHeadersToggleButton):
  • inspector/front-end/networkPanel.css: (.resource-headers-view .outline-disclosure li .header-toggle): (.resource-headers-view .outline-disclosure li.expanded .header-toggle): (.resource-headers-view .outline-disclosure li .header-toggle:hover): (.resource-headers-view .outline-disclosure li.raw-headers-text):
  • platform/network/ResourceLoadInfo.h:

2011-04-14 Vsevolod Vlasov <vsevik@chromium.org>

Reviewed by Pavel Feldman.

Web Inspector: Enable raw HTTP headers support
https://bugs.webkit.org/show_bug.cgi?id=58259

Added raw headers text support to inspector.

  • public/WebHTTPLoadInfo.h:
  • src/WebHTTPLoadInfo.cpp: (WebKit::WebHTTPLoadInfo::rawRequestHeadersText): (WebKit::WebHTTPLoadInfo::setRawRequestHeadersText): (WebKit::WebHTTPLoadInfo::rawResponseHeadersText): (WebKit::WebHTTPLoadInfo::setRawResponseHeadersText):
Location:
trunk/Source
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r83949 r83950  
     12011-04-14  Vsevolod Vlasov  <vsevik@chromium.org>
     2
     3        Reviewed by Pavel Feldman.
     4
     5        Web Inspector: Enable raw HTTP headers support
     6        https://bugs.webkit.org/show_bug.cgi?id=58259
     7
     8        Added raw headers text support to inspector.
     9
     10        * English.lproj/localizedStrings.js:
     11        * inspector/Inspector.json:
     12        * inspector/InspectorResourceAgent.cpp:
     13        (WebCore::buildObjectForResourceResponse):
     14        * inspector/front-end/NetworkManager.js:
     15        (WebInspector.NetworkDispatcher.prototype._updateResourceWithResponse):
     16        * inspector/front-end/Resource.js:
     17        (WebInspector.Resource):
     18        (WebInspector.Resource.prototype.get transferSize):
     19        (WebInspector.Resource.prototype.set requestHeaders):
     20        (WebInspector.Resource.prototype.get rawRequestHeadersText):
     21        (WebInspector.Resource.prototype.set rawRequestHeadersText):
     22        (WebInspector.Resource.prototype.get requestHeadersSize):
     23        (WebInspector.Resource.prototype.set responseHeaders):
     24        (WebInspector.Resource.prototype.get rawResponseHeadersText):
     25        (WebInspector.Resource.prototype.set rawResponseHeadersText):
     26        (WebInspector.Resource.prototype.get responseHeadersSize):
     27        (WebInspector.Resource.prototype._headersSize):
     28        * inspector/front-end/ResourceHeadersView.js:
     29        (WebInspector.ResourceHeadersView):
     30        (WebInspector.ResourceHeadersView.prototype._refreshParms):
     31        (WebInspector.ResourceHeadersView.prototype._refreshRequestHeaders):
     32        (WebInspector.ResourceHeadersView.prototype._refreshResponseHeaders):
     33        (WebInspector.ResourceHeadersView.prototype._refreshHeadersTitle):
     34        (WebInspector.ResourceHeadersView.prototype._refreshHeaders):
     35        (WebInspector.ResourceHeadersView.prototype._refreshRawHeadersText):
     36        (WebInspector.ResourceHeadersView.prototype._toggleRawRequestHeadersText):
     37        (WebInspector.ResourceHeadersView.prototype._toggleRawResponseHeadersText):
     38        (WebInspector.ResourceHeadersView.prototype._createToggleButton):
     39        (WebInspector.ResourceHeadersView.prototype._createHeadersToggleButton):
     40        * inspector/front-end/networkPanel.css:
     41        (.resource-headers-view .outline-disclosure li .header-toggle):
     42        (.resource-headers-view .outline-disclosure li.expanded .header-toggle):
     43        (.resource-headers-view .outline-disclosure li .header-toggle:hover):
     44        (.resource-headers-view .outline-disclosure li.raw-headers-text):
     45        * platform/network/ResourceLoadInfo.h:
     46
    1472011-04-14  Justin Novosad  <junov@chromium.org>
    248
  • trunk/Source/WebCore/inspector/Inspector.json

    r83861 r83950  
    337337                    { "name": "statusText", "type": "string", "description": "HTTP response status text." },
    338338                    { "name": "headers", "type": "object", "description": "HTTP response headers." },
     339                    { "name": "rawHeadersText", "type": "string", "optional": true, "description": "Raw HTTP response headers text." },
    339340                    { "name": "mimeType", "type": "string", "description": "Resource mimeType as determined by the browser." },
    340341                    { "name": "requestHeaders", "type": "object", "optional": true, "description": "Refined HTTP request headers that were actually transmitted over the network." },
     342                    { "name": "rawRequestHeadersText", "type": "string", "optional": true, "description": "Raw HTTP request headers text." },
    341343                    { "name": "connectionReused", "type": "boolean", "description": "Specifies whether physical connection was actually reused for this request." },
    342344                    { "name": "connectionID", "type": "number", "description": "Physical connection id that was actually used for this request." },
  • trunk/Source/WebCore/inspector/InspectorResourceAgent.cpp

    r83724 r83950  
    222222    responseObject->setNumber("status", response.resourceLoadInfo() ? response.resourceLoadInfo()->httpStatusCode : response.httpStatusCode());
    223223    responseObject->setString("statusText", response.resourceLoadInfo() ? response.resourceLoadInfo()->httpStatusText : response.httpStatusText());
    224     responseObject->setObject("headers", buildObjectForHeaders(response.resourceLoadInfo() ? response.resourceLoadInfo()->responseHeaders : response.httpHeaderFields()));
    225224
    226225    responseObject->setString("mimeType", response.mimeType());
     
    231230        responseObject->setObject("timing", buildObjectForTiming(*response.resourceLoadTiming()));
    232231
    233     if (response.resourceLoadInfo())
     232    if (response.resourceLoadInfo()) {
     233        responseObject->setObject("headers", buildObjectForHeaders(response.resourceLoadInfo()->responseHeaders));
     234        if (!response.resourceLoadInfo()->rawResponseHeadersText.isEmpty())
     235            responseObject->setString("rawHeadersText", response.resourceLoadInfo()->rawResponseHeadersText);
     236
    234237        responseObject->setObject("requestHeaders", buildObjectForHeaders(response.resourceLoadInfo()->requestHeaders));
     238        if (!response.resourceLoadInfo()->rawRequestHeadersText.isEmpty())
     239            responseObject->setString("rawRequestHeadersText", response.resourceLoadInfo()->rawRequestHeadersText);
     240    } else
     241        responseObject->setObject("headers", buildObjectForHeaders(response.httpHeaderFields()));
    235242
    236243    return responseObject;
  • trunk/Source/WebCore/inspector/front-end/NetworkManager.js

    r83724 r83950  
    9393        resource.statusText = response.statusText;
    9494        resource.responseHeaders = response.headers;
    95         // Raw request headers can be a part of response as well.
     95        if (response.rawHeadersText)
     96            resource.rawResponseHeadersText = response.rawHeadersText;
    9697        if (response.requestHeaders)
    9798            resource.requestHeaders = response.requestHeaders;
     99        if (response.rawRequestHeadersText)
     100            resource.rawRequestHeadersText = response.rawRequestHeadersText;
    98101
    99102        resource.connectionReused = response.connectionReused;
  • trunk/Source/WebCore/inspector/front-end/Resource.js

    r83843 r83950  
    3434    this._category = WebInspector.resourceCategories.other;
    3535    this._pendingContentCallbacks = [];
    36     this._responseHeadersSize = 0;
    3736}
    3837
     
    241240            return 0;
    242241        if (this.statusCode === 304) // Not modified
    243             return this._responseHeadersSize;
     242            return this.responseHeadersSize;
    244243        if (this._transferSize !== undefined)
    245244            return this._transferSize;
     
    255254        // get actual transfer size from the network stack.
    256255        var bodySize = Number(this.responseHeaders["Content-Length"] || this.resourceSize);
    257         return this._responseHeadersSize + bodySize;
     256        return this.responseHeadersSize + bodySize;
    258257    },
    259258
     
    404403        delete this._sortedRequestHeaders;
    405404        delete this._requestCookies;
     405        delete this._responseHeadersSize;
    406406
    407407        this.dispatchEventToListeners("requestHeaders changed");
     408    },
     409
     410    get rawRequestHeadersText()
     411    {
     412        return this._rawRequestHeadersText;
     413    },
     414
     415    set rawRequestHeadersText(x)
     416    {
     417        this._rawRequestHeadersText = x;
     418        delete this._responseHeadersSize;
     419
     420        this.dispatchEventToListeners("requestHeaders changed");
     421    },
     422
     423    get requestHeadersSize()
     424    {
     425        if (typeof(this._requestHeadersSize) === "undefined") {
     426            if (this._rawRequestHeadersText)
     427                this._requestHeadersSize = this._rawRequestHeadersText.length;
     428            else
     429                this._requestHeadersSize = this._headersSize(this._requestHeaders)
     430        }
     431        return this._requestHeadersSize;
    408432    },
    409433
     
    452476    {
    453477        this._responseHeaders = x;
    454         // FIXME: we should take actual headers size from network stack, when possible.
    455         this._responseHeadersSize = this._headersSize(x);
     478        delete this._responseHeadersSize;
    456479        delete this._sortedResponseHeaders;
    457480        delete this._responseCookies;
     
    459482        this.dispatchEventToListeners("responseHeaders changed");
    460483    },
     484   
     485    get rawResponseHeadersText()
     486    {
     487        return this._rawResponseHeadersText;
     488    },
     489
     490    set rawResponseHeadersText(x)
     491    {
     492        this._rawResponseHeadersText = x;
     493        delete this._responseHeadersSize;
     494
     495        this.dispatchEventToListeners("responseHeaders changed");
     496    },
     497   
     498    get responseHeadersSize()
     499    {
     500        if (typeof(this._responseHeadersSize) === "undefined") {
     501            if (this._rawResponseHeadersText)
     502                this._responseHeadersSize = this._rawResponseHeadersText.length;
     503            else
     504                this._responseHeadersSize = this._headersSize(this._responseHeaders)
     505        }
     506        return this._responseHeadersSize;
     507    },
     508   
    461509
    462510    get sortedResponseHeaders()
     
    537585    _headersSize: function(headers)
    538586    {
     587        // We should take actual headers size from network stack, when possible, but fall back to
     588        // this lousy computation when no raw headers are available.
    539589        var size = 0;
    540590        for (var header in headers)
    541             size += header.length + headers[header].length + 3; // _typical_ overhead per herader is ": ".length + "\n".length.
     591            size += header.length + headers[header].length + 4; // _typical_ overhead per header is ": ".length + "\r\n".length.
    542592        return size;
    543593    },
  • trunk/Source/WebCore/inspector/front-end/ResourceHeadersView.js

    r78486 r83950  
    6060    this._headersTreeOutline.appendChild(this._requestHeadersTreeElement);
    6161
    62     this._decodeHover = WebInspector.UIString("Double-Click to toggle between URL encoded and decoded formats");
    6362    this._decodeRequestParameters = true;
     63
     64    this._showRawRequestHeadersText = false;
     65    this._showRawResponseHeadersText = false;
    6466
    6567    this._queryStringTreeElement = new TreeElement("", null, true);
     
    147149        parmsTreeElement.removeChildren();
    148150
    149         parmsTreeElement.titleHTML = title + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", parms.length) + "</span>";
     151        parmsTreeElement.listItemElement.removeChildren();
     152        parmsTreeElement.listItemElement.appendChild(document.createTextNode(title));
     153       
     154        var headerCount = document.createElement("span");
     155        headerCount.addStyleClass("header-count");
     156        headerCount.textContent = WebInspector.UIString(" (%d)", parms.length);
     157        parmsTreeElement.listItemElement.appendChild(headerCount);
     158
     159        var toggleTitle = this._decodeRequestParameters ? WebInspector.UIString("view URL encoded") : WebInspector.UIString("view decoded");
     160        var toggleButton = this._createToggleButton(toggleTitle);
     161        toggleButton.addEventListener("click", this._toggleURLdecoding.bind(this));
     162        parmsTreeElement.listItemElement.appendChild(toggleButton);
     163
    150164
    151165        for (var i = 0; i < parms.length; ++i) {
     
    176190            parmTreeElement.titleHTML = title;
    177191            parmTreeElement.selectable = false;
    178             parmTreeElement.tooltip = this._decodeHover;
    179             parmTreeElement.ondblclick = this._toggleURLdecoding.bind(this);
    180192            parmsTreeElement.appendChild(parmTreeElement);
    181193        }
     
    203215        if (typeof this._resource.webSocketRequestKey3 !== "undefined")
    204216            additionalRow = {header: "(Key3)", value: this._resource.webSocketRequestKey3};
    205         this._refreshHeaders(WebInspector.UIString("Request Headers"), this._resource.sortedRequestHeaders, additionalRow, this._requestHeadersTreeElement);
     217        if (this._showRawRequestHeadersText)
     218            this._refreshRawHeadersText(WebInspector.UIString("Request Headers"), this._resource.rawRequestHeadersText, this._requestHeadersTreeElement);
     219        else
     220            this._refreshHeaders(WebInspector.UIString("Request Headers"), this._resource.sortedRequestHeaders, additionalRow, this._requestHeadersTreeElement);
     221
     222        if (this._resource.rawRequestHeadersText) {
     223            var toggleButton = this._createHeadersToggleButton(this._showRawRequestHeadersText);
     224            toggleButton.addEventListener("click", this._toggleRawRequestHeadersText.bind(this));
     225            this._requestHeadersTreeElement.listItemElement.appendChild(toggleButton);
     226        }
     227
    206228        this._refreshFormData();
    207229    },
     
    212234        if (typeof this._resource.webSocketChallengeResponse !== "undefined")
    213235            additionalRow = {header: "(Challenge Response)", value: this._resource.webSocketChallengeResponse};
    214         this._refreshHeaders(WebInspector.UIString("Response Headers"), this._resource.sortedResponseHeaders, additionalRow, this._responseHeadersTreeElement);
     236        if (this._showRawResponseHeadersText)
     237            this._refreshRawHeadersText(WebInspector.UIString("Response Headers"), this._resource.rawResponseHeadersText, this._responseHeadersTreeElement);
     238        else
     239            this._refreshHeaders(WebInspector.UIString("Response Headers"), this._resource.sortedResponseHeaders, additionalRow, this._responseHeadersTreeElement);
     240       
     241        if (this._resource.rawResponseHeadersText) {
     242            var toggleButton = this._createHeadersToggleButton(this._showRawResponseHeadersText);
     243            toggleButton.addEventListener("click", this._toggleRawResponseHeadersText.bind(this));
     244            this._responseHeadersTreeElement.listItemElement.appendChild(toggleButton);
     245        }
    215246    },
    216247
     
    243274    },
    244275   
     276    _refreshHeadersTitle: function(title, headersTreeElement, isRawHeadersTextShown, headersLength)
     277    {
     278        headersTreeElement.listItemElement.removeChildren();
     279        headersTreeElement.listItemElement.appendChild(document.createTextNode(title));
     280       
     281        if (!isRawHeadersTextShown) {
     282            var headerCount = document.createElement("span");
     283            headerCount.addStyleClass("header-count");
     284            headerCount.textContent = WebInspector.UIString(" (%d)", headersLength);
     285            headersTreeElement.listItemElement.appendChild(headerCount);
     286        }
     287    },
     288   
    245289    _refreshHeaders: function(title, headers, additionalRow, headersTreeElement)
    246290    {
    247291        headersTreeElement.removeChildren();
    248 
     292       
    249293        var length = headers.length;
    250         headersTreeElement.titleHTML = title.escapeHTML() + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", length) + "</span>";
     294        this._refreshHeadersTitle(title, headersTreeElement, false, length);
    251295        headersTreeElement.hidden = !length;
    252 
    253         var length = headers.length;
    254296        for (var i = 0; i < length; ++i) {
    255297            var title = "<div class=\"header-name\">" + headers[i].header.escapeHTML() + ":</div>";
     
    271313            headersTreeElement.appendChild(headerTreeElement);
    272314        }
     315    },
     316   
     317    _refreshRawHeadersText: function(title, rawHeadersText, headersTreeElement)
     318    {
     319        headersTreeElement.removeChildren();
     320       
     321        this._refreshHeadersTitle(title, headersTreeElement, true);
     322        var headerTreeElement = new TreeElement(null, null, false);
     323        headerTreeElement.selectable = false;
     324        headersTreeElement.appendChild(headerTreeElement);
     325        headerTreeElement.listItemElement.addStyleClass("raw-headers-text");
     326       
     327        var rawHeadersTextElement = document.createElement("span");
     328        rawHeadersTextElement.addStyleClass("header-value");
     329        rawHeadersTextElement.addStyleClass("source-code");
     330        rawHeadersTextElement.textContent = String(rawHeadersText).trim();
     331        headerTreeElement.listItemElement.appendChild(rawHeadersTextElement);
     332    },
     333
     334    _toggleRawRequestHeadersText: function(event)
     335    {
     336        this._showRawRequestHeadersText = !this._showRawRequestHeadersText;
     337        this._refreshRequestHeaders();
     338    },
     339
     340    _toggleRawResponseHeadersText: function(event)
     341    {
     342        this._showRawResponseHeadersText = !this._showRawResponseHeadersText;
     343        this._refreshResponseHeaders();
     344    },
     345
     346    _createToggleButton: function(title)
     347    {
     348        var button = document.createElement("span");
     349        button.addStyleClass("header-toggle");
     350        button.textContent = title;
     351        return button;
     352    },
     353   
     354    _createHeadersToggleButton: function(isRawHeadersTextShown)
     355    {
     356        var toggleTitle = isRawHeadersTextShown ? WebInspector.UIString("view parsed") : WebInspector.UIString("view source");
     357        return this._createToggleButton(toggleTitle);
    273358    }
    274359}
  • trunk/Source/WebCore/inspector/front-end/networkPanel.css

    r80565 r83950  
    715715}
    716716
     717.resource-headers-view .outline-disclosure li .header-toggle {
     718    display: none;
     719}
     720
     721.resource-headers-view .outline-disclosure li.expanded .header-toggle {
     722    display: inline;
     723    margin-left: 30px;
     724    font-weight: normal;
     725    color: rgb(45%, 45%, 45%);
     726}
     727
     728.resource-headers-view .outline-disclosure li .header-toggle:hover {
     729    color: rgb(20%, 20%, 45%);
     730    cursor: pointer;
     731}
     732
    717733.resource-headers-view .outline-disclosure .header-name {
    718734    color: rgb(33%, 33%, 33%);
     
    732748}
    733749
     750.resource-headers-view .outline-disclosure li.raw-headers-text {
     751    text-indent: 0;
     752    margin-left: -2px;
     753}
     754
    734755.resource-headers-view .outline-disclosure .raw-form-data {
    735756    white-space: pre-wrap;
  • trunk/Source/WebCore/platform/network/ResourceLoadInfo.h

    r83942 r83950  
    4242    HTTPHeaderMap requestHeaders;
    4343    HTTPHeaderMap responseHeaders;
     44    String rawRequestHeadersText;
     45    String rawResponseHeadersText;
    4446};
    4547
  • trunk/Source/WebKit/chromium/ChangeLog

    r83942 r83950  
     12011-04-14  Vsevolod Vlasov  <vsevik@chromium.org>
     2
     3        Reviewed by Pavel Feldman.
     4
     5        Web Inspector: Enable raw HTTP headers support
     6        https://bugs.webkit.org/show_bug.cgi?id=58259
     7
     8        Added raw headers text support to inspector.
     9
     10        * public/WebHTTPLoadInfo.h:
     11        * src/WebHTTPLoadInfo.cpp:
     12        (WebKit::WebHTTPLoadInfo::rawRequestHeadersText):
     13        (WebKit::WebHTTPLoadInfo::setRawRequestHeadersText):
     14        (WebKit::WebHTTPLoadInfo::rawResponseHeadersText):
     15        (WebKit::WebHTTPLoadInfo::setRawResponseHeadersText):
     16
    1172011-04-14  Vsevolod Vlasov  <vsevik@chromium.org>
    218
  • trunk/Source/WebKit/chromium/public/WebHTTPLoadInfo.h

    r83942 r83950  
    6969    WEBKIT_API void addResponseHeader(const WebString& name, const WebString& value);
    7070
     71    WEBKIT_API WebString rawRequestHeadersText() const;
     72    WEBKIT_API void setRawRequestHeadersText(const WebString&);
     73
     74    WEBKIT_API WebString rawResponseHeadersText() const;
     75    WEBKIT_API void setRawResponseHeadersText(const WebString&);
     76
    7177#if WEBKIT_IMPLEMENTATION
    7278    WebHTTPLoadInfo(WTF::PassRefPtr<WebCore::ResourceLoadInfo>);
  • trunk/Source/WebKit/chromium/src/WebHTTPLoadInfo.cpp

    r83942 r83950  
    121121}
    122122
     123WebString WebHTTPLoadInfo::rawRequestHeadersText() const
     124{
     125    ASSERT(!m_private.isNull());
     126    return m_private->rawRequestHeadersText;
     127}
     128
     129void WebHTTPLoadInfo::setRawRequestHeadersText(const WebString& rawHeadersText)
     130{
     131    ASSERT(!m_private.isNull());
     132    m_private->rawRequestHeadersText = rawHeadersText;
     133}
     134
     135WebString WebHTTPLoadInfo::rawResponseHeadersText() const
     136{
     137    ASSERT(!m_private.isNull());
     138    return m_private->rawResponseHeadersText;
     139}
     140
     141void WebHTTPLoadInfo::setRawResponseHeadersText(const WebString& rawHeadersText)
     142{
     143    ASSERT(!m_private.isNull());
     144    m_private->rawResponseHeadersText = rawHeadersText;
     145}
     146
    123147} // namespace WebKit
Note: See TracChangeset for help on using the changeset viewer.