FIX: race conditions in search menu (#9262)

FIX: race conditions in search menu (#9262)

Race conditions could lead the previous query search term to be used in the next query. This commit also attempts to simplify code.

diff --git a/app/assets/javascripts/discourse/widgets/search-menu-controls.js b/app/assets/javascripts/discourse/widgets/search-menu-controls.js
index 9331255..7884b1a 100644
--- a/app/assets/javascripts/discourse/widgets/search-menu-controls.js
+++ b/app/assets/javascripts/discourse/widgets/search-menu-controls.js
@@ -35,7 +35,8 @@ createWidget("search-term", {
     }
 
     const val = this.attrs.value;
-    const newVal = $(`#${this.buildId()}`).val();
+    // remove zero-width chars
+    const newVal = e.target.value.replace(/[\u200B-\u200D\uFEFF]/, "");
 
     if (newVal !== val) {
       this.sendWidgetAction("searchTermChanged", newVal);
diff --git a/app/assets/javascripts/discourse/widgets/search-menu.js b/app/assets/javascripts/discourse/widgets/search-menu.js
index 690dc80..7bc56bf 100644
--- a/app/assets/javascripts/discourse/widgets/search-menu.js
+++ b/app/assets/javascripts/discourse/widgets/search-menu.js
@@ -1,5 +1,5 @@
 import { get } from "@ember/object";
-import { debounce, later } from "@ember/runloop";
+import { debounce, cancel } from "@ember/runloop";
 import { popupAjaxError } from "discourse/lib/ajax-error";
 import { searchForTerm, isValidSearchTerm } from "discourse/lib/search";
 import { createWidget } from "discourse/widgets/widget";
@@ -23,28 +23,17 @@ initSearchData();
 // Helps with debouncing and cancelling promises
 const SearchHelper = {
   _activeSearch: null,
-  _cancelSearch: null,
 
   // for cancelling debounced search
   cancel() {
     if (this._activeSearch) {
-      this._activeSearch.abort();
+      cancel(this._activeSearch);
+      this._activeSearch = null;
     }
-
-    this._cancelSearch = true;
-    later(() => (this._cancelSearch = false), 400);
   },
 
   perform(widget) {
-    if (this._cancelSearch) {
-      this._cancelSearch = null;
-      return;
-    }
-
-    if (this._activeSearch) {
-      this._activeSearch.abort();
-      this._activeSearch = null;
-    }
+    this.cancel();
 
     const { term, typeFilter, contextEnabled } = searchData;
     const searchContext = contextEnabled ? widget.searchContext() : null;
@@ -67,11 +56,6 @@ const SearchHelper = {
       this._activeSearch
         .then(content => {
           searchData.noResults = content.resultTypes.length === 0;
-
-          if (content.grouped_search_result) {
-            searchData.term = content.grouped_search_result.term;
-          }
-
           searchData.results = content;
 
           if (searchContext && searchContext.type === "topic") {

GitHub sha: 58ced428

1 Like

This commit appears in #9262 which was approved by eviltrout. It was merged by jjaffeux.