Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/quick_open/QuickOpen.js

Issue 2679483002: DevTools: Create extensible QuickOpen control (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 QuickOpen.QuickOpen = class extends QuickOpen.FilteredListWidget.Delegate {
6 constructor() {
7 super();
8 this._prefix = [];
9 self.runtime.extensions('quick-open').forEach(this._addPrefix.bind(this));
10 this._currentDelegate = new QuickOpen.Loading();
pfeldman 2017/02/07 02:10:03 nit: here and below, remove _current prefix - I do
einbinder 2017/02/28 23:59:07 Done.
11 this._currentPrefix = '';
12 this._currentQuery = '';
13 }
14
15 /**
16 * @param {!Runtime.Extension} extension
17 */
18 _addPrefix(extension) {
19 this._prefix.push(
20 {prefix: extension.descriptor().prefix, delegate: null, instance: extens ion.instance.bind(extension)});
21 this._prefix.sort((a, b) => b.prefix.length - a.prefix.length);
pfeldman 2017/02/07 02:10:02 They are already sorter by "order" extension prope
einbinder 2017/02/28 23:59:07 This is important so that longer prefix go first.
22 }
23
24 /**
25 * @param {string} query
26 * @return {!QuickOpen.FilteredListWidget.Delegate}
27 */
28 _delegate(query) {
29 for (var i = 0; i < this._prefix.length; i++) {
pfeldman 2017/02/07 02:10:02 for (var provider of this._providers)
einbinder 2017/02/28 23:59:07 Done.
30 if (query.startsWith(this._prefix[i].prefix)) {
31 this._currentPrefix = this._prefix[i].prefix;
32 var delegate = this._prefix[i].delegate;
33 if (!delegate) {
34 delegate = new QuickOpen.Loading();
35 this._prefix[i].instance().then(instance => {
36 instance.setRefreshCallback(this.refresh.bind(this));
37 this._prefix[i].delegate = instance;
pfeldman 2017/02/07 02:10:02 Store extension in this._providers and simply chai
einbinder 2017/02/28 23:59:07 It is much easier if this method is synchronous. O
38 this.queryChanged(this._currentQuery);
39 });
40 }
41 return delegate;
42 }
43 }
44 this._currentPrefix = '';
45 return this._currentDelegate || new QuickOpen.FilteredListWidget.Delegate();
pfeldman 2017/02/07 02:10:02 Oh, so QuickOpen.Loading() is not the same!
einbinder 2017/02/28 23:59:07 There was no path to get to the blank delegate, I
46 }
47
48 /**
49 * @param {string} query
50 * @return {string}
51 */
52 _cleanQuery(query) {
53 return query.substring(this._currentPrefix.length);
54 }
55
56 /**
57 * @override
58 * @param {string} query
59 */
60 queryChanged(query) {
61 this._currentQuery = query;
62 var lastDelegate = this._currentDelegate;
63 this._currentDelegate = this._delegate(query);
64 this._currentDelegate.queryChanged(this._cleanQuery(query));
65 if (this._currentDelegate !== lastDelegate)
66 this.refresh();
67 if (!(this._currentDelegate instanceof QuickOpen.Loading))
68 this._delegateLoadedForTest(this._currentDelegate);
69 }
70
71 /**
72 * @param {!QuickOpen.FilteredListWidget.Delegate} delegate
73 */
74 _delegateLoadedForTest(delegate) {
75 }
76
77 /**
78 * @override
79 * @param {string} query
80 * @return {string}
81 */
82 notFoundText(query) {
83 return this._currentDelegate.notFoundText(this._cleanQuery(query));
84 }
85
86 /**
87 * @override
88 * @param {function():void} refreshCallback
89 */
90 setRefreshCallback(refreshCallback) {
pfeldman 2017/02/07 02:10:02 Is this to make sure that JavaScript works?
einbinder 2017/02/28 23:59:07 I was suspicious.
91 super.setRefreshCallback(refreshCallback);
92 }
93
94 /**
95 * @override
96 * @return {number}
97 */
98 itemCount() {
99 return this._currentDelegate.itemCount();
100 }
101
102 /**
103 * @override
104 * @param {number} itemIndex
105 * @return {string}
106 */
107 itemKeyAt(itemIndex) {
108 return this._currentDelegate.itemKeyAt(itemIndex);
109 }
110
111 /**
112 * @override
113 * @param {number} itemIndex
114 * @param {string} query
115 * @return {number}
116 */
117 itemScoreAt(itemIndex, query) {
118 return this._currentDelegate.itemScoreAt(itemIndex, query);
119 }
120
121 /**
122 * @override
123 * @param {number} itemIndex
124 * @param {string} query
125 * @param {!Element} titleElement
126 * @param {!Element} subtitleElement
127 */
128 renderItem(itemIndex, query, titleElement, subtitleElement) {
129 this._delegate(query).renderItem(itemIndex, this._cleanQuery(query), titleEl ement, subtitleElement);
130 }
131
132 /**
133 * @override
134 * @return {boolean}
135 */
136 renderAsTwoRows() {
137 return this._currentDelegate.renderAsTwoRows();
138 }
139
140 /**
141 * @override
142 * @param {null|number} itemIndex
143 * @param {string} promptValue
144 */
145 selectItem(itemIndex, promptValue) {
146 this._currentDelegate.selectItem(itemIndex, this._cleanQuery(promptValue));
147 }
148
149 /**
150 * @override
151 * @param {string} query
152 * @return {string}
153 */
154 rewriteQuery(query) {
155 return this._delegate(query).rewriteQuery(this._cleanQuery(query));
156 }
157
158 /**
159 * @override
160 */
161 dispose() {
162 for (var i = 0; i < this._prefix.length; i++) {
pfeldman 2017/02/07 02:10:02 I now see why you need delegates, but I'd manage s
einbinder 2017/02/28 23:59:07 Dispose is to remove the event listeners on Filter
163 if (this._prefix[i].delegate)
164 this._prefix[i].delegate.dispose();
165 }
166 super.dispose();
167 }
168
169 /**
170 * @param {string} query
171 */
172 static show(query) {
pfeldman 2017/02/07 02:10:03 move up.
einbinder 2017/02/28 23:59:07 Done.
173 var filteredItemSelectionDialog =
174 new QuickOpen.FilteredListWidget(new QuickOpen.QuickOpen(), QuickOpen.Qu ickOpen._history);
pfeldman 2017/02/07 02:10:03 QuickOpen.QuickOpen again - why do you need to spe
einbinder 2017/02/28 23:59:07 Fixed :)
175 filteredItemSelectionDialog.showAsDialog();
176 filteredItemSelectionDialog.setQuery(query);
177 }
178 };
179
180 QuickOpen.QuickOpen._history = [];
181
182 /**
183 * @implements {UI.ActionDelegate}
184 */
185 QuickOpen.QuickOpen.ShowActionDelegate = class {
186 /**
187 * @override
188 * @param {!UI.Context} context
189 * @param {string} actionId
190 * @return {boolean}
191 */
192 handleAction(context, actionId) {
193 switch (actionId) {
194 case 'quickOpen.show':
195 QuickOpen.QuickOpen.show('');
196 return true;
197 }
198 return false;
199 }
200 };
201
202 QuickOpen.Loading = class extends QuickOpen.FilteredListWidget.Delegate {
pfeldman 2017/02/07 02:10:02 QuickOpen.QuickOpen.Loading :)
einbinder 2017/02/28 23:59:07 Done.
203 /**
204 * @override
205 */
206 notFoundText() {
207 return Common.UIString('Loading...');
208 }
209 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698