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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/ui/SuggestBox.js

Issue 2592433003: [DevTools] Replace ViewportControl with ListControl. (Closed)
Patch Set: Created 3 years, 12 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
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 28 matching lines...) Expand all
39 */ 39 */
40 applySuggestion(suggestion, isIntermediateSuggestion) {}, 40 applySuggestion(suggestion, isIntermediateSuggestion) {},
41 41
42 /** 42 /**
43 * acceptSuggestion will be always called after call to applySuggestion with i sIntermediateSuggestion being equal to false. 43 * acceptSuggestion will be always called after call to applySuggestion with i sIntermediateSuggestion being equal to false.
44 */ 44 */
45 acceptSuggestion() {}, 45 acceptSuggestion() {},
46 }; 46 };
47 47
48 /** 48 /**
49 * @implements {UI.ViewportControl.Provider}
50 * @unrestricted 49 * @unrestricted
51 */ 50 */
52 UI.SuggestBox = class { 51 UI.SuggestBox = class {
53 /** 52 /**
54 * @param {!UI.SuggestBoxDelegate} suggestBoxDelegate 53 * @param {!UI.SuggestBoxDelegate} suggestBoxDelegate
55 * @param {number=} maxItemsHeight 54 * @param {number=} maxItemsHeight
56 * @param {boolean=} captureEnter 55 * @param {boolean=} captureEnter
57 */ 56 */
58 constructor(suggestBoxDelegate, maxItemsHeight, captureEnter) { 57 constructor(suggestBoxDelegate, maxItemsHeight, captureEnter) {
59 this._suggestBoxDelegate = suggestBoxDelegate; 58 this._suggestBoxDelegate = suggestBoxDelegate;
60 this._length = 0;
61 this._selectedIndex = -1; 59 this._selectedIndex = -1;
62 this._selectedElement = null; 60 this._selectedElement = null;
63 this._maxItemsHeight = maxItemsHeight; 61 this._maxItemsHeight = maxItemsHeight;
64 this._maybeHideBound = this._maybeHide.bind(this); 62 this._maybeHideBound = this._maybeHide.bind(this);
65 this._container = createElementWithClass('div', 'suggest-box-container'); 63 this._container = createElementWithClass('div', 'suggest-box-container');
66 this._viewport = new UI.ViewportControl(this); 64 this._viewport = new UI.SimpleViewport(this._createItemElement.bind(this));
67 this._element = this._viewport.element; 65 this._element = this._viewport.element;
68 this._element.classList.add('suggest-box'); 66 this._element.classList.add('suggest-box');
69 this._container.appendChild(this._element); 67 this._container.appendChild(this._element);
70 this._element.addEventListener('mousedown', this._onBoxMouseDown.bind(this), true); 68 this._element.addEventListener('mousedown', this._onBoxMouseDown.bind(this), true);
71 this._detailsPopup = this._container.createChild('div', 'suggest-box details -popup monospace'); 69 this._detailsPopup = this._container.createChild('div', 'suggest-box details -popup monospace');
72 this._detailsPopup.classList.add('hidden'); 70 this._detailsPopup.classList.add('hidden');
73 this._asyncDetailsCallback = null; 71 this._asyncDetailsCallback = null;
74 /** @type {!Map<number, !Promise<{detail: string, description: string}>>} */ 72 /** @type {!Map<number, !Promise<{detail: string, description: string}>>} */
75 this._asyncDetailsPromises = new Map(); 73 this._asyncDetailsPromises = new Map();
76 this._userInteracted = false; 74 this._userInteracted = false;
77 this._captureEnter = captureEnter; 75 this._captureEnter = captureEnter;
78 /** @type {!Array<!Element>} */
79 this._elementList = [];
80 this._rowHeight = 17;
81 this._viewportWidth = '100vw'; 76 this._viewportWidth = '100vw';
82 this._hasVerticalScroll = false; 77 this._hasVerticalScroll = false;
83 this._userEnteredText = ''; 78 this._userEnteredText = '';
84 /** @type {!UI.SuggestBox.Suggestions} */ 79 /** @type {!UI.SuggestBox.Suggestions} */
85 this._items = []; 80 this._items = [];
86 } 81 }
87 82
88 /** 83 /**
89 * @return {boolean} 84 * @return {boolean}
90 */ 85 */
91 visible() { 86 visible() {
92 return !!this._container.parentElement; 87 return !!this._container.parentElement;
93 } 88 }
94 89
95 /** 90 /**
96 * @param {!AnchorBox} anchorBox 91 * @param {!AnchorBox} anchorBox
97 */ 92 */
98 setPosition(anchorBox) { 93 setPosition(anchorBox) {
99 this._updateBoxPosition(anchorBox); 94 this._updateBoxPosition(anchorBox);
100 } 95 }
101 96
102 /** 97 /**
103 * @param {!AnchorBox} anchorBox 98 * @param {!AnchorBox} anchorBox
104 */ 99 */
105 _updateBoxPosition(anchorBox) { 100 _updateBoxPosition(anchorBox) {
106 console.assert(this._overlay); 101 console.assert(this._overlay);
107 if (this._lastAnchorBox && this._lastAnchorBox.equals(anchorBox) && this._la stItemCount === this.itemCount()) 102 if (this._lastAnchorBox && this._lastAnchorBox.equals(anchorBox) && this._la stItemCount === this._items.length)
108 return; 103 return;
109 this._lastItemCount = this.itemCount(); 104 this._lastItemCount = this._items.length;
110 this._lastAnchorBox = anchorBox; 105 this._lastAnchorBox = anchorBox;
111 106
112 // Position relative to main DevTools element. 107 // Position relative to main DevTools element.
113 var container = UI.Dialog.modalHostView().element; 108 var container = UI.Dialog.modalHostView().element;
114 anchorBox = anchorBox.relativeToElement(container); 109 anchorBox = anchorBox.relativeToElement(container);
115 var totalHeight = container.offsetHeight; 110 var totalHeight = container.offsetHeight;
116 var aboveHeight = anchorBox.y; 111 var aboveHeight = anchorBox.y;
117 var underHeight = totalHeight - anchorBox.y - anchorBox.height; 112 var underHeight = totalHeight - anchorBox.y - anchorBox.height;
118 113
119 this._overlay.setLeftOffset(anchorBox.x); 114 this._overlay.setLeftOffset(anchorBox.x);
120 115
121 var under = underHeight >= aboveHeight; 116 var under = underHeight >= aboveHeight;
122 if (under) 117 if (under)
123 this._overlay.setVerticalOffset(anchorBox.y + anchorBox.height, true); 118 this._overlay.setVerticalOffset(anchorBox.y + anchorBox.height, true);
124 else 119 else
125 this._overlay.setVerticalOffset(totalHeight - anchorBox.y, false); 120 this._overlay.setVerticalOffset(totalHeight - anchorBox.y, false);
126 121
127 var spacer = 6; 122 var spacer = 6;
123 var rowHeight = this._viewport.elementHeight();
128 var maxHeight = Math.min( 124 var maxHeight = Math.min(
129 Math.max(underHeight, aboveHeight) - spacer, 125 Math.max(underHeight, aboveHeight) - spacer,
130 this._maxItemsHeight ? this._maxItemsHeight * this._rowHeight : Infinity ); 126 this._maxItemsHeight ? this._maxItemsHeight * rowHeight : Infinity);
131 var height = this._rowHeight * this._items.length; 127 var height = rowHeight * this._items.length;
132 this._hasVerticalScroll = height > maxHeight; 128 this._hasVerticalScroll = height > maxHeight;
133 this._element.style.height = Math.min(maxHeight, height) + 'px'; 129 this._element.style.height = Math.min(maxHeight, height) + 'px';
134 } 130 }
135 131
136 _updateWidth() { 132 _updateWidth() {
137 if (this._hasVerticalScroll) { 133 if (this._hasVerticalScroll) {
138 this._element.style.width = '100vw'; 134 this._element.style.width = '100vw';
139 return; 135 return;
140 } 136 }
141 // If there are no scrollbars, set the width to the width of the largest row . 137 // If there are no scrollbars, set the width to the width of the largest row .
142 var maxIndex = 0; 138 var maxIndex = 0;
143 for (var i = 0; i < this._items.length; i++) { 139 for (var i = 0; i < this._items.length; i++) {
144 if (this._items[i].title.length > this._items[maxIndex].title.length) 140 if (this._items[i].title.length > this._items[maxIndex].title.length)
145 maxIndex = i; 141 maxIndex = i;
146 } 142 }
147 var element = /** @type {!Element} */ (this.itemElement(maxIndex)); 143 var element = /** @type {!Element} */ (this._viewport.elementAtIndex(maxInde x));
148 this._element.style.width = UI.measurePreferredSize(element, this._element). width + 'px'; 144 this._element.style.width = UI.measurePreferredSize(element, this._element). width + 'px';
149 } 145 }
150 146
151 /** 147 /**
152 * @param {!Event} event 148 * @param {!Event} event
153 */ 149 */
154 _onBoxMouseDown(event) { 150 _onBoxMouseDown(event) {
155 if (this._hideTimeoutId) { 151 if (this._hideTimeoutId) {
156 window.clearTimeout(this._hideTimeoutId); 152 window.clearTimeout(this._hideTimeoutId);
157 delete this._hideTimeoutId; 153 delete this._hideTimeoutId;
(...skipping 10 matching lines...) Expand all
168 * // FIXME: make SuggestBox work for multiple documents. 164 * // FIXME: make SuggestBox work for multiple documents.
169 * @suppressGlobalPropertiesCheck 165 * @suppressGlobalPropertiesCheck
170 */ 166 */
171 _show() { 167 _show() {
172 if (this.visible()) 168 if (this.visible())
173 return; 169 return;
174 this._bodyElement = document.body; 170 this._bodyElement = document.body;
175 this._bodyElement.addEventListener('mousedown', this._maybeHideBound, true); 171 this._bodyElement.addEventListener('mousedown', this._maybeHideBound, true);
176 this._overlay = new UI.SuggestBox.Overlay(); 172 this._overlay = new UI.SuggestBox.Overlay();
177 this._overlay.setContentElement(this._container); 173 this._overlay.setContentElement(this._container);
178 var measuringElement = this._createItemElement('1', '12');
179 this._viewport.element.appendChild(measuringElement);
180 this._rowHeight = measuringElement.getBoundingClientRect().height;
181 measuringElement.remove();
182 } 174 }
183 175
184 hide() { 176 hide() {
185 if (!this.visible()) 177 if (!this.visible())
186 return; 178 return;
187 179
188 this._userInteracted = false; 180 this._userInteracted = false;
189 this._bodyElement.removeEventListener('mousedown', this._maybeHideBound, tru e); 181 this._bodyElement.removeEventListener('mousedown', this._maybeHideBound, tru e);
190 delete this._bodyElement; 182 delete this._bodyElement;
191 this._container.remove(); 183 this._container.remove();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
234 226
235 return true; 227 return true;
236 } 228 }
237 229
238 /** 230 /**
239 * @param {number} shift 231 * @param {number} shift
240 * @param {boolean=} isCircular 232 * @param {boolean=} isCircular
241 * @return {boolean} is changed 233 * @return {boolean} is changed
242 */ 234 */
243 _selectClosest(shift, isCircular) { 235 _selectClosest(shift, isCircular) {
244 if (!this._length) 236 if (!this._items.length)
245 return false; 237 return false;
246 238
247 this._userInteracted = true; 239 this._userInteracted = true;
248 240
249 if (this._selectedIndex === -1 && shift < 0) 241 if (this._selectedIndex === -1 && shift < 0)
250 shift += 1; 242 shift += 1;
251 243
252 var index = this._selectedIndex + shift; 244 var index = this._selectedIndex + shift;
253 245
254 if (isCircular) 246 if (isCircular)
255 index = (this._length + index) % this._length; 247 index = (this._items.length + index) % this._items.length;
256 else 248 else
257 index = Number.constrain(index, 0, this._length - 1); 249 index = Number.constrain(index, 0, this._items.length - 1);
258 250
259 this._selectItem(index); 251 this._selectItem(index);
260 return true; 252 return true;
261 } 253 }
262 254
263 /** 255 /**
264 * @param {!Event} event 256 * @param {!Event} event
265 */ 257 */
266 _onItemMouseDown(event) { 258 _onItemMouseDown(event) {
267 this._selectedElement = event.currentTarget; 259 this._selectedElement = event.currentTarget;
268 this.acceptSuggestion(); 260 this.acceptSuggestion();
269 event.consume(true); 261 event.consume(true);
270 } 262 }
271 263
272 /** 264 /**
273 * @param {string} query 265 * @param {number} itemIndex
274 * @param {string} title
275 * @param {string=} subtitle
276 * @param {string=} iconType
277 * @param {boolean=} isSecondary
278 * @return {!Element} 266 * @return {!Element}
279 */ 267 */
280 _createItemElement(query, title, subtitle, iconType, isSecondary) { 268 _createItemElement(itemIndex) {
269 var query = this._userEnteredText;
270 var title = this._items[itemIndex].title;
271 var subtitle = this._items[itemIndex].subtitle;
272 var iconType = this._items[itemIndex].iconType;
273 var isSecondary = this._items[itemIndex].isSecondary;
281 var element = createElementWithClass('div', 'suggest-box-content-item source -code'); 274 var element = createElementWithClass('div', 'suggest-box-content-item source -code');
282 if (iconType) { 275 if (iconType) {
283 var icon = UI.Icon.create(iconType, 'suggestion-icon'); 276 var icon = UI.Icon.create(iconType, 'suggestion-icon');
284 element.appendChild(icon); 277 element.appendChild(icon);
285 } 278 }
286 if (isSecondary) 279 if (isSecondary)
287 element.classList.add('secondary'); 280 element.classList.add('secondary');
288 element.tabIndex = -1; 281 element.tabIndex = -1;
289 var displayText = title.trimEnd(50 + query.length); 282 var displayText = title.trimEnd(50 + query.length);
290 283
(...skipping 13 matching lines...) Expand all
304 element.addEventListener('mousedown', this._onItemMouseDown.bind(this), fals e); 297 element.addEventListener('mousedown', this._onItemMouseDown.bind(this), fals e);
305 return element; 298 return element;
306 } 299 }
307 300
308 /** 301 /**
309 * @param {!UI.SuggestBox.Suggestions} items 302 * @param {!UI.SuggestBox.Suggestions} items
310 * @param {string} userEnteredText 303 * @param {string} userEnteredText
311 * @param {function(number): !Promise<{detail:string, description:string}>=} a syncDetails 304 * @param {function(number): !Promise<{detail:string, description:string}>=} a syncDetails
312 */ 305 */
313 _updateItems(items, userEnteredText, asyncDetails) { 306 _updateItems(items, userEnteredText, asyncDetails) {
314 this._length = items.length;
315 this._asyncDetailsPromises.clear(); 307 this._asyncDetailsPromises.clear();
316 this._asyncDetailsCallback = asyncDetails; 308 this._asyncDetailsCallback = asyncDetails;
317 this._elementList = [];
318 delete this._selectedElement; 309 delete this._selectedElement;
319
320 this._userEnteredText = userEnteredText; 310 this._userEnteredText = userEnteredText;
321 this._items = items; 311 this._items = items;
322 } 312 }
323 313
324 /** 314 /**
325 * @param {number} index 315 * @param {number} index
326 * @return {!Promise<?{detail: string, description: string}>} 316 * @return {!Promise<?{detail: string, description: string}>}
327 */ 317 */
328 _asyncDetails(index) { 318 _asyncDetails(index) {
329 if (!this._asyncDetailsCallback) 319 if (!this._asyncDetailsCallback)
(...skipping 21 matching lines...) Expand all
351 _selectItem(index) { 341 _selectItem(index) {
352 if (this._selectedElement) { 342 if (this._selectedElement) {
353 this._selectedElement.classList.remove('selected'); 343 this._selectedElement.classList.remove('selected');
354 this._selectedElement.classList.remove('force-white-icons'); 344 this._selectedElement.classList.remove('force-white-icons');
355 } 345 }
356 346
357 this._selectedIndex = index; 347 this._selectedIndex = index;
358 if (index < 0) 348 if (index < 0)
359 return; 349 return;
360 350
361 this._selectedElement = this.itemElement(index); 351 this._selectedElement = this._viewport.elementAtIndex(index);
362 this._selectedElement.classList.add('selected'); 352 this._selectedElement.classList.add('selected');
363 this._selectedElement.classList.add('force-white-icons'); 353 this._selectedElement.classList.add('force-white-icons');
364 this._detailsPopup.classList.add('hidden'); 354 this._detailsPopup.classList.add('hidden');
365 var elem = this._selectedElement; 355 var elem = this._selectedElement;
366 this._asyncDetails(index).then(showDetails.bind(this), function() {}); 356 this._asyncDetails(index).then(showDetails.bind(this), function() {});
367 357
368 this._viewport.scrollItemIntoView(index); 358 this._viewport.scrollItemIntoView(index);
369 this._applySuggestion(true); 359 this._applySuggestion(true);
370 360
371 /** 361 /**
(...skipping 19 matching lines...) Expand all
391 if (completions.length > 1) 381 if (completions.length > 1)
392 return true; 382 return true;
393 383
394 if (!completions[0].title.startsWith(userEnteredText)) 384 if (!completions[0].title.startsWith(userEnteredText))
395 return true; 385 return true;
396 386
397 // Do not show a single suggestion if it is the same as user-entered query, even if allowed to show single-item suggest boxes. 387 // Do not show a single suggestion if it is the same as user-entered query, even if allowed to show single-item suggest boxes.
398 return canShowForSingleItem && completions[0].title !== userEnteredText; 388 return canShowForSingleItem && completions[0].title !== userEnteredText;
399 } 389 }
400 390
401 _ensureRowCountPerViewport() {
402 if (this._rowCountPerViewport)
403 return;
404 if (!this._items.length)
405 return;
406
407 this._rowCountPerViewport = Math.floor(this._element.getBoundingClientRect() .height / this._rowHeight);
408 }
409
410 /** 391 /**
411 * @param {!AnchorBox} anchorBox 392 * @param {!AnchorBox} anchorBox
412 * @param {!UI.SuggestBox.Suggestions} completions 393 * @param {!UI.SuggestBox.Suggestions} completions
413 * @param {boolean} selectHighestPriority 394 * @param {boolean} selectHighestPriority
414 * @param {boolean} canShowForSingleItem 395 * @param {boolean} canShowForSingleItem
415 * @param {string} userEnteredText 396 * @param {string} userEnteredText
416 * @param {function(number): !Promise<{detail:string, description:string}>=} a syncDetails 397 * @param {function(number): !Promise<{detail:string, description:string}>=} a syncDetails
417 */ 398 */
418 updateSuggestions( 399 updateSuggestions(
419 anchorBox, 400 anchorBox,
420 completions, 401 completions,
421 selectHighestPriority, 402 selectHighestPriority,
422 canShowForSingleItem, 403 canShowForSingleItem,
423 userEnteredText, 404 userEnteredText,
424 asyncDetails) { 405 asyncDetails) {
425 delete this._onlyCompletion; 406 delete this._onlyCompletion;
426 if (this._canShowBox(completions, canShowForSingleItem, userEnteredText)) { 407 if (this._canShowBox(completions, canShowForSingleItem, userEnteredText)) {
427 this._updateItems(completions, userEnteredText, asyncDetails); 408 this._updateItems(completions, userEnteredText, asyncDetails);
409 this._viewport.resetElementHeight();
428 this._show(); 410 this._show();
429 this._updateBoxPosition(anchorBox); 411 this._updateBoxPosition(anchorBox);
412 this._viewport.refresh(this._items.length);
430 this._updateWidth(); 413 this._updateWidth();
431 this._viewport.refresh();
432 var highestPriorityItem = -1; 414 var highestPriorityItem = -1;
433 if (selectHighestPriority) { 415 if (selectHighestPriority) {
434 var highestPriority = -Infinity; 416 var highestPriority = -Infinity;
435 for (var i = 0; i < completions.length; i++) { 417 for (var i = 0; i < completions.length; i++) {
436 var priority = completions[i].priority || 0; 418 var priority = completions[i].priority || 0;
437 if (highestPriority < priority) { 419 if (highestPriority < priority) {
438 highestPriority = priority; 420 highestPriority = priority;
439 highestPriorityItem = i; 421 highestPriorityItem = i;
440 } 422 }
441 } 423 }
442 } 424 }
443 this._selectItem(highestPriorityItem); 425 this._selectItem(highestPriorityItem);
444 delete this._rowCountPerViewport;
445 } else { 426 } else {
446 if (completions.length === 1) { 427 if (completions.length === 1) {
447 this._onlyCompletion = completions[0].title; 428 this._onlyCompletion = completions[0].title;
448 this._applySuggestion(true); 429 this._applySuggestion(true);
449 } 430 }
450 this.hide(); 431 this.hide();
451 } 432 }
452 } 433 }
453 434
454 /** 435 /**
(...skipping 27 matching lines...) Expand all
482 * @return {boolean} 463 * @return {boolean}
483 */ 464 */
484 downKeyPressed() { 465 downKeyPressed() {
485 return this._selectClosest(1, true); 466 return this._selectClosest(1, true);
486 } 467 }
487 468
488 /** 469 /**
489 * @return {boolean} 470 * @return {boolean}
490 */ 471 */
491 pageUpKeyPressed() { 472 pageUpKeyPressed() {
492 this._ensureRowCountPerViewport(); 473 return this._selectClosest(-this._viewport.elementsPerViewport(), false);
pfeldman 2016/12/20 02:00:18 Since scrollbar belongs to viewport, this should a
493 return this._selectClosest(-this._rowCountPerViewport, false);
494 } 474 }
495 475
496 /** 476 /**
497 * @return {boolean} 477 * @return {boolean}
498 */ 478 */
499 pageDownKeyPressed() { 479 pageDownKeyPressed() {
500 this._ensureRowCountPerViewport(); 480 return this._selectClosest(this._viewport.elementsPerViewport(), false);
501 return this._selectClosest(this._rowCountPerViewport, false);
502 } 481 }
503 482
504 /** 483 /**
505 * @return {boolean} 484 * @return {boolean}
506 */ 485 */
507 enterKeyPressed() { 486 enterKeyPressed() {
508 if (!this._userInteracted && this._captureEnter) 487 if (!this._userInteracted && this._captureEnter)
509 return false; 488 return false;
510 489
511 var hasSelectedItem = !!this._selectedElement || this._onlyCompletion; 490 var hasSelectedItem = !!this._selectedElement || this._onlyCompletion;
512 this.acceptSuggestion(); 491 this.acceptSuggestion();
513 492
514 // Report the event as non-handled if there is no selected item, 493 // Report the event as non-handled if there is no selected item,
515 // to commit the input or handle it otherwise. 494 // to commit the input or handle it otherwise.
516 return hasSelectedItem; 495 return hasSelectedItem;
517 } 496 }
518
519 /**
520 * @override
521 * @param {number} index
522 * @return {number}
523 */
524 fastItemHeight(index) {
525 return this._rowHeight;
526 }
527
528 /**
529 * @override
530 * @return {number}
531 */
532 itemCount() {
533 return this._items.length;
534 }
535
536 /**
537 * @override
538 * @param {number} index
539 * @return {?Element}
540 */
541 itemElement(index) {
542 if (!this._elementList[index]) {
543 this._elementList[index] = this._createItemElement(
544 this._userEnteredText, this._items[index].title, this._items[index].su btitle, this._items[index].iconType,
545 this._items[index].isSecondary);
546 }
547 return this._elementList[index];
548 }
549 }; 497 };
550 498
551 /** 499 /**
552 * @typedef {!Array.<{title: string, subtitle: (string|undefined), iconType: (st ring|undefined), priority: (number|undefined), isSecondary: (boolean|undefined)} >} 500 * @typedef {!Array.<{title: string, subtitle: (string|undefined), iconType: (st ring|undefined), priority: (number|undefined), isSecondary: (boolean|undefined)} >}
553 */ 501 */
554 UI.SuggestBox.Suggestions; 502 UI.SuggestBox.Suggestions;
555 503
556 /** 504 /**
557 * @unrestricted 505 * @unrestricted
558 */ 506 */
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 this.element.style.left = containerBox.x + 'px'; 557 this.element.style.left = containerBox.x + 'px';
610 this.element.style.top = containerBox.y + 'px'; 558 this.element.style.top = containerBox.y + 'px';
611 this.element.style.height = containerBox.height + 'px'; 559 this.element.style.height = containerBox.height + 'px';
612 this.element.style.width = containerBox.width + 'px'; 560 this.element.style.width = containerBox.width + 'px';
613 } 561 }
614 562
615 dispose() { 563 dispose() {
616 this.element.remove(); 564 this.element.remove();
617 } 565 }
618 }; 566 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698