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

Michael Meeks (via logerrit) logerrit at kemper.freedesktop.org
Mon May 25 20:17:30 UTC 2020


 loleaflet/js/global.js |   59 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 53 insertions(+), 6 deletions(-)

New commits:
commit 9fd905563b9d2949263f8b7913375d8833662784
Author:     Michael Meeks <michael.meeks at collabora.com>
AuthorDate: Mon May 25 20:44:31 2020 +0100
Commit:     Michael Meeks <michael.meeks at collabora.com>
CommitDate: Mon May 25 22:17:12 2020 +0200

    Proxy: horrible re-implementation of array / string bits for IE11.
    
    Change-Id: Iccb2f98b5529a2f923dba8763b17f895067c1e0c
    Reviewed-on: https://gerrit.libreoffice.org/c/online/+/94808
    Tested-by: Jenkins
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>

diff --git a/loleaflet/js/global.js b/loleaflet/js/global.js
index a0d719eb3..2a789e98e 100644
--- a/loleaflet/js/global.js
+++ b/loleaflet/js/global.js
@@ -235,8 +235,55 @@
 		};
 		this.onmessage = function() {
 		};
+		// IE11 compatibility ...
+		if (!!window.MSInputMethodContext && !!document.documentMode) {
+			this.decoder = {};
+			this.decoder.decode = function(bytes) {
+				var decoded = '';
+				var code = 0;
+				for (var i = 0; i < bytes.length;) {
+					var b = bytes[i];
+					var seqLen = 1;
+					// get bits off the top.
+					if (b <= 0x7f)
+						code = b & 0xff;
+					else if (b <= 0xdf) {
+						code = b & 0x1f;
+						seqLen = 2;
+					} else if (b <= 0xdf) {
+						code = b & 0x0f;
+						seqLen = 3;
+					} else if (b <= 0xf4) {
+						code = b & 0x07;
+						seqLen = 4;
+					}
+					var left = bytes.length - i;
+					if (left >= seqLen) {
+						for (var j = 1; j < seqLen; ++j)
+							code = (code << 6) | (bytes[i + j] & 0x3f);
+					} else { // skip to end
+						seqLen = left;
+						code = 0xfffd;
+					}
+					decoded += String.fromCharCode(code);
+					i += seqLen;
+				}
+				return decoded;
+			};
+			this.doSlice = function(bytes,start,end) {
+				var data = new Uint8Array(end - start + 1);
+				for (var i = 0; i <= (end - start); ++i)
+					data[i] = bytes[start + i];
+				return data;
+			};
+		} else {
+			this.decoder = new TextDecoder();
+			this.doSlice = function(bytes,start,end) { return bytes.slice(start,end); };
+		}
+		this.decode = function(bytes,start,end) {
+			return this.decoder.decode(this.doSlice(bytes, start,end));
+		};
 		this.parseIncomingArray = function(arr) {
-			var decoder = new TextDecoder();
 			console.debug('proxy: parse incoming array of length ' + arr.length);
 			for (var i = 0; i < arr.length; ++i)
 			{
@@ -265,7 +312,7 @@
 				var start = i;
 				while (arr[i] != 10) // '\n'
 					i++;
-				numStr = decoder.decode(arr.slice(start, i)); // FIXME: IE11
+				numStr = this.decode(arr, start, i);
 				var serial = parseInt(numStr, 16);
 
 				i++; // skip \n
@@ -280,16 +327,16 @@
 				start = i;
 				while (arr[i] != 10) // '\n'
 					i++;
-				numStr = decoder.decode(arr.slice(start, i)); // FIXME: IE11
+				numStr = this.decode(arr, start, i);
 				var size = parseInt(numStr, 16);
 
 				i++; // skip \n
 
 				var data;
-				if (type == 'T') // FIXME: IE11
-					data = decoder.decode(arr.slice(i, i + size));
+				if (type == 'T')
+					data = this.decode(arr, i, i + size);
 				else
-					data = arr.slice(i, i + size);
+					data = this.doSlice(arr, i, i + size);
 
 				if (serial !== that.inSerial + 1) {
 					console.debug('Error: serial mismatch ' + serial + ' vs. ' + (that.inSerial + 1));


More information about the Libreoffice-commits mailing list