summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortza <marios8543@gmail.com>2022-04-05 22:40:24 +0300
committertza <marios8543@gmail.com>2022-04-05 22:40:24 +0300
commit30325397d090cfffee1143f21423aff7bd4e6122 (patch)
tree1b3e238627864b347bc0139069d6a445d0b0e45c
parent8d0fe5c45ac67ea4eef9a7c6a5e4eaaa57ad01d3 (diff)
downloaddecky-loader-30325397d090cfffee1143f21423aff7bd4e6122.tar.gz
decky-loader-30325397d090cfffee1143f21423aff7bd4e6122.zip
added plugin tile view isolation
Tile views will now run each in their own iframe. This makes it more safe as plugins no longer share the same javascript context, and plugin method calls can now be supported from the tile view.
-rw-r--r--plugin_loader/loader.py23
-rw-r--r--plugin_loader/templates/plugin_view.html51
2 files changed, 64 insertions, 10 deletions
diff --git a/plugin_loader/loader.py b/plugin_loader/loader.py
index d74eed51..231fe07b 100644
--- a/plugin_loader/loader.py
+++ b/plugin_loader/loader.py
@@ -43,7 +43,8 @@ class Loader:
web.get("/plugins/iframe", self.plugin_iframe_route),
web.get("/plugins/reload", self.reload_plugins),
web.post("/plugins/method_call", self.handle_plugin_method_call),
- web.get("/plugins/load/{name}", self.load_plugin),
+ web.get("/plugins/load_main/{name}", self.load_plugin_main_view),
+ web.get("/plugins/load_tile/{name}", self.load_plugin_tile_view),
web.get("/steam_resource/{path:.+}", self.get_steam_resource)
])
@@ -94,7 +95,7 @@ class Loader:
except Exception as e:
return web.Response(text=str(e), status=400)
- async def load_plugin(self, request):
+ async def load_plugin_main_view(self, request):
plugin = self.plugins[request.match_info["name"]]
ret = """
<script src="/static/library.js"></script>
@@ -103,6 +104,24 @@ class Loader:
""".format(plugin.name, plugin.main_view_html)
return web.Response(text=ret, content_type="text/html")
+ async def load_plugin_tile_view(self, request):
+ plugin = self.plugins[request.match_info["name"]]
+ ret = """
+ <html style="height: fit-content;">
+ <head>
+ <link rel="stylesheet" href="/steam_resource/css/2.css">
+ <link rel="stylesheet" href="/steam_resource/css/39.css">
+ <link rel="stylesheet" href="/steam_resource/css/library.css">
+ <script src="/static/library.js"></script>
+ <script>const plugin_name = '{name}';</script>
+ </head>
+ <body style="height: fit-content; display: block;">
+ {content}
+ </body>
+ <html>
+ """.format(name=plugin.name, content=plugin.tile_view_html)
+ return web.Response(text=ret, content_type="text/html")
+
@template('plugin_view.html')
async def plugin_iframe_route(self, request):
return {"plugins": self.plugins.values()}
diff --git a/plugin_loader/templates/plugin_view.html b/plugin_loader/templates/plugin_view.html
index d0275a7a..895931c4 100644
--- a/plugin_loader/templates/plugin_view.html
+++ b/plugin_loader/templates/plugin_view.html
@@ -1,13 +1,21 @@
<link rel="stylesheet" href="/steam_resource/css/2.css">
<link rel="stylesheet" href="/steam_resource/css/39.css">
<link rel="stylesheet" href="/steam_resource/css/library.css">
-<script src="/static/library.js"></script>
+<script>
+ const tile_iframes = [];
+ window.addEventListener("message", function (evt) {
+ tile_iframes.forEach(iframe => {
+ iframe.contentWindow.postMessage(evt.data, "http://127.0.0.1:1337");
+ });
+ }, false);
+</script>
{% if not plugins|length %}
-<div class="basicdialog_Field_ugL9c basicdialog_WithChildrenBelow_1RjOd basicdialog_InlineWrapShiftsChildrenBelow_3a6QZ basicdialog_ExtraPaddingOnChildrenBelow_2-owv basicdialog_StandardPadding_1HrfN basicdialog_HighlightOnFocus_1xh2W Panel Focusable" style="--indent-level:0;">
+<div class="basicdialog_Field_ugL9c basicdialog_WithChildrenBelow_1RjOd basicdialog_InlineWrapShiftsChildrenBelow_3a6QZ basicdialog_ExtraPaddingOnChildrenBelow_2-owv basicdialog_StandardPadding_1HrfN basicdialog_HighlightOnFocus_1xh2W Panel Focusable"
+ style="--indent-level:0;">
<div class="basicdialog_FieldChildren_279n8" style="color: white; font-size: large; padding-top: 10px;">
No plugins installed :(
- </div>
+ </div>
</div>
{% endif %}
@@ -15,15 +23,42 @@
<div class="quickaccesscontrols_PanelSectionRow_26R5w">
{% for plugin in plugins %}
{% if plugin.tile_view_html|length %}
- <div onclick="location.href = '/plugins/load/{{ plugin.name }}'" class="basicdialog_Field_ugL9c basicdialog_WithChildrenBelow_1RjOd basicdialog_InlineWrapShiftsChildrenBelow_3a6QZ basicdialog_ExtraPaddingOnChildrenBelow_2-owv basicdialog_StandardPadding_1HrfN basicdialog_HighlightOnFocus_1xh2W Panel Focusable" style="--indent-level:0;">
- {{ plugin.tile_view_html|safe }}
+ <div onclick="location.href = '/plugins/load/{{ plugin.name }}'"
+ class="basicdialog_Field_ugL9c basicdialog_WithChildrenBelow_1RjOd basicdialog_InlineWrapShiftsChildrenBelow_3a6QZ basicdialog_ExtraPaddingOnChildrenBelow_2-owv basicdialog_StandardPadding_1HrfN basicdialog_HighlightOnFocus_1xh2W Panel Focusable"
+ style="--indent-level:0;">
+ <iframe id="tile_view_iframe_{{ plugin.name }}" style="display:block; padding: 0; border: none;"
+ src="/plugins/load_tile/{{ plugin.name }}"></iframe>
+ <script>
+ (function() {
+ let iframe = document.getElementById("tile_view_iframe_{{ plugin.name }}");
+ tile_iframes.push(document.getElementById("tile_view_iframe_{{ plugin.name }}"));
+ iframe.onload = function() {
+ let html = iframe.contentWindow.document.children[0];
+ let last_height = 0;
+ setInterval(function() {
+ let height = iframe.contentWindow.document.children[0].scrollHeight;
+ if (height != last_height) {
+ iframe.height = height + "px";
+ last_height = height;
+ }
+ }, 100);
+ iframe.contentWindow.document.body.onclick = function () {
+ location.href = '/plugins/load_main/{{ plugin.name }}';
+ };
+ }
+ })();
+ </script>
</div>
{% else %}
<div class="quickaccesscontrols_PanelSectionRow_26R5w">
- <div onclick="location.href = '/plugins/load/{{ plugin.name }}'" class="basicdialog_Field_ugL9c basicdialog_WithChildrenBelow_1RjOd basicdialog_InlineWrapShiftsChildrenBelow_3a6QZ basicdialog_ExtraPaddingOnChildrenBelow_2-owv basicdialog_StandardPadding_1HrfN basicdialog_HighlightOnFocus_1xh2W Panel Focusable" style="--indent-level:0;">
+ <div onclick="location.href = '/plugins/load_main/{{ plugin.name }}'"
+ class="basicdialog_Field_ugL9c basicdialog_WithChildrenBelow_1RjOd basicdialog_InlineWrapShiftsChildrenBelow_3a6QZ basicdialog_ExtraPaddingOnChildrenBelow_2-owv basicdialog_StandardPadding_1HrfN basicdialog_HighlightOnFocus_1xh2W Panel Focusable"
+ style="--indent-level:0;">
<div class="basicdialog_FieldChildren_279n8">
- <button type="button" tabindex="0" class="DialogButton _DialogLayout Secondary basicdialog_Button_1Ievp Focusable">{{ plugin.name }}</button>
- </div>
+ <button type="button" tabindex="0"
+ class="DialogButton _DialogLayout Secondary basicdialog_Button_1Ievp Focusable">{{ plugin.name
+ }}</button>
+ </div>
</div>
</div>
{% endif %}