Index: third_party/WebKit/Source/devtools/front_end/profiler/ProfileDataGrid.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileDataGrid.js b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileDataGrid.js |
index 92a3d9ee2bde26c3cb217e8ee413370fdb7d5822..2fb7fc6e23d68c4a3abf7a9bb04b841b4851b44f 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/profiler/ProfileDataGrid.js |
+++ b/third_party/WebKit/Source/devtools/front_end/profiler/ProfileDataGrid.js |
@@ -22,17 +22,17 @@ |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
- |
/** |
- * @constructor |
- * @extends {WebInspector.DataGridNode} |
- * @param {!WebInspector.ProfileNode} profileNode |
- * @param {!WebInspector.ProfileDataGridTree} owningTree |
- * @param {boolean} hasChildren |
+ * @unrestricted |
*/ |
-WebInspector.ProfileDataGridNode = function(profileNode, owningTree, hasChildren) |
-{ |
- WebInspector.DataGridNode.call(this, null, hasChildren); |
+WebInspector.ProfileDataGridNode = class extends WebInspector.DataGridNode { |
+ /** |
+ * @param {!WebInspector.ProfileNode} profileNode |
+ * @param {!WebInspector.ProfileDataGridTree} owningTree |
+ * @param {boolean} hasChildren |
+ */ |
+ constructor(profileNode, owningTree, hasChildren) { |
+ super(null, hasChildren); |
this.profileNode = profileNode; |
this.tree = owningTree; |
@@ -44,233 +44,59 @@ WebInspector.ProfileDataGridNode = function(profileNode, owningTree, hasChildren |
this.self = profileNode.self; |
this.total = profileNode.total; |
this.functionName = WebInspector.beautifyFunctionName(profileNode.functionName); |
- this._deoptReason = profileNode.deoptReason || ""; |
+ this._deoptReason = profileNode.deoptReason || ''; |
this.url = profileNode.url; |
-}; |
- |
-WebInspector.ProfileDataGridNode.prototype = { |
- /** |
- * @override |
- * @param {string} columnId |
- * @return {!Element} |
- */ |
- createCell: function(columnId) |
- { |
- var cell; |
- switch (columnId) { |
- case "self": |
- cell = this._createValueCell(this.self, this.selfPercent); |
- cell.classList.toggle("highlight", this._searchMatchedSelfColumn); |
- break; |
- |
- case "total": |
- cell = this._createValueCell(this.total, this.totalPercent); |
- cell.classList.toggle("highlight", this._searchMatchedTotalColumn); |
- break; |
- |
- case "function": |
- cell = this.createTD(columnId); |
- cell.classList.toggle("highlight", this._searchMatchedFunctionColumn); |
- if (this._deoptReason) { |
- cell.classList.add("not-optimized"); |
- cell.createChild("span", "profile-warn-marker").title = WebInspector.UIString("Not optimized: %s", this._deoptReason); |
- } |
- cell.createTextChild(this.functionName); |
- if (this.profileNode.scriptId === "0") |
- break; |
- var urlElement = this.tree._formatter.linkifyNode(this); |
- if (!urlElement) |
- break; |
- urlElement.style.maxWidth = "75%"; |
- cell.appendChild(urlElement); |
- break; |
- |
- default: |
- cell = WebInspector.DataGridNode.prototype.createCell.call(this, columnId); |
- break; |
+ } |
+ |
+ /** |
+ * @param {!Array<!Array<!WebInspector.ProfileDataGridNode>>} gridNodeGroups |
+ * @param {function(!T, !T)} comparator |
+ * @param {boolean} force |
+ * @template T |
+ */ |
+ static sort(gridNodeGroups, comparator, force) { |
+ for (var gridNodeGroupIndex = 0; gridNodeGroupIndex < gridNodeGroups.length; ++gridNodeGroupIndex) { |
+ var gridNodes = gridNodeGroups[gridNodeGroupIndex]; |
+ var count = gridNodes.length; |
+ |
+ for (var index = 0; index < count; ++index) { |
+ var gridNode = gridNodes[index]; |
+ |
+ // If the grid node is collapsed, then don't sort children (save operation for later). |
+ // If the grid node has the same sorting as previously, then there is no point in sorting it again. |
+ if (!force && (!gridNode.expanded || gridNode.lastComparator === comparator)) { |
+ if (gridNode.children.length) |
+ gridNode.shouldRefreshChildren = true; |
+ continue; |
} |
- return cell; |
- }, |
- /** |
- * @param {number} value |
- * @param {number} percent |
- * @return {!Element} |
- */ |
- _createValueCell: function(value, percent) |
- { |
- var cell = createElementWithClass("td", "numeric-column"); |
- var div = cell.createChild("div", "profile-multiple-values"); |
- div.createChild("span").textContent = this.tree._formatter.formatValue(value, this); |
- div.createChild("span", "percent-column").textContent = this.tree._formatter.formatPercent(percent, this); |
- return cell; |
- }, |
+ gridNode.lastComparator = comparator; |
- /** |
- * @param {function(!T, !T)} comparator |
- * @param {boolean} force |
- * @template T |
- */ |
- sort: function(comparator, force) |
- { |
- var gridNodeGroups = [[this]]; |
- |
- for (var gridNodeGroupIndex = 0; gridNodeGroupIndex < gridNodeGroups.length; ++gridNodeGroupIndex) { |
- var gridNodes = gridNodeGroups[gridNodeGroupIndex]; |
- var count = gridNodes.length; |
- |
- for (var index = 0; index < count; ++index) { |
- var gridNode = gridNodes[index]; |
- |
- // If the grid node is collapsed, then don't sort children (save operation for later). |
- // If the grid node has the same sorting as previously, then there is no point in sorting it again. |
- if (!force && (!gridNode.expanded || gridNode.lastComparator === comparator)) { |
- if (gridNode.children.length) |
- gridNode.shouldRefreshChildren = true; |
- continue; |
- } |
+ var children = gridNode.children; |
+ var childCount = children.length; |
- gridNode.lastComparator = comparator; |
+ if (childCount) { |
+ children.sort(comparator); |
- var children = gridNode.children; |
- var childCount = children.length; |
+ for (var childIndex = 0; childIndex < childCount; ++childIndex) |
+ children[childIndex].recalculateSiblings(childIndex); |
- if (childCount) { |
- children.sort(comparator); |
- |
- for (var childIndex = 0; childIndex < childCount; ++childIndex) |
- children[childIndex].recalculateSiblings(childIndex); |
- |
- gridNodeGroups.push(children); |
- } |
- } |
+ gridNodeGroups.push(children); |
} |
- }, |
- |
- /** |
- * @override |
- * @param {!WebInspector.DataGridNode} profileDataGridNode |
- * @param {number} index |
- */ |
- insertChild: function(profileDataGridNode, index) |
- { |
- WebInspector.DataGridNode.prototype.insertChild.call(this, profileDataGridNode, index); |
- |
- this.childrenByCallUID.set(profileDataGridNode.callUID, /** @type {!WebInspector.ProfileDataGridNode} */ (profileDataGridNode)); |
- }, |
- |
- /** |
- * @override |
- * @param {!WebInspector.DataGridNode} profileDataGridNode |
- */ |
- removeChild: function(profileDataGridNode) |
- { |
- WebInspector.DataGridNode.prototype.removeChild.call(this, profileDataGridNode); |
- |
- this.childrenByCallUID.delete((/** @type {!WebInspector.ProfileDataGridNode} */ (profileDataGridNode)).callUID); |
- }, |
- |
- removeChildren: function() |
- { |
- WebInspector.DataGridNode.prototype.removeChildren.call(this); |
- |
- this.childrenByCallUID.clear(); |
- }, |
- |
- /** |
- * @param {!WebInspector.ProfileDataGridNode} node |
- * @return {?WebInspector.ProfileDataGridNode} |
- */ |
- findChild: function(node) |
- { |
- if (!node) |
- return null; |
- return this.childrenByCallUID.get(node.callUID); |
- }, |
- |
- get selfPercent() |
- { |
- return this.self / this.tree.total * 100.0; |
- }, |
- |
- get totalPercent() |
- { |
- return this.total / this.tree.total * 100.0; |
- }, |
- |
- populate: function() |
- { |
- WebInspector.ProfileDataGridNode.populate(this); |
- }, |
- |
- /** |
- * @protected |
- */ |
- populateChildren: function() |
- { |
- }, |
- |
- // When focusing and collapsing we modify lots of nodes in the tree. |
- // This allows us to restore them all to their original state when we revert. |
- |
- save: function() |
- { |
- if (this._savedChildren) |
- return; |
- |
- this._savedSelf = this.self; |
- this._savedTotal = this.total; |
- |
- this._savedChildren = this.children.slice(); |
- }, |
- |
- /** |
- * When focusing and collapsing we modify lots of nodes in the tree. |
- * This allows us to restore them all to their original state when we revert. |
- * @protected |
- */ |
- restore: function() |
- { |
- if (!this._savedChildren) |
- return; |
- |
- this.self = this._savedSelf; |
- this.total = this._savedTotal; |
- |
- this.removeChildren(); |
- |
- var children = this._savedChildren; |
- var count = children.length; |
- |
- for (var index = 0; index < count; ++index) { |
- children[index].restore(); |
- this.appendChild(children[index]); |
- } |
- }, |
- |
- /** |
- * @param {!WebInspector.ProfileDataGridNode} child |
- * @param {boolean} shouldAbsorb |
- */ |
- merge: function(child, shouldAbsorb) |
- { |
- WebInspector.ProfileDataGridNode.merge(this, child, shouldAbsorb); |
- }, |
- |
- __proto__: WebInspector.DataGridNode.prototype |
-}; |
- |
-/** |
- * @param {!WebInspector.ProfileDataGridNode|!WebInspector.ProfileDataGridTree} container |
- * @param {!WebInspector.ProfileDataGridNode} child |
- * @param {boolean} shouldAbsorb |
- */ |
-WebInspector.ProfileDataGridNode.merge = function(container, child, shouldAbsorb) |
-{ |
+ } |
+ } |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.ProfileDataGridNode|!WebInspector.ProfileDataGridTree} container |
+ * @param {!WebInspector.ProfileDataGridNode} child |
+ * @param {boolean} shouldAbsorb |
+ */ |
+ static merge(container, child, shouldAbsorb) { |
container.self += child.self; |
if (!shouldAbsorb) |
- container.total += child.total; |
+ container.total += child.total; |
var children = container.children.slice(); |
@@ -279,31 +105,30 @@ WebInspector.ProfileDataGridNode.merge = function(container, child, shouldAbsorb |
var count = children.length; |
for (var index = 0; index < count; ++index) { |
- if (!shouldAbsorb || children[index] !== child) |
- container.appendChild(children[index]); |
+ if (!shouldAbsorb || children[index] !== child) |
+ container.appendChild(children[index]); |
} |
children = child.children.slice(); |
count = children.length; |
for (var index = 0; index < count; ++index) { |
- var orphanedChild = children[index]; |
- var existingChild = container.childrenByCallUID.get(orphanedChild.callUID); |
+ var orphanedChild = children[index]; |
+ var existingChild = container.childrenByCallUID.get(orphanedChild.callUID); |
- if (existingChild) |
- existingChild.merge(/** @type{!WebInspector.ProfileDataGridNode} */(orphanedChild), false); |
- else |
- container.appendChild(orphanedChild); |
+ if (existingChild) |
+ existingChild.merge(/** @type{!WebInspector.ProfileDataGridNode} */ (orphanedChild), false); |
+ else |
+ container.appendChild(orphanedChild); |
} |
-}; |
+ } |
-/** |
- * @param {!WebInspector.ProfileDataGridNode|!WebInspector.ProfileDataGridTree} container |
- */ |
-WebInspector.ProfileDataGridNode.populate = function(container) |
-{ |
+ /** |
+ * @param {!WebInspector.ProfileDataGridNode|!WebInspector.ProfileDataGridTree} container |
+ */ |
+ static populate(container) { |
if (container._populated) |
- return; |
+ return; |
container._populated = true; |
container.populateChildren(); |
@@ -311,18 +136,193 @@ WebInspector.ProfileDataGridNode.populate = function(container) |
var currentComparator = container.tree.lastComparator; |
if (currentComparator) |
- container.sort(currentComparator, true); |
+ container.sort(currentComparator, true); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {string} columnId |
+ * @return {!Element} |
+ */ |
+ createCell(columnId) { |
+ var cell; |
+ switch (columnId) { |
+ case 'self': |
+ cell = this._createValueCell(this.self, this.selfPercent); |
+ cell.classList.toggle('highlight', this._searchMatchedSelfColumn); |
+ break; |
+ |
+ case 'total': |
+ cell = this._createValueCell(this.total, this.totalPercent); |
+ cell.classList.toggle('highlight', this._searchMatchedTotalColumn); |
+ break; |
+ |
+ case 'function': |
+ cell = this.createTD(columnId); |
+ cell.classList.toggle('highlight', this._searchMatchedFunctionColumn); |
+ if (this._deoptReason) { |
+ cell.classList.add('not-optimized'); |
+ cell.createChild('span', 'profile-warn-marker').title = |
+ WebInspector.UIString('Not optimized: %s', this._deoptReason); |
+ } |
+ cell.createTextChild(this.functionName); |
+ if (this.profileNode.scriptId === '0') |
+ break; |
+ var urlElement = this.tree._formatter.linkifyNode(this); |
+ if (!urlElement) |
+ break; |
+ urlElement.style.maxWidth = '75%'; |
+ cell.appendChild(urlElement); |
+ break; |
+ |
+ default: |
+ cell = super.createCell(columnId); |
+ break; |
+ } |
+ return cell; |
+ } |
+ |
+ /** |
+ * @param {number} value |
+ * @param {number} percent |
+ * @return {!Element} |
+ */ |
+ _createValueCell(value, percent) { |
+ var cell = createElementWithClass('td', 'numeric-column'); |
+ var div = cell.createChild('div', 'profile-multiple-values'); |
+ div.createChild('span').textContent = this.tree._formatter.formatValue(value, this); |
+ div.createChild('span', 'percent-column').textContent = this.tree._formatter.formatPercent(percent, this); |
+ return cell; |
+ } |
+ |
+ /** |
+ * @param {function(!T, !T)} comparator |
+ * @param {boolean} force |
+ * @template T |
+ */ |
+ sort(comparator, force) { |
+ return WebInspector.ProfileDataGridNode.sort([[this]], comparator, force); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {!WebInspector.DataGridNode} profileDataGridNode |
+ * @param {number} index |
+ */ |
+ insertChild(profileDataGridNode, index) { |
+ super.insertChild(profileDataGridNode, index); |
+ |
+ this.childrenByCallUID.set( |
+ profileDataGridNode.callUID, /** @type {!WebInspector.ProfileDataGridNode} */ (profileDataGridNode)); |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {!WebInspector.DataGridNode} profileDataGridNode |
+ */ |
+ removeChild(profileDataGridNode) { |
+ super.removeChild(profileDataGridNode); |
+ |
+ this.childrenByCallUID.delete((/** @type {!WebInspector.ProfileDataGridNode} */ (profileDataGridNode)).callUID); |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ removeChildren() { |
+ super.removeChildren(); |
+ |
+ this.childrenByCallUID.clear(); |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.ProfileDataGridNode} node |
+ * @return {?WebInspector.ProfileDataGridNode} |
+ */ |
+ findChild(node) { |
+ if (!node) |
+ return null; |
+ return this.childrenByCallUID.get(node.callUID); |
+ } |
+ |
+ get selfPercent() { |
+ return this.self / this.tree.total * 100.0; |
+ } |
+ |
+ get totalPercent() { |
+ return this.total / this.tree.total * 100.0; |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ populate() { |
+ WebInspector.ProfileDataGridNode.populate(this); |
+ } |
+ |
+ /** |
+ * @protected |
+ */ |
+ populateChildren() { |
+ } |
+ |
+ // When focusing and collapsing we modify lots of nodes in the tree. |
+ // This allows us to restore them all to their original state when we revert. |
+ |
+ save() { |
+ if (this._savedChildren) |
+ return; |
+ |
+ this._savedSelf = this.self; |
+ this._savedTotal = this.total; |
+ |
+ this._savedChildren = this.children.slice(); |
+ } |
+ |
+ /** |
+ * When focusing and collapsing we modify lots of nodes in the tree. |
+ * This allows us to restore them all to their original state when we revert. |
+ * @protected |
+ */ |
+ restore() { |
+ if (!this._savedChildren) |
+ return; |
+ |
+ this.self = this._savedSelf; |
+ this.total = this._savedTotal; |
+ |
+ this.removeChildren(); |
+ |
+ var children = this._savedChildren; |
+ var count = children.length; |
+ |
+ for (var index = 0; index < count; ++index) { |
+ children[index].restore(); |
+ this.appendChild(children[index]); |
+ } |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.ProfileDataGridNode} child |
+ * @param {boolean} shouldAbsorb |
+ */ |
+ merge(child, shouldAbsorb) { |
+ WebInspector.ProfileDataGridNode.merge(this, child, shouldAbsorb); |
+ } |
}; |
+ |
/** |
- * @constructor |
* @implements {WebInspector.Searchable} |
- * @param {!WebInspector.ProfileDataGridNode.Formatter} formatter |
- * @param {!WebInspector.SearchableView} searchableView |
- * @param {number} total |
+ * @unrestricted |
*/ |
-WebInspector.ProfileDataGridTree = function(formatter, searchableView, total) |
-{ |
+WebInspector.ProfileDataGridTree = class { |
+ /** |
+ * @param {!WebInspector.ProfileDataGridNode.Formatter} formatter |
+ * @param {!WebInspector.SearchableView} searchableView |
+ * @param {number} total |
+ */ |
+ constructor(formatter, searchableView, total) { |
this.tree = this; |
this.children = []; |
this._formatter = formatter; |
@@ -330,326 +330,323 @@ WebInspector.ProfileDataGridTree = function(formatter, searchableView, total) |
this.total = total; |
this.lastComparator = null; |
this.childrenByCallUID = new Map(); |
-}; |
+ } |
+ |
+ /** |
+ * @param {string} property |
+ * @param {boolean} isAscending |
+ * @return {function(!Object.<string, *>, !Object.<string, *>)} |
+ */ |
+ static propertyComparator(property, isAscending) { |
+ var comparator = WebInspector.ProfileDataGridTree.propertyComparators[(isAscending ? 1 : 0)][property]; |
-WebInspector.ProfileDataGridTree.prototype = { |
- get expanded() |
- { |
- return true; |
- }, |
+ if (!comparator) { |
+ if (isAscending) { |
+ comparator = function(lhs, rhs) { |
+ if (lhs[property] < rhs[property]) |
+ return -1; |
- appendChild: function(child) |
- { |
- this.insertChild(child, this.children.length); |
- }, |
+ if (lhs[property] > rhs[property]) |
+ return 1; |
- insertChild: function(child, index) |
- { |
- this.children.splice(index, 0, child); |
- this.childrenByCallUID.set(child.callUID, child); |
- }, |
+ return 0; |
+ }; |
+ } else { |
+ comparator = function(lhs, rhs) { |
+ if (lhs[property] > rhs[property]) |
+ return -1; |
- removeChildren: function() |
- { |
- this.children = []; |
- this.childrenByCallUID.clear(); |
- }, |
+ if (lhs[property] < rhs[property]) |
+ return 1; |
- populateChildren: function() |
- { |
- }, |
+ return 0; |
+ }; |
+ } |
- findChild: WebInspector.ProfileDataGridNode.prototype.findChild, |
- sort: WebInspector.ProfileDataGridNode.prototype.sort, |
+ WebInspector.ProfileDataGridTree.propertyComparators[(isAscending ? 1 : 0)][property] = comparator; |
+ } |
- /** |
- * @protected |
- */ |
- save: function() |
- { |
- if (this._savedChildren) |
- return; |
+ return comparator; |
+ } |
- this._savedTotal = this.total; |
- this._savedChildren = this.children.slice(); |
- }, |
+ get expanded() { |
+ return true; |
+ } |
- restore: function() |
- { |
- if (!this._savedChildren) |
- return; |
+ appendChild(child) { |
+ this.insertChild(child, this.children.length); |
+ } |
- this.children = this._savedChildren; |
- this.total = this._savedTotal; |
+ insertChild(child, index) { |
+ this.children.splice(index, 0, child); |
+ this.childrenByCallUID.set(child.callUID, child); |
+ } |
- var children = this.children; |
- var count = children.length; |
+ removeChildren() { |
+ this.children = []; |
+ this.childrenByCallUID.clear(); |
+ } |
+ |
+ populateChildren() { |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.ProfileDataGridNode} node |
+ * @return {?WebInspector.ProfileDataGridNode} |
+ */ |
+ findChild(node) { |
+ if (!node) |
+ return null; |
+ return this.childrenByCallUID.get(node.callUID); |
+ } |
+ |
+ /** |
+ * @param {function(!T, !T)} comparator |
+ * @param {boolean} force |
+ * @template T |
+ */ |
+ sort(comparator, force) { |
+ return WebInspector.ProfileDataGridNode.sort([[this]], comparator, force); |
+ } |
+ |
+ /** |
+ * @protected |
+ */ |
+ save() { |
+ if (this._savedChildren) |
+ return; |
+ |
+ this._savedTotal = this.total; |
+ this._savedChildren = this.children.slice(); |
+ } |
+ |
+ restore() { |
+ if (!this._savedChildren) |
+ return; |
+ |
+ this.children = this._savedChildren; |
+ this.total = this._savedTotal; |
+ |
+ var children = this.children; |
+ var count = children.length; |
- for (var index = 0; index < count; ++index) |
- children[index].restore(); |
+ for (var index = 0; index < count; ++index) |
+ children[index].restore(); |
+ |
+ this._savedChildren = null; |
+ } |
+ |
+ /** |
+ * @param {!WebInspector.SearchableView.SearchConfig} searchConfig |
+ * @return {?function(!WebInspector.ProfileDataGridNode):boolean} |
+ */ |
+ _matchFunction(searchConfig) { |
+ var query = searchConfig.query.trim(); |
+ if (!query.length) |
+ return null; |
+ |
+ var greaterThan = (query.startsWith('>')); |
+ var lessThan = (query.startsWith('<')); |
+ var equalTo = (query.startsWith('=') || ((greaterThan || lessThan) && query.indexOf('=') === 1)); |
+ var percentUnits = (query.endsWith('%')); |
+ var millisecondsUnits = (query.length > 2 && query.endsWith('ms')); |
+ var secondsUnits = (!millisecondsUnits && query.endsWith('s')); |
+ |
+ var queryNumber = parseFloat(query); |
+ if (greaterThan || lessThan || equalTo) { |
+ if (equalTo && (greaterThan || lessThan)) |
+ queryNumber = parseFloat(query.substring(2)); |
+ else |
+ queryNumber = parseFloat(query.substring(1)); |
+ } |
- this._savedChildren = null; |
- }, |
+ var queryNumberMilliseconds = (secondsUnits ? (queryNumber * 1000) : queryNumber); |
- /** |
- * @param {!WebInspector.SearchableView.SearchConfig} searchConfig |
- * @return {?function(!WebInspector.ProfileDataGridNode):boolean} |
- */ |
- _matchFunction: function(searchConfig) |
- { |
- var query = searchConfig.query.trim(); |
- if (!query.length) |
- return null; |
- |
- var greaterThan = (query.startsWith(">")); |
- var lessThan = (query.startsWith("<")); |
- var equalTo = (query.startsWith("=") || ((greaterThan || lessThan) && query.indexOf("=") === 1)); |
- var percentUnits = (query.endsWith("%")); |
- var millisecondsUnits = (query.length > 2 && query.endsWith("ms")); |
- var secondsUnits = (!millisecondsUnits && query.endsWith("s")); |
- |
- var queryNumber = parseFloat(query); |
- if (greaterThan || lessThan || equalTo) { |
- if (equalTo && (greaterThan || lessThan)) |
- queryNumber = parseFloat(query.substring(2)); |
- else |
- queryNumber = parseFloat(query.substring(1)); |
- } |
+ // Make equalTo implicitly true if it wasn't specified there is no other operator. |
+ if (!isNaN(queryNumber) && !(greaterThan || lessThan)) |
+ equalTo = true; |
- var queryNumberMilliseconds = (secondsUnits ? (queryNumber * 1000) : queryNumber); |
- |
- // Make equalTo implicitly true if it wasn't specified there is no other operator. |
- if (!isNaN(queryNumber) && !(greaterThan || lessThan)) |
- equalTo = true; |
- |
- var matcher = createPlainTextSearchRegex(query, "i"); |
- |
- /** |
- * @param {!WebInspector.ProfileDataGridNode} profileDataGridNode |
- * @return {boolean} |
- */ |
- function matchesQuery(profileDataGridNode) |
- { |
- delete profileDataGridNode._searchMatchedSelfColumn; |
- delete profileDataGridNode._searchMatchedTotalColumn; |
- delete profileDataGridNode._searchMatchedFunctionColumn; |
- |
- if (percentUnits) { |
- if (lessThan) { |
- if (profileDataGridNode.selfPercent < queryNumber) |
- profileDataGridNode._searchMatchedSelfColumn = true; |
- if (profileDataGridNode.totalPercent < queryNumber) |
- profileDataGridNode._searchMatchedTotalColumn = true; |
- } else if (greaterThan) { |
- if (profileDataGridNode.selfPercent > queryNumber) |
- profileDataGridNode._searchMatchedSelfColumn = true; |
- if (profileDataGridNode.totalPercent > queryNumber) |
- profileDataGridNode._searchMatchedTotalColumn = true; |
- } |
- |
- if (equalTo) { |
- if (profileDataGridNode.selfPercent === queryNumber) |
- profileDataGridNode._searchMatchedSelfColumn = true; |
- if (profileDataGridNode.totalPercent === queryNumber) |
- profileDataGridNode._searchMatchedTotalColumn = true; |
- } |
- } else if (millisecondsUnits || secondsUnits) { |
- if (lessThan) { |
- if (profileDataGridNode.self < queryNumberMilliseconds) |
- profileDataGridNode._searchMatchedSelfColumn = true; |
- if (profileDataGridNode.total < queryNumberMilliseconds) |
- profileDataGridNode._searchMatchedTotalColumn = true; |
- } else if (greaterThan) { |
- if (profileDataGridNode.self > queryNumberMilliseconds) |
- profileDataGridNode._searchMatchedSelfColumn = true; |
- if (profileDataGridNode.total > queryNumberMilliseconds) |
- profileDataGridNode._searchMatchedTotalColumn = true; |
- } |
- |
- if (equalTo) { |
- if (profileDataGridNode.self === queryNumberMilliseconds) |
- profileDataGridNode._searchMatchedSelfColumn = true; |
- if (profileDataGridNode.total === queryNumberMilliseconds) |
- profileDataGridNode._searchMatchedTotalColumn = true; |
- } |
- } |
- |
- if (profileDataGridNode.functionName.match(matcher) || (profileDataGridNode.url && profileDataGridNode.url.match(matcher))) |
- profileDataGridNode._searchMatchedFunctionColumn = true; |
- |
- if (profileDataGridNode._searchMatchedSelfColumn || |
- profileDataGridNode._searchMatchedTotalColumn || |
- profileDataGridNode._searchMatchedFunctionColumn) { |
- profileDataGridNode.refresh(); |
- return true; |
- } |
- |
- return false; |
- } |
- return matchesQuery; |
- }, |
+ var matcher = createPlainTextSearchRegex(query, 'i'); |
/** |
- * @override |
- * @param {!WebInspector.SearchableView.SearchConfig} searchConfig |
- * @param {boolean} shouldJump |
- * @param {boolean=} jumpBackwards |
+ * @param {!WebInspector.ProfileDataGridNode} profileDataGridNode |
+ * @return {boolean} |
*/ |
- performSearch: function(searchConfig, shouldJump, jumpBackwards) |
- { |
- this.searchCanceled(); |
- var matchesQuery = this._matchFunction(searchConfig); |
- if (!matchesQuery) |
- return; |
- |
- this._searchResults = []; |
- for (var current = this.children[0]; current; current = current.traverseNextNode(false, null, false)) { |
- if (matchesQuery(current)) |
- this._searchResults.push({ profileNode: current }); |
+ function matchesQuery(profileDataGridNode) { |
+ delete profileDataGridNode._searchMatchedSelfColumn; |
+ delete profileDataGridNode._searchMatchedTotalColumn; |
+ delete profileDataGridNode._searchMatchedFunctionColumn; |
+ |
+ if (percentUnits) { |
+ if (lessThan) { |
+ if (profileDataGridNode.selfPercent < queryNumber) |
+ profileDataGridNode._searchMatchedSelfColumn = true; |
+ if (profileDataGridNode.totalPercent < queryNumber) |
+ profileDataGridNode._searchMatchedTotalColumn = true; |
+ } else if (greaterThan) { |
+ if (profileDataGridNode.selfPercent > queryNumber) |
+ profileDataGridNode._searchMatchedSelfColumn = true; |
+ if (profileDataGridNode.totalPercent > queryNumber) |
+ profileDataGridNode._searchMatchedTotalColumn = true; |
} |
- this._searchResultIndex = jumpBackwards ? 0 : this._searchResults.length - 1; |
- this._searchableView.updateSearchMatchesCount(this._searchResults.length); |
- this._searchableView.updateCurrentMatchIndex(this._searchResultIndex); |
- }, |
- /** |
- * @override |
- */ |
- searchCanceled: function() |
- { |
- if (this._searchResults) { |
- for (var i = 0; i < this._searchResults.length; ++i) { |
- var profileNode = this._searchResults[i].profileNode; |
- delete profileNode._searchMatchedSelfColumn; |
- delete profileNode._searchMatchedTotalColumn; |
- delete profileNode._searchMatchedFunctionColumn; |
- profileNode.refresh(); |
- } |
+ if (equalTo) { |
+ if (profileDataGridNode.selfPercent === queryNumber) |
+ profileDataGridNode._searchMatchedSelfColumn = true; |
+ if (profileDataGridNode.totalPercent === queryNumber) |
+ profileDataGridNode._searchMatchedTotalColumn = true; |
+ } |
+ } else if (millisecondsUnits || secondsUnits) { |
+ if (lessThan) { |
+ if (profileDataGridNode.self < queryNumberMilliseconds) |
+ profileDataGridNode._searchMatchedSelfColumn = true; |
+ if (profileDataGridNode.total < queryNumberMilliseconds) |
+ profileDataGridNode._searchMatchedTotalColumn = true; |
+ } else if (greaterThan) { |
+ if (profileDataGridNode.self > queryNumberMilliseconds) |
+ profileDataGridNode._searchMatchedSelfColumn = true; |
+ if (profileDataGridNode.total > queryNumberMilliseconds) |
+ profileDataGridNode._searchMatchedTotalColumn = true; |
} |
- this._searchResults = []; |
- this._searchResultIndex = -1; |
- }, |
- |
- /** |
- * @override |
- */ |
- jumpToNextSearchResult: function() |
- { |
- if (!this._searchResults || !this._searchResults.length) |
- return; |
- this._searchResultIndex = (this._searchResultIndex + 1) % this._searchResults.length; |
- this._jumpToSearchResult(this._searchResultIndex); |
- }, |
+ if (equalTo) { |
+ if (profileDataGridNode.self === queryNumberMilliseconds) |
+ profileDataGridNode._searchMatchedSelfColumn = true; |
+ if (profileDataGridNode.total === queryNumberMilliseconds) |
+ profileDataGridNode._searchMatchedTotalColumn = true; |
+ } |
+ } |
- /** |
- * @override |
- */ |
- jumpToPreviousSearchResult: function() |
- { |
- if (!this._searchResults || !this._searchResults.length) |
- return; |
- this._searchResultIndex = (this._searchResultIndex - 1 + this._searchResults.length) % this._searchResults.length; |
- this._jumpToSearchResult(this._searchResultIndex); |
- }, |
+ if (profileDataGridNode.functionName.match(matcher) || |
+ (profileDataGridNode.url && profileDataGridNode.url.match(matcher))) |
+ profileDataGridNode._searchMatchedFunctionColumn = true; |
- /** |
- * @override |
- * @return {boolean} |
- */ |
- supportsCaseSensitiveSearch: function() |
- { |
+ if (profileDataGridNode._searchMatchedSelfColumn || profileDataGridNode._searchMatchedTotalColumn || |
+ profileDataGridNode._searchMatchedFunctionColumn) { |
+ profileDataGridNode.refresh(); |
return true; |
- }, |
- |
- /** |
- * @override |
- * @return {boolean} |
- */ |
- supportsRegexSearch: function() |
- { |
- return false; |
- }, |
+ } |
- /** |
- * @param {number} index |
- */ |
- _jumpToSearchResult: function(index) |
- { |
- var searchResult = this._searchResults[index]; |
- if (!searchResult) |
- return; |
- var profileNode = searchResult.profileNode; |
- profileNode.revealAndSelect(); |
- this._searchableView.updateCurrentMatchIndex(index); |
+ return false; |
+ } |
+ return matchesQuery; |
+ } |
+ |
+ /** |
+ * @override |
+ * @param {!WebInspector.SearchableView.SearchConfig} searchConfig |
+ * @param {boolean} shouldJump |
+ * @param {boolean=} jumpBackwards |
+ */ |
+ performSearch(searchConfig, shouldJump, jumpBackwards) { |
+ this.searchCanceled(); |
+ var matchesQuery = this._matchFunction(searchConfig); |
+ if (!matchesQuery) |
+ return; |
+ |
+ this._searchResults = []; |
+ for (var current = this.children[0]; current; current = current.traverseNextNode(false, null, false)) { |
+ if (matchesQuery(current)) |
+ this._searchResults.push({profileNode: current}); |
} |
+ this._searchResultIndex = jumpBackwards ? 0 : this._searchResults.length - 1; |
+ this._searchableView.updateSearchMatchesCount(this._searchResults.length); |
+ this._searchableView.updateCurrentMatchIndex(this._searchResultIndex); |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ searchCanceled() { |
+ if (this._searchResults) { |
+ for (var i = 0; i < this._searchResults.length; ++i) { |
+ var profileNode = this._searchResults[i].profileNode; |
+ delete profileNode._searchMatchedSelfColumn; |
+ delete profileNode._searchMatchedTotalColumn; |
+ delete profileNode._searchMatchedFunctionColumn; |
+ profileNode.refresh(); |
+ } |
+ } |
+ |
+ this._searchResults = []; |
+ this._searchResultIndex = -1; |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ jumpToNextSearchResult() { |
+ if (!this._searchResults || !this._searchResults.length) |
+ return; |
+ this._searchResultIndex = (this._searchResultIndex + 1) % this._searchResults.length; |
+ this._jumpToSearchResult(this._searchResultIndex); |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ jumpToPreviousSearchResult() { |
+ if (!this._searchResults || !this._searchResults.length) |
+ return; |
+ this._searchResultIndex = (this._searchResultIndex - 1 + this._searchResults.length) % this._searchResults.length; |
+ this._jumpToSearchResult(this._searchResultIndex); |
+ } |
+ |
+ /** |
+ * @override |
+ * @return {boolean} |
+ */ |
+ supportsCaseSensitiveSearch() { |
+ return true; |
+ } |
+ |
+ /** |
+ * @override |
+ * @return {boolean} |
+ */ |
+ supportsRegexSearch() { |
+ return false; |
+ } |
+ |
+ /** |
+ * @param {number} index |
+ */ |
+ _jumpToSearchResult(index) { |
+ var searchResult = this._searchResults[index]; |
+ if (!searchResult) |
+ return; |
+ var profileNode = searchResult.profileNode; |
+ profileNode.revealAndSelect(); |
+ this._searchableView.updateCurrentMatchIndex(index); |
+ } |
}; |
WebInspector.ProfileDataGridTree.propertyComparators = [{}, {}]; |
-/** |
- * @param {string} property |
- * @param {boolean} isAscending |
- * @return {function(!Object.<string, *>, !Object.<string, *>)} |
- */ |
-WebInspector.ProfileDataGridTree.propertyComparator = function(property, isAscending) |
-{ |
- var comparator = WebInspector.ProfileDataGridTree.propertyComparators[(isAscending ? 1 : 0)][property]; |
- |
- if (!comparator) { |
- if (isAscending) { |
- comparator = function(lhs, rhs) |
- { |
- if (lhs[property] < rhs[property]) |
- return -1; |
- |
- if (lhs[property] > rhs[property]) |
- return 1; |
- |
- return 0; |
- }; |
- } else { |
- comparator = function(lhs, rhs) |
- { |
- if (lhs[property] > rhs[property]) |
- return -1; |
- |
- if (lhs[property] < rhs[property]) |
- return 1; |
- |
- return 0; |
- }; |
- } |
- |
- WebInspector.ProfileDataGridTree.propertyComparators[(isAscending ? 1 : 0)][property] = comparator; |
- } |
- |
- return comparator; |
-}; |
/** |
* @interface |
*/ |
-WebInspector.ProfileDataGridNode.Formatter = function() { }; |
+WebInspector.ProfileDataGridNode.Formatter = function() {}; |
WebInspector.ProfileDataGridNode.Formatter.prototype = { |
- /** |
- * @param {number} value |
- * @param {!WebInspector.ProfileDataGridNode} node |
- * @return {string} |
- */ |
- formatValue: function(value, node) { }, |
- |
- /** |
- * @param {number} value |
- * @param {!WebInspector.ProfileDataGridNode} node |
- * @return {string} |
- */ |
- formatPercent: function(value, node) { }, |
- |
- /** |
- * @param {!WebInspector.ProfileDataGridNode} node |
- * @return {?Element} |
- */ |
- linkifyNode: function(node) { } |
+ /** |
+ * @param {number} value |
+ * @param {!WebInspector.ProfileDataGridNode} node |
+ * @return {string} |
+ */ |
+ formatValue: function(value, node) {}, |
+ |
+ /** |
+ * @param {number} value |
+ * @param {!WebInspector.ProfileDataGridNode} node |
+ * @return {string} |
+ */ |
+ formatPercent: function(value, node) {}, |
+ |
+ /** |
+ * @param {!WebInspector.ProfileDataGridNode} node |
+ * @return {?Element} |
+ */ |
+ linkifyNode: function(node) {} |
}; |