6eef0bd90b
Change-Id: I3a8f4c05999a8c76df77686ecf55b6a49124c0cf
145 lines
7 KiB
HTML
145 lines
7 KiB
HTML
<!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 callSetCellColor() {
|
|
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 callGetNamedRanges() {
|
|
window.frames[0].postMessage(JSON.stringify({'MessageId': 'Host_PostmessageReady'}), '*');
|
|
window.frames[0].postMessage(JSON.stringify({'MessageId': 'CallPythonScript',
|
|
'SendTime': Date.now(),
|
|
'ScriptFile': 'NamedRanges.py',
|
|
'Function': 'GetNamedRanges',
|
|
'Values': null
|
|
}),
|
|
'*');
|
|
}
|
|
|
|
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.hasOwnProperty('success') &&
|
|
msg.Values.success == 'true' &&
|
|
msg.Values.hasOwnProperty('result') &&
|
|
msg.Values.result.hasOwnProperty('value')) {
|
|
if (msg.Values.commandName === 'vnd.sun.star.script:SetCellColor.py$SetCellColor?language=Python&location=share') {
|
|
document.forms['cell-colour-form'].elements['result'].readOnly = false;
|
|
document.forms['cell-colour-form'].elements['result'].value = msg.Values.result.value;
|
|
document.forms['cell-colour-form'].elements['result'].readOnly = true;
|
|
}
|
|
else if (msg.Values.commandName === 'vnd.sun.star.script:NamedRanges.py$GetNamedRanges?language=Python&location=share') {
|
|
document.forms['get-named-ranges-form'].elements['result'].readOnly = false;
|
|
var index = 0;
|
|
var result = '';
|
|
while (msg.Values.result.value.hasOwnProperty(index.toString())) {
|
|
result += msg.Values.result.value[index.toString()].value + "\n";
|
|
index++;
|
|
}
|
|
document.forms['get-named-ranges-form'].elements['result'].value = result;
|
|
document.forms['get-named-ranges-form'].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="cell-colour-form">
|
|
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="callSetCellColor(); return false;">here</button>
|
|
to send message to iframe below. It returned <input type="text" name="result" value="" readonly>.
|
|
</form>
|
|
</p>
|
|
|
|
<form id="get-named-ranges-form">
|
|
Click <button onclick="callGetNamedRanges(); return false;">here</button> to get a list of named ranges in the document:
|
|
<textarea name="result" value="" rows="10" "cols="80"></textarea>
|
|
</form>
|
|
|
|
<!-- 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>
|