From 58ced428ee84190fc9df2e0ec81ff2d9dd43242d Mon Sep 17 00:00:00 2001 From: Joffrey JAFFEUX Date: Tue, 24 Mar 2020 15:16:42 +0100 Subject: [PATCH] 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. --- .../discourse/widgets/search-menu-controls.js | 3 ++- .../discourse/widgets/search-menu.js | 24 ++++--------------- 2 files changed, 6 insertions(+), 21 deletions(-) diff --git a/app/assets/javascripts/discourse/widgets/search-menu-controls.js b/app/assets/javascripts/discourse/widgets/search-menu-controls.js index 93312553bdb..7884b1ac778 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 690dc80bffa..7bc56bfdbb4 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") {