From f4e248eee28c3c610daf6afc1e8eb7d4a00e0d8f Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Mon, 26 Oct 2026 13:59:21 +0100 Subject: [PATCH 1/4] CSSTUDIO-3811 Don't call ActionUtil.resolve() on the URL in Open Web Page Action Handler. Instead, expand macros, escape space characters, and open the resulting URL. --- .../OpenWebPageActionHandler.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java index ea397c6ada..4c6367e924 100644 --- a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java +++ b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java @@ -12,6 +12,8 @@ import org.csstudio.display.builder.runtime.script.ScriptUtil; import org.csstudio.display.builder.model.spi.ActionHandler; import org.csstudio.display.actions.OpenWebPageAction; +import org.phoebus.framework.macros.MacroHandler; +import org.phoebus.framework.macros.MacroValueProvider; import java.util.logging.Level; import java.util.logging.Logger; @@ -31,19 +33,29 @@ public void handleAction(Widget sourceWidget, ActionInfo pluggableActionInfo) { } try { - final String resolved_name = ActionUtil.resolve(sourceWidget, action.getURL()); - final DisplayModel top_model = sourceWidget.getTopDisplayModel(); - final ToolkitRepresentation toolkit = ToolkitRepresentation.getToolkit(top_model); + final String escapedExpandedURL; + { + final String url = action.getURL(); + final MacroValueProvider macros = sourceWidget.getMacrosOrProperties(); + final String expandedURL = MacroHandler.replace(macros, url); + escapedExpandedURL = expandedURL.replace(" ", "%20"); + } + + final ToolkitRepresentation toolkit; + { + final DisplayModel top_model = sourceWidget.getTopDisplayModel(); + toolkit = ToolkitRepresentation.getToolkit(top_model); + } toolkit.execute(() -> { try { - toolkit.openWebBrowser(resolved_name); + toolkit.openWebBrowser(escapedExpandedURL); } catch (Exception ex) { logger.log(Level.WARNING, "Cannot open " + action, ex); - toolkit.showErrorDialog(sourceWidget, "Cannot open " + resolved_name); + toolkit.showErrorDialog(sourceWidget, "Cannot open " + escapedExpandedURL); } }); } From 13522551c86bbd0661eba9cfaf6f065d54fef400 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Mon, 26 Oct 2026 14:58:57 +0100 Subject: [PATCH 2/4] CSSTUDIO-3811 Improve error reporting. --- .../actionhandlers/OpenWebPageActionHandler.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java index 4c6367e924..51cae99088 100644 --- a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java +++ b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java @@ -26,16 +26,24 @@ public class OpenWebPageActionHandler implements ActionHandler { @Override public void handleAction(Widget sourceWidget, ActionInfo pluggableActionInfo) { OpenWebPageAction action = (OpenWebPageAction)pluggableActionInfo; - if (action.getURL().isEmpty()) + final String url = action.getURL(); + if (url.trim().isEmpty()) { - logger.log(Level.WARNING, "Action without URL: {0}", action); + logger.log(Level.WARNING, "Open Web Page Action: No URL: {0}", action); + return; + } + else if (!url.trim().equals(url)) { + logger.log(Level.WARNING, "Open Web Page Action: URL has leading and/or trailing whitespace: \"{0}\"", url); + return; + } + else if (!(url.startsWith("http://") || url.startsWith("https://") || url.startsWith("file:"))) { + logger.log(Level.WARNING, "Open Web Page Action: URL does not start with one of the URL schemes \"http://\", \"https://\", or \"file:\": \"{0}\"", url); return; } try { final String escapedExpandedURL; { - final String url = action.getURL(); final MacroValueProvider macros = sourceWidget.getMacrosOrProperties(); final String expandedURL = MacroHandler.replace(macros, url); escapedExpandedURL = expandedURL.replace(" ", "%20"); @@ -62,7 +70,7 @@ public void handleAction(Widget sourceWidget, ActionInfo pluggableActionInfo) { catch (final Exception ex) { logger.log(Level.WARNING, "Error handling " + action, ex); - ScriptUtil.showErrorDialog(sourceWidget, "Cannot open " + action.getURL() + ".\n\nSee log for details."); + ScriptUtil.showErrorDialog(sourceWidget, "Cannot open " + url + ".\n\nSee log for details."); } } From 2cabc76e3b66ffd770a174f1fc815fc3db28a486 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Mon, 26 Oct 2026 15:08:26 +0100 Subject: [PATCH 3/4] CSSTUDIO-3811 Remove unused import. --- .../runtime/app/actionhandlers/OpenWebPageActionHandler.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java index 51cae99088..3e0020deb2 100644 --- a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java +++ b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java @@ -8,7 +8,6 @@ import org.csstudio.display.builder.model.Widget; import org.csstudio.display.builder.model.spi.ActionInfo; import org.csstudio.display.builder.representation.ToolkitRepresentation; -import org.csstudio.display.builder.runtime.ActionUtil; import org.csstudio.display.builder.runtime.script.ScriptUtil; import org.csstudio.display.builder.model.spi.ActionHandler; import org.csstudio.display.actions.OpenWebPageAction; From ed363d99f41f96716c1703ebcdd11cdb341cf711 Mon Sep 17 00:00:00 2001 From: Abraham Wolk Date: Tue, 27 Oct 2026 14:10:09 +0100 Subject: [PATCH 4/4] CSSTUDIO-3811 Make check for URL scheme case-insensitive. --- .../runtime/app/actionhandlers/OpenWebPageActionHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java index 3e0020deb2..87ce44b0e1 100644 --- a/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java +++ b/app/display/runtime/src/main/java/org/csstudio/display/builder/runtime/app/actionhandlers/OpenWebPageActionHandler.java @@ -35,7 +35,7 @@ else if (!url.trim().equals(url)) { logger.log(Level.WARNING, "Open Web Page Action: URL has leading and/or trailing whitespace: \"{0}\"", url); return; } - else if (!(url.startsWith("http://") || url.startsWith("https://") || url.startsWith("file:"))) { + else if (!(url.toLowerCase().startsWith("http://") || url.toLowerCase().startsWith("https://") || url.toLowerCase().startsWith("file:"))) { logger.log(Level.WARNING, "Open Web Page Action: URL does not start with one of the URL schemes \"http://\", \"https://\", or \"file:\": \"{0}\"", url); return; }