[Libreoffice-commits] online.git: 4 commits - loleaflet/dist loleaflet/main.js loleaflet/src loolwsd/DocumentBroker.cpp loolwsd/Storage.cpp loolwsd/Storage.hpp

Pranav Kant pranavk at collabora.co.uk
Wed Oct 26 16:18:18 UTC 2016


 loleaflet/dist/loleaflet.html            |   13 ++++++++
 loleaflet/dist/toolbar/toolbar.js        |    2 -
 loleaflet/main.js                        |   10 ++++--
 loleaflet/src/control/Control.Menubar.js |    4 --
 loleaflet/src/core/Socket.js             |   12 +++++++
 loleaflet/src/layer/tile/TileLayer.js    |    6 +--
 loleaflet/src/map/Map.js                 |   47 +++++++++++++++++++++++++++++--
 loolwsd/DocumentBroker.cpp               |    5 +++
 loolwsd/Storage.cpp                      |    5 ++-
 loolwsd/Storage.hpp                      |    4 ++
 10 files changed, 95 insertions(+), 13 deletions(-)

New commits:
commit e0e6a343dade6ffd33f07ca916b176aec019bd21
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Wed Oct 26 21:30:12 2016 +0530

    tdf#103450: Implement session management postmessage API
    
    Change-Id: Id22759c5c103948078fb20943768a9ff6251dddf

diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js
index d015765..2d6ceb6 100644
--- a/loleaflet/src/map/Map.js
+++ b/loleaflet/src/map/Map.js
@@ -137,12 +137,14 @@ L.Map = L.Evented.extend({
 	addView: function(viewid, userid, username, color) {
 		this._viewInfo[viewid] = {'userid': userid, 'username': username, 'color': color};
 		this.fire('addview', {viewId: viewid, username: username});
+		this.WOPIPostMessage('View_Added', {ViewId: viewid, UserId: userid, UserName: username, Color: color});
 	},
 
 	removeView: function(viewid) {
 		var username = this._viewInfo[viewid].username;
 		delete this._viewInfo[viewid];
 		this.fire('removeview', {viewId: viewid, username: username});
+		this.WOPIPostMessage('View_Removed', {ViewId: viewid});
 	},
 
 	getViewName: function(viewid) {
@@ -158,8 +160,24 @@ L.Map = L.Evented.extend({
 	},
 
 	_WOPIPostMessageListener: function(e) {
-		// TODO
-		//console.log(e);
+		if (!window.WOPIPostmessageReady) {
+			return;
+		}
+
+		var msg = JSON.parse(e.data);
+		if (msg.MessageId === 'Get_Views') {
+			var getMembersRespVal = [];
+			for (var viewInfoIdx in this._viewInfo) {
+				getMembersRespVal.push({
+					ViewId: viewInfoIdx,
+					UserName: this._viewInfo[viewInfoIdx].username,
+					UserId: this._viewInfo[viewInfoIdx].userid,
+					Color: this._viewInfo[viewInfoIdx].color
+				});
+			}
+
+			this.WOPIPostMessage('Get_Views_Resp', getMembersRespVal);
+		}
 	},
 
 	WOPIPostMessage: function(msgId, values) {
commit 56f6ee7a57acd299cf8a9a70e78fab4f82080db6
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Wed Oct 26 21:15:33 2016 +0530

    loleaflet: Store userid in map
    
    Change-Id: Ia54516b52ace3f722ae27ee28b5a11897dedc479

diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 90dcc34..22d7aa5 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -758,8 +758,8 @@ L.TileLayer = L.GridLayer.extend({
 		this._onUpdateViewCursor(viewId);
 	},
 
-	_addView: function(viewId, username, color) {
-		this._map.addView(viewId, username, color);
+	_addView: function(viewId, userid, username, color) {
+		this._map.addView(viewId, userid, username, color);
 
 		//TODO: We can initialize color and other properties here.
 		if (typeof this._viewCursors[viewId] !== 'undefined') {
@@ -799,7 +799,7 @@ L.TileLayer = L.GridLayer.extend({
 		var viewIds = [];
 		for (var viewInfoIdx in viewInfo) {
 			if (!(parseInt(viewInfo[viewInfoIdx].id) in this._map._viewInfo)) {
-				this._addView(viewInfo[viewInfoIdx].id, viewInfo[viewInfoIdx].username, viewInfo[viewInfoIdx].color);
+				this._addView(viewInfo[viewInfoIdx].id, viewInfo[viewInfoIdx].userid, viewInfo[viewInfoIdx].username, viewInfo[viewInfoIdx].color);
 			}
 			viewIds.push(viewInfo[viewInfoIdx].id);
 		}
diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js
index 87c0197..d015765 100644
--- a/loleaflet/src/map/Map.js
+++ b/loleaflet/src/map/Map.js
@@ -134,8 +134,8 @@ L.Map = L.Evented.extend({
 
 	// public methods that modify map state
 
-	addView: function(viewid, username, color) {
-		this._viewInfo[viewid] = {'username': username, 'color': color};
+	addView: function(viewid, userid, username, color) {
+		this._viewInfo[viewid] = {'userid': userid, 'username': username, 'color': color};
 		this.fire('addview', {viewId: viewid, username: username});
 	},
 
commit 4987df6547bfea184c707a7f1239f8559cda09ee
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Wed Oct 26 18:58:35 2016 +0530

    tdf#103450: WOPI compliant message and new way to post message
    
    Use map's WOPIPostMessage which takes care of bunch of things
    according to WOPI
    
    Change-Id: Id559179d684fd6243d3afa488d4cddc9eb92f4d6

diff --git a/loleaflet/dist/toolbar/toolbar.js b/loleaflet/dist/toolbar/toolbar.js
index 1de1a70..f5fc593 100644
--- a/loleaflet/dist/toolbar/toolbar.js
+++ b/loleaflet/dist/toolbar/toolbar.js
@@ -220,7 +220,7 @@ function onClick(id, item, subItem) {
 		resizeToolbar();
 	}
 	else if (id === 'close') {
-		window.parent.postMessage('close', '*');
+		map.WOPIPostMessage('UI_Close');
 		map.remove();
 	}
 }
diff --git a/loleaflet/src/control/Control.Menubar.js b/loleaflet/src/control/Control.Menubar.js
index 6f8f71d..c08722c 100644
--- a/loleaflet/src/control/Control.Menubar.js
+++ b/loleaflet/src/control/Control.Menubar.js
@@ -321,9 +321,7 @@ L.Control.Menubar = L.Control.extend({
 		} else if (id === 'rev-history') {
 			// if we are being loaded inside an iframe, ask
 			// our host to show revision history mode
-			if (window.top !== window.self) {
-				window.parent.postMessage('rev-history', '*');
-			}
+			map.WOPIPostMessage('rev-history');
 		} else if (id === 'repair') {
 			map._socket.sendMessage('commandvalues command=.uno:DocumentRepair');
 		}
commit cfcc6bdd94a658dd4a70da7daa4fe5658c101be6
Author: Pranav Kant <pranavk at collabora.co.uk>
Date:   Tue Oct 25 12:43:00 2016 +0530

    tdf#103450: Implement WOPI initialization postmessage API
    
    This includes support for Host_PostmessageReady and
    App_LoadingStatus
    
    Change-Id: Iaa0222dfa63c17b26a4fcb2236973bacdd61ee62

diff --git a/loleaflet/dist/loleaflet.html b/loleaflet/dist/loleaflet.html
index ff3edca..084b710 100644
--- a/loleaflet/dist/loleaflet.html
+++ b/loleaflet/dist/loleaflet.html
@@ -6,6 +6,19 @@
 
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 
+<script>
+  // Start listening for Host_PostmessageReady message and save the
+  // result for future
+  window.WOPIpostMessageReady = false;
+  var PostMessageReadyListener = function(e) {
+    var msg = JSON.parse(e.data);
+    if (msg.MessageId === 'Host_PostmessageReady') {
+      window.WOPIPostmessageReady = true;
+      window.removeEventListener('message', PostMessageReadyListener, false);
+    }
+  };
+  window.addEventListener('message', PostMessageReadyListener, false);
+</script>
 <link rel="stylesheet" href="/loleaflet/%VERSION%/branding.css"> <!-- add your logo here -->
 <link rel="localizations" href="/loleaflet/%VERSION%/l10n/localizations.json" type="application/vnd.oftn.l10n+json"/>
 <link rel="localizations" href="/loleaflet/%VERSION%/l10n/styles-localizations.json" type="application/vnd.oftn.l10n+json" />
diff --git a/loleaflet/main.js b/loleaflet/main.js
index 3074bdf..3528ea9 100644
--- a/loleaflet/main.js
+++ b/loleaflet/main.js
@@ -78,12 +78,15 @@ global.revHistoryEnabled = revHistoryEnabled;
 global.title = title;
 global.errorMessages = errorMessages;
 var docURL, docParams;
+var storageType;
 if (wopiSrc != '') {
     docURL = wopiSrc;
-    docParams = wopiParams;
+	docParams = wopiParams;
+	storageType = 'wopi';
 } else {
     docURL = filePath;
-    docParams = {};
+	docParams = {};
+	storageType = 'local';
 }
 
 document.title = title;
@@ -94,7 +97,8 @@ var map = L.map('map', {
     permission: permission,
     timestamp: timestamp,
     documentContainer: 'document-container',
-    debug: debugMode
+    debug: debugMode,
+    storageType: storageType
 });
 // toolbar.js (loaded in <script> tag accesses map as global variable,
 // so expose it
diff --git a/loleaflet/src/core/Socket.js b/loleaflet/src/core/Socket.js
index 488aeda..ba35050 100644
--- a/loleaflet/src/core/Socket.js
+++ b/loleaflet/src/core/Socket.js
@@ -167,6 +167,18 @@ L.Socket = L.Class.extend({
 
 			return;
 		}
+		else if (textMsg.startsWith('wopi: ')) {
+			// Handle WOPI related messages
+			textMsg = textMsg.substring('wopi: '.length);
+			if (textMsg.startsWith('postmessageorigin ')) {
+				this._map._wopi['PostMessageOrigin'] = textMsg.substring('postmessageorigin '.length);
+				this._map._wopi['DocumentLoadedTime'] = Date.now();
+				// Tell the host that we are ready now
+				this._map.WOPIPostMessage('App_LoadingStatus', {'DocumentLoadedTime': this._map._wopi['DocumentLoadedTime']});
+			}
+
+			return;
+		}
 		else if (textMsg.startsWith('error:') && command.errorCmd === 'internal') {
 			this._map._fatal = true;
 			if (command.errorKind === 'diskfull') {
diff --git a/loleaflet/src/map/Map.js b/loleaflet/src/map/Map.js
index 70fc83b..87c0197 100644
--- a/loleaflet/src/map/Map.js
+++ b/loleaflet/src/map/Map.js
@@ -123,6 +123,12 @@ L.Map = L.Evented.extend({
 
 		// View color map
 		this._viewColors = {};
+
+		// WOPI specific properties container
+		this._wopi = {};
+
+		// WOPI PostMessage Listener
+		L.DomEvent.on(window, 'message', this._WOPIPostMessageListener, this);
 	},
 
 
@@ -151,6 +157,25 @@ L.Map = L.Evented.extend({
 		return this._viewInfo[viewid].color;
 	},
 
+	_WOPIPostMessageListener: function(e) {
+		// TODO
+		//console.log(e);
+	},
+
+	WOPIPostMessage: function(msgId, values) {
+		if (this.options.storageType === 'wopi' && this._wopiPostMessageOrigin !== '') {
+			if (window.top !== window.self) {
+				var msg = {
+					'MessageId': msgId,
+					'SendTime': Date.now(),
+					'Values': values
+				};
+
+				window.parent.postMessage(JSON.stringify(msg), this._wopi['PostMessageOrigin']);
+			}
+		}
+	},
+
 	// replaced by animation-powered implementation in Map.PanAnimation.js
 	setView: function (center, zoom) {
 		zoom = zoom === undefined ? this.getZoom() : zoom;
diff --git a/loolwsd/DocumentBroker.cpp b/loolwsd/DocumentBroker.cpp
index 5bc55ed..2e24c72 100644
--- a/loolwsd/DocumentBroker.cpp
+++ b/loolwsd/DocumentBroker.cpp
@@ -237,6 +237,11 @@ bool DocumentBroker::load(const std::string& sessionId, const std::string& jailI
                 it->second->setReadOnly();
             }
 
+            if (!wopifileinfo._postMessageOrigin.empty())
+            {
+                it->second->sendTextFrame("wopi: postmessageorigin " + wopifileinfo._postMessageOrigin);
+            }
+
             getInfoCallDuration = wopifileinfo._callDuration;
         }
         else if (dynamic_cast<LocalStorage*>(_storage.get()) != nullptr)
diff --git a/loolwsd/Storage.cpp b/loolwsd/Storage.cpp
index 451387e..4b3f31c 100644
--- a/loolwsd/Storage.cpp
+++ b/loolwsd/Storage.cpp
@@ -310,6 +310,7 @@ WopiStorage::WOPIFileInfo WopiStorage::getWOPIFileInfo(const Poco::URI& uriPubli
     std::string userId;
     std::string userName;
     bool canWrite = false;
+    std::string postMessageOrigin;
     std::string resMsg;
     Poco::StreamCopier::copyToString(rs, resMsg);
 
@@ -332,6 +333,8 @@ WopiStorage::WOPIFileInfo WopiStorage::getWOPIFileInfo(const Poco::URI& uriPubli
         userName = (userNameVar.isString() ? userNameVar.toString() : "anonymous");
         const auto canWriteVar = getOrWarn(object, "UserCanWrite");
         canWrite = canWriteVar.isString() ? (canWriteVar.toString() == "true") : false;
+        const auto postMessageOriginVar = getOrWarn(object, "PostMessageOrigin");
+        postMessageOrigin = postMessageOriginVar.isString() ? postMessageOriginVar.toString() : "";
     }
     else
         Log::error("WOPI::CheckFileInfo is missing JSON payload");
@@ -342,7 +345,7 @@ WopiStorage::WOPIFileInfo WopiStorage::getWOPIFileInfo(const Poco::URI& uriPubli
         _fileInfo = FileInfo({filename, Poco::Timestamp(), size});
     }
 
-    return WOPIFileInfo({userId, userName, canWrite, callDuration});
+    return WOPIFileInfo({userId, userName, canWrite, postMessageOrigin, callDuration});
 }
 
 /// uri format: http://server/<...>/wopi*/files/<id>/content
diff --git a/loolwsd/Storage.hpp b/loolwsd/Storage.hpp
index e9ed98c..b21b19e 100644
--- a/loolwsd/Storage.hpp
+++ b/loolwsd/Storage.hpp
@@ -166,10 +166,12 @@ public:
         WOPIFileInfo(const std::string& userid,
                      const std::string& username,
                      const bool userCanWrite,
+                     const std::string& postMessageOrigin,
                      const std::chrono::duration<double> callDuration)
             : _userid(userid),
               _username(username),
               _userCanWrite(userCanWrite),
+              _postMessageOrigin(postMessageOrigin),
               _callDuration(callDuration)
             {
             }
@@ -180,6 +182,8 @@ public:
         std::string _username;
         /// If user accessing the file has write permission
         bool _userCanWrite;
+        /// WOPI Post message property
+        std::string _postMessageOrigin;
         /// Time it took to call WOPI's CheckFileInfo
         std::chrono::duration<double> _callDuration;
     };


More information about the Libreoffice-commits mailing list