Index: Source/devtools/front_end/profiler/HeapSnapshotView.js |
diff --git a/Source/devtools/front_end/profiler/HeapSnapshotView.js b/Source/devtools/front_end/profiler/HeapSnapshotView.js |
index d6fac11ed81d522a2f65d3027ef2067c7999138e..3430523fd786f86a2c91d31903c10e99533a4c3f 100644 |
--- a/Source/devtools/front_end/profiler/HeapSnapshotView.js |
+++ b/Source/devtools/front_end/profiler/HeapSnapshotView.js |
@@ -31,6 +31,7 @@ |
/** |
* @constructor |
* @implements {WebInspector.ProfileType.DataDisplayDelegate} |
+ * @implements {WebInspector.Searchable} |
* @extends {WebInspector.VBox} |
* @param {!WebInspector.ProfileType.DataDisplayDelegate} dataDisplayDelegate |
* @param {!WebInspector.HeapProfileHeader} profile |
@@ -51,8 +52,11 @@ WebInspector.HeapSnapshotView = function(dataDisplayDelegate, profile) |
this._parentDataDisplayDelegate = dataDisplayDelegate; |
+ this._searchableView = new WebInspector.SearchableView(this); |
+ this._searchableView.show(this.element); |
+ |
this._splitView = new WebInspector.SplitView(false, true, "heapSnapshotSplitViewState", 200, 200); |
- this._splitView.show(this.element); |
+ this._splitView.show(this._searchableView.element); |
this._containmentView = new WebInspector.VBox(); |
this._containmentView.setMinimumSize(50, 25); |
@@ -242,11 +246,11 @@ WebInspector.HeapSnapshotView.SummaryPerspective.prototype = { |
{ |
heapSnapshotView._constructorsView.show(heapSnapshotView._splitView.mainElement()); |
heapSnapshotView._objectDetailsView.show(heapSnapshotView._splitView.sidebarElement()); |
- heapSnapshotView._splitView.show(heapSnapshotView.element); |
+ heapSnapshotView._splitView.show(heapSnapshotView._searchableView.element); |
heapSnapshotView._filterSelect.visible = true; |
heapSnapshotView._classNameFilter.visible = true; |
if (heapSnapshotView._trackingOverviewGrid) { |
- heapSnapshotView._trackingOverviewGrid.show(heapSnapshotView.element, heapSnapshotView._splitView.element); |
+ heapSnapshotView._trackingOverviewGrid.show(heapSnapshotView._searchableView.element, heapSnapshotView._splitView.element); |
heapSnapshotView._trackingOverviewGrid.update(); |
heapSnapshotView._trackingOverviewGrid._updateGrid(); |
} |
@@ -292,7 +296,7 @@ WebInspector.HeapSnapshotView.ComparisonPerspective.prototype = { |
{ |
heapSnapshotView._diffView.show(heapSnapshotView._splitView.mainElement()); |
heapSnapshotView._objectDetailsView.show(heapSnapshotView._splitView.sidebarElement()); |
- heapSnapshotView._splitView.show(heapSnapshotView.element); |
+ heapSnapshotView._splitView.show(heapSnapshotView._searchableView.element); |
heapSnapshotView._baseSelect.visible = true; |
heapSnapshotView._classNameFilter.visible = true; |
}, |
@@ -337,7 +341,7 @@ WebInspector.HeapSnapshotView.ContainmentPerspective.prototype = { |
{ |
heapSnapshotView._containmentView.show(heapSnapshotView._splitView.mainElement()); |
heapSnapshotView._objectDetailsView.show(heapSnapshotView._splitView.sidebarElement()); |
- heapSnapshotView._splitView.show(heapSnapshotView.element); |
+ heapSnapshotView._splitView.show(heapSnapshotView._searchableView.element); |
}, |
/** |
@@ -381,7 +385,7 @@ WebInspector.HeapSnapshotView.AllocationPerspective.prototype = { |
heapSnapshotView._constructorsView.show(heapSnapshotView._splitView.mainElement()); |
heapSnapshotView._objectDetailsView.show(heapSnapshotView._splitView.sidebarElement()); |
heapSnapshotView._splitView.show(this._allocationSplitView.sidebarElement()); |
- this._allocationSplitView.show(heapSnapshotView.element); |
+ this._allocationSplitView.show(heapSnapshotView._searchableView.element); |
heapSnapshotView._constructorsDataGrid.clear(); |
var selectedNode = heapSnapshotView._allocationDataGrid.selectedNode; |
@@ -428,7 +432,7 @@ WebInspector.HeapSnapshotView.StatisticsPerspective.prototype = { |
*/ |
activate: function(heapSnapshotView) |
{ |
- heapSnapshotView._statisticsView.show(heapSnapshotView.element); |
+ heapSnapshotView._statisticsView.show(heapSnapshotView._searchableView.element); |
}, |
/** |
@@ -447,6 +451,14 @@ WebInspector.HeapSnapshotView.StatisticsPerspective.prototype = { |
WebInspector.HeapSnapshotView.prototype = { |
/** |
+ * @return {!WebInspector.SearchableView} |
+ */ |
+ searchableView: function() |
+ { |
+ return this._searchableView; |
+ }, |
+ |
+ /** |
* @override |
* @param {?WebInspector.ProfileHeader} profile |
* @return {?WebInspector.View} |
@@ -543,6 +555,22 @@ WebInspector.HeapSnapshotView.prototype = { |
this.helpPopover.hide(); |
}, |
+ /** |
+ * @return {boolean} |
+ */ |
+ supportsCaseSensitiveSearch: function() |
+ { |
+ return true; |
+ }, |
+ |
+ /** |
+ * @return {boolean} |
+ */ |
+ supportsRegexSearch: function() |
+ { |
+ return false; |
+ }, |
+ |
searchCanceled: function() |
{ |
if (this._searchResults) { |
@@ -553,20 +581,30 @@ WebInspector.HeapSnapshotView.prototype = { |
} |
} |
- delete this._searchFinishedCallback; |
this._currentSearchResultIndex = -1; |
this._searchResults = []; |
}, |
/** |
- * @param {string} query |
- * @param {function(!WebInspector.View, number)} finishedCallback |
+ * @param {boolean} found |
+ */ |
+ _didHighlightById: function(found) |
+ { |
+ // Do not remove. It needs for heap snapshot search tests. |
+ }, |
+ |
+ /** |
+ * @param {!WebInspector.SearchableView.SearchConfig} searchConfig |
+ * @param {boolean} shouldJump |
+ * @param {boolean=} jumpBackwards |
*/ |
- performSearch: function(query, finishedCallback) |
+ performSearch: function(searchConfig, shouldJump, jumpBackwards) |
{ |
// Call searchCanceled since it will reset everything we need before doing a new search. |
this.searchCanceled(); |
+ this.currentQuery = searchConfig; |
+ var query = searchConfig.query; |
query = query.trim(); |
if (!query) |
@@ -574,26 +612,14 @@ WebInspector.HeapSnapshotView.prototype = { |
if (!this._currentPerspective.supportsSearch()) |
return; |
- /** |
- * @param {boolean} found |
- * @this {WebInspector.HeapSnapshotView} |
- */ |
- function didHighlight(found) |
- { |
- finishedCallback(this, found ? 1 : 0); |
- } |
- |
if (query.charAt(0) === "@") { |
var snapshotNodeId = parseInt(query.substring(1), 10); |
if (!isNaN(snapshotNodeId)) |
- this._dataGrid.highlightObjectByHeapSnapshotId(String(snapshotNodeId), didHighlight.bind(this)); |
- else |
- finishedCallback(this, 0); |
+ this._dataGrid.highlightObjectByHeapSnapshotId(String(snapshotNodeId), this._didHighlightById.bind(this)); |
return; |
} |
- this._searchFinishedCallback = finishedCallback; |
- var nameRegExp = createPlainTextSearchRegex(query, "i"); |
+ var nameRegExp = createPlainTextSearchRegex(query, searchConfig.caseSensitive ? "": "i"); |
function matchesByName(gridNode) { |
return ("_name" in gridNode) && nameRegExp.test(gridNode._name); |
@@ -624,53 +650,36 @@ WebInspector.HeapSnapshotView.prototype = { |
depth += info.depthChange; |
} |
- finishedCallback(this, this._searchResults.length); |
- }, |
- |
- jumpToFirstSearchResult: function() |
- { |
- if (!this._searchResults || !this._searchResults.length) |
- return; |
- this._currentSearchResultIndex = 0; |
- this._jumpToSearchResult(this._currentSearchResultIndex); |
- }, |
- |
- jumpToLastSearchResult: function() |
- { |
- if (!this._searchResults || !this._searchResults.length) |
- return; |
- this._currentSearchResultIndex = (this._searchResults.length - 1); |
- this._jumpToSearchResult(this._currentSearchResultIndex); |
+ this._searchableView.updateSearchMatchesCount(this._searchResults.length); |
+ if (this._searchResults.length) { |
+ if (jumpBackwards) |
+ this._currentSearchResultIndex = this._searchResults.length - 1; |
+ else |
+ this._currentSearchResultIndex = this._searchResults.length ? 0 : -1; |
+ } |
+ this._searchableView.updateCurrentMatchIndex(this._currentSearchResultIndex); |
+ this._jumpToSearchResult(); |
}, |
jumpToNextSearchResult: function() |
{ |
- if (!this._searchResults || !this._searchResults.length) |
+ if (!this._searchResults.length) |
return; |
- if (++this._currentSearchResultIndex >= this._searchResults.length) |
- this._currentSearchResultIndex = 0; |
- this._jumpToSearchResult(this._currentSearchResultIndex); |
+ this._currentSearchResultIndex = (this._currentSearchResultIndex + 1) % this._searchResults.length; |
+ this._jumpToSearchResult(); |
}, |
jumpToPreviousSearchResult: function() |
{ |
- if (!this._searchResults || !this._searchResults.length) |
+ if (!this._searchResults.length) |
return; |
- if (--this._currentSearchResultIndex < 0) |
- this._currentSearchResultIndex = (this._searchResults.length - 1); |
- this._jumpToSearchResult(this._currentSearchResultIndex); |
+ this._currentSearchResultIndex = (this._currentSearchResultIndex + this._searchResults.length - 1) % this._searchResults.length; |
+ this._jumpToSearchResult(); |
}, |
- /** |
- * @return {number} |
- */ |
- currentSearchResultIndex: function() { |
- return this._currentSearchResultIndex; |
- }, |
- |
- _jumpToSearchResult: function(index) |
+ _jumpToSearchResult: function() |
{ |
- var searchResult = this._searchResults[index]; |
+ var searchResult = this._searchResults[this._currentSearchResultIndex]; |
if (!searchResult) |
return; |
@@ -700,14 +709,13 @@ WebInspector.HeapSnapshotView.prototype = { |
if (dataGrid.snapshot) |
this._baseProfile.load(dataGrid.setBaseDataSource.bind(dataGrid)); |
- if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults) |
+ if (!this.currentQuery || !this._searchResults) |
return; |
// The current search needs to be performed again. First negate out previous match |
// count by calling the search finished callback with a negative number of matches. |
// Then perform the search again with the same query and callback. |
- this._searchFinishedCallback(this, -this._searchResults.length); |
- this.performSearch(this.currentQuery, this._searchFinishedCallback); |
+ this.performSearch(this.currentQuery, false); |
}, |
_changeFilter: function() |
@@ -720,14 +728,13 @@ WebInspector.HeapSnapshotView.prototype = { |
label: this._filterSelect.selectedOption().label |
}); |
- if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults) |
+ if (!this.currentQuery || !this._searchResults) |
return; |
// The current search needs to be performed again. First negate out previous match |
// count by calling the search finished callback with a negative number of matches. |
// Then perform the search again with the same query and callback. |
- this._searchFinishedCallback(this, -this._searchResults.length); |
- this.performSearch(this.currentQuery, this._searchFinishedCallback); |
+ this.performSearch(this.currentQuery, false); |
}, |
/** |
@@ -888,14 +895,13 @@ WebInspector.HeapSnapshotView.prototype = { |
this._updateDataSourceAndView(); |
- if (!this.currentQuery || !this._searchFinishedCallback || !this._searchResults) |
+ if (!this.currentQuery || !this._searchResults) |
return; |
// The current search needs to be performed again. First negate out previous match |
// count by calling the search finished callback with a negative number of matches. |
// Then perform the search again the with same query and callback. |
- this._searchFinishedCallback(this, -this._searchResults.length); |
- this.performSearch(this.currentQuery, this._searchFinishedCallback); |
+ this.performSearch(this.currentQuery, false); |
}, |
/** |
@@ -937,6 +943,8 @@ WebInspector.HeapSnapshotView.prototype = { |
{ |
if (!this._profile.target()) |
return; |
+ if (!element.node) |
+ return; |
element.node.queryObjectContent(this._profile.target(), showCallback, objectGroupName); |
}, |