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

Unified Diff: Source/devtools/front_end/ui/SuggestBox.js

Issue 1264133002: Devtools: [WIP] Implement enhanced devtools extension language APIs Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Small cleanups - prefer URIs to contentURLs, revert protocol unifications, remove lambdas Created 5 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/devtools/front_end/sources/module.json ('k') | Source/devtools/front_end/ui/TextPrompt.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/devtools/front_end/ui/SuggestBox.js
diff --git a/Source/devtools/front_end/ui/SuggestBox.js b/Source/devtools/front_end/ui/SuggestBox.js
index 32b3c52282616f84ecb7df1250dd9182739a72a5..7f1cc205b282d21ef49262bf3d4165242f880baa 100644
--- a/Source/devtools/front_end/ui/SuggestBox.js
+++ b/Source/devtools/front_end/ui/SuggestBox.js
@@ -61,8 +61,11 @@ WebInspector.SuggestBox = function(suggestBoxDelegate, maxItemsHeight)
this._selectedElement = null;
this._maxItemsHeight = maxItemsHeight;
this._maybeHideBound = this._maybeHide.bind(this);
- this._element = createElementWithClass("div", "suggest-box");
+ this._container = createElementWithClass("div", "suggest-box-container");
+ this._element = this._container.createChild("div", "suggest-box");
this._element.addEventListener("mousedown", this._onBoxMouseDown.bind(this), true);
+ this._detailsPopup = this._container.createChild("div", "details-popup monospace");
+ this._detailsPopup.style.visibility = 'hidden';
}
WebInspector.SuggestBox.prototype = {
@@ -71,7 +74,7 @@ WebInspector.SuggestBox.prototype = {
*/
visible: function()
{
- return !!this._element.parentElement;
+ return !!this._container.parentElement;
},
/**
@@ -142,7 +145,7 @@ WebInspector.SuggestBox.prototype = {
this._bodyElement = document.body;
this._bodyElement.addEventListener("mousedown", this._maybeHideBound, true);
this._overlay = new WebInspector.SuggestBox.Overlay();
- this._overlay.setContentElement(this._element);
+ this._overlay.setContentElement(this._container);
},
hide: function()
@@ -152,7 +155,7 @@ WebInspector.SuggestBox.prototype = {
this._bodyElement.removeEventListener("mousedown", this._maybeHideBound, true);
delete this._bodyElement;
- this._element.remove();
+ this._container.remove();
this._overlay.dispose();
delete this._overlay;
delete this._selectedElement;
@@ -234,8 +237,9 @@ WebInspector.SuggestBox.prototype = {
/**
* @param {string} prefix
* @param {string} text
+ * @param {?Function<!Promise<{detail:string, description:string}>>} asyncDetail
*/
- _createItemElement: function(prefix, text)
+ _createItemElement: function(prefix, text, asyncDetail)
{
var element = createElementWithClass("div", "suggest-box-content-item source-code");
element.tabIndex = -1;
@@ -246,6 +250,17 @@ WebInspector.SuggestBox.prototype = {
element.createChild("span", "suffix").textContent = text;
}
element.createChild("span", "spacer");
+ var prom;
+ element.details = function() {
+ if (!prom) {
+ if (!asyncDetail) {
+ prom = Promise.reject().then(function(){},function(){});
+ } else {
+ prom = asyncDetail();
+ }
+ }
+ return prom;
+ };
element.addEventListener("mousedown", this._onItemMouseDown.bind(this), false);
return element;
},
@@ -253,8 +268,9 @@ WebInspector.SuggestBox.prototype = {
/**
* @param {!Array.<string>} items
* @param {string} userEnteredText
+ * @param {!Array<!Function<!Promise<{detail:string, description:string}>>>} asyncDetails
*/
- _updateItems: function(items, userEnteredText)
+ _updateItems: function(items, userEnteredText, asyncDetails)
{
this._length = items.length;
this._element.removeChildren();
@@ -262,11 +278,34 @@ WebInspector.SuggestBox.prototype = {
for (var i = 0; i < items.length; ++i) {
var item = items[i];
- var currentItemElement = this._createItemElement(userEnteredText, item);
+ if (!item) continue;
+ var currentItemElement = this._createItemElement(userEnteredText, item, asyncDetails[i]);
this._element.appendChild(currentItemElement);
}
},
+ _hideDetailsPopup: function()
+ {
+ this._detailsPopup.style.visibility = 'hidden';
+ },
+
+ /**
+ * @param {{detail: string, description: string}=} details
+ */
+ _showDetailsPopup: function(details)
+ {
+ while (this._detailsPopup.firstChild) {
+ this._detailsPopup.removeChild(this._detailsPopup.firstChild);
+ }
+ if (!details) {
+ return;
+ }
+ this._detailsPopup.createChild('section', 'detail').createTextChild(details.detail);
+ this._detailsPopup.createChild('section', 'description').createTextChild(details.description);
+ this._detailsPopup.style.visibility = '';
+ //WebInspector.runCSSAnimationOnce(this._detailsPopup, 'details-fade-in'); //TODO: Causes assertion failures
+ },
+
/**
* @param {number} index
* @param {boolean} scrollIntoView
@@ -282,6 +321,13 @@ WebInspector.SuggestBox.prototype = {
this._selectedElement = this._element.children[index];
this._selectedElement.classList.add("selected");
+ this._hideDetailsPopup();
+ var elem = this._selectedElement;
+ this._selectedElement.details().then((function(details){
+ if (elem === this._selectedElement) {
+ this._showDetailsPopup(details);
+ }
+ }).bind(this), function(){});
if (scrollIntoView)
this._selectedElement.scrollIntoViewIfNeeded(false);
@@ -320,11 +366,12 @@ WebInspector.SuggestBox.prototype = {
* @param {number} selectedIndex
* @param {boolean} canShowForSingleItem
* @param {string} userEnteredText
+ * @param {?Array<!Function<!Promise<{detail:string, description:string}>>>=} asyncDetails
*/
- updateSuggestions: function(anchorBox, completions, selectedIndex, canShowForSingleItem, userEnteredText)
+ updateSuggestions: function(anchorBox, completions, selectedIndex, canShowForSingleItem, userEnteredText, asyncDetails)
{
if (this._canShowBox(completions, canShowForSingleItem, userEnteredText)) {
- this._updateItems(completions, userEnteredText);
+ this._updateItems(completions, userEnteredText, asyncDetails || []);
this._show();
this._updateBoxPosition(anchorBox);
this._selectItem(selectedIndex, selectedIndex > 0);
« no previous file with comments | « Source/devtools/front_end/sources/module.json ('k') | Source/devtools/front_end/ui/TextPrompt.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698