loleaflet/src/layer/marker/TextInput.js | 52 +++++++++++++++++++++----- loleaflet/src/map/handler/Map.TouchGesture.js | 4 ++ 2 files changed, 47 insertions(+), 9 deletions(-)
New commits: commit 9cc07c8ea0ceadd44557ce0a612ee07121f6e788 Author: Tor Lillqvist <t...@collabora.com> AuthorDate: Wed Aug 12 17:02:56 2020 +0300 Commit: Andras Timar <andras.ti...@collabora.com> CommitDate: Mon Aug 17 18:40:48 2020 +0200 Stopgap fix to make the on-screen keyboard behave a bit better on iPhone Our focus and blur back-and-forth dance does not seem to work on iOS like it does on Android. So for now, never call the textarea element's blur() function explicitly on iOS. Also don't play with the readonly attribute on iPhone. Probably whether the calls to the textarea's focus() and blur() functions actually do anything or not might depend on whether the call stack originates in a user input event handler or not, for security reasons. Change-Id: I442f0c26ae5b36913235a7ef96820bff83535b76 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/100642 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Andras Timar <andras.ti...@collabora.com> diff --git a/loleaflet/src/layer/marker/TextInput.js b/loleaflet/src/layer/marker/TextInput.js index 8e7196e96..801c9d368 100644 --- a/loleaflet/src/layer/marker/TextInput.js +++ b/loleaflet/src/layer/marker/TextInput.js @@ -158,6 +158,11 @@ L.TextInput = L.Layer.extend({ // @acceptInput (only on "mobile" (= mobile phone) or on iOS and Android in general) true if we want to // accept key input, and show the virtual keyboard. focus: function(acceptInput) { + // console.trace('L.TextInput.focus(' + acceptInput + ')'); + + // Note that the acceptInput parameter intentionally + // is a tri-state boolean: undefined, false, or true. + // Clicking or otherwise focusing the map should focus on the clipboard // container in order for the user to input text (and on-screen keyboards // to pop-up), unless the document is read only. @@ -168,23 +173,52 @@ L.TextInput = L.Layer.extend({ // Trick to avoid showing the software keyboard: Set the textarea // read-only before focus() and reset it again after the blur() - if ((window.ThisIsAMobileApp || window.mode.isMobile()) && acceptInput !== true) - this._textArea.setAttribute('readonly', true); + if (navigator.platform !== 'iPhone') { + if ((window.ThisIsAMobileApp || window.mode.isMobile()) && acceptInput !== true) + this._textArea.setAttribute('readonly', true); + } - this._textArea.focus(); + if (navigator.platform !== 'iPhone') { + this._textArea.focus(); + } else if (acceptInput === true) { + // On the iPhone, only call the textarea's focus() when we get an explicit + // true parameter. On the other hand, never call the textarea's blur(). - if ((window.ThisIsAMobileApp || window.mode.isMobile()) && acceptInput !== true) { - this._setAcceptInput(false); - this._textArea.blur(); - this._textArea.removeAttribute('readonly'); - } else { + // Calling blur() leads to so confusing behaviour with the keyboard not + // showing up when we want. Better to have it show up a bit too long that + // strictly needed. + + // Probably whether the calls to the textarea's focus() and blur() functions + // actually do anything or not might depend on whether the call stack + // originates in a user input event handler or not, for security reasons. + + // To investigate, uncomment the call to console.trace() at the start of + // this function, and check when the topmost slot in the stack trace is + // "(anonymous function)" in hammer.js (an event handler), and when it is + // _onMessage (the WebSocket message handler in Socket.js). + + this._textArea.focus(); + } + + if (navigator.platform !== 'iPhone') { + if ((window.ThisIsAMobileApp || window.mode.isMobile()) && acceptInput !== true) { + this._setAcceptInput(false); + this._textArea.blur(); + this._textArea.removeAttribute('readonly'); + } else { + this._setAcceptInput(true); + } + } else if (acceptInput !== false) { this._setAcceptInput(true); + } else { + this._setAcceptInput(false); } }, blur: function() { this._setAcceptInput(false); - this._textArea.blur(); + if (navigator.platform !== 'iPhone') + this._textArea.blur(); }, // Returns true if the last focus was to accept input. diff --git a/loleaflet/src/map/handler/Map.TouchGesture.js b/loleaflet/src/map/handler/Map.TouchGesture.js index 27792560d..4257c0212 100644 --- a/loleaflet/src/map/handler/Map.TouchGesture.js +++ b/loleaflet/src/map/handler/Map.TouchGesture.js @@ -390,6 +390,10 @@ L.Map.TouchGesture = L.Handler.extend({ // Show keyboard when no graphic selection, or cursor is visible. var acceptInput = !docLayer.hasGraphicSelection() || docLayer.isCursorVisible(); + + if (navigator.platform === 'iPhone' && docLayer._docType === 'presentation') + acceptInput = true; + this._map.focus(acceptInput); } }, _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits