loleaflet/src/layer/marker/TextInput.js | 87 +++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 1 deletion(-)
New commits: commit c440e8dd7bdf4e1c326fc6af388fababa63457e5 Author: Tor Lillqvist <t...@collabora.com> AuthorDate: Wed Aug 19 11:19:35 2020 +0300 Commit: Tor Lillqvist <t...@collabora.com> CommitDate: Wed Aug 19 19:34:41 2020 +0200 Use CollaboraOnlineWebViewKeyboardManager if available If loleaflet is embedded in an iOS app that uses CollaboraOnlineWebViewKeyboardManager, then we can use that to reliably display and hide the on-screen keyboard. (Such iOS apps are Collabora Office or Nextcloud.) This is optional as we can't be sure whether the version of the iOS app we are embedded in uses CollaboraOnlineWebViewKeyboardManager or not. If not, work as before. I.e. hope that calling the focus()/blur() methods of a textarea object will show/hide the on-screen keyboard. Change-Id: Idddedcb4a83588c622067cdbeadb02ecdbd4fc72 Reviewed-on: https://gerrit.libreoffice.org/c/online/+/100980 Tested-by: Jenkins Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Tor Lillqvist <t...@collabora.com> diff --git a/loleaflet/src/layer/marker/TextInput.js b/loleaflet/src/layer/marker/TextInput.js index 6d7ec5851..24af6a272 100644 --- a/loleaflet/src/layer/marker/TextInput.js +++ b/loleaflet/src/layer/marker/TextInput.js @@ -1,4 +1,4 @@ -/* -*- js-indent-level: 8 -*- */ +/* -*- js-indent-level: 8; fill-column: 100 -*- */ /* * L.TextInput is the hidden textarea, which handles text input events * @@ -168,6 +168,81 @@ L.TextInput = L.Layer.extend({ return; } + // Are we running in a WebView under an iOS app that uses + // CollaboraOnlineWebViewKeyboardManager? + if (window.webkit && + window.webkit.messageHandlers && + window.webkit.messageHandlers.CollaboraOnlineWebViewKeyboardManager) { + + if (!acceptInput) { + window.webkit.messageHandlers.CollaboraOnlineWebViewKeyboardManager.postMessage({command: 'hide'}); + return; + } + + // Define the function that CollaboraOnlineWebViewKeyboardManager will call. + // This is a hardcoded name that CollaboraOnlineWebViewKeyboardManager + // knows. This is not a problem as we can keep both codebases in sync. + + var that = this; + window.COKbdMgrCallback = function(message) { + var errorMessage; + if (typeof message !== 'object') { + errorMessage = 'COKbdMgrCallback called with non-object of type ' + typeof message; + console.log(errorMessage); + throw errorMessage; + } + + if (message.id !== 'COKbdMgr') { + errorMessage = 'COKbdMgrCallback called with object with unknown id: ' + message.id; + console.log(errorMessage); + throw errorMessage; + } + + if (message.command === undefined || typeof message.command !== 'string') { + errorMessage = 'COKbdMgrCallback called without command'; + console.log(errorMessage); + throw errorMessage; + } + + if (message.command === 'replaceText') { + if (message.text === undefined || typeof message.text !== 'string') { + errorMessage = 'COKbdMgrCallback called for replaceText without text'; + console.log(errorMessage); + throw errorMessage; + } + + if (message.location === undefined || typeof message.location !== 'number') { + errorMessage = 'COKbdMgrCallback called for replaceText without location'; + console.log(errorMessage); + throw errorMessage; + } + + if (message.length === undefined || typeof message.length !== 'number') { + errorMessage = 'COKbdMgrCallback called for replaceText without length'; + console.log(errorMessage); + throw errorMessage; + } + + if (that._textArea.value.length == 2 && message.length == 0 && message.text.length == 0) { + that._removeTextContent(1, 0); + } else { + that._textArea.value = that._textArea.value.slice(0, message.location + 1) + message.text + that._textArea.value.slice(message.location + 1 + message.length); + that._onInput({}); + } + } else { + errorMessage = 'COKbdMgrCallback called with unknown command ' + message.command; + console.log(errorMessage); + throw errorMessage; + } + }; + + // We don't know the seed text to feed CollaboraOnlineWebViewKeyboardManager + window.webkit.messageHandlers.CollaboraOnlineWebViewKeyboardManager.postMessage({command: 'display'}); + this._onFocusBlur({type: 'focus'}); + + return; + } + // Trick to avoid showing the software keyboard: Set the textarea // read-only before focus() and reset it again after the blur() if (navigator.platform !== 'iPhone') { @@ -213,6 +288,16 @@ L.TextInput = L.Layer.extend({ }, blur: function() { + // Are we running in a WebView under an iOS app that uses + // CollaboraOnlineWebViewKeyboardManager? + if (window.webkit && + window.webkit.messageHandlers && + window.webkit.messageHandlers.CollaboraOnlineWebViewKeyboardManager) { + window.webkit.messageHandlers.CollaboraOnlineWebViewKeyboardManager.postMessage({command: 'hide'}); + this._onFocusBlur({type: 'blur'}); + return; + } + this._setAcceptInput(false); if (navigator.platform !== 'iPhone') this._textArea.blur(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits