loleaflet/js/global.js | 59 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 6 deletions(-)
New commits: commit 9fd905563b9d2949263f8b7913375d8833662784 Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Mon May 25 20:44:31 2020 +0100 Commit: Michael Meeks <michael.me...@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 <jenkinscollaboraoff...@gmail.com> Reviewed-by: Michael Meeks <michael.me...@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)); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits