Changeset 47903 in webkit


Ignore:
Timestamp:
Aug 31, 2009 1:15:17 PM (15 years ago)
Author:
eric@webkit.org
Message:

2009-08-31 Patrick Mueller <Patrick_Mueller@us.ibm.com>

Reviewed by Timothy Hatcher.

Inspector Request Headers Should Show Data Sent With Request
https://bugs.webkit.org/show_bug.cgi?id=22920

Manual test added - see below.

  • English.lproj/localizedStrings.js:
  • inspector/InspectorResource.cpp: (WebCore::InspectorResource::updateRequest): (WebCore::InspectorResource::createScriptObject): (WebCore::InspectorResource::updateScriptObject):
  • inspector/InspectorResource.h:
  • inspector/front-end/Resource.js: (WebInspector.Resource):
  • inspector/front-end/ResourceView.js: (WebInspector.ResourceView): (WebInspector.ResourceView.prototype._refreshURL): (WebInspector.ResourceView.prototype._refreshQueryString): (WebInspector.ResourceView.prototype._refreshFormData): (WebInspector.ResourceView.prototype._refreshRequestPayload): (WebInspector.ResourceView.prototype._refreshParms): (WebInspector.ResourceView.prototype._toggleURLdecoding): (WebInspector.ResourceView.prototype._getHeaderValue): (WebInspector.ResourceView.prototype._refreshRequestHeaders):
  • inspector/front-end/inspector.css:
  • inspector/front-end/inspector.js: (WebInspector.addResource): (WebInspector.updateResource):
  • manual-tests/inspector/display-form-data.html: Added.
