[Libreoffice-commits] online.git: 2 commits - loleaflet/dist loleaflet/src loolwsd/ClientSession.cpp loolwsd/protocol.txt

László Németh laszlo.nemeth at collabora.com
Tue Sep 27 18:57:16 UTC 2016


 loleaflet/dist/leaflet.css                   |   20 +++++-
 loleaflet/src/core/Socket.js                 |    5 +
 loleaflet/src/layer/tile/CalcTileLayer.js    |    6 +
 loleaflet/src/layer/tile/ImpressTileLayer.js |    6 +
 loleaflet/src/layer/tile/TileLayer.js        |   82 +++++++++++++++++++++++----
 loleaflet/src/layer/tile/WriterTileLayer.js  |    7 +-
 loleaflet/src/map/handler/Map.Keyboard.js    |    8 ++
 loolwsd/ClientSession.cpp                    |    6 +
 loolwsd/protocol.txt                         |    4 +
 9 files changed, 124 insertions(+), 20 deletions(-)

New commits:
commit 459b5e585c36fd4a281d730e45d2a4be95982f37
Author: László Németh <laszlo.nemeth at collabora.com>
Date:   Tue Sep 27 20:29:10 2016 +0200

    loleaflet: show latency and other data in tile debugging mode
    
    - show best, average, worst, last times of
      - server ping round trip
      - times between key press and invalidation message
      - tile based and total tile update latencies
    
    - show data of the last five invalidation:
      - tilecombine messages, if they exist
      - otherwise the invalidation message
      - border of the last five invalidation rectangles
    
    - visual fixes:
      - more transparent red color for better text typing
      - small letters over tiles with transparent background
      - black attribution text instead of gray + bottomleft position

