[Libreoffice-commits] online.git: Branch 'distro/collabora/collabora-online-3' - loleaflet/dist loleaflet/src
Tor Lillqvist
tml at collabora.com
Thu Apr 5 08:06:24 UTC 2018
loleaflet/dist/framed.html | 117 ++++++++++++++++++++++++++++++++++
loleaflet/src/layer/tile/TileLayer.js | 9 ++
loleaflet/src/map/handler/Map.WOPI.js | 7 ++
3 files changed, 133 insertions(+)
New commits:
commit 9975e51d60bb9924407d1f32423a29e9adde316e
Author: Tor Lillqvist <tml at collabora.com>
Date: Thu Jan 18 18:54:20 2018 +0200
Add handling of the SetCellColor proof-of-concept postMessage event
When we receive such a message, we forward it to the corresponding
Python script (from core's scripting/examples/python/SetCellColor.py).
We also save the event's source so that we can send the return value
of the script back to its window.
Change-Id: I1f54a90000937d6c9b91fb15cdfde329223cf8db
(cherry picked from commit 0b77d1b1761f4bb64862ed38b2b8d6f152e9beaa)
(cherry picked from commit 05917b9a46f4784a3d88b52c00b0ff821e7bbaf9)
(cherry picked from commit d43c3ec8595436ed2fc215219043f676d3ef59f6)
(cherry picked from commit fdaa96cff0d7230429b8e86fbd63fac14608f3af)
(cherry picked from commit a0158a143230a3ed573c56275f51d857f61d8da3)
Reviewed-on: https://gerrit.libreoffice.org/52104
Reviewed-by: Jan Holesovsky <kendy at collabora.com>
Tested-by: Jan Holesovsky <kendy at collabora.com>
diff --git a/loleaflet/dist/framed.html b/loleaflet/dist/framed.html
new file mode 100644
index 000000000..f45054d4f
--- /dev/null
+++ b/loleaflet/dist/framed.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html>
+
+<!-- Proof of concept of running loleaflet.html in an iframe.
+
+ The top part of this page has a form with three input fields:
+ "x", "y", and "color", a submit button, and a "result" field used
+ for output only.
+
+ When the submit button is pressed, the input fields are passed as
+ a postMessage to the iframe. The message also specifies what
+ Python script to call. (In this demo case, the 'SetCellColor'
+ script in scripting/examples/python/SetCellColor.py in
+ LibreOffice core.) The parameters are then in our JavaScript
+ passed on to the Python script that acts on the document open in
+ the iframe. The Python script returns a value, which gets passed
+ to loleaflet in a unocommandresult: message, and passed on to the
+ event listener on this page, which writes it to the output field.
+
+ For this to work, in the trivial proof of concept case of 'make
+ run', the below patch is needed to the C++ code. It is probably
+ not necessary in a "real" WOPI-based setup where iframes are
+ already used and things work fine.
+
+--- a/wsd/FileServer.cpp
++++ b/wsd/FileServer.cpp
+@@ -172,7 +172,7 @@ void FileServerRequestHandler::handleRequest(const HTTPRequest& request, Poco::M
+ const auto& config = Application::instance().config();
+ const std::string loleafletHtml = config.getString("loleaflet_html", "loleaflet.html");
+ const std::string endPoint = requestSegments[requestSegments.size() - 1];
+- if (endPoint == loleafletHtml)
++ if (endPoint == loleafletHtml || endPoint == "framed.html")
+ {
+ preprocessFile(request, message, socket);
+ return;
+@@ -548,7 +548,7 @@ void FileServerRequestHandler::preprocessFile(const HTTPRequest& request, Poco::
+ LOG_TRC("Denied frame ancestor: " << frameAncestor);
+
+ cspOss << "img-src 'self' data: ;";
+- oss << "X-Frame-Options: deny\r\n";
++ oss << "X-Frame-Options: sameorigin\r\n";
+ }
+
+ cspOss << "\r\n";
+
+-->
+
+<html>
+ <head>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>Online Editor</title>
+
+ <script>
+ function callPythonScript() {
+ window.frames[0].postMessage(JSON.stringify({'MessageId': 'Host_PostmessageReady'}), '*');
+ var x = document.forms[0].elements['x'].value;
+ var y = document.forms[0].elements['y'].value;
+ var color = document.forms[0].elements['color'].value;
+ console.log('x=' + x + ' y=' + y + ' color=' + color);
+ color = parseInt('0x' + color.substring(1));
+ console.log('x=' + x + ' y=' + y + ' color=' + color);
+ window.frames[0].postMessage(JSON.stringify({'MessageId': 'CallPythonScript',
+ 'SendTime': Date.now(),
+ 'ScriptFile': 'SetCellColor.py',
+ 'Function': 'SetCellColor',
+ 'Values': {'x': {'type': 'long', 'value': x},
+ 'y': {'type': 'long', 'value': y},
+ 'color': {'type': 'long', 'value': color}
+ }
+ }),
+ '*');
+ }
+
+ function receiveMessage(event) {
+ var msg = JSON.parse(event.data);
+ console.log('==== framed.html receiveMessage: ' + event.data);
+ console.log(' ' + msg);
+ if (msg.hasOwnProperty('MessageId') &&
+ msg.MessageId === 'CallPythonScript-Result' &&
+ msg.hasOwnProperty('Values') &&
+ msg.Values.hasOwnProperty('commandName') &&
+ msg.Values.commandName === 'vnd.sun.star.script:SetCellColor.py$SetCellColor?language=Python&location=share' &&
+ msg.Values.hasOwnProperty('success') &&
+ msg.Values.success == 'true' &&
+ msg.Values.hasOwnProperty('result') &&
+ msg.Values.result.hasOwnProperty('value')) {
+ document.forms[0].elements['result'].readOnly = false;
+ document.forms[0].elements['result'].value = msg.Values.result.value;
+ document.forms[0].elements['result'].readOnly = true;
+ }
+ }
+ window.addEventListener("message", receiveMessage, false);
+ </script>
+
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ </head>
+
+ <body style="user-select: none;">
+
+ <p>
+ <form id="frm1">
+ Cell: (<input type="number" name="x" min="0" max="20" value="0">, <input type="number" name="y" min="0" max="20" value="0">),
+ colour: <input type="text" name="color" value="#008000">
+ <br>
+ Click <button onclick="callPythonScript(); return false;">here</button>
+ to send message to iframe below. It returned <input type="text" name="result" value="" readonly>.
+ </form>
+ </p>
+
+ <!-- The hostname and pathnames below are obviously specific to my
+ personal environment and need to be changed appropriately. Also
+ the hex string needs to be changed of course, to the right one as
+ shown by 'make run'. -->
+
+ <iframe src="http://snorken.local:9980/loleaflet/94781ec6/loleaflet.html?file_path=file:///home/tml/lo/internal-online/test/data/empty.ods&NotWOPIButIframe=true" height="1000" width="1000"></iframe>
+ </body>
+</html>
diff --git a/loleaflet/src/layer/tile/TileLayer.js b/loleaflet/src/layer/tile/TileLayer.js
index 4fdee2095..330c86c90 100644
--- a/loleaflet/src/layer/tile/TileLayer.js
+++ b/loleaflet/src/layer/tile/TileLayer.js
@@ -1081,6 +1081,7 @@ L.TileLayer = L.GridLayer.extend({
},
_onUnoCommandResultMsg: function (textMsg) {
+ // console.log('_onUnoCommandResultMsg: "' + textMsg + '"');
textMsg = textMsg.substring(18);
var obj = JSON.parse(textMsg);
var commandName = obj.commandName;
@@ -1094,6 +1095,14 @@ L.TileLayer = L.GridLayer.extend({
this._map.hideBusy();
this._map.fire('commandresult', {commandName: commandName, success: success, result: obj.result});
+ if (this._map.CallPythonScriptSource != null) {
+ this._map.CallPythonScriptSource.postMessage(JSON.stringify({'MessageId': 'CallPythonScript-Result',
+ 'SendTime': Date.now(),
+ 'Values': obj
+ }),
+ '*');
+ this._map.CallPythonScriptSource = null;
+ }
},
_onRulerUpdate: function (textMsg) {
diff --git a/loleaflet/src/map/handler/Map.WOPI.js b/loleaflet/src/map/handler/Map.WOPI.js
index c7055c440..b95dd1ed9 100644
--- a/loleaflet/src/map/handler/Map.WOPI.js
+++ b/loleaflet/src/map/handler/Map.WOPI.js
@@ -18,6 +18,7 @@ L.Map.WOPI = L.Handler.extend({
DisableCopy: false,
DisableInactiveMessages: false,
UserCanNotWriteRelative: true,
+ CallPythonScriptSource: null,
_appLoadedConditions: {
docloaded: false,
@@ -244,6 +245,12 @@ L.Map.WOPI = L.Handler.extend({
this._map._socket.sendMessage('versionrestore prerestore');
}
}
+ else if (msg.MessageId === 'CallPythonScript' &&
+ msg.hasOwnProperty('ScriptFile') &&
+ msg.hasOwnProperty('Function')) {
+ this._map.CallPythonScriptSource = e.source;
+ this._map.sendUnoCommand('vnd.sun.star.script:' + msg.ScriptFile + '$' + msg.Function + '?language=Python&location=share', msg.Values);
+ }
},
_postMessage: function(e) {
More information about the Libreoffice-commits
mailing list