Merge "Remove Autocomplete noDebounce option"
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.ts b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.ts
index 6f8bd9a..c2739f3 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.ts
+++ b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog.ts
@@ -218,7 +218,6 @@
<gr-autocomplete
id="parentInput"
.query=${this.query}
- no-debounce
.text=${this.text}
@text-changed=${(e: ValueChangedEvent) =>
(this.text = e.detail.value)}
diff --git a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.ts b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.ts
index 776e923..2644d81 100644
--- a/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.ts
+++ b/polygerrit-ui/app/elements/change/gr-confirm-rebase-dialog/gr-confirm-rebase-dialog_test.ts
@@ -74,7 +74,6 @@
<gr-autocomplete
allow-non-suggested-values=""
id="parentInput"
- no-debounce=""
placeholder="Change number, ref, or commit hash"
>
</gr-autocomplete>
@@ -305,7 +304,6 @@
test('input text change triggers function', async () => {
const recentChangesSpy = sinon.spy(element, 'getRecentChanges');
- element.parentInput.noDebounce = true;
pressKey(
queryAndAssert(queryAndAssert(element, '#parentInput'), '#input'),
Key.ENTER
diff --git a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.ts b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.ts
index 31283ad..0729f21 100644
--- a/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.ts
+++ b/polygerrit-ui/app/elements/edit/gr-edit-controls/gr-edit-controls_test.ts
@@ -217,16 +217,20 @@
assert.isFalse(hideDialogStub.called);
queryAndAssert<GrButton>(element, '#open').click();
element.patchNum = 1 as RevisionPatchSetNum;
- await waitUntilVisible(element.modal!);
+ await showDialogSpy.lastCall.returnValue;
assert.isTrue(hideDialogStub.called);
assert.isTrue(element.openDialog!.disabled);
assert.isFalse(queryStub.called);
// Setup focused manually - in headless mode Chrome sometimes doesn't
// setup focus. waitEventLoop() doesn't help.
openAutoComplete.focused = true;
- openAutoComplete.noDebounce = true;
openAutoComplete.text = 'src/test.cpp';
+ // Focus happens after updateComplete, so we first wait for it explicitly.
+ await new Promise<void>(resolve => {
+ openAutoComplete.addEventListener('focus', () => resolve());
+ });
await element.updateComplete;
+ await openAutoComplete.latestSuggestionUpdateComplete;
assert.isTrue(queryStub.called);
await waitUntil(() => !element.openDialog!.disabled);
queryAndAssert<GrButton>(
@@ -242,7 +246,6 @@
queryAndAssert<GrButton>(element, '#open').click();
await waitUntilVisible(element.modal!);
assert.isTrue(element.openDialog!.disabled);
- openAutoComplete.noDebounce = true;
openAutoComplete.text = 'src/test.cpp';
await element.updateComplete;
await waitUntil(() => !element.openDialog!.disabled);
@@ -277,9 +280,13 @@
// Setup focused manually - in headless mode Chrome sometimes doesn't
// setup focus. waitEventLoop() doesn't help.
deleteAutocomplete.focused = true;
- deleteAutocomplete.noDebounce = true;
deleteAutocomplete.text = 'src/test.cpp';
+ // Focus happens after updateComplete, so we first wait for it explicitly.
+ await new Promise<void>(resolve => {
+ deleteAutocomplete.addEventListener('focus', () => resolve());
+ });
await element.updateComplete;
+ await deleteAutocomplete.latestSuggestionUpdateComplete;
assert.isTrue(queryStub.called);
await waitUntil(() => !element.deleteDialog!.disabled);
queryAndAssert<GrButton>(
@@ -304,9 +311,13 @@
// Setup focused manually - in headless mode Chrome sometimes doesn't
// setup focus. waitEventLoop() doesn't help.
deleteAutocomplete.focused = true;
- deleteAutocomplete.noDebounce = true;
deleteAutocomplete.text = 'src/test.cpp';
+ // Focus happens after updateComplete, so we first wait for it explicitly.
+ await new Promise<void>(resolve => {
+ deleteAutocomplete.addEventListener('focus', () => resolve());
+ });
await element.updateComplete;
+ await deleteAutocomplete.latestSuggestionUpdateComplete;
assert.isTrue(queryStub.called);
await waitUntil(() => !element.deleteDialog!.disabled);
queryAndAssert<GrButton>(
@@ -363,9 +374,13 @@
// Setup focused manually - in headless mode Chrome sometimes doesn't
// setup focus. waitEventLoop() doesn't help.
renameAutocomplete.focused = true;
- renameAutocomplete.noDebounce = true;
renameAutocomplete.text = 'src/test.cpp';
+ // Focus happens after updateComplete, so we first wait for it explicitly.
+ await new Promise<void>(resolve => {
+ renameAutocomplete.addEventListener('focus', () => resolve());
+ });
await element.updateComplete;
+ await renameAutocomplete.latestSuggestionUpdateComplete;
assert.isTrue(queryStub.called);
assert.isTrue(element.renameDialog!.disabled);
@@ -395,9 +410,13 @@
// Setup focused manually - in headless mode Chrome sometimes doesn't
// setup focus. waitEventLoop() doesn't help.
renameAutocomplete.focused = true;
- renameAutocomplete.noDebounce = true;
renameAutocomplete.text = 'src/test.cpp';
+ // Focus happens after updateComplete, so we first wait for it explicitly.
+ await new Promise<void>(resolve => {
+ renameAutocomplete.addEventListener('focus', () => resolve());
+ });
await element.updateComplete;
+ await renameAutocomplete.latestSuggestionUpdateComplete;
assert.isTrue(queryStub.called);
assert.isTrue(element.renameDialog!.disabled);
diff --git a/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.ts b/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.ts
index 6b4d670..cc2723e 100644
--- a/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-account-list/gr-account-list_test.ts
@@ -401,8 +401,8 @@
);
input.text = 'newTest';
input.input!.focus();
- input.noDebounce = true;
await element.updateComplete;
+ await input.latestSuggestionUpdateComplete;
assert.isTrue(getSuggestionsStub.calledOnce);
assert.equal(getSuggestionsStub.lastCall.args[0], 'newTest');
await waitUntil(() => makeSuggestionItemSpy.getCalls().length === 2);
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.ts b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.ts
index de97741..ab74e8b 100644
--- a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.ts
+++ b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete.ts
@@ -9,7 +9,11 @@
import '../../../styles/shared-styles';
import {GrAutocompleteDropdown} from '../gr-autocomplete-dropdown/gr-autocomplete-dropdown';
import {fire, fireEvent} from '../../../utils/event-util';
-import {debounce, DelayedTask} from '../../../utils/async-util';
+import {
+ debounce,
+ DelayedTask,
+ ResolvedDelayedTaskStatus,
+} from '../../../utils/async-util';
import {PropertyType} from '../../../types/common';
import {modifierPressed} from '../../../utils/dom-util';
import {sharedStyles} from '../../../styles/shared-styles';
@@ -150,12 +154,6 @@
@property({type: Boolean, attribute: 'warn-uncommitted'})
warnUncommitted = false;
- /**
- * When true, querying for suggestions is not debounced w/r/t keypresses
- */
- @property({type: Boolean, attribute: 'no-debounce'})
- noDebounce = false;
-
@property({type: Boolean, attribute: 'show-blue-focus-border'})
showBlueFocusBorder = false;
@@ -183,6 +181,15 @@
private updateSuggestionsTask?: DelayedTask;
+ /**
+ * @return Promise that resolves when suggestions are update.
+ */
+ get latestSuggestionUpdateComplete():
+ | Promise<ResolvedDelayedTaskStatus>
+ | undefined {
+ return this.updateSuggestionsTask?.promise;
+ }
+
get nativeInput() {
return (this.input!.inputElement as IronInputElement)
.inputElement as HTMLInputElement;
@@ -254,11 +261,7 @@
}
override willUpdate(changedProperties: PropertyValues) {
- if (
- changedProperties.has('text') ||
- changedProperties.has('threshold') ||
- changedProperties.has('noDebounce')
- ) {
+ if (changedProperties.has('text') || changedProperties.has('threshold')) {
this.updateSuggestions();
}
if (
@@ -404,12 +407,7 @@
}
updateSuggestions() {
- if (
- this.text === undefined ||
- this.threshold === undefined ||
- this.noDebounce === undefined
- )
- return;
+ if (this.text === undefined || this.threshold === undefined) return;
// Reset suggestions for every update
// This will also prevent from carrying over suggestions:
@@ -462,15 +460,11 @@
});
};
- if (this.noDebounce) {
- update();
- } else {
- this.updateSuggestionsTask = debounce(
- this.updateSuggestionsTask,
- update,
- DEBOUNCE_WAIT_MS
- );
- }
+ this.updateSuggestionsTask = debounce(
+ this.updateSuggestionsTask,
+ update,
+ DEBOUNCE_WAIT_MS
+ );
}
setFocus(focused: boolean) {
diff --git a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.ts b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.ts
index eb1efec..81949c7 100644
--- a/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-autocomplete/gr-autocomplete_test.ts
@@ -391,7 +391,6 @@
element.query = queryStub;
await element.updateComplete;
- element.noDebounce = false;
focusOnInput();
element.text = 'a';
@@ -413,7 +412,6 @@
test('empty text results in no suggestions', async () => {
element.text = '';
element.threshold = 0;
- element.noDebounce = false;
await element.updateComplete;
assert.equal(element.suggestions.length, 0);
});
@@ -475,7 +473,6 @@
assert.equal(element.suggestions.length, 1);
element.text = '';
element.threshold = 0;
- element.noDebounce = false;
await element.updateComplete;
assert.equal(element.suggestions.length, 0);
});
@@ -494,7 +491,6 @@
await waitUntil(() => element.queryErrorMessage === 'Test error');
element.text = '';
element.threshold = 0;
- element.noDebounce = false;
await element.updateComplete;
assert.isUndefined(element.queryErrorMessage);
});