Location:
trunk/WebCore
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r47900 r47903  
     12009-08-31  Patrick Mueller  <Patrick_Mueller@us.ibm.com>
     2
     3        Reviewed by Timothy Hatcher.
     4
     5        Inspector Request Headers Should Show Data Sent With Request
     6        https://bugs.webkit.org/show_bug.cgi?id=22920
     7
     8        Manual test added - see below.
     9
     10        * English.lproj/localizedStrings.js:
     11        * inspector/InspectorResource.cpp:
     12        (WebCore::InspectorResource::updateRequest):
     13        (WebCore::InspectorResource::createScriptObject):
     14        (WebCore::InspectorResource::updateScriptObject):
     15        * inspector/InspectorResource.h:
     16        * inspector/front-end/Resource.js:
     17        (WebInspector.Resource):
     18        * inspector/front-end/ResourceView.js:
     19        (WebInspector.ResourceView):
     20        (WebInspector.ResourceView.prototype._refreshURL):
     21        (WebInspector.ResourceView.prototype._refreshQueryString):
     22        (WebInspector.ResourceView.prototype._refreshFormData):
     23        (WebInspector.ResourceView.prototype._refreshRequestPayload):
     24        (WebInspector.ResourceView.prototype._refreshParms):
     25        (WebInspector.ResourceView.prototype._toggleURLdecoding):
     26        (WebInspector.ResourceView.prototype._getHeaderValue):
     27        (WebInspector.ResourceView.prototype._refreshRequestHeaders):
     28        * inspector/front-end/inspector.css:
     29        * inspector/front-end/inspector.js:
     30        (WebInspector.addResource):
     31        (WebInspector.updateResource):
     32        * manual-tests/inspector/display-form-data.html: Added.
     33
    1342009-08-31  Pavel Feldman  <pfeldman@chromium.org>
    235
  • trunk/WebCore/inspector/InspectorResource.cpp

    r46490 r47903  
    9090    m_requestHeaderFields = request.httpHeaderFields();
    9191    m_requestURL = request.url();
     92    m_requestMethod = request.httpMethod();
     93    if (request.httpBody() && !request.httpBody()->isEmpty())
     94        m_requestFormData = request.httpBody()->flattenToString();
    9295
    9396    m_changes.set(RequestChange);
     
    127130        jsonObject.set("isMainResource", m_isMainResource);
    128131        jsonObject.set("cached", m_cached);
     132        jsonObject.set("requestMethod", m_requestMethod);
     133        jsonObject.set("requestFormData", m_requestFormData);
    129134        if (!frontend->addResource(m_identifier, jsonObject))
    130135            return;
     
    154159        jsonObject.set("requestHeaders", requestHeaders);
    155160        jsonObject.set("mainResource", m_isMainResource);
     161        jsonObject.set("requestMethod", m_requestMethod);
     162        jsonObject.set("requestFormData", m_requestFormData);
    156163        jsonObject.set("didRequestChange", true);
    157164    }
  • trunk/WebCore/inspector/InspectorResource.h

    r43864 r47903  
    157157        Changes m_changes;
    158158        bool m_isMainResource;
     159        String m_requestMethod;
     160        String m_requestFormData;
    159161    };
    160162
  • trunk/WebCore/inspector/front-end/Resource.js

    r47633 r47903  
    2727 */
    2828
    29 WebInspector.Resource = function(requestHeaders, url, domain, path, lastPathComponent, identifier, mainResource, cached)
     29WebInspector.Resource = function(requestHeaders, url, domain, path, lastPathComponent, identifier, mainResource, cached, requestMethod, requestFormData)
    3030{
    3131    this.identifier = identifier;
     
    4040    this.lastPathComponent = lastPathComponent;
    4141    this.cached = cached;
     42    this.requestMethod = requestMethod || "";
     43    this.requestFormData = requestFormData || "";
    4244
    4345    this.category = WebInspector.resourceCategories.other;
  • trunk/WebCore/inspector/front-end/ResourceView.js

    r37289 r47903  
    11/*
    22 * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved.
     3 * Copyright (C) IBM Corp. 2009  All rights reserved.
    34 *
    45 * Redistribution and use in source and binary forms, with or without
     
    5960    this.headersTreeOutline.appendChild(this.requestHeadersTreeElement);
    6061
     62    this._decodeHover = WebInspector.UIString("Double-Click to toggle between URL encoded and decoded formats");
     63    this._decodeRequestParameters = true;
     64
     65    this.queryStringTreeElement = new TreeElement("", null, true);
     66    this.queryStringTreeElement.expanded = false;
     67    this.queryStringTreeElement.selectable = false;
     68    this.queryStringTreeElement.hidden = true;
     69    this.headersTreeOutline.appendChild(this.queryStringTreeElement);
     70
     71    this.formDataTreeElement = new TreeElement("", null, true);
     72    this.formDataTreeElement.expanded = false;
     73    this.formDataTreeElement.selectable = false;
     74    this.formDataTreeElement.hidden = true;
     75    this.headersTreeOutline.appendChild(this.formDataTreeElement);
     76
     77    this.requestPayloadTreeElement = new TreeElement(WebInspector.UIString("Request Payload"), null, true);
     78    this.requestPayloadTreeElement.expanded = false;
     79    this.requestPayloadTreeElement.selectable = false;
     80    this.requestPayloadTreeElement.hidden = true;
     81    this.headersTreeOutline.appendChild(this.requestPayloadTreeElement);
     82
    6183    this.responseHeadersTreeElement = new TreeElement("", null, true);
    6284    this.responseHeadersTreeElement.expanded = false;
     
    105127    _refreshURL: function()
    106128    {
    107         this.urlTreeElement.title = this.resource.url.escapeHTML();
     129        var url = this.resource.url;
     130        this.urlTreeElement.title = this.resource.requestMethod + " " + url.escapeHTML();
     131        this._refreshQueryString();
     132    },
     133
     134    _refreshQueryString: function()
     135    {
     136        var url = this.resource.url;
     137        var hasQueryString = url.indexOf("?") >= 0;
     138
     139        if (!hasQueryString) {
     140            this.queryStringTreeElement.hidden = true;
     141            return;
     142        }
     143
     144        this.queryStringTreeElement.hidden = false;
     145        var parmString = url.split("?", 2)[1];
     146        this._refreshParms(WebInspector.UIString("Query String Parameters"), parmString, this.queryStringTreeElement);
     147    },
     148
     149    _refreshFormData: function()
     150    {
     151        this.formDataTreeElement.hidden = true;
     152        this.requestPayloadTreeElement.hidden = true;
     153
     154        var isFormData = this.resource.requestFormData;
     155        if (!isFormData)
     156            return;
     157
     158        var isFormEncoded = false;
     159        var requestContentType = this._getHeaderValue(this.resource.requestHeaders, "Content-Type");
     160        if (requestContentType == "application/x-www-form-urlencoded")
     161            isFormEncoded = true;
     162
     163        if (isFormEncoded) {
     164            this.formDataTreeElement.hidden = false;
     165            this._refreshParms(WebInspector.UIString("Form Data"), this.resource.requestFormData, this.formDataTreeElement);
     166        } else {
     167            this.requestPayloadTreeElement.hidden = false;
     168            this._refreshRequestPayload(this.resource.requestFormData);
     169        }
     170    },
     171
     172    _refreshRequestPayload: function(formData)
     173    {
     174        this.requestPayloadTreeElement.removeChildren();
     175
     176        var title = "<div class=\"header-name\">&nbsp;</div>";
     177        title += "<div class=\"raw-form-data header-value\">" + formData.escapeHTML() + "</div>";
     178        var parmTreeElement = new TreeElement(title, null, false);
     179        this.requestPayloadTreeElement.appendChild(parmTreeElement);
     180    },
     181
     182    _refreshParms: function(title, parmString, parmsTreeElement)
     183    {
     184        var parms = parmString.split("&");
     185        for (var i = 0; i < parms.length; ++i) {
     186            var parm = parms[i];
     187            parm = parm.split("=", 2);
     188            if (parm.length == 1)
     189                parm.push("");
     190            parms[i] = parm;
     191        }
     192
     193        parmsTreeElement.removeChildren();
     194
     195        parmsTreeElement.title = title + "<span class=\"header-count\">" + WebInspector.UIString(" (%d)", parms.length) + "</span>";
     196
     197        for (var i = 0; i < parms.length; ++i) {
     198            var key = parms[i][0];
     199            var val = parms[i][1];
     200
     201            if (val.indexOf("%") >= 0)
     202                if (this._decodeRequestParameters)
     203                    val = decodeURIComponent(val).replace(/\+/g, " ");
     204
     205            var title = "<div class=\"header-name\">" + key.escapeHTML() + ":</div>";
     206            title += "<div class=\"header-value\">" + val.escapeHTML() + "</div>";
     207
     208            var parmTreeElement = new TreeElement(title, null, false);
     209            parmTreeElement.selectable = false;
     210            parmTreeElement.tooltip = this._decodeHover;
     211            parmTreeElement.ondblclick = this._toggleURLdecoding.bind(this);
     212            parmsTreeElement.appendChild(parmTreeElement);
     213        }
     214    },
     215
     216    _toggleURLdecoding: function(treeElement, event)
     217    {
     218        this._decodeRequestParameters = !this._decodeRequestParameters;
     219        this._refreshQueryString();
     220        this._refreshFormData();
     221    },
     222
     223    _getHeaderValue: function(headers, key)
     224    {
     225        var lowerKey = key.toLowerCase();
     226        for (var testKey in headers) {
     227            if (testKey.toLowerCase() === lowerKey)
     228                return headers[testKey];
     229        }
    108230    },
    109231
     
    111233    {
    112234        this._refreshHeaders(WebInspector.UIString("Request Headers"), this.resource.sortedRequestHeaders, this.requestHeadersTreeElement);
     235        this._refreshFormData();
    113236    },
    114237
  • trunk/WebCore/inspector/front-end/inspector.css

    r47822 r47903  
    774774}
    775775
     776.resource-view-headers .outline-disclosure .raw-form-data {
     777    white-space:pre-wrap;
     778}
     779
    776780.resource-view .resource-view-content {
    777781    position: absolute;
  • trunk/WebCore/inspector/front-end/inspector.js

    r47897 r47903  
    895895        identifier,
    896896        payload.isMainResource,
    897         payload.cached);
     897        payload.cached,
     898        payload.requestMethod,
     899        payload.requestFormData);
    898900    this.resources[identifier] = resource;
    899901    this.resourceURLMap[resource.url] = resource;
     
    938940        resource.requestHeaders = payload.requestHeaders;
    939941        resource.mainResource = payload.mainResource;
     942        resource.requestMethod = payload.requestMethod;
     943        resource.requestFormData = payload.requestFormData;
    940944    }
    941945
Note: See TracChangeset for help on using the changeset viewer.