OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 * Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
5 */ | 5 */ |
6 | |
7 /** | 6 /** |
8 * @constructor | 7 * @unrestricted |
9 * @extends {WebInspector.FilteredListWidget.Delegate} | |
10 * @param {!WebInspector.UISourceCode} uiSourceCode | |
11 * @param {function(number, number)} selectItemCallback | |
12 */ | 8 */ |
13 WebInspector.JavaScriptOutlineDialog = function(uiSourceCode, selectItemCallback
) | 9 WebInspector.JavaScriptOutlineDialog = class extends WebInspector.FilteredListWi
dget.Delegate { |
14 { | 10 /** |
15 WebInspector.FilteredListWidget.Delegate.call(this, []); | 11 * @param {!WebInspector.UISourceCode} uiSourceCode |
| 12 * @param {function(number, number)} selectItemCallback |
| 13 */ |
| 14 constructor(uiSourceCode, selectItemCallback) { |
| 15 super([]); |
16 | 16 |
17 this._functionItems = []; | 17 this._functionItems = []; |
18 this._selectItemCallback = selectItemCallback; | 18 this._selectItemCallback = selectItemCallback; |
19 WebInspector.formatterWorkerPool.runChunkedTask("javaScriptOutline", {conten
t: uiSourceCode.workingCopy() }, this._didBuildOutlineChunk.bind(this)); | 19 WebInspector.formatterWorkerPool.runChunkedTask( |
| 20 'javaScriptOutline', {content: uiSourceCode.workingCopy()}, this._didBui
ldOutlineChunk.bind(this)); |
| 21 } |
| 22 |
| 23 /** |
| 24 * @param {!WebInspector.UISourceCode} uiSourceCode |
| 25 * @param {function(number, number)} selectItemCallback |
| 26 */ |
| 27 static show(uiSourceCode, selectItemCallback) { |
| 28 WebInspector.JavaScriptOutlineDialog._instanceForTests = |
| 29 new WebInspector.JavaScriptOutlineDialog(uiSourceCode, selectItemCallbac
k); |
| 30 new WebInspector.FilteredListWidget(WebInspector.JavaScriptOutlineDialog._in
stanceForTests).showAsDialog(); |
| 31 } |
| 32 |
| 33 /** |
| 34 * @param {?MessageEvent} event |
| 35 */ |
| 36 _didBuildOutlineChunk(event) { |
| 37 if (!event) { |
| 38 this.dispose(); |
| 39 this.refresh(); |
| 40 return; |
| 41 } |
| 42 var data = /** @type {!WebInspector.JavaScriptOutlineDialog.MessageEventData
} */ (event.data); |
| 43 var chunk = data.chunk; |
| 44 for (var i = 0; i < chunk.length; ++i) |
| 45 this._functionItems.push(chunk[i]); |
| 46 |
| 47 if (data.isLastChunk) |
| 48 this.dispose(); |
| 49 |
| 50 this.refresh(); |
| 51 } |
| 52 |
| 53 /** |
| 54 * @override |
| 55 * @return {number} |
| 56 */ |
| 57 itemCount() { |
| 58 return this._functionItems.length; |
| 59 } |
| 60 |
| 61 /** |
| 62 * @override |
| 63 * @param {number} itemIndex |
| 64 * @return {string} |
| 65 */ |
| 66 itemKeyAt(itemIndex) { |
| 67 var item = this._functionItems[itemIndex]; |
| 68 return item.name + (item.arguments ? item.arguments : ''); |
| 69 } |
| 70 |
| 71 /** |
| 72 * @override |
| 73 * @param {number} itemIndex |
| 74 * @param {string} query |
| 75 * @return {number} |
| 76 */ |
| 77 itemScoreAt(itemIndex, query) { |
| 78 var item = this._functionItems[itemIndex]; |
| 79 var methodName = query.split('(')[0]; |
| 80 if (methodName.toLowerCase() === item.name.toLowerCase()) |
| 81 return 1 / (1 + item.line); |
| 82 return -item.line - 1; |
| 83 } |
| 84 |
| 85 /** |
| 86 * @override |
| 87 * @param {number} itemIndex |
| 88 * @param {string} query |
| 89 * @param {!Element} titleElement |
| 90 * @param {!Element} subtitleElement |
| 91 */ |
| 92 renderItem(itemIndex, query, titleElement, subtitleElement) { |
| 93 var item = this._functionItems[itemIndex]; |
| 94 titleElement.textContent = item.name + (item.arguments ? item.arguments : ''
); |
| 95 this.highlightRanges(titleElement, query); |
| 96 subtitleElement.textContent = ':' + (item.line + 1); |
| 97 } |
| 98 |
| 99 /** |
| 100 * @override |
| 101 * @param {?number} itemIndex |
| 102 * @param {string} promptValue |
| 103 */ |
| 104 selectItem(itemIndex, promptValue) { |
| 105 if (itemIndex === null) |
| 106 return; |
| 107 var lineNumber = this._functionItems[itemIndex].line; |
| 108 if (!isNaN(lineNumber) && lineNumber >= 0) |
| 109 this._selectItemCallback(lineNumber, this._functionItems[itemIndex].column
); |
| 110 } |
| 111 |
| 112 /** |
| 113 * @override |
| 114 */ |
| 115 dispose() { |
| 116 } |
20 }; | 117 }; |
21 | 118 |
22 /** | |
23 * @param {!WebInspector.UISourceCode} uiSourceCode | |
24 * @param {function(number, number)} selectItemCallback | |
25 */ | |
26 WebInspector.JavaScriptOutlineDialog.show = function(uiSourceCode, selectItemCal
lback) | |
27 { | |
28 WebInspector.JavaScriptOutlineDialog._instanceForTests = new WebInspector.Ja
vaScriptOutlineDialog(uiSourceCode, selectItemCallback); | |
29 new WebInspector.FilteredListWidget(WebInspector.JavaScriptOutlineDialog._in
stanceForTests).showAsDialog(); | |
30 }; | |
31 | |
32 WebInspector.JavaScriptOutlineDialog.prototype = { | |
33 /** | |
34 * @param {?MessageEvent} event | |
35 */ | |
36 _didBuildOutlineChunk: function(event) | |
37 { | |
38 if (!event) { | |
39 this.dispose(); | |
40 this.refresh(); | |
41 return; | |
42 } | |
43 var data = /** @type {!WebInspector.JavaScriptOutlineDialog.MessageEvent
Data} */ (event.data); | |
44 var chunk = data.chunk; | |
45 for (var i = 0; i < chunk.length; ++i) | |
46 this._functionItems.push(chunk[i]); | |
47 | |
48 if (data.isLastChunk) | |
49 this.dispose(); | |
50 | |
51 this.refresh(); | |
52 }, | |
53 | |
54 /** | |
55 * @override | |
56 * @return {number} | |
57 */ | |
58 itemCount: function() | |
59 { | |
60 return this._functionItems.length; | |
61 }, | |
62 | |
63 /** | |
64 * @override | |
65 * @param {number} itemIndex | |
66 * @return {string} | |
67 */ | |
68 itemKeyAt: function(itemIndex) | |
69 { | |
70 var item = this._functionItems[itemIndex]; | |
71 return item.name + (item.arguments ? item.arguments : ""); | |
72 }, | |
73 | |
74 /** | |
75 * @override | |
76 * @param {number} itemIndex | |
77 * @param {string} query | |
78 * @return {number} | |
79 */ | |
80 itemScoreAt: function(itemIndex, query) | |
81 { | |
82 var item = this._functionItems[itemIndex]; | |
83 var methodName = query.split("(")[0]; | |
84 if (methodName.toLowerCase() === item.name.toLowerCase()) | |
85 return 1 / (1 + item.line); | |
86 return -item.line - 1; | |
87 }, | |
88 | |
89 /** | |
90 * @override | |
91 * @param {number} itemIndex | |
92 * @param {string} query | |
93 * @param {!Element} titleElement | |
94 * @param {!Element} subtitleElement | |
95 */ | |
96 renderItem: function(itemIndex, query, titleElement, subtitleElement) | |
97 { | |
98 var item = this._functionItems[itemIndex]; | |
99 titleElement.textContent = item.name + (item.arguments ? item.arguments
: ""); | |
100 this.highlightRanges(titleElement, query); | |
101 subtitleElement.textContent = ":" + (item.line + 1); | |
102 }, | |
103 | |
104 /** | |
105 * @override | |
106 * @param {?number} itemIndex | |
107 * @param {string} promptValue | |
108 */ | |
109 selectItem: function(itemIndex, promptValue) | |
110 { | |
111 if (itemIndex === null) | |
112 return; | |
113 var lineNumber = this._functionItems[itemIndex].line; | |
114 if (!isNaN(lineNumber) && lineNumber >= 0) | |
115 this._selectItemCallback(lineNumber, this._functionItems[itemIndex].
column); | |
116 }, | |
117 | |
118 dispose: function() | |
119 { | |
120 }, | |
121 | |
122 __proto__: WebInspector.FilteredListWidget.Delegate.prototype | |
123 }; | |
124 | 119 |
125 /** | 120 /** |
126 * @typedef {{isLastChunk: boolean, chunk: !Array.<!{selectorText: string, lineN
umber: number, columnNumber: number}>}} | 121 * @typedef {{isLastChunk: boolean, chunk: !Array.<!{selectorText: string, lineN
umber: number, columnNumber: number}>}} |
127 */ | 122 */ |
128 WebInspector.JavaScriptOutlineDialog.MessageEventData; | 123 WebInspector.JavaScriptOutlineDialog.MessageEventData; |
OLD | NEW |