Commit 318155ce authored by eustas@chromium.org's avatar eustas@chromium.org

Dev Tools: NetworkPanel: Allow negation of filtering

BUG=412737

Review URL: https://codereview.chromium.org/654923002

git-svn-id: svn://svn.chromium.org/blink/trunk@183722 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent eb2a94ba
......@@ -3,37 +3,69 @@ Tests filter query parsing.
Keys: []
Query: plain text
Result: {"text":["plain text"],"filters":{}}
Result: {"text":["plain text"],"filters":[]}
Keys: ["single"]
Query: single:value
Result: {"text":[],"filters":{"single":"value"}}
Result: {"text":[],"filters":[{"type":"single","data":"value","negative":false}]}
Keys: ["single"]
Query: -single:value
Result: {"text":[],"filters":[{"type":"single","data":"value","negative":true}]}
Keys: ["one","two"]
Query: one:foo two:bar
Result: {"text":[],"filters":{"one":"foo","two":"bar"}}
Result: {"text":[],"filters":[{"type":"one","data":"foo","negative":false},{"type":"two","data":"bar","negative":false}]}
Keys: ["one","two"]
Query: -one:foo two:bar
Result: {"text":[],"filters":[{"type":"one","data":"foo","negative":true},{"type":"two","data":"bar","negative":false}]}
Keys: ["one","two"]
Query: -one:foo -two:bar
Result: {"text":[],"filters":[{"type":"one","data":"foo","negative":true},{"type":"two","data":"bar","negative":true}]}
Keys: ["one","two"]
Query: one:foo -two:bar
Result: {"text":[],"filters":[{"type":"one","data":"foo","negative":false},{"type":"two","data":"bar","negative":true}]}
Keys: ["key"]
Query: bar key foo
Result: {"text":["bar key foo"],"filters":{}}
Result: {"text":["bar key foo"],"filters":[]}
Keys: ["key"]
Query: bar key:foo
Result: {"text":["bar"],"filters":{"key":"foo"}}
Result: {"text":["bar"],"filters":[{"type":"key","data":"foo","negative":false}]}
Keys: ["key"]
Query: bar key:foo baz
Result: {"text":["bar","baz"],"filters":{"key":"foo"}}
Result: {"text":["bar","baz"],"filters":[{"type":"key","data":"foo","negative":false}]}
Keys: ["key"]
Query: bar key:foo yek:roo baz
Result: {"text":["bar","yek:roo baz"],"filters":[{"type":"key","data":"foo","negative":false}]}
Keys: ["key"]
Query: bar key:foo -yek:roo baz
Result: {"text":["bar","-yek:roo baz"],"filters":[{"type":"key","data":"foo","negative":false}]}
Keys: ["key"]
Query: bar baz key:foo goo zoo
Result: {"text":["bar baz","goo zoo"],"filters":{"key":"foo"}}
Result: {"text":["bar baz","goo zoo"],"filters":[{"type":"key","data":"foo","negative":false}]}
Keys: ["key"]
Query: bar key:key:foo
Result: {"text":["bar"],"filters":{"key":"key:foo"}}
Result: {"text":["bar"],"filters":[{"type":"key","data":"key:foo","negative":false}]}
Keys: ["key"]
Query: bar :key:foo baz
Result: {"text":["bar :key:foo baz"],"filters":{}}
Result: {"text":["bar :key:foo baz"],"filters":[]}
Keys: ["key"]
Query: bar -:key:foo baz
Result: {"text":["bar -:key:foo baz"],"filters":[]}
Keys: ["key"]
Query: bar key:-foo baz
Result: {"text":["bar","baz"],"filters":[{"type":"key","data":"-foo","negative":false}]}
......@@ -16,13 +16,21 @@ function test() {
checkQuery([], "plain text");
checkQuery(["single"], "single:value");
checkQuery(["single"], "-single:value");
checkQuery(["one", "two"], "one:foo two:bar");
checkQuery(["one", "two"], "-one:foo two:bar");
checkQuery(["one", "two"], "-one:foo -two:bar");
checkQuery(["one", "two"], "one:foo -two:bar");
checkQuery(["key"], "bar key foo");
checkQuery(["key"], "bar key:foo");
checkQuery(["key"], "bar key:foo baz");
checkQuery(["key"], "bar key:foo yek:roo baz");
checkQuery(["key"], "bar key:foo -yek:roo baz");
checkQuery(["key"], "bar baz key:foo goo zoo");
checkQuery(["key"], "bar key:key:foo");
checkQuery(["key"], "bar :key:foo baz");
checkQuery(["key"], "bar -:key:foo baz");
checkQuery(["key"], "bar key:-foo baz");
InspectorTest.completeTest();
}
......
......@@ -40,6 +40,9 @@ WebInspector.FilterSuggestionBuilder = function(keys)
this._valueLists = {};
}
/** @typedef {{type: string, data: string, negative: boolean}} */
WebInspector.FilterSuggestionBuilder.Filter;
WebInspector.FilterSuggestionBuilder.prototype = {
/**
* @param {!HTMLInputElement} input
......@@ -60,6 +63,10 @@ WebInspector.FilterSuggestionBuilder.prototype = {
if (!prefix)
return [];
var negative = prefix.startsWith("-");
if (negative)
prefix = prefix.substring(1);
var modifier = negative ? "-" : "";
var valueDelimiterIndex = prefix.indexOf(":");
var suggestions = [];
......@@ -67,7 +74,7 @@ WebInspector.FilterSuggestionBuilder.prototype = {
var matcher = new RegExp("^" + prefix.escapeForRegExp(), "i");
for (var j = 0; j < this._keys.length; ++j) {
if (this._keys[j].match(matcher))
suggestions.push(this._keys[j] + ":");
suggestions.push(modifier + this._keys[j] + ":");
}
} else {
var key = prefix.substring(0, valueDelimiterIndex);
......@@ -76,7 +83,7 @@ WebInspector.FilterSuggestionBuilder.prototype = {
var items = this._values(key);
for (var i = 0; i < items.length; ++i) {
if (items[i].match(matcher) && (items[i] !== value))
suggestions.push(key + ":" + items[i]);
suggestions.push(modifier + key + ":" + items[i]);
}
}
return suggestions;
......@@ -155,11 +162,11 @@ WebInspector.FilterSuggestionBuilder.prototype = {
/**
* @param {string} query
* @return {{text: !Array.<string>, filters: !Object.<string, string>}}
* @return {{text: !Array.<string>, filters: !Array.<!WebInspector.FilterSuggestionBuilder.Filter>}}
*/
parseQuery: function(query)
{
var filters = {};
var filters = [];
var text = [];
var i = 0;
var j = 0;
......@@ -174,6 +181,9 @@ WebInspector.FilterSuggestionBuilder.prototype = {
}
var spaceIndex = query.lastIndexOf(" ", colonIndex);
var key = query.substring(spaceIndex + 1, colonIndex);
var negative = key.startsWith("-");
if (negative)
key = key.substring(1);
if (this._keys.indexOf(key) == -1) {
i = colonIndex + 1;
continue;
......@@ -183,10 +193,10 @@ WebInspector.FilterSuggestionBuilder.prototype = {
text.push(part);
var nextSpace = query.indexOf(" ", colonIndex + 1);
if (nextSpace == -1) {
filters[key] = query.substring(colonIndex + 1);
filters.push({type: key, data: query.substring(colonIndex + 1), negative: negative});
break;
}
filters[key] = query.substring(colonIndex + 1, nextSpace);
filters.push({type: key, data: query.substring(colonIndex + 1, nextSpace), negative: negative});
i = nextSpace + 1;
j = i;
}
......
......@@ -1481,9 +1481,12 @@ WebInspector.NetworkLogView.prototype = {
{
var parsedQuery = this._suggestionBuilder.parseQuery(query);
this._filters = parsedQuery.text.map(this._createTextFilter);
for (var key in parsedQuery.filters) {
var filterType = /** @type {!WebInspector.NetworkLogView.FilterType} */ (key);
this._filters.push(this._createFilter(filterType, parsedQuery.filters[key]));
var filters = parsedQuery.filters;
var n = parsedQuery.filters.length;
for (var i = 0; i < n; ++i) {
var filter = parsedQuery.filters[i];
var filterType = /** @type {!WebInspector.NetworkLogView.FilterType} */ (filter.type);
this._filters.push(this._createFilter(filterType, filter.data, filter.negative));
}
},
......@@ -1500,9 +1503,26 @@ WebInspector.NetworkLogView.prototype = {
/**
* @param {!WebInspector.NetworkLogView.FilterType} type
* @param {string} value
* @param {boolean} negative
* @return {!WebInspector.NetworkLogView.Filter}
*/
_createFilter: function(type, value) {
_createFilter: function(type, value, negative)
{
var filter = this._createSpecialFilter(type, value);
if (!filter)
return this._createTextFilter((negative ? "-" : "") + type + ":" + value);
if (negative)
return WebInspector.NetworkLogView._negativeFilter.bind(null, filter);
return filter;
},
/**
* @param {!WebInspector.NetworkLogView.FilterType} type
* @param {string} value
* @return {?WebInspector.NetworkLogView.Filter}
*/
_createSpecialFilter: function(type, value)
{
switch (type) {
case WebInspector.NetworkLogView.FilterType.Domain:
return WebInspector.NetworkLogView._requestDomainFilter.bind(null, value);
......@@ -1536,7 +1556,7 @@ WebInspector.NetworkLogView.prototype = {
case WebInspector.NetworkLogView.FilterType.StatusCode:
return WebInspector.NetworkLogView._statusCodeFilter.bind(null, value);
}
return this._createTextFilter(type + ":" + value);
return null;
},
_filterRequests: function()
......@@ -1704,6 +1724,16 @@ WebInspector.NetworkLogView.prototype = {
/** @typedef {function(!WebInspector.NetworkRequest): boolean} */
WebInspector.NetworkLogView.Filter;
/**
* @param {!WebInspector.NetworkLogView.Filter} filter
* @param {!WebInspector.NetworkRequest} request
* @return {boolean}
*/
WebInspector.NetworkLogView._negativeFilter = function(filter, request)
{
return !filter(request);
}
/**
* @param {!RegExp} regex
* @param {!WebInspector.NetworkRequest} request
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment