| Index: Source/devtools/front_end/source_frame/TextEditorAutocompleteController.js
 | 
| diff --git a/Source/devtools/front_end/source_frame/TextEditorAutocompleteController.js b/Source/devtools/front_end/source_frame/TextEditorAutocompleteController.js
 | 
| index fc755380a398e468462f08f26742386226b22807..3d7cae44e1c1255758d43cc5b0d61f5130c31542 100644
 | 
| --- a/Source/devtools/front_end/source_frame/TextEditorAutocompleteController.js
 | 
| +++ b/Source/devtools/front_end/source_frame/TextEditorAutocompleteController.js
 | 
| @@ -126,6 +126,53 @@ WebInspector.TextEditorAutocompleteController.prototype = {
 | 
|          var prefixRange = substituteRange.clone();
 | 
|          prefixRange.endColumn = cursor.ch;
 | 
|  
 | 
| +        var oldPrefixRange = this._prefixRange;
 | 
| +        this._prefixRange = prefixRange;
 | 
| +
 | 
| +        var prefix = this._textEditor.copyRange(prefixRange);
 | 
| +
 | 
| +        if (!oldPrefixRange || prefixRange.startLine !== oldPrefixRange.startLine || prefixRange.startColumn !== oldPrefixRange.startColumn)
 | 
| +            this._updateAnchorBox();
 | 
| +
 | 
| +        var sourceUrl = this._textEditor.url();
 | 
| +        if (sourceUrl) {
 | 
| +            var mime = this._textEditor.mimeType();
 | 
| +            var completionLocation = {
 | 
| +                source: sourceUrl,
 | 
| +                line: /** @type {number} */ (cursor.line),
 | 
| +                column: /** @type {number} */ (cursor.ch)
 | 
| +            };
 | 
| +
 | 
| +            if (WebInspector.languageService.handles.completions(mime)) {
 | 
| +                var anchor = this._anchorBox; //This can be removed by other calls to _updateAnchorBox, keep it for us
 | 
| +
 | 
| +                /**
 | 
| +                 * @this {!WebInspector.TextEditorAutocompleteController}
 | 
| +                 */
 | 
| +                function completionsReadyCallback(completions) {
 | 
| +                    var texts = completions.map(function(i){ return i.text; });
 | 
| +                    var details = completions.map(function(i){ return i.details; });
 | 
| +                    if (!this._suggestBox)
 | 
| +                        this._suggestBox = new WebInspector.SuggestBox(this, 6);
 | 
| +
 | 
| +                    this._suggestBox.updateSuggestions(anchor, texts, 0, true, prefix, details);
 | 
| +                    if (!this._suggestBox.visible())
 | 
| +                        this.finishAutocomplete();
 | 
| +                    this._onSuggestionsShownForTest(texts);
 | 
| +                }
 | 
| +
 | 
| +                var lastCompletion = this._lastCompletion = WebInspector.languageService.completions(mime, completionLocation, prefix).then((function(vals) {
 | 
| +                    if (lastCompletion !== this._lastCompletion) return;
 | 
| +                    if (!vals) {
 | 
| +                        completionsReadyCallback.call(this, []);
 | 
| +                        return;
 | 
| +                    }
 | 
| +                    completionsReadyCallback.call(this, vals);
 | 
| +                }).bind(this));
 | 
| +                return;
 | 
| +            }
 | 
| +        }
 | 
| +
 | 
|          var wordsWithPrefix = this._delegate.wordsWithPrefix(this._textEditor, prefixRange, substituteRange);
 | 
|          if (!wordsWithPrefix.length) {
 | 
|              this.finishAutocomplete();
 | 
| @@ -134,11 +181,7 @@ WebInspector.TextEditorAutocompleteController.prototype = {
 | 
|  
 | 
|          if (!this._suggestBox)
 | 
|              this._suggestBox = new WebInspector.SuggestBox(this, 6);
 | 
| -        var oldPrefixRange = this._prefixRange;
 | 
| -        this._prefixRange = prefixRange;
 | 
| -        if (!oldPrefixRange || prefixRange.startLine !== oldPrefixRange.startLine || prefixRange.startColumn !== oldPrefixRange.startColumn)
 | 
| -            this._updateAnchorBox();
 | 
| -        this._suggestBox.updateSuggestions(this._anchorBox, wordsWithPrefix, 0, true, this._textEditor.copyRange(prefixRange));
 | 
| +        this._suggestBox.updateSuggestions(this._anchorBox, wordsWithPrefix, 0, true, prefix);
 | 
|          if (!this._suggestBox.visible())
 | 
|              this.finishAutocomplete();
 | 
|          this._onSuggestionsShownForTest(wordsWithPrefix);
 | 
| @@ -194,6 +237,9 @@ WebInspector.TextEditorAutocompleteController.prototype = {
 | 
|       */
 | 
|      acceptSuggestion: function()
 | 
|      {
 | 
| +        if (!this._prefixRange)
 | 
| +            return;
 | 
| +
 | 
|          if (this._prefixRange.endColumn - this._prefixRange.startColumn === this._currentSuggestion.length)
 | 
|              return;
 | 
|  
 | 
| @@ -224,7 +270,7 @@ WebInspector.TextEditorAutocompleteController.prototype = {
 | 
|  
 | 
|      _onCursorActivity: function()
 | 
|      {
 | 
| -        if (!this._suggestBox)
 | 
| +        if (!(this._suggestBox && this._prefixRange))
 | 
|              return;
 | 
|          var cursor = this._codeMirror.getCursor();
 | 
|          if (cursor.line !== this._prefixRange.startLine || cursor.ch > this._prefixRange.endColumn || cursor.ch <= this._prefixRange.startColumn)
 | 
| @@ -233,6 +279,7 @@ WebInspector.TextEditorAutocompleteController.prototype = {
 | 
|  
 | 
|      _updateAnchorBox: function()
 | 
|      {
 | 
| +        if (!this._prefixRange) return;
 | 
|          var line = this._prefixRange.startLine;
 | 
|          var column = this._prefixRange.startColumn;
 | 
|          var metrics = this._textEditor.cursorPositionToCoordinates(line, column);
 | 
| 
 |