From 5b7e9666dc740f89b511005623dbc42132f702f0 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 17 Feb 2023 15:40:06 +0000 Subject: [PATCH] Send URL updates to the UI when pages are loaded. --- src/main/java/org/qortal/api/HTMLParser.java | 16 ++++++++++--- .../arbitrary/ArbitraryDataRenderer.java | 2 +- src/main/resources/q-apps/q-apps.js | 23 +++++++++++++++++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/qortal/api/HTMLParser.java b/src/main/java/org/qortal/api/HTMLParser.java index 8b2d1116..86f0c19e 100644 --- a/src/main/java/org/qortal/api/HTMLParser.java +++ b/src/main/java/org/qortal/api/HTMLParser.java @@ -5,6 +5,7 @@ import org.apache.logging.log4j.Logger; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; +import org.qortal.arbitrary.misc.Service; public class HTMLParser { @@ -13,12 +14,21 @@ public class HTMLParser { private String linkPrefix; private byte[] data; private String qdnContext; + private String resourceId; + private Service service; + private String identifier; + private String path; - public HTMLParser(String resourceId, String inPath, String prefix, boolean usePrefix, byte[] data, String qdnContext) { + public HTMLParser(String resourceId, String inPath, String prefix, boolean usePrefix, byte[] data, + String qdnContext, Service service, String identifier) { String inPathWithoutFilename = inPath.substring(0, inPath.lastIndexOf('/')); this.linkPrefix = usePrefix ? String.format("%s/%s%s", prefix, resourceId, inPathWithoutFilename) : ""; this.data = data; this.qdnContext = qdnContext; + this.resourceId = resourceId; + this.service = service; + this.identifier = identifier; + this.path = inPath; } public void addAdditionalHeaderTags() { @@ -31,8 +41,8 @@ public class HTMLParser { String qAppsScriptElement = String.format("", this.qdnContext); + // Add vars + String qdnContextVar = String.format("", this.qdnContext, this.service.toString(), this.resourceId, this.identifier, this.path); head.get(0).prepend(qdnContextVar); // Add base href tag diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java index 2df13b8c..9ad021c1 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java @@ -129,7 +129,7 @@ public class ArbitraryDataRenderer { if (HTMLParser.isHtmlFile(filename)) { // HTML file - needs to be parsed byte[] data = Files.readAllBytes(Paths.get(filePath)); // TODO: limit file size that can be read into memory - HTMLParser htmlParser = new HTMLParser(resourceId, inPath, prefix, usePrefix, data, qdnContext); + HTMLParser htmlParser = new HTMLParser(resourceId, inPath, prefix, usePrefix, data, qdnContext, service, identifier); htmlParser.addAdditionalHeaderTags(); response.addHeader("Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval'; media-src 'self' blob:; img-src 'self' data: blob:;"); response.setContentType(context.getMimeType(filename)); diff --git a/src/main/resources/q-apps/q-apps.js b/src/main/resources/q-apps/q-apps.js index 626f2b4b..88be3d37 100644 --- a/src/main/resources/q-apps/q-apps.js +++ b/src/main/resources/q-apps/q-apps.js @@ -10,7 +10,7 @@ function handleResponse(event, response) { return; } - // Handle emmpty or missing responses + // Handle empty or missing responses if (response == null || response.length == 0) { response = "{\"error\": \"Empty response\"}" } @@ -151,7 +151,6 @@ window.addEventListener("message", (event) => { case "LINK_TO_QDN_RESOURCE": if (data.service == null) data.service = "WEBSITE"; // Default to WEBSITE window.location = buildResourceUrl(data.service, data.name, data.identifier, data.path); - response = true; break; case "SEARCH_QDN_RESOURCES": @@ -279,6 +278,13 @@ window.addEventListener("message", (event) => { return; } + if (response == null) { + // Pass to parent (UI), in case they can fulfil this request + event.data.requestedHandler = "UI"; + parent.postMessage(event.data, '*', [event.ports[0]]); + return; + } + handleResponse(event, response); }, false); @@ -317,6 +323,19 @@ else if (document.attachEvent) { document.attachEvent('onclick', interceptClickEvent); } +/** + * Send current page details to UI + */ +document.addEventListener('DOMContentLoaded', () => { + qortalRequest({ + action: "QDN_RESOURCE_DISPLAYED", + service: qdnService, + name: qdnName, + identifier: qdnIdentifier, + path: qdnPath + }); +}); + /** * Intercept image loads from the DOM */