[ 
https://issues.apache.org/jira/browse/DELTASPIKE-832?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Thomas Andraschko resolved DELTASPIKE-832.
------------------------------------------
    Resolution: Fixed

> Javascript assert windowId not resilient enough
> -----------------------------------------------
>
>                 Key: DELTASPIKE-832
>                 URL: https://issues.apache.org/jira/browse/DELTASPIKE-832
>             Project: DeltaSpike
>          Issue Type: Bug
>          Components: JSF-Module
>    Affects Versions: 1.2.1
>            Reporter: Nuno G. de M
>            Assignee: Thomas Andraschko
>             Fix For: 1.4.0
>
>
> The issue is with the algorithm used by the delta spike LAZY mode to identify 
> the dswid in the request parameter of a window.
> We have a use case scenario where we open a URL for a view in an iframe by 
> doing something as iframe.src / iframe.contentwindow.location.href = url. 
> As opposed to doing a standard JSF form postback, this creates a get request 
> for the URL.  One of the request parameters that we have in our GET request 
> is itself a small url.
> Say that we do a get:
> ifram.src = 
> '/pageToOpen/whateve.xhtml?param1=whatever&loginUrl=/pathToSomeOtherUrl,xhtml?dswid=56&dswid=78787'
> OK. If you use a browser to decompse the query params of this get request you 
> would get:
> param1=whatever
> loginUrl=/pathToSomeOtherUrl,xhtml?dswid=56
> dswid=78787
> This means we have three request parameters, param1, loginUrl and dswid.
> The algorithm:
> function getUrlParameter(name) {
>     var url = window.location.href;
>     var vars = url.split(/&|\?/g);
>     for (var i=0; vars != null && i < vars.length; i++) {
>         var pair = vars[i].split("=");
>         if (pair[0]==name) {
>             return pair[1];
>         }
>     }
>     return null;
> }
> Will wrongly detect the dswid=56 as the window id of the request URL, and it 
> will decide that it is different from window.name  of the iframe, which in 
> this case would actually have been 78787.
> This triggers the page to be double loaded due to the incorrect window id 
> determined by the assert window id.
> One possible way to fix this issue, may be to make use of the browser 
> capabilities to parse URLs.
> If you were to create an <a> anchor object e.g.
> var a = jQuery('<a>', { href:uri } )[0];
> You then can use the anchor object properties such as a.path and a.search to 
> get the diffenrent components from the wndow.location.href.
> After that, you can make an accurate loop over the query parameters by 
> spliting the a.search by &.
> Careful that the first element of the search part of the anchor, when not 
> empty alway carries the ?, so you might want to do  a.search.substring(1).
> Finally on the spllitted array by (&) you can loop over the elements, split 
> each by '=' and then you will be accurately be able to know if any of the 
> query parameters actually was a dswid.
> The current algorithm is not 100% accurate and can lead to page double 
> loading if incrrectly parsing the URL.
> If possible, could you enhance the ds:windowid component to optinally render 
> the javascript without using the compressed javascript?
> In order to figre out what was happening with the double load I had to create 
> a render extending your base render and with resource depdency on the 
> uncompressed javascript.
> Many thanks for all the help.
> Kind regards.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to