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

Reply via email to