diff --git a/loleaflet/dist/leaflet.css b/loleaflet/dist/leaflet.css
index 2febea3..41c7abd 100644
--- a/loleaflet/dist/leaflet.css
+++ b/loleaflet/dist/leaflet.css
@@ -410,7 +410,7 @@ a.leaflet-control-buttons:hover:first-child {
 .leaflet-control-attribution,
 .leaflet-control-scale-line {
 	padding: 0 5px;
-	color: #333;
+	color: #000;
 	}
 .leaflet-control-attribution a {
 	text-decoration: none;
@@ -566,18 +566,30 @@ a.leaflet-control-buttons:hover:first-child {
 	pointer-events: none;
 	}
 
+.debug .leaflet-popup-content-wrapper {
+	padding: 1px;
+	text-align: left;
+	border-radius: 0px;
+	}
+
 .debug .leaflet-popup-content {
 	margin: 1px 1px;
-	font: 28px/24px Tahoma, Verdana, sans-serif;
+	font: 9px/8px Tahoma, Verdana, sans-serif;
 	line-height: 1;
 	background: rgba(0, 0, 0, 0);
 	pointer-events: none;
 	}
 
-.debug .leaflet-popup-content-wrapper,
+.debug .leaflet-popup-content-wrapper {
+	background: rgba(255, 255, 255, 0.6);
+	color: #000;
+	box-shadow: none;
+	pointer-events: none;
+	}
+
 .debug .leaflet-popup-tip {
 	background: rgba(255, 255, 255, 0);
-	color: #f70;
+	color: #000;
 	box-shadow: none;
 	pointer-events: none;
 	}
diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js
index e9a64f5..73c54fb 100644
--- a/loleaflet/src/core/Socket.js
+++ b/loleaflet/src/core/Socket.js
@@ -188,6 +188,11 @@ L.Socket = L.Class.extend({
 		else if (textMsg.startsWith('error:') && !this._map._docLayer) {
 			this.fail = true;
 		}
+		else if (textMsg === 'pong' && this._map._docLayer && this._map._docLayer._debug) {
+			var times = this._map._docLayer._debugTimePING;
+			var timeText = this._map._docLayer._debugSetTimes(times, +new Date() - times.date);
+			this._map._docLayer._debugDataPING.setPrefix('Server ping time: ' + timeText);
+		}
 		else if (textMsg.startsWith('statusindicator:')) {
 			//FIXME: We should get statusindicator when saving too, no?
 			this._map.showBusy(_('Connecting...'), false);
diff --git a/loleaflet/src/layer/tile/CalcTileLayer.js b/loleaflet/src/layer/tile/CalcTileLayer.js
index a493c7c..c14cd5f 100644
--- a/loleaflet/src/layer/tile/CalcTileLayer.js
+++ b/loleaflet/src/layer/tile/CalcTileLayer.js
@@ -34,7 +34,7 @@ L.CalcTileLayer = L.TileLayer.extend({
 		var offset = new L.Point(command.width, command.height);
 		var bottomRightTwips = topLeftTwips.add(offset);
 		if (this._debug) {
-			this._debugAddInvalidationRectangle(topLeftTwips, bottomRightTwips);
+			this._debugAddInvalidationRectangle(topLeftTwips, bottomRightTwips, textMsg);
 		}
 		var invalidBounds = new L.Bounds(topLeftTwips, bottomRightTwips);
 		var visibleTopLeft = this._latLngToTwips(this._map.getBounds().getNorthWest());
@@ -69,7 +69,9 @@ L.CalcTileLayer = L.TileLayer.extend({
 					needsNewTiles = true;
 					if (this._debug && this._tiles[key]._debugTile) {
 						this._tiles[key]._debugTile.setStyle({fillOpacity: 0.5});
+						this._tiles[key]._debugTime.date = +new Date();
 						this._tiles[key]._debugInvalidateCount++;
+						this._debugInvalidateCount++;
 					}
 				}
 				else {
@@ -93,7 +95,7 @@ L.CalcTileLayer = L.TileLayer.extend({
 
 			this._map._socket.sendMessage(message, '');
 			if (this._debug) {
-				this._debugDataTileCombine.setPrefix(message);
+				this._debugAddInvalidationMessage(message);
 			}
 		}
 
diff --git a/loleaflet/src/layer/tile/ImpressTileLayer.js b/loleaflet/src/layer/tile/ImpressTileLayer.js
index 522ba09..677e592 100644
--- a/loleaflet/src/layer/tile/ImpressTileLayer.js
+++ b/loleaflet/src/layer/tile/ImpressTileLayer.js
@@ -18,7 +18,7 @@ L.ImpressTileLayer = L.TileLayer.extend({
 		var offset = new L.Point(command.width, command.height);
 		var bottomRightTwips = topLeftTwips.add(offset);
 		if (this._debug) {
-			this._debugAddInvalidationRectangle(topLeftTwips, bottomRightTwips);
+			this._debugAddInvalidationRectangle(topLeftTwips, bottomRightTwips, textMsg);
 		}
 		var invalidBounds = new L.Bounds(topLeftTwips, bottomRightTwips);
 		var visibleTopLeft = this._latLngToTwips(this._map.getBounds().getNorthWest());
@@ -53,7 +53,9 @@ L.ImpressTileLayer = L.TileLayer.extend({
 					needsNewTiles = true;
 					if (this._debug && this._tiles[key]._debugTile) {
 						this._tiles[key]._debugTile.setStyle({fillOpacity: 0.5});
+						this._tiles[key]._debugTime.date = +new Date();
 						this._tiles[key]._debugInvalidateCount++;
+						this._debugInvalidateCount++;
 					}
 				}
 				else {
@@ -77,7 +79,7 @@ L.ImpressTileLayer = L.TileLayer.extend({
 
 			this._map._socket.sendMessage(message, '');
 			if (this._debug) {
-				this._debugDataTileCombine.setPrefix(message);
+				this._debugAddInvalidationMessage(message);
 			}
 		}
 
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 3ea0829..62cae49 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -384,8 +384,10 @@ L.TileLayer = L.GridLayer.extend({
 			this._map.removeLayer(this._debugInfo);
 		}
 		if (!this._debug) {
+			this._debugDataPING.setPrefix('');
 			this._debugDataCancelledTiles.setPrefix('');
 			this._debugDataTileCombine.setPrefix('');
+			this._debugDataFromKeyInputToInvalidate.setPrefix('');
 		}
 		this._debugInit();
 		this._onMessage('invalidatetiles: EMPTY', null);
@@ -1000,6 +1002,7 @@ L.TileLayer = L.GridLayer.extend({
 		if (this._debug && tile) {
 			if (tile._debugLoadCount) {
 				tile._debugLoadCount++;
+				this._debugLoadCount++;
 			} else {
 				tile._debugLoadCount = 1;
 				tile._debugInvalidateCount = 1;
@@ -1007,15 +1010,22 @@ L.TileLayer = L.GridLayer.extend({
 			if (!tile._debugPopup) {
 				var tileBound = this._keyToBounds(key);
 				tile._debugPopup = L.popup({className: 'debug', offset: new L.Point(0, 0), autoPan: false, closeButton: false, closeOnClick: false})
-						.setLatLng(new L.LatLng(tileBound.getSouth(), tileBound.getWest() + (tileBound.getEast() - tileBound.getWest())/4)).setContent('-');
+						.setLatLng(new L.LatLng(tileBound.getSouth(), tileBound.getWest() + (tileBound.getEast() - tileBound.getWest())/5));
 				this._debugInfo.addLayer(tile._debugPopup);
 				tile._debugTile = L.rectangle(tileBound, {color: 'blue', weight: 1, fillOpacity: 0, pointerEvents: 'none'});
+				tile._debugTime = this._debugGetTimeArray();
 				this._debugInfo.addLayer(tile._debugTile);
 			}
-			tile._debugPopup.setContent('' + this._tiles[key]._debugLoadCount + '/' + this._tiles[key]._debugInvalidateCount);
+			if (tile._debugTime.date === 0)  {
+				tile._debugPopup.setContent('requested: ' + this._tiles[key]._debugInvalidateCount + '<br>received: ' + this._tiles[key]._debugLoadCount);
+			} else {
+				tile._debugPopup.setContent('requested: ' + this._tiles[key]._debugInvalidateCount + '<br>received: ' + this._tiles[key]._debugLoadCount +
+						'<br>' + this._debugSetTimes(tile._debugTime, +new Date() - tile._debugTime.date).replace(/, /g, '<br>'));
+			}
 			if (tile._debugTile) {
 				tile._debugTile.setStyle({fillOpacity: 0});
 			}
+			this._debugDataLoadCount.setPrefix('Total of requested tiles: ' + this._debugInvalidateCount + ', received: ' + this._debugLoadCount);
 		}
 		if (command.id !== undefined) {
 			this._map.fire('tilepreview', {
@@ -1758,28 +1768,76 @@ L.TileLayer = L.GridLayer.extend({
 		this._clientVisibleArea = true;
 	},
 
+	_debugGetTimeArray: function() {
+		return {count: 0, ms: 0, best: Number.MAX_SAFE_INTEGER, worst: 0, last: 0, date: 0};
+	},
+
 	_debugInit: function() {
 		if (this._debug) {
 			this._debugInfo = new L.LayerGroup();
 			map.addLayer(this._debugInfo);
 			this._debugInvalidBounds = {};
+			this._debugInvalidBoundsMessage = {};
 			this._debugTimeout();
 			this._debugId = 0;
 			this._debugCancelledTiles = 0;
+			this._debugLoadCount = 0;
+			this._debugInvalidateCount = 0;
 			if (!this._debugDataCancelledTiles) {
-				this._debugDataTileCombine = L.control.attribution({prefix: '[tilecombine message]'}).addTo(map);
-				this._debugDataCancelledTiles = L.control.attribution({prefix: 'Cancelled tiles: 0'}).addTo(map);
+				this._debugDataTileCombine = L.control.attribution({prefix: '', position: 'bottomleft'}).addTo(map);
+				this._debugDataCancelledTiles = L.control.attribution({prefix: '', position: 'bottomleft'}).addTo(map);
+				this._debugDataFromKeyInputToInvalidate = L.control.attribution({prefix: '', position: 'bottomleft'}).addTo(map);
+				this._debugDataPING = L.control.attribution({prefix: '', position: 'bottomleft'}).addTo(map);
+				this._debugDataLoadCount = L.control.attribution({prefix: '', position: 'bottomleft'}).addTo(map);
+
 			}
+			this._debugTimePING = this._debugGetTimeArray();
+			this._debugTimeKeypress = this._debugGetTimeArray();
+			this._debugKeypressQueue = [];
+		}
+	},
+
+	_debugSetTimes: function(times, value) {
+		times.last = value;
+		if (value < times.best) {
+			times.best = value;
+		}
+		if (value > times.worst) {
+			times.worst = value;
 		}
+		times.ms += value;
+		times.count++;
+		return 'best: ' + times.best + ' ms, avg: ' + Math.round(times.ms/times.count) + ' ms, worst: ' + times.worst + ' ms, last: ' + value + ' ms';
 	},
 
-	_debugAddInvalidationRectangle: function(topLeftTwips, bottomRightTwips) {
+	_debugAddInvalidationRectangle: function(topLeftTwips, bottomRightTwips, command) {
+		var now = +new Date();
+
 		var invalidBoundCoords = new L.LatLngBounds(this._twipsToLatLng(topLeftTwips, this._tileZoom),
 				this._twipsToLatLng(bottomRightTwips, this._tileZoom));
-		var rect = L.rectangle(invalidBoundCoords, {color: 'red', weight: 1, fillOpacity: 0.5, pointerEvents: 'none'});
+		var rect = L.rectangle(invalidBoundCoords, {color: 'red', weight: 1, opacity: 1, fillOpacity: 0.4, pointerEvents: 'none'});
 		this._debugInvalidBounds[this._debugId] = rect;
+		this._debugInvalidBoundsMessage[this._debugId] = command;
 		this._debugId++;
 		this._debugInfo.addLayer(rect);
+
+		var oldestKeypress = this._debugKeypressQueue.shift();
+		if (oldestKeypress) {
+			var timeText = this._debugSetTimes(this._debugTimeKeypress, now - oldestKeypress);
+			this._debugDataFromKeyInputToInvalidate.setPrefix('Elapsed time between key input and next invalidate: ' + timeText);
+		}
+	},
+
+	_debugAddInvalidationMessage: function(message) {
+		this._debugInvalidBoundsMessage[this._debugId - 1] = message;
+		var messages = '';
+		for (var i = this._debugId - 1; i > this._debugId - 6; i--) {
+			if (i >= 0 && this._debugInvalidBoundsMessage[i]) {
+				messages += '' + i + ': ' + this._debugInvalidBoundsMessage[i] + ' <br>';
+			}
+		}
+		this._debugDataTileCombine.setPrefix(messages);
+		this._debugDataLoadCount.setPrefix('Total of requested tiles: ' + this._debugInvalidateCount + ', received: ' + this._debugLoadCount);
 	},
 
 	_debugTimeout: function() {
@@ -1787,11 +1845,15 @@ L.TileLayer = L.GridLayer.extend({
 			for (var key in this._debugInvalidBounds) {
 				var rect = this._debugInvalidBounds[key];
 				var opac = rect.options.fillOpacity;
-				if (opac < 0.1) {
-					this._debugInfo.removeLayer(rect);
-					delete this._debugInvalidBounds[key];
+				if (opac <= 0.04) {
+					rect.setStyle({fillOpacity: 0});
+					if (key < this._debugId - 5) {
+						this._debugInfo.removeLayer(rect);
+						delete this._debugInvalidBounds[key];
+						delete this._debugInvalidBoundsMessage[key];
+					}
 				} else {
-					rect.setStyle({opacity: opac - 0.05, fillOpacity: opac - 0.05});
+					rect.setStyle({fillOpacity: opac - 0.04});
 				}
 			}
 			this._debugTimeoutId = setTimeout(function () { map._docLayer._debugTimeout() }, 50);
diff --git a/loleaflet/src/layer/tile/WriterTileLayer.js b/loleaflet/src/layer/tile/WriterTileLayer.js
index 910e9fa..f5299dc 100644
--- a/loleaflet/src/layer/tile/WriterTileLayer.js
+++ b/loleaflet/src/layer/tile/WriterTileLayer.js
@@ -19,7 +19,7 @@ L.WriterTileLayer = L.TileLayer.extend({
 		var offset = new L.Point(command.width, command.height);
 		var bottomRightTwips = topLeftTwips.add(offset);
 		if (this._debug) {
-			this._debugAddInvalidationRectangle(topLeftTwips, bottomRightTwips);
+			this._debugAddInvalidationRectangle(topLeftTwips, bottomRightTwips, textMsg);
 		}
 		var invalidBounds = new L.Bounds(topLeftTwips, bottomRightTwips);
 		var visibleTopLeft = this._latLngToTwips(this._map.getBounds().getNorthWest());
@@ -52,7 +52,9 @@ L.WriterTileLayer = L.TileLayer.extend({
 					needsNewTiles = true;
 					if (this._debug && this._tiles[key]._debugTile) {
 						this._tiles[key]._debugTile.setStyle({fillOpacity: 0.5});
+						this._tiles[key]._debugTime.date = +new Date();
 						this._tiles[key]._debugInvalidateCount++;
+						this._debugInvalidateCount++;
 					}
 				}
 				else {
@@ -78,8 +80,9 @@ L.WriterTileLayer = L.TileLayer.extend({
 				'tileheight=' + this._tileHeightTwips;
 
 			this._map._socket.sendMessage(message, '');
+
 			if (this._debug) {
-				this._debugDataTileCombine.setPrefix(message);
+				this._debugAddInvalidationMessage(message);
 			}
 		}
 
diff --git a/loleaflet/src/map/handler/Map.Keyboard.js b/loleaflet/src/map/handler/Map.Keyboard.js
index 817130c..5872247 100644
--- a/loleaflet/src/map/handler/Map.Keyboard.js
+++ b/loleaflet/src/map/handler/Map.Keyboard.js
@@ -301,6 +301,7 @@ L.Map.Keyboard = L.Handler.extend({
 
 		if (this._map._permission === 'edit') {
 			docLayer._resetPreFetching();
+
 			if (e.type === 'keydown' && this.handleOnKeyDown[keyCode] && charCode === 0) {
 				docLayer._postKeyboardEvent('input', charCode, unoKeyCode);
 			}
@@ -312,6 +313,13 @@ L.Map.Keyboard = L.Handler.extend({
 					keyCode = 0;
 					unoKeyCode = this._toUNOKeyCode(keyCode);
 				}
+				if (docLayer._debug) {
+					// query server ping time at key press
+					this._map._docLayer._debugTimePING.date = +new Date();
+					this._map._socket.sendMessage('ping');
+					// key press times will be paired with the invalidation messages
+					docLayer._debugKeypressQueue.push(+new Date());
+				}
 				docLayer._postKeyboardEvent('input', charCode, unoKeyCode);
 			}
 			else if (e.type === 'keyup') {
commit 9c9c98b89fecb2636dccaeb3df00cef1daa33ab8
Author: László Németh <laszlo.nemeth at collabora.com>
Date:   Tue Sep 27 20:22:09 2016 +0200

    loolwsd: add ping support to the protocol
    
    The client message 'ping' requests a 'pong' server message.

diff --git a/loolwsd/ClientSession.cpp b/loolwsd/ClientSession.cpp
index 43d712b..9884178 100644
--- a/loolwsd/ClientSession.cpp
+++ b/loolwsd/ClientSession.cpp
@@ -114,6 +114,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
              tokens[0] != "key" &&
              tokens[0] != "mouse" &&
              tokens[0] != "partpagerectangles" &&
+             tokens[0] != "ping" &&
              tokens[0] != "renderfont" &&
              tokens[0] != "requestloksession" &&
              tokens[0] != "resetselection" &&
@@ -150,6 +151,11 @@ bool ClientSession::_handleInput(const char *buffer, int length)
     {
         return getPartPageRectangles(buffer, length);
     }
+    else if (tokens[0] == "ping")
+    {
+        sendTextFrame("pong");
+        return true;
+    }
     else if (tokens[0] == "renderfont")
     {
         return sendFontRendering(buffer, length, tokens);
diff --git a/loolwsd/protocol.txt b/loolwsd/protocol.txt
index 64bdf73..a507a32 100644
--- a/loolwsd/protocol.txt
+++ b/loolwsd/protocol.txt
@@ -84,6 +84,10 @@ mouse type=<type> x=<x> y=<y> count=<count>
 
     <type> is 'buttondown', 'buttonup' or 'move', others are numbers.
 
+ping
+
+    requests a 'pong' server message.
+
 renderfont font=<font>
 
     requests the rendering of the given font.


More information about the Libreoffice-commits mailing list