This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/main by this push:
new e939e99f650 CAUSEWAY-3976: advanced client side redirect helper
(java-script)
e939e99f650 is described below
commit e939e99f6509ad14aaf24e21637d582943876dba
Author: andi-huber <[email protected]>
AuthorDate: Thu Mar 12 11:48:43 2026 +0100
CAUSEWAY-3976: advanced client side redirect helper (java-script)
corrects the origin if unexpected
---
.../causeway/viewer/wicket/ui/exec/Mediator.java | 29 +++++++++++++++++++---
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/exec/Mediator.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/exec/Mediator.java
index 8b5f99f06ac..f9d0b485bc4 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/exec/Mediator.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/exec/Mediator.java
@@ -150,11 +150,10 @@ void handle() {
: javascriptFor_sameWindow(fullUrl);
scheduleJs(ajaxTarget, js, 100);
- } else {
+ } else
throw _Exceptions.unrecoverable(
"no logic implemented to handle IRequestHandler of
type %s",
requestHandler.getClass().getName());
- }
}
}
}
@@ -181,11 +180,33 @@ private static String expanded(String urlStr) {
}
private static String javascriptFor_newWindow(final CharSequence url) {
- return
"function(){Wicket.Event.publish(Causeway.Topic.OPEN_IN_NEW_TAB, '" + url +
"');}";
+ return String.format("""
+ function(){
+ const url = '%s';
+ const requiredOrigin = window.location.origin;
+ const replacedUrl = url.startsWith(requiredOrigin)
+ ? url
+ : (() => {
+ const urlObj = new URL(url);
+ return requiredOrigin + urlObj.pathname + urlObj.search
+ urlObj.hash;
+ })();
+ Wicket.Event.publish(Causeway.Topic.OPEN_IN_NEW_TAB,
replacedUrl);
+ }""", url);
}
private static String javascriptFor_sameWindow(final CharSequence url) {
- return "\"window.location.href='" + url + "'\"";
+ return String.format("""
+ function(){
+ const url = '%s';
+ const requiredOrigin = window.location.origin;
+ const replacedUrl = url.startsWith(requiredOrigin)
+ ? url
+ : (() => {
+ const urlObj = new URL(url);
+ return requiredOrigin + urlObj.pathname + urlObj.search
+ urlObj.hash;
+ })();
+ window.location.href=replacedUrl;
+ }""", url);
}
private static void scheduleJs(final AjaxRequestTarget target, final
String js, final int millis) {