[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-3-0' - loleaflet/reference.html loleaflet/src wsd/ClientSession.cpp wsd/protocol.txt

Pranav Kant pranavk at collabora.co.uk
Thu Feb 15 13:14:38 UTC 2018


 loleaflet/reference.html              |   66 +++++++++++++++++++++++++++++-----
 loleaflet/src/core/Socket.js          |   12 ++++++
 loleaflet/src/map/handler/Map.WOPI.js |   15 +++++++
 wsd/ClientSession.cpp                 |    8 ++++
 wsd/protocol.txt                      |   18 +++++++++
 5 files changed, 109 insertions(+), 10 deletions(-)

New commits:
commit 804acd2adea6b944da709086a42915d81d479a12
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Fri Feb 2 11:35:29 2018 +0530

    Version restore states
    
    See documentation
    
    Change-Id: Ica3cd3744643157c5a2c6c1e42e0858ad641da16
    Reviewed-on: https://gerrit.libreoffice.org/49754
    Reviewed-by: Andras Timar <andras.timar at collabora.com>
    Tested-by: Andras Timar <andras.timar at collabora.com>

diff --git a/loleaflet/reference.html b/loleaflet/reference.html
index 7894f2a7..51516b44 100644
--- a/loleaflet/reference.html
+++ b/loleaflet/reference.html
@@ -33,7 +33,7 @@
 <h2>API Reference</h2>
 
 <div id="toc" class="clearfix">
-	<div class="toc-col map-col">
+    <div class="toc-col map-col">
 		<h4>Map</h4>
 		<ul>
 			<li><a href="#map-usage">Usage example</a></li>
@@ -2759,17 +2759,20 @@ Editor to WOPI host
 		<td><code>
 		    <nobr>Status: <String></nobr>
 		    <nobr>DocumentLoadedTime: <Timestamp></nobr>
-		</code></td>
-		<td>If Status is Frame_Ready, loleaflet frame is loaded and UI
-		can be shown. <br/>
-		When Status is Document_Loaded, document has been completely
-		loaded and host can also start sending document-specific query
-		messages using post message API such as Get_Views,
-		Get_Export_Formats etc. DocumentLoadedTime is specified
-		only in this case.
+		    <nobr>Features: <Dict></nobr>
+		</code></td>
+		<td>If Status is <i>Frame_Ready</i>, loleaflet frame is loaded and UI
+		    can be shown. <br/>
+		    Accompanying keys: <i>Features</i>: This client's capabilities.
+		    Supported values are: <i>VersionStates</i>. Tells the host that client supports different version states. See <a href="#loleaflet-postmessage-versioning">Version Restore</a> for more details.<br/>
+		    When Status is Document_Loaded, document has been completely
+		    loaded and host can also start using PostMessage API.<br/>
+		    Accompanying keys:
+		    <i>DocumentLoadedTime</i>
 		</td>
 	</tr>
 </table>
+
 WOPI host to editor
 <table data-id='postmessage-initialization-to-editor'>
 	<tr>
@@ -2986,6 +2989,51 @@ Actions response
 	</tr>
 </table>
 
+<h3 id="loleaflet-postmessage-versioning">Version Restore</h3>
+WOPI host to editor
+<table data-id="postmessage-versioning-to-editor">
+    <tr>
+	<th>MessageId</th>
+	<th>Values</th>
+	<th>Description</th>
+    </tr>
+    <tr>
+	<td><code><b>Host_VersionRestore</b></code></td>
+	<td><code>
+	    <nobr>Status: <string></nobr>
+	</code></td>
+	<td>
+	    Only possible value of Status (for now) is <code>Pre_Restore</code>.
+	    This message is sent by the host <b>before</b> actually restoring the document
+	    and <b>after</b> user showed the intent to restore the document. This is so such
+	    that if there are any unsaved changes, Online can save them to storage before
+	    document is restored.
+	</td>
+    </tr>
+</table>
+Editor to WOPI host
+<table data-id="postmessage-versioning-to-host">
+    <tr>
+	<th>MessageId</th>
+	<th>Values</th>
+	<th>Description</th>
+    </tr>
+    <tr>
+	<td><code><b>App_VersionRestore</b></code></td>
+	<td><code>
+	    <nobr>Status: <string></nobr>
+	</code></td>
+	<td>
+	    This is the reply for the Host_VersionRestore message. Possible values for <code>Status</code>
+	    (for now) is: <code>Pre_Restore_Ack</code>. It means that host can go ahead with restoring the
+	    document to an earlier revision.
+	</td>
+    </tr>
+</table>
+
+<h4>Note</h4>
+<p>These messages are only emitted if <i>App_LoadingStatus</i> contains <i>VersionStates</i> in <i>Features</i>. Otherwise, host can immediately restore the version to earlier revision.</p>
+
 <h3 id='loleaflet-postmessage-misc'>Miscellaneous</h3>
 WOPI host to editor
 <table data-id='postmessage-misc-to-editor'>
diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js
index 33330d1b..068edc9a 100644
--- a/loleaflet/src/core/Socket.js
+++ b/loleaflet/src/core/Socket.js
@@ -258,6 +258,7 @@ L.Socket = L.Class.extend({
 			textMsg = textMsg.substring('close: '.length);
 			msg = '';
 			var postMsgData = {};
+			var showMsgAndReload = false;
 			// This is due to document owner terminating the session
 			if (textMsg === 'ownertermination') {
 				msg = _('Session terminated by document owner');
@@ -310,7 +311,18 @@ L.Socket = L.Class.extend({
 			}
 			else if (textMsg.startsWith('documentconflict')) {
 				msg = _('Document has changed in storage. Loading the new document. Your version is available as revision.');
+				showMsgAndReload = true;
+			}
+			else if (textMsg.startsWith('versionrestore:')) {
+				textMsg = textMsg.substring('versionrestore:'.length).trim();
+				if (textMsg === 'prerestore_ack') {
+					msg = _('Restoring older revision. Any unsaved changes will be available in version history');
+					this._map.fire('postMessage', {msgId: 'App_VersionRestore', args: {Status: 'Pre_Restore_Ack'}});
+					showMsgAndReload = true;
+				}
+			}
 
+			if (showMsgAndReload) {
 				if (this._map._docLayer) {
 					this._map._docLayer.removeAllViews();
 				}
diff --git a/loleaflet/src/map/handler/Map.WOPI.js b/loleaflet/src/map/handler/Map.WOPI.js
index 54278376..c7055c44 100644
--- a/loleaflet/src/map/handler/Map.WOPI.js
+++ b/loleaflet/src/map/handler/Map.WOPI.js
@@ -72,7 +72,15 @@ L.Map.WOPI = L.Handler.extend({
 		this.DisableInactiveMessages = !!wopiInfo['DisableInactiveMessages'];
 		this.UserCanNotWriteRelative = !!wopiInfo['UserCanNotWriteRelative'];
 
-		this._map.fire('postMessage', {msgId: 'App_LoadingStatus', args: {Status: 'Frame_Ready'}});
+		this._map.fire('postMessage', {
+			msgId: 'App_LoadingStatus',
+			args: {
+				Status: 'Frame_Ready',
+				Features: {
+					VersionStates: true
+				}
+			}
+		});
 	},
 
 	resetAppLoaded: function() {
@@ -231,6 +239,11 @@ L.Map.WOPI = L.Handler.extend({
 				}
 			}
 		}
+		else if (msg.MessageId === 'Host_VersionRestore') {
+			if (msg.Values.Status === 'Pre_Restore') {
+				this._map._socket.sendMessage('versionrestore prerestore');
+			}
+		}
 	},
 
 	_postMessage: function(e) {
diff --git a/wsd/ClientSession.cpp b/wsd/ClientSession.cpp
index e23ec418..70d73c71 100644
--- a/wsd/ClientSession.cpp
+++ b/wsd/ClientSession.cpp
@@ -129,6 +129,7 @@ bool ClientSession::_handleInput(const char *buffer, int length)
              tokens[0] != "outlinestate" &&
              tokens[0] != "commandvalues" &&
              tokens[0] != "closedocument" &&
+             tokens[0] != "versionrestore" &&
              tokens[0] != "downloadas" &&
              tokens[0] != "getchildid" &&
              tokens[0] != "gettextselection" &&
@@ -195,6 +196,13 @@ bool ClientSession::_handleInput(const char *buffer, int length)
 
         return true;
     }
+    else if (tokens[0] == "versionrestore") {
+        if (tokens[1] == "prerestore") {
+            // green signal to WOPI host to restore the version *after* saving
+            // any unsaved changes, if any, to the storage
+            docBroker->closeDocument("versionrestore: prerestore_ack");
+        }
+    }
     else if (tokens[0] == "partpagerectangles")
     {
         // We don't support partpagerectangles any more, will be removed in the
diff --git a/wsd/protocol.txt b/wsd/protocol.txt
index bb871d81..1f5f2bb9 100644
--- a/wsd/protocol.txt
+++ b/wsd/protocol.txt
@@ -204,6 +204,14 @@ closedocument
     having that document opened. This functionality is enabled only in case WOPI
     host mentions 'EnableOwnerTermination' flag in its CheckFileInfo response
 
+versionrestore <action>
+
+    Version restore related messages.
+
+    <action> can take following values:
+    - prerestore: The storage is about restore the document to an earlier
+    revision.
+
 server -> client
 ================
 
@@ -292,6 +300,9 @@ close: <reason>
     because file was changed in storage and we want to load the new document
     from the storage.
 
+    * versionrestore payload - Version restore message is also sent as part of
+      the close frame. See `versionrestore:` message for details.
+
 getchildid: id=<id>
 
     Returns the child id
@@ -444,6 +455,13 @@ wopi: <JSON>
      + HideExportOption: (boolean): If loleaflet should hide the export options
        this implies 'Download as' options in file menu
 
+versionrestore: <action>
+
+     Possible values for <action>:
+
+     - prerestore_ack: The host can go ahead with restoring the document to an
+       earlier revision.
+
 child -> parent
 ===============
 


More information about the Libreoffice-commits mailing list