Merge "Disable suggestion if not focused and don't carry over suggestions"
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.html b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.html
index b116171..d801638 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.html
+++ b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.html
@@ -182,6 +182,11 @@
test('input text change triggers function', () => {
sandbox.spy(element, '_getRecentChanges');
element.$.parentInput.noDebounce = true;
+ MockInteractions.pressAndReleaseKeyOn(
+ element.$.parentInput.$.input,
+ 13,
+ null,
+ 'enter');
element._text = '1';
assert.isTrue(element._getRecentChanges.calledOnce);
element._text = '12';
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js
index 3a60255..be3c48f 100644
--- a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js
+++ b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.js
@@ -264,13 +264,23 @@
return;
}
+ // Reset _suggestions for every update
+ // This will also prevent from carrying over suggestions:
+ // @see Issue 12039
+ this._suggestions = [];
+
+ // TODO(taoalpha): Also skip if text has not changed
+
if (this._disableSuggestions) { return; }
if (text.length < threshold) {
- this._suggestions = [];
this.value = '';
return;
}
+ if (!this._focused) {
+ return;
+ }
+
const update = () => {
this.query(text).then(suggestions => {
if (text !== this.text) {
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html
index 39329e5..9df3cfc 100644
--- a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html
+++ b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.html
@@ -38,6 +38,10 @@
suite('gr-autocomplete tests', () => {
let element;
let sandbox;
+ const focusOnInput = element => {
+ MockInteractions.pressAndReleaseKeyOn(element.$.input, 13, null,
+ 'enter');
+ };
setup(() => {
element = fixture('basic');
@@ -63,6 +67,7 @@
assert.isTrue(element.$.suggestions.isHidden);
assert.equal(element.$.suggestions.$.cursor.index, -1);
+ focusOnInput(element);
element.text = 'blah';
assert.isTrue(queryStub.called);
@@ -186,6 +191,7 @@
return promise = Promise.resolve([{name: 'suggestion', value: 0}]);
});
element.query = queryStub;
+ focusOnInput(element);
element.text = 'blah';
promise.then(() => {
@@ -207,6 +213,7 @@
return promise = Promise.resolve([{name: 'suggestion', value: 0}]);
});
element.query = queryStub;
+ focusOnInput(element);
element.text = 'blah';
element.clearOnCommit = true;
@@ -228,15 +235,11 @@
return Promise.resolve([]);
});
element.query = queryStub;
-
element.threshold = 2;
-
+ focusOnInput(element);
element.text = 'a';
-
assert.isFalse(queryStub.called);
-
element.text = 'ab';
-
assert.isTrue(queryStub.called);
});
@@ -249,6 +252,7 @@
(name, cb) => { callback = cb; });
element.query = queryStub;
element.noDebounce = false;
+ focusOnInput(element);
element.text = 'a';
assert.isFalse(queryStub.called);
assert.isTrue(debounceStub.called);
@@ -269,11 +273,60 @@
assert.equal(element._suggestions.length, 0);
});
+ test('when focused', done => {
+ let promise;
+ const queryStub = sandbox.stub()
+ .returns(promise = Promise.resolve([{name: 'suggestion', value: 0}]));
+ element.query = queryStub;
+ element.suggestOnlyWhenFocus = true;
+ focusOnInput(element);
+ element.text = 'bla';
+ assert.equal(element._focused, true);
+ flushAsynchronousOperations();
+ promise.then(() => {
+ assert.equal(element._suggestions.length, 1);
+ assert.equal(queryStub.notCalled, false);
+ done();
+ });
+ });
+
+ test('when not focused', done => {
+ let promise;
+ const queryStub = sandbox.stub()
+ .returns(promise = Promise.resolve([{name: 'suggestion', value: 0}]));
+ element.query = queryStub;
+ element.suggestOnlyWhenFocus = true;
+ element.text = 'bla';
+ assert.equal(element._focused, false);
+ flushAsynchronousOperations();
+ promise.then(() => {
+ assert.equal(element._suggestions.length, 0);
+ done();
+ });
+ });
+
+ test('suggestions should not carry over', done => {
+ let promise;
+ const queryStub = sandbox.stub()
+ .returns(promise = Promise.resolve([{name: 'suggestion', value: 0}]));
+ element.query = queryStub;
+ focusOnInput(element);
+ element.text = 'bla';
+ flushAsynchronousOperations();
+ promise.then(() => {
+ assert.equal(element._suggestions.length, 1);
+ element._updateSuggestions('', 0, false);
+ assert.equal(element._suggestions.length, 0);
+ done();
+ });
+ });
+
test('multi completes only the last part of the query', done => {
let promise;
const queryStub = sandbox.stub()
.returns(promise = Promise.resolve([{name: 'suggestion', value: 0}]));
element.query = queryStub;
+ focusOnInput(element);
element.text = 'blah blah';
element.multi = true;