From 8fd10e6414cf4eabdb28d2c5bde8a5b25ea4a4df Mon Sep 17 00:00:00 2001 From: Osama Sayegh Date: Wed, 24 Nov 2021 20:44:46 +0300 Subject: [PATCH] FIX: Don't crash the browser when tapping autocomplete suggestions on Android/Gboard (#15076) This is a workaround for an annoying bug that crashes the browser when an autocomplete suggestion is selected on Android if the virtual keyboard is Gboard. It's specific to Gboard because it sometimes sends `keydown` and `keyup` events twice for a single key press, more details can be found here: https://meta.discourse.org/t/emoji-selector-crashes-the-message-editor-in-android-chrome/187009/24?u=osama. --- .../discourse/app/lib/autocomplete.js | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/app/assets/javascripts/discourse/app/lib/autocomplete.js b/app/assets/javascripts/discourse/app/lib/autocomplete.js index 56450508780..38ab5601e01 100644 --- a/app/assets/javascripts/discourse/app/lib/autocomplete.js +++ b/app/assets/javascripts/discourse/app/lib/autocomplete.js @@ -309,9 +309,22 @@ export default function (options) { } ul.find("li").click(function () { selectedOption = ul.find("li").index(this); - completeTerm(autocompleteOptions[selectedOption]); - if (!options.single) { - me.focus(); + // hack for Gboard, see meta.discourse.org/t/-/187009/24 + if (autocompleteOptions == null) { + const opts = { ...options, _gboard_hack_force_lookup: true }; + const forcedAutocompleteOptions = dataSource(prevTerm, opts); + forcedAutocompleteOptions?.then((data) => { + updateAutoComplete(data); + completeTerm(autocompleteOptions[selectedOption]); + if (!options.single) { + me.focus(); + } + }); + } else { + completeTerm(autocompleteOptions[selectedOption]); + if (!options.single) { + me.focus(); + } } return false; }); @@ -398,7 +411,11 @@ export default function (options) { } function dataSource(term, opts) { - if (prevTerm === term) { + const force = opts._gboard_hack_force_lookup; + if (force) { + delete opts._gboard_hack_force_lookup; + } + if (prevTerm === term && !force) { return SKIP; }