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) {

Reply via email to