Disable suggestion if not focused and don't carry over suggestions

Bug: Issue 12039
Change-Id: Icb18783d921127b04fdb2453e241241893ebe0db
This commit is contained in:
Tao Zhou
2019-12-06 20:07:57 +01:00
parent 1fca1ef3db
commit b0815b891f
3 changed files with 74 additions and 6 deletions

View File

@@ -182,6 +182,11 @@ limitations under the License.
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';

View File

@@ -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) {

View File

@@ -38,6 +38,10 @@ limitations under the License.
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 @@ limitations under the License.
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 @@ limitations under the License.
return promise = Promise.resolve([{name: 'suggestion', value: 0}]);
});
element.query = queryStub;
focusOnInput(element);
element.text = 'blah';
promise.then(() => {
@@ -207,6 +213,7 @@ limitations under the License.
return promise = Promise.resolve([{name: 'suggestion', value: 0}]);
});
element.query = queryStub;
focusOnInput(element);
element.text = 'blah';
element.clearOnCommit = true;
@@ -228,15 +235,11 @@ limitations under the License.
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 @@ limitations under the License.
(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 @@ limitations under the License.
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;