[Libreoffice-commits] online.git: loleaflet/src

Tomaž Vajngerl tomaz.vajngerl at collabora.co.uk
Sun Jan 15 23:00:10 UTC 2017


 loleaflet/src/map/Map.js                  |    5 ++-
 loleaflet/src/map/handler/Map.Keyboard.js |   47 ++++++++++++++++++++++++------
 2 files changed, 43 insertions(+), 9 deletions(-)

New commits:
commit 724cac1d97ab2458252c60bd949a7852c3852c69
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Sun Jan 15 23:53:00 2017 +0100

    fix Chrome Android and Firefox Android text input
    
    - Change from textarea to input (type="text") to prevent Firefox
    to auto-capitalize.
    
    - Clean the text input content after each word so that the soft
    keyboard spellcheck suggestions are correct and that backspace
    doesn't delete long IME suggestions before it has effect.
    
    - Workaround on Chrome Android 'space' and applying spell-check
    corrections.

diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js
index 4001cd4..65efab7 100644
--- a/loleaflet/src/map/Map.js
+++ b/loleaflet/src/map/Map.js
@@ -599,7 +599,10 @@ L.Map = L.Evented.extend({
 		}
 
 		var textAreaContainer = L.DomUtil.create('div', 'clipboard-container', container.parentElement);
-		this._textArea = L.DomUtil.create('textarea', 'clipboard', textAreaContainer);
+		this._textArea = L.DomUtil.create('input', 'clipboard', textAreaContainer);
+		this._textArea.setAttribute('type', 'text');
+		this._textArea.setAttribute('autocorrect', 'off');
+		this._textArea.setAttribute('autocapitalize', 'off');
 		this._resizeDetector = L.DomUtil.create('iframe', 'resize-detector', container);
 		this._fileDownloader = L.DomUtil.create('iframe', '', container);
 		L.DomUtil.setStyle(this._fileDownloader, 'display', 'none');
diff --git a/loleaflet/src/map/handler/Map.Keyboard.js b/loleaflet/src/map/handler/Map.Keyboard.js
index 0da5e09..a159b68 100644
--- a/loleaflet/src/map/handler/Map.Keyboard.js
+++ b/loleaflet/src/map/handler/Map.Keyboard.js
@@ -284,12 +284,28 @@ L.Map.Keyboard = L.Handler.extend({
 		var charCode = e.originalEvent.charCode;
 		var keyCode = e.originalEvent.keyCode;
 
+		if (e.type === 'compositionstart' || e.type === 'compositionupdate') {
+			this._isComposing = true; // we are starting composing with IME
+		}
+
 		if (e.type === 'compositionend') {
+			this._isComposing = false; // stop of composing with IME
+			// get the composited char codes
 			var compCharCodes = [];
 			for (var i = 0; i < e.originalEvent.data.length; i++) {
 				compCharCodes.push(e.originalEvent.data[i].charCodeAt());
 			}
+			// clear the input now - best to do this ASAP so the input
+			// is clear for the next word
+			this._map._textArea.value = '';
+		}
+
+		if (!this._isComposing && e.type === 'keyup') {
+			// not compositing and keyup, clear the input so it is ready
+			// for next word (or char only)
+			this._map._textArea.value = '';
 		}
+
 		var unoKeyCode = this._toUNOKeyCode(keyCode);
 
 		if (this.modifier) {
@@ -338,15 +354,30 @@ L.Map.Keyboard = L.Handler.extend({
 				this._bufferedTextInputEvent = e;
 			}
 			else if (e.type === 'keyup') {
-				// Hack for making space work in chrome when IME is enabled
-				// Chrome doesn't fire compositionend event or keypress when
-				// IME is enabled *and* user presses <space>.
-				// However, it sends 'textInput' event in such a case.
-				// Use the buffered textInput event if its the space key and has not been
-				// handled already by 'keypress' or 'compositionend' events above
-				if (!this._keyHandled && this._bufferedTextInputEvent && e.originalEvent.key === this._bufferedTextInputEvent.originalEvent.data) {
+				// Hack for making space and spell-check text insert work
+				// in Chrome (on Andorid) or Chrome with IME.
+				//
+				// Chrome (Android) IME triggers keyup/keydown input with
+				// code 229 when hitting space (as with all composiiton events)
+				// with addition to 'textinput' event, in which we only see that
+				// space was entered. Similar situation is also when inserting
+				// a soft-keyboard spell-check item - it is visible only with
+				// 'textinput' event (no composition event is fired).
+				// To make this work we need to insert textinput.data here..
+				//
+				// TODO: Maybe make sure this is only triggered when keydown has
+				// 229 code. Also we need to detect that composition was overriden
+				// (part or whole word deleted) with the spell-checked word. (for
+				// example: enter 'tar' and with spell-check correct that to 'rat')
+
+				if (!this._keyHandled && this._bufferedTextInputEvent) {
+					var textInputData = this._bufferedTextInputEvent.originalEvent.data;
 					charCode = e.originalEvent.keyCode;
-					docLayer._postKeyboardEvent('input', charCode, 0);
+					var compCharCodes = [];
+					for (var i = 0; i < textInputData.length; i++) {
+						compCharCodes.push(textInputData[i].charCodeAt());
+					}
+					docLayer._postKeyboardEvents('input', compCharCodes, Array.apply(null, Array(compCharCodes.length)).map(Number.prototype.valueOf, 0));
 				}
 				docLayer._postKeyboardEvent('up', charCode, unoKeyCode);
 


More information about the Libreoffice-commits mailing list