| Index: Source/devtools/front_end/NetworkPanel.js
|
| diff --git a/Source/devtools/front_end/NetworkPanel.js b/Source/devtools/front_end/NetworkPanel.js
|
| index bf5df0279f35db3b82c1c665c5af505d12964ef1..ed1102e270e9e638af3f5bd29e653f884d7c047c 100644
|
| --- a/Source/devtools/front_end/NetworkPanel.js
|
| +++ b/Source/devtools/front_end/NetworkPanel.js
|
| @@ -28,6 +28,7 @@
|
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| */
|
|
|
| +importScript("FilterSuggestionBuilder.js");
|
| importScript("RequestView.js");
|
| importScript("NetworkItemView.js");
|
| importScript("RequestCookiesView.js");
|
| @@ -51,6 +52,7 @@ WebInspector.NetworkLogView = function(filterBar, coulmnsVisibilitySetting)
|
| WebInspector.View.call(this);
|
| this.registerRequiredCSS("networkLogView.css");
|
| this.registerRequiredCSS("filter.css");
|
| + this.registerRequiredCSS("textPrompt.css");
|
|
|
| this._filterBar = filterBar;
|
| this._coulmnsVisibilitySetting = coulmnsVisibilitySetting;
|
| @@ -67,6 +69,9 @@ WebInspector.NetworkLogView = function(filterBar, coulmnsVisibilitySetting)
|
| this._highlightedSubstringChanges = [];
|
| this._filteredOutRequests = new Map();
|
|
|
| + /** @type {!Array.<!WebInspector.NetworkLogView.Filter>} */
|
| + this._filters = [];
|
| +
|
| this._matchedRequestsMap = {};
|
| this._currentMatchedRequestIndex = -1;
|
|
|
| @@ -84,6 +89,7 @@ WebInspector.NetworkLogView = function(filterBar, coulmnsVisibilitySetting)
|
| WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded, this._domContentLoadedEventFired, this);
|
|
|
| this._addFilters();
|
| + this._resetSuggestionBuilder();
|
| this._initializeView();
|
| this._recordButton.toggled = true;
|
| WebInspector.networkLog.requests.forEach(this._appendRequest.bind(this));
|
| @@ -118,10 +124,17 @@ WebInspector.NetworkLogView.prototype = {
|
| this._filterBar.addFilter(this._dataURLFilterUI);
|
| },
|
|
|
| + _resetSuggestionBuilder: function()
|
| + {
|
| + this._suggestionBuilder = new WebInspector.FilterSuggestionBuilder(WebInspector.NetworkPanel._searchKeys);
|
| + this._textFilterUI.setSuggestionBuilder(this._suggestionBuilder);
|
| + },
|
| +
|
| _filterChanged: function(event)
|
| {
|
| this._removeAllNodeHighlights();
|
| this.searchCanceled();
|
| + this._parseFilterQuery(this._textFilterUI.value());
|
| this._filterRequests();
|
| },
|
|
|
| @@ -743,6 +756,7 @@ WebInspector.NetworkLogView.prototype = {
|
| this._requestsByURL = {};
|
| this._staleRequests = {};
|
| this._requestGridNodes = {};
|
| + this._resetSuggestionBuilder();
|
|
|
| if (this._dataGrid) {
|
| this._dataGrid.rootNode().removeChildren();
|
| @@ -806,6 +820,21 @@ WebInspector.NetworkLogView.prototype = {
|
| {
|
| if (!this._requestsById[request.requestId])
|
| return;
|
| +
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.Domain, request.domain);
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.MimeType, request.mimeType);
|
| +
|
| + var responseHeaders = request.responseHeaders;
|
| + for (var i = 0, l = responseHeaders.length; i < l; ++i)
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.HasResponseHeader, responseHeaders[i].name);
|
| + var cookies = request.responseCookies;
|
| + for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| + var cookie = cookies[i];
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.SetCookieDomain, cookie.domain());
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.SetCookieName, cookie.name());
|
| + this._suggestionBuilder.addItem(WebInspector.NetworkPanel.FilterType.SetCookieValue, cookie.value());
|
| + }
|
| +
|
| this._staleRequests[request.requestId] = request;
|
| this._scheduleRefresh();
|
| },
|
| @@ -1291,20 +1320,12 @@ WebInspector.NetworkLogView.prototype = {
|
| */
|
| _applyFilter: function(node)
|
| {
|
| - var filter = this._textFilterUI.regex();
|
| var request = node._request;
|
| -
|
| - var matches = true;
|
| + var matches = this._resourceTypeFilterUI.accept(request.type.name());
|
| if (this._dataURLFilterUI.checked() && request.parsedURL.isDataURL())
|
| matches = false;
|
| - if (matches && !this._resourceTypeFilterUI.accept(request.type.name()))
|
| - matches = false;
|
| -
|
| - if (matches && filter) {
|
| - matches = filter.test(request.name()) || filter.test(request.path());
|
| - if (matches)
|
| - this._highlightMatchedRequest(request, false, filter);
|
| - }
|
| + for (var i = 0; matches && (i < this._filters.length); ++i)
|
| + matches = this._filters[i](request);
|
|
|
| node.element.enableStyleClass("filtered-out", !matches);
|
| if (matches)
|
| @@ -1313,6 +1334,57 @@ WebInspector.NetworkLogView.prototype = {
|
| this._filteredOutRequests.put(request, true);
|
| },
|
|
|
| + /**
|
| + * @param {string} query
|
| + */
|
| + _parseFilterQuery: function(query)
|
| + {
|
| + var parsedQuery = this._suggestionBuilder.parseQuery(query);
|
| + this._filters = parsedQuery.text.map(this._createTextFilter);
|
| + for (var key in parsedQuery.filters) {
|
| + var filterType = /** @type {!WebInspector.NetworkPanel.FilterType} */ (key);
|
| + this._filters.push(this._createFilter(filterType, parsedQuery.filters[key]));
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * @param {string} text
|
| + * @return {!WebInspector.NetworkLogView.Filter}
|
| + */
|
| + _createTextFilter: function(text)
|
| + {
|
| + var regexp = new RegExp(text.escapeForRegExp(), "i");
|
| + return WebInspector.NetworkLogView._requestNameOrPathFilter.bind(null, regexp);
|
| + },
|
| +
|
| + /**
|
| + * @param {!WebInspector.NetworkPanel.FilterType} type
|
| + * @param {string} value
|
| + * @return {!WebInspector.NetworkLogView.Filter}
|
| + */
|
| + _createFilter: function(type, value) {
|
| + switch (type) {
|
| + case WebInspector.NetworkPanel.FilterType.Domain:
|
| + return WebInspector.NetworkLogView._requestDomainFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkPanel.FilterType.HasResponseHeader:
|
| + return WebInspector.NetworkLogView._requestResponseHeaderFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkPanel.FilterType.MimeType:
|
| + return WebInspector.NetworkLogView._requestMimeTypeFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkPanel.FilterType.SetCookieDomain:
|
| + return WebInspector.NetworkLogView._requestSetCookieDomainFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkPanel.FilterType.SetCookieName:
|
| + return WebInspector.NetworkLogView._requestSetCookieNameFilter.bind(null, value);
|
| +
|
| + case WebInspector.NetworkPanel.FilterType.SetCookieValue:
|
| + return WebInspector.NetworkLogView._requestSetCookieValueFilter.bind(null, value);
|
| + }
|
| + return this._createTextFilter(type + ":" + value);
|
| + },
|
| +
|
| _filterRequests: function()
|
| {
|
| this._removeAllHighlights();
|
| @@ -1472,6 +1544,94 @@ WebInspector.NetworkLogView.prototype = {
|
| __proto__: WebInspector.View.prototype
|
| }
|
|
|
| +/** @typedef {function(!WebInspector.NetworkRequest): boolean} */
|
| +WebInspector.NetworkLogView.Filter;
|
| +
|
| +/**
|
| + * @param {!RegExp} regex
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| +WebInspector.NetworkLogView._requestNameOrPathFilter = function(regex, request)
|
| +{
|
| + return regex.test(request.name()) || regex.test(request.path());
|
| +}
|
| +
|
| +/**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| +WebInspector.NetworkLogView._requestDomainFilter = function(value, request)
|
| +{
|
| + return request.domain === value;
|
| +}
|
| +
|
| +/**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| +WebInspector.NetworkLogView._requestResponseHeaderFilter = function(value, request)
|
| +{
|
| + return request.responseHeaderValue(value) !== undefined;
|
| +}
|
| +
|
| +/**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| +WebInspector.NetworkLogView._requestMimeTypeFilter = function(value, request)
|
| +{
|
| + return request.mimeType === value;
|
| +}
|
| +
|
| +/**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| +WebInspector.NetworkLogView._requestSetCookieDomainFilter = function(value, request)
|
| +{
|
| + var cookies = request.responseCookies;
|
| + for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| + if (cookies[i].domain() === value)
|
| + return false;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +/**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| +WebInspector.NetworkLogView._requestSetCookieNameFilter = function(value, request)
|
| +{
|
| + var cookies = request.responseCookies;
|
| + for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| + if (cookies[i].name() === value)
|
| + return false;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +/**
|
| + * @param {string} value
|
| + * @param {!WebInspector.NetworkRequest} request
|
| + * @return {boolean}
|
| + */
|
| +WebInspector.NetworkLogView._requestSetCookieValueFilter = function(value, request)
|
| +{
|
| + var cookies = request.responseCookies;
|
| + for (var i = 0, l = cookies ? cookies.length : 0; i < l; ++i) {
|
| + if (cookies[i].value() === value)
|
| + return false;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| /**
|
| * @param {!WebInspector.NetworkRequest} request
|
| * @return {boolean}
|
| @@ -1566,6 +1726,19 @@ WebInspector.NetworkPanel = function()
|
| WebInspector.GoToLineDialog.install(this, viewGetter.bind(this));
|
| }
|
|
|
| +/** @enum {string} */
|
| +WebInspector.NetworkPanel.FilterType = {
|
| + Domain: "Domain",
|
| + HasResponseHeader: "HasResponseHeader",
|
| + MimeType: "MimeType",
|
| + SetCookieDomain: "SetCookieDomain",
|
| + SetCookieName: "SetCookieName",
|
| + SetCookieValue: "SetCookieValue"
|
| +};
|
| +
|
| +/** @type {!Array.<string>} */
|
| +WebInspector.NetworkPanel._searchKeys = Object.values(WebInspector.NetworkPanel.FilterType);
|
| +
|
| WebInspector.NetworkPanel.prototype = {
|
| _onFiltersToggled: function(event)
|
| {
|
|
|