libreoffice-online/loleaflet/dist/framed.html
Tor Lillqvist 05917b9a46 Add the HTML of the iframe loleaflet proof of concept
Change-Id: I3dcc79fe58b14533b41ace05c14263097b69717b
2018-03-28 14:13:05 +03:00

108 lines
4.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, with the MessageId of
'SetCellColor'. That is then in our JavaScript passed on to a
Python script that sets the background colour of the
corresponding cell of the spreadsheet document open in the
loleaflet iframe. The Python script return 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, the following patch is needed to the C++ code:
--- 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 foobar() {
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': 'SetCellColor',
'SendTime': Date.now(),
'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 === 'SetCellColor-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="foobar(); return false;">here</button>
to send message to iframe below. It returned <input type="text" name="result" value="" readonly>.
</form>
</p>
<